MAximo 工单总人工成本和总 Material 成本
MAximo workorder total labor costs and total Material costs
我正在与我的 DBA 合作,试图找到一种方法来汇总与工单相关的所有成本。由于任何工作订单都可以有多个子工作订单(通过多个 "generations")以及相关的工作订单(通过 RELATEDRECORDS table),我需要能够获得 ACTLABORCOST 和 ACTMATERIALCOST 的总和所有子工单和相关工单(以及它们的每个子工单和相关工单)的字段。我已经通过分层查询(使用 CONNECT BY PRIOR)来获取所有的子项、孙项等,但我被困在相关的工作订单上。由于每个工作订单都可以有一个相关工作订单及其自己的子订单和相关工作订单,因此我需要一个 Oracle 函数来深入了解子订单和相关工作订单及其子订单和相关工作订单。因为我认为这应该是相当普遍的事情,所以我希望有人已经这样做了并且可以分享他们所做的事情。
您是否考虑过 WOGRANDTOTAL 对象?它在 MAXOBJECT 中的描述是 "Non-Persistent table to display WO grandtotals"。工单跟踪应用程序中有一个对话框,您可以从 Select 操作/更多操作菜单访问该对话框。由于您反复提到它,我应该注意 WOGRANDTOTAL 值不包括跨 RELATEDRECORDS 到其他工作订单层次结构的连接。
您还可以通过加入 WOANCESTOR 来避免 CONNECT BY PRIOR 的复杂性,WOANCESTOR 实际上是 CONNECT BY PRIOR 查询的转储。 (其他层次结构还有其他 %ANCESTOR 表。)
如果您需要 Maximo 中的结果,我认为递归自动化脚本将是执行您想要的操作的最佳方式。如果您需要 Maximo 之外的总成本,也许递归函数会起作用。
另一种选择是递归查询,正如 Francisco Sitja 所建议的那样。由于我的 Oracle 不允许 2 UNION ALL
s,我不得不在两个子查询中联合到 WOANCESTOR table,而不是专门用于执行 WO 层次结构的 UNION ALL
。然后,我能够使用允许的 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
;
我们终于想出了解决办法。
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;
此 returns 给定工单的所有子工单和相关工单的列表。
我正在与我的 DBA 合作,试图找到一种方法来汇总与工单相关的所有成本。由于任何工作订单都可以有多个子工作订单(通过多个 "generations")以及相关的工作订单(通过 RELATEDRECORDS table),我需要能够获得 ACTLABORCOST 和 ACTMATERIALCOST 的总和所有子工单和相关工单(以及它们的每个子工单和相关工单)的字段。我已经通过分层查询(使用 CONNECT BY PRIOR)来获取所有的子项、孙项等,但我被困在相关的工作订单上。由于每个工作订单都可以有一个相关工作订单及其自己的子订单和相关工作订单,因此我需要一个 Oracle 函数来深入了解子订单和相关工作订单及其子订单和相关工作订单。因为我认为这应该是相当普遍的事情,所以我希望有人已经这样做了并且可以分享他们所做的事情。
您是否考虑过 WOGRANDTOTAL 对象?它在 MAXOBJECT 中的描述是 "Non-Persistent table to display WO grandtotals"。工单跟踪应用程序中有一个对话框,您可以从 Select 操作/更多操作菜单访问该对话框。由于您反复提到它,我应该注意 WOGRANDTOTAL 值不包括跨 RELATEDRECORDS 到其他工作订单层次结构的连接。
您还可以通过加入 WOANCESTOR 来避免 CONNECT BY PRIOR 的复杂性,WOANCESTOR 实际上是 CONNECT BY PRIOR 查询的转储。 (其他层次结构还有其他 %ANCESTOR 表。)
如果您需要 Maximo 中的结果,我认为递归自动化脚本将是执行您想要的操作的最佳方式。如果您需要 Maximo 之外的总成本,也许递归函数会起作用。
另一种选择是递归查询,正如 Francisco Sitja 所建议的那样。由于我的 Oracle 不允许 2 UNION ALL
s,我不得不在两个子查询中联合到 WOANCESTOR table,而不是专门用于执行 WO 层次结构的 UNION ALL
。然后,我能够使用允许的 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
;
我们终于想出了解决办法。
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;
此 returns 给定工单的所有子工单和相关工单的列表。