代码之家  ›  专栏  ›  技术社区  ›  D.R.

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

  •  0
  • D.R.  · 技术社区  · 14 年前

    我正在使用一个自动发出工单的IBMMaximo数据库。发出工单时(即插入到数据库工单表中),我希望根据一组条件自动分配一个主管、所有者和所有者组。只有在尚未分配主管、所有者和所有者组时,才需要执行此操作。通常情况下,“父工作订单”具有这些信息,但需要将其复制到“子”工作订单中(您将在下面的条件中看到)。所有触发器的标准是:

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

    触发条件如下:

    -如果所有者组和主管具有值,则跳过该记录。(无所事事)

    -如果所有者组和/或主管为空或空,以及相应的父工作 订单字段不为空,请从 父工作订单记录。

    -如果父工作订单所有者组和/或主管为空,则 根据下表值分配所有者组和主管:(为了安全起见,我删除了名称,但所有列都是正确的,即b3应该使用supera作为主管)

    Site / OwnerGroup / Supervisor
    ABC / @ABCGroup / @ABCSupervisor
    DEF / @DEFGroup / @DEFSupervisor
    

    *注: 站点不是表列,它实际上是workorder.location字段的前3个字符。例如,位置可以是abc-1234,这意味着它位于站点abc,建筑物1234(不幸的是,这些不存储在单独的列中,它们只存在于位置列中)。在这个SQL查询中,一个位置上的所有建筑都由同一个所有者组/主管提供服务,因此我们当前使用的所有其他查询都使用工作订单。location='abc%'

    我已经做了大量的选择、更新和存储过程,但这是我的第一个触发器,并希望确保我不会彻底破坏数据库!非常感谢您的任何帮助!

    对于不熟悉Maximo的人,表格是: 工作顺序 字段是: 位置,所有者组,主管


    更新1:
    以下是一些可能很重要的附加信息。
    位置:
    首先,workorder.location将包含abc-1234等值,这意味着它位于现场abc,建筑物1234(尽管这些不是单独的值,但它是组合的)。在这个SQL查询中,一个位置上的所有建筑都由同一个所有者组/主管提供服务,因此所有查询都使用类似于workorder.location='abc%'的内容。

    下面是最后一个查询的逻辑:

    如果缺少“主管”字段,请首先查看它是否有父级,如果有,则父级是否有主管?如果没有,请根据上表进行分配。

    如果缺少ownergroup字段,首先查看它是否有父级,如果有,父级是否有ownergroup?如果没有,请根据上表进行分配。

    这就是为什么我认为案例陈述可能是最好的选择。另外,我现在有一个变量列表,比如“@asupervisor、@b1supervisor、@b2supervisor等等”,这样我可以在将来需要的时候更改它们。为了节省大量冗余代码,是否可以执行以下操作:
    (在本例中,位置为abc-1234,所有者组应为@abcgroup,主管应为@abc supervisor,其中@abcgroup和@abc supervisor在代码前面设置)

    如果缺少supervisor字段,首先查看它是否有父级,如果有,父级是否有一个supervisor(然后复制它的supervisor)?如果没有,指定主管X。
    其中x='@'+'(位置的前三个字符)'+'主管'(在本例中,x=@abcsupervisor)

    这有可能吗??


    更新2:

    我和那个要求更改数据库的人谈过,我们在这里改变了一些想法。首先,父位置和子位置应该总是相同的(如果不是,那就完全是另一个问题)。所有站点(前3个位置字母)都应具有相同的所有者组和主管,因此本质上,我们只需查看工作订单条目在任一字段中是否具有空值,然后根据位置分配它。我相信下面的代码可以工作(但希望有人在我在系统上实现它之前对其进行检查)

    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 回复  |  直到 11 年前
        1
  •  1
  •   Ice    14 年前

    如果您做了一些更新语句,那么您的方法是正确的。 将插入的虚拟表放入UPDATE语句中,并使用一个唯一键(例如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
    

    我建议将默认值存储在单独的表中,以便在parentValues为空时方便连接。

    在触发器中放入两个update语句并编写一个代码where子句,以确保只执行一个语句…

    和平与好运

        2
  •  1
  •   Sun    11 年前

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

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

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

    或者,如果您有一个基本的查找来填充基于前三个位置的所有者组和主管,那么您可以执行一个if-then类型逻辑来在匹配时填充子工作订单中的数据。“位置”是我为父工作订单位置定义的变量:

    if v_location == 'ABC':
        mbo.setValue("ownergroup","ABCOwnerGroup")
        mbo.setValue("supervisor","ABCSupervisor")
    
        3
  •  0
  •   neuromouse    12 年前

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