MAximo工作单总人工成本和总物料成本

时间:2019-07-17 20:29:18

标签: oracle maximo

我正在与DBA合作,试图找出一种汇总与工单相关的所有成本的方法。由于任何工作单都可以具有多个子工作单(通过多个“世代”)以及相关工作单(通过RELATEDRECORDS表),因此我需要能够获取所有子工作和相关工作的ACTLABORCOST和ACTMATERIALCOST字段的总和工作指令(以及他们的每个孩子和相关工作指令)。我通过分层查询(使用CONNECT BY PRIOR)进行了工作,以获取所有的子代,孙子等,但是我仍然受制于相关的工作指令。由于每个工作订单都可以具有与其自己的子工作订单和相关工作订单相关的工作订单,因此我需要一个Oracle函数,该功能可以深入研究子工作流程,相关工作订单及其子工作流程和相关工作订单。由于我认为这应该是相当普遍的事情,所以我希望有人能够做到这一点,并且可以分享他们所做的事情。

3 个答案:

答案 0 :(得分:1)

您是否考虑过WOGRANDTOTAL对象?在MAXOBJECT中的描述为“非持久表以显示WO总计”。您可以从“选择操作/更多操作”菜单进入“工作单跟踪”应用程序中的对话框。既然您反复提到它,我应该注意到WOGRANDTOTAL值不包括跨RELATEDRECORDS到其他工作订单层次结构的联接。

您还可以通过加入WOANCESTOR来节省CONNECT BY PRIOR的复杂性,这实际上是CONNECT BY PRIOR查询的转储。 (还有其他%ANCESTOR表用于其他层次结构。)

我认为,如果需要Maximo中的结果,则递归自动化脚本将是执行所需操作的最佳方法。如果您需要Maximo以外的总成本,则也许可以使用递归函数。

答案 1 :(得分:1)

另一种选择是Francisco Sitja建议的递归查询。由于我的Oracle不允许2个UNION ALL,因此我不得不在两个子查询中都连接到WOANCESTOR表,而不是专门使用UNION ALL进行WO层次结构。然后,我可以使用一个允许的UNION ALL来进行RELATEDRECORD层次结构。而且似乎运行很快。

with mywos (wonum, parent, taskid, worktype, description, origrecordid, woclass, siteid) as (
    -- normal WO hierarchy
    select wo.wonum, wo.parent, wo.taskid, wo.worktype, wo.description, wo.origrecordid, wo.woclass, wo.siteid
    from woancestor a
        join workorder wo
            on a.wonum = wo.wonum
            and a.siteid = wo.siteid
    where a.ancestor = 'MY-STARTING-WONUM'
    union all
    -- WO hierarchy associated via RELATEDRECORD
    select wo.wonum, wo.parent, wo.taskid, wo.worktype, wo.description, wo.origrecordid, wo.woclass, wo.siteid
    from mywos
        join relatedrecord rr
            on mywos.woclass = rr.class
            and mywos.siteid = rr.siteid
            and mywos.wonum = rr.recordkey
            -- prevent cycle / going back up the hierarchy
            and rr.relatetype not in ('ORIGINATOR')
        join woancestor a
            on rr.relatedrecsiteid = a.siteid
            and rr.relatedreckey = a.ancestor 
        join workorder wo
            on a.siteid = wo.siteid
            and a.wonum = wo.wonum
)
select * from mywos
;

答案 2 :(得分:0)

我们终于弄清楚了如何实现这一目标。

WITH WO(WONUM,
PARENT) AS
((SELECT X.WONUM,
                  X.PARENT
        FROM (SELECT R.RECORDKEY WONUM,
                                    R.RELATEDRECKEY PARENT
                        FROM MAXIMO.RELATEDRECORD R
                        WHERE R.RELATEDRECKEY = '382418'
                    UNION ALL
                    SELECT W.WONUM,
                                    W.PARENT
                        FROM MAXIMO.WORKORDER W
                        START WITH W.PARENT = '382418'
                    CONNECT BY PRIOR W.WONUM = W.PARENT) X) 
           UNION ALL 
  SELECT W.WONUM, W.PARENT FROM MAXIMO.WORKORDER W, WO WHERE W.WONUM = WO.PARENT)
SELECT DISTINCT WONUM FROM WO;

这将返回给定工作单的所有子工作单和相关工作单的列表。

相关问题