From 95941891315290bf785f3793897fa533d8e754df Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 1 Aug 2024 12:46:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D0=B9=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B0=20"=D0=9F?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D0=BD=D0=BE=D0=B7=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5"=20=D0=B8=20=D1=81=D0=BA=D1=80=D0=B8?= =?UTF-8?q?=D0=BF=D1=82=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B0=D0=B2=20=D0=B4=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=83=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/UDO_PKG_EQUIPTCF.pck | 127 ++++++++++++++++++++++++++++++++++++++++ db/grants.sql | 2 + 2 files changed, 129 insertions(+) create mode 100644 db/UDO_PKG_EQUIPTCF.pck create mode 100644 db/grants.sql 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;