Я работаю со своим администратором баз данных, чтобы попытаться найти способ свести все расходы, связанные с заказом на работу. Поскольку любое рабочее задание может иметь несколько дочерних рабочих заданий (через несколько «поколений»), а также связанных рабочих заданий (через таблицу RELATEDRECORDS), мне нужно иметь возможность получить общее количество полей ACTLABORCOST и ACTMATERIALCOST для всех дочерних и связанных рабочие задания (а также каждый из их дочерних и связанных рабочих заданий). Я работал с иерархическим запросом (используя CONNECT BY PRIOR), чтобы получить всех детей, внуков и т. д., но я застрял на связанных рабочих заданиях. Поскольку каждое рабочее задание может иметь связанное рабочее задание со своими дочерними элементами и связанными рабочими заданиями, мне нужна функция Oracle, которая детализирует дочерние элементы и связанные рабочие задания, а также их дочерние элементы и связанные рабочие задания. Поскольку я думаю, что это должно быть довольно распространенным явлением, я надеюсь, что есть кто-то, кто сделал это и может поделиться тем, что они сделали.
Общие затраты на рабочую силу и общие затраты на материалы MAximo workorder
Ответы (3)
Другим вариантом может быть рекурсивный запрос, предложенный Франсиско Ситья. Поскольку мой 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
;
Рассматривали ли вы объект WOGRANDTOTAL? Его описание в MAXOBJECT: «Непостоянная таблица для отображения общих итогов WO». В приложении «Отслеживание заказов на работу» есть диалоговое окно, доступ к которому можно получить из меню «Выбрать действие» / «Дополнительные действия». Поскольку вы неоднократно упоминали об этом, я должен отметить, что значения WOGRANDTOTAL не включают соединения через RELATEDRECORDS с другими иерархиями рабочих заданий.
Вы также можете избавить себя от сложностей с CONNECT BY PRIOR, присоединившись к WOANCESTOR, который фактически является дампом из запроса CONNECT BY PRIOR. (Есть другие таблицы %ANCESTOR для других иерархий.)
Я думаю, что рекурсивный сценарий автоматизации был бы лучшим способом сделать то, что вы хотите, если вам нужны результаты в Maximo. Если вам нужна общая стоимость за пределами Maximo, возможно, сработает рекурсивная функция.
Наконец-то мы поняли, как это осуществить.
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;
Это возвращает список всех дочерних и связанных рабочих заданий для данного рабочего задания.
with
использует это, чтобы снова спуститься. Таким образом, вы получите от '382418'
и вниз плюс один уровень вниз и вниз. Но ваше первоначальное требование состояло в том, чтобы пройти весь путь (сколь угодно много уровней) и все вниз, что, я думаю, достигает мой запрос.
- person Preacher; 19.07.2019