diff --git a/db/UDO_PKG_EQUIPTCF.pck b/db/UDO_PKG_EQUIPTCF.pck new file mode 100644 index 0000000..a097497 --- /dev/null +++ b/db/UDO_PKG_EQUIPTCF.pck @@ -0,0 +1,127 @@ +create or replace package UDO_PKG_EQUIPTCF as + + /* Формирование дерева состава оборудования */ + procedure EQCONFIG_HIER + ( + NPEQCONFIG in number, -- Рег. номер родительского узла состава оборудования + COUT out clob -- Сериализованное XML-представление дерева + ); + + /* Формирование списка технических объектов для выбранного узла состава оборудования */ + procedure EQCONFIG_THOBJ_DG + ( + NPEQCONFIG in number -- Рег. номер родительского узла состава оборудования + ); + +end UDO_PKG_EQUIPTCF; +/ +create or replace package body UDO_PKG_EQUIPTCF as + + /* Формирование ветки дерева состава оборудования */ + function EQCONFIG_HIER_NODE + ( + NCUR in integer, -- Курсор документа для результата + NCOMPANY in number, -- Рег. номер организации + NPEQCONFIG in number -- Рег. номер родительского узла состава оборудования + ) return PKG_XMAKE.TNODE -- XML-описание веток дерева + is + XLEAF PKG_XMAKE.TNODE; -- Текущий лист + XCHILD PKG_XMAKE.TNODE; -- Дочерние листы текущего + XRES PKG_XMAKE.TNODE; -- Буфер для результата + begin + /* Обходим состав оборудования с заданного корня */ + for C in (select M.RN NRN, + M.EQPARENT NHRN, + DECODE(M.FICT_REC, 0, M.NAME, DECODE(OL.RN, null, M.NAME, OL.NAME)) SNAME, + case + when exists + (select null + from EQCONFIG C + where C.EQPARENT = M.RN + and exists (select null from V_USERPRIV_HIER_SINGL UP where UP.HIERARCHY = C.RN)) then + 1 + else + 0 + end NHASCHILDREN + from EQCONFIG M, + EQOBJLEVEL OL + where M.PR_OBJ_LEVEL = OL.RN(+) + and ((M.FICT_REC = 0) or ((M.FICT_REC = 1) and (CMP_VC2(M.NAME, F_EQCONFIG_EXTRANAME(0)) = 1))) + and exists (select null from V_USERPRIV_HIER_SINGL UP where UP.HIERARCHY = M.RN) + and COALESCE(M.EQPARENT, 0) = NPEQCONFIG + and M.COMPANY = NCOMPANY) + loop + /* Если есть дочерние ветки */ + if (C.NHASCHILDREN = 1) then + /* Добавим фиктивную дочернюю запись для индикации наличия дочерних на клиенте */ + XCHILD := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, + SNAME => 'children', + RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, + RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'id', + SVALUE => C.NRN || + '_loader'), + RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'label', + SVALUE => 'Минуточку...'))); + else + XCHILD := null; + end if; + /* Соберём лист */ + XLEAF := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, + SNAME => 'children', + RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, + RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'id', + SVALUE => C.NRN), + RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'label', + SVALUE => C.SNAME)), + RNODE00 => XCHILD); + /* Соберём листы в ветку */ + XRES := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XRES, RNODE01 => XLEAF); + end loop; + /* Вернём собранное */ + return XRES; + end EQCONFIG_HIER_NODE; + + /* Формирование дерева состава оборудования */ + procedure EQCONFIG_HIER + ( + NPEQCONFIG in number, -- Рег. номер родительского узла состава оборудования + COUT out clob -- Сериализованное XML-представление дерева + ) + is + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации + NCUR integer; -- Курсор документа для результата + XDOC PKG_XMAKE.TNODE; -- Документ для результата + begin + /* Открываем документ */ + NCUR := PKG_XMAKE.OPEN_CURSOR(); + /* Формируем XML-представление ветки для запрошенного родителя */ + XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, + SNAME => 'XDATA', + RNODE00 => EQCONFIG_HIER_NODE(NCUR => NCUR, NCOMPANY => NCOMPANY, NPEQCONFIG => NPEQCONFIG)); + /* Конвертируем в CLOB */ + COUT := PKG_XMAKE.SERIALIZE_TO_CLOB(ICURSOR => NCUR, + ITYPE => PKG_XMAKE.CONTENT_, + RNODE => XDOC, + RHEADER => PKG_XHEADER.WRAP_ALL(SVERSION => PKG_XHEADER.VERSION_1_0_, + SENCODING => PKG_XHEADER.ENCODING_UTF_, + SSTANDALONE => PKG_XHEADER.STANDALONE_YES_)); + /* Закрываем документ */ + PKG_XMAKE.CLOSE_CURSOR(ICURSOR => NCUR); + end EQCONFIG_HIER; + + /* Формирование списка технических объектов для выбранного узла состава оборудования */ + procedure EQCONFIG_THOBJ_DG + ( + NPEQCONFIG in number -- Рег. номер родительского узла состава оборудования + ) + is + begin + null; + end EQCONFIG_THOBJ_DG; + +end UDO_PKG_EQUIPTCF; +/ diff --git a/db/grants.sql b/db/grants.sql new file mode 100644 index 0000000..63ea6a9 --- /dev/null +++ b/db/grants.sql @@ -0,0 +1,2 @@ +grant execute on UDO_PKG_EQUIPTCF to public; +grant execute on UDO_PKG_EQUIPDS to public;