我正在使用自动发布工单的 IBM Maximo 数据库。当发布工作订单(又名插入到数据库工作订单表中)时,我想根据一组标准自动分配主管、所有者和所有者组。仅当尚未分配主管、所有者和所有者组时才需要这样做。通常,“父工单”具有信息,但需要将其复制到“子”工单中(正如您将在下面的标准中看到的那样)。所有触发器的标准是:
WHERE status<>'COMP'
AND historyflag=0
AND istask=0
以下是触发条件:
- 如果 Owner Group 和 Supervisor 有值,则跳过记录。(没做什么)
- 如果所有者组和/或主管为空白或为空,并且相应的父工单字段不为空,则从父工单记录中复制所有者组和/或主管。
- 如果父工单所有者组和/或主管为空白或为空,则根据下表值分配所有者组和主管:(为了安全起见,我删除了名称,但所有列都是正确的,即假定为 B3让SuperA担任主管)
Site / OwnerGroup / Supervisor
ABC / @ABCGroup / @ABCSupervisor
DEF / @DEFGroup / @DEFSupervisor
**注意:SITE 不是表格列,它实际上是 workorder.location 字段的前 3 个字符。例如,位置可能是 ABC-1234,这意味着它位于站点 ABC,建筑物 1234(不幸的是,这些没有存储在单独的列中,它们只一起出现在位置列中)。在这个 SQL 查询中,一个位置的所有建筑物都由同一个所有者组/主管提供服务,因此我们当前使用的所有其他查询都使用 workorder.location='ABC%'
我已经做了很多选择、更新和存储过程,但这是我的第一个触发器,我想确保我不会彻底搞砸数据库!非常感谢任何和所有帮助!
对于不熟悉 Maximo 的人,该表为:dbo.workorder,字段为:location、ownergroup、supervisor
UPDATE1:
这里有一些可能很重要的附加信息。
位置:
首先,workorder.location 将包含诸如 ABC-1234 之类的值,这意味着它位于站点 ABC,建筑物 1234(虽然这些不是单独的值,但它是组合的)。在这个 SQL 查询中,一个位置的所有建筑物都由同一个所有者组/主管提供服务,因此所有查询都使用类似于 workorder.location='ABC%' 的内容。
这是我希望最终查询的逻辑看起来像:
如果缺少 supervisor 字段,首先查看它是否有 parent,如果有,那么 parent 是否有 supervisor?如果没有,请根据上表进行分配。
如果缺少 ownergroup 字段,首先查看它是否有父级,如果有,父级是否有 ownergroup?如果没有,请根据上表进行分配。
这就是为什么我认为案例陈述可能是最好的选择。另外,我目前有一个变量列表,例如“@ASupervisor、@B1Supervisor、@B2Supervisor、...等”,以便将来可以根据需要更改它们。为了节省大量冗余代码,是否可以这样做:(
在此示例中,位置为 ABC-1234,所有者组应为@ABCGroup,主管应为@ABCSupervisor,其中@ABCGroup 和@ABCSupervisor 在前面设置代码)
如果缺少 supervisor 字段,首先查看它是否有父级,如果有,父级是否有主管(然后复制它的主管)?如果不是,则分配主管 X。
其中 X = '@' + '(位置的前三个字符)' + '主管'(在本例中,X=@ABCSupervisor)
这可能吗??
更新 2:
我已经与要求更改此数据库的人进行了交谈,我们在这里改变了一些想法。首先,父位置和子位置应该始终相同(如果不是,那就是另一个问题了)。所有站点(位置的前 3 个字母)都应具有相同的所有者组和主管,因此基本上我们可以查看工作订单条目在任一字段中是否具有 NULL 值,然后根据位置进行分配。我相信以下代码会起作用(但希望有人在我在系统上实施之前对其进行审查)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER dbo.AutoAssign
ON dbo.workorder
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ABCSupervisor varchar(30)
DECLARE @DEFSupervisor varchar(30)
DECLARE @ABCOwnerGroup varchar(20)
DECLARE @DEFOwnerGroup varchar(20)
/*EDIT VARIABLES IF FUTURE CHANGES*/
--SET Supervisor values HERE;
SET @ABCSupervisor='JOHNDOE'
SET @XYZSupervisor='JANEDOE'
--SET OwnerGroup values HERE:
SET @ABCOwnerGroup='ALPHATEAM'
SET @XYZOwnerGroup='OMEGATEAM'
--UPDATES
UPDATE dbo.workorder
SET ownergroup='@'+SUBSTR(location,1,3)+'OwnerGroup'
WHERE status<>'COMP'
AND historyflag=0
AND istask=0
AND ownergroup IS NULL
AND location IS NOT NULL
UPDATE dbo.workorder
SET supervisor='@'+SUBSTR(location,1,3)+'Supervisor'
WHERE status<>'COMP'
AND historyflag=0
AND istask=0
AND supervisor IS NULL
AND location IS NOT NULL
END
GO
我在这里看到的唯一问题是我没有在“插入”表上加入某种形式,因此它只会影响这些条目(而不是每次都影响整个表)。如果我能得到一些帮助,将不胜感激!!