0

我正在使用自动发布工单的 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

我在这里看到的唯一问题是我没有在“插入”表上加入某种形式,因此它只会影响这些条目(而不是每次都影响整个表)。如果我能得到一些帮助,将不胜感激!!

4

3 回答 3

1

如果您已经完成了一些更新语句,那么您就走对了。将虚拟表 INSERTED 放入您的更新语句中,并使用唯一键加入它,例如 SerialNo: 这将是这样的:

create trigger Trig_WorkOrder for insert, update as
BEGIN
update wo
set location = pwo.location, ...
from dbo.workorder as wo, inserted as i, dbo.parentworkorder as pwo
where wo.serialNo = i.SerialNo -- join with the actual table-entry
and wo.pwo_id = pwo.id -- join with the parentworkorder
and i.ownergroup is null -- do it if new value is empty
and (pwo.ownergroup is not null or pwo.ownergroup <> '') -- do it if parentvalue is not empty
and (pwo.Supervisor is not null or pwo.Supervisor <> '') -- do it if parentvalue is not empty

update wo
set location = pwo.location, ...
from dbo.workorder as wo, inserted as i, dbo.standardworkorder as pwo
where wo.serialNo = i.SerialNo 
and wo.location = pwo.location
and wo.ownergroup is null
and (pwo.ownergroup is null or pwo.ownergroup = '')
and (pwo.Supervisor is null or pwo.Supervisor = '')
END

我建议将默认值存储在单独的表中,以便在父值为空时方便加入。

将两个更新语句放入触发器中的代码 where 子句以确保只有一个语句执行......

和平与好运

于 2010-10-20T21:14:08.367 回答
1

如果您使用的是 Maximo 7.x,自动化脚本可以做您想做的事。

例如,我们使用一个自动化脚本来检查子工单的字段是否为空。如果是,Maximo 将获取父工作订单值并填写它。在我们的例子中,它是一个名为 WOPM1 的自定义字段。

WorkOrderSet = mbo.getMboSet("PARENT")

if WorkOrderSet.getMbo(0) is not None:
      SUPERVISOR = WorkOrderSet.getMbo(0).getString("SUPERVISOR")

或者,如果您有一个基本查找来根据位置的前三个来填写 OwnerGroup 和 Supervisor,您可以执行 if then type 逻辑以在匹配时填写子工单中的数据。v_location 是我为父工作订单位置定义的变量:

if v_location == 'ABC':
    mbo.setValue("ownergroup","ABCOwnerGroup")
    mbo.setValue("supervisor","ABCSupervisor")
于 2013-11-26T16:46:46.447 回答
0

对于您要实现的目标,我不确定使用触发器是 Maximo 中的最佳解决方案 - 使用触发器会忽略所有 MBO 业务逻辑。也许您可以考虑自定义 MBO 类或使用 Maximo Escalations 来完成此任务。在应用 Fix Pack 或升级 Maximo 时,使用触发器也会给您带来麻烦,因此如果您选择采用这种方式,请务必在执行任何此类操作之前备份触发器。

于 2012-11-18T12:02:32.937 回答