SQL触发器 - Maximo工作器 - 主管/所有者初始化

时间:2010-10-20 20:36:00

标签: sql triggers sql-update maximo

我正在使用自动发布工作程序的IBM Maximo数据库。当工作人员被发布(也就是插入数据库工作单表)时,我想根据一组标准自动分配主管,所有者和所有者组。只有在尚未分配主管,所有者和所有者组时才需要这样做。通常情况下,“父工作单”具有信息,但需要将其复制到“子”工作单中(如下面的标准所示)。所有触发器的标准是:

WHERE status<>'COMP'
AND historyflag=0
AND istask=0

以下是触发条件:

- 如果所有者组和主管有值,请跳过记录。 (什么都不做)

- 如果所有者组和/或主管为空或空,并且相应的父母工作 订单字段不是空的,从中复制所有者组和/或主管 父母工作单记录。

- 如果父工作单所有者组和/或主管为空或空,则 根据下面的表值分配所有者组和主管:(为安全起见,我删除了名称,但所有列都是正确的,即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 这些领域是: 位置,ownergroup,监事

<小时/> 的 UPDATE1:
以下是一些可能很重要的其他信息 位置:
首先,workorder.location将包含诸如ABC-1234之类的值,这意味着它位于站点ABC,构建1234(尽管这些不是单独的值,而是组合在一起)。在此SQL查询中,某个位置的所有建筑物都由同一所有者组/主管提供服务,因此所有查询都使用类似于workorder.location ='ABC%'的内容。

以下是我希望最终查询的逻辑:

如果缺少主管字段,首先要查看它是否有父母,如果是,父母是否有主管?如果没有,请根据上表分配。

如果缺少ownergroup字段,首先要查看它是否有父项,如果是,那么父项是否具有所有者组?如果没有,请根据上表分配

这就是为什么我认为案例陈述可能是最好的选择。此外,我目前有一个变量列表,如“@ asperper,@ B1Supervisor,@ B2Supervisor,...等”,以便我可以在将来更改它们。为了节省大量冗余代码,是否可以执行以下操作: (在这个例子中,location是ABC-1234,ownergroup应该是@ABCGroup,supervisor应该是@ABCSupervisor,其中@ABCGroup和@ABCSupervisor在代码的前面设置)

如果缺少主管字段,首先要查看它是否有父母,如果是,父母是否有主管(然后复制它的主管)?如果没有,请指派主管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

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

3 个答案:

答案 0 :(得分:1)

如果你做了一些更新语句,那么你就是正确的方式。 将虚拟表INSERTED放入update-statement中,并将其与唯一键连接,例如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

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

在触发器中放入两个update-statements,使用where子句代码,以确保只执行一个语句......

和平,祝你好运

答案 1 :(得分: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,然后键入逻辑以在匹配时填充子工作单中的数据。 v_location是我为父工作单位置定义的变量:

if v_location == 'ABC':
    mbo.setValue("ownergroup","ABCOwnerGroup")
    mbo.setValue("supervisor","ABCSupervisor")

答案 2 :(得分:0)

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