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