create or replace package UDO_PKG_EQUIPTCF as /* Формирование дерева состава оборудования */ procedure EQCONFIG_HIER ( NEQPARENT in number, -- Рег. номер родительского узла состава оборудования COUT out clob -- Сериализованное XML-представление дерева ); /* Условия отбора технических объектов */ procedure EQCONFIG_THOBJ_LIST_COND; /* Формирование списка технических объектов для выбранного узла состава оборудования */ procedure EQCONFIG_THOBJ_LIST ( NEQPARENT in number, -- Рег. номер родительского узла состава оборудования NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) NPAGE_SIZE in number, -- Количество записей на странице (0 - все) CFILTERS in clob, -- Фильтры CORDERS in clob, -- Сортировки NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ COUT out clob -- Сериализованная таблица данных ); /* Формирование карточки технического объекта */ procedure EQCONFIG_THOBJ_CARD ( NEQCONFIG in number, -- Рег. номер технического объекта COUT out clob -- Сериализованная карточка ); /* Отправка запроса на формирование прогноза технического объекта */ procedure EQCONFIG_THOBJ_FORECAST ( NEQCONFIG in number, -- Рег. номер технического объекта NEQUIPDSCMML in number -- Рег. номер модели ); /* Формирование ремонтной ведомости для технического объекта */ procedure EQCONFIG_THOBJ_MAKE_EQRPSHEET ( NEQCONFIG in number, -- Рег. номер технического объекта SACATALOG in varchar2, -- Каталог размещения ведомости SEQTECSRVKIND in varchar2, -- Вид ремонта DPLANDATE_FROM in date, -- Плановая дата начала ремонта NIDENT out number -- Идентификатор списка сформированных ведомостей ); end UDO_PKG_EQUIPTCF; / create or replace package body UDO_PKG_EQUIPTCF as /* TODO: owner="root" created="02.08.2024" text="Проверка прав доступа при формировании таблицы и карточки ТО" */ /* Формирование ветки дерева состава оборудования */ function EQCONFIG_HIER_NODE ( NCUR in integer, -- Курсор документа для результата NCOMPANY in number, -- Рег. номер организации NEQPARENT 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, M.OBJ_KIND NOBJ_KIND, 0 NSHOW_CARD 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) = NEQPARENT and M.COMPANY = NCOMPANY order by 3) 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; /* Для технического объекта, не имеющего дочерних - соберём признак отображения карточки */ if ((C.NHASCHILDREN = 0) and (C.NOBJ_KIND is not null)) then C.NSHOW_CARD := 1; 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), RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'showCard', NVALUE => C.NSHOW_CARD)), RNODE00 => XCHILD); /* Соберём листы в ветку */ XRES := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XRES, RNODE01 => XLEAF); end loop; /* Вернём собранное */ return XRES; end EQCONFIG_HIER_NODE; /* Формирование дерева состава оборудования */ procedure EQCONFIG_HIER ( NEQPARENT 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, NEQPARENT => NEQPARENT)); /* Конвертируем в 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_LIST_COND is begin /* Установка главной таблицы */ PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'EQCONFIG'); /* Обозначение */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE', SCONDITION_NAME => 'SCODEFrom'); /* Наименование */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME', SCONDITION_NAME => 'SNAMEFrom'); /* Дата ввода в эксплуатацию */ PKG_COND_BROKER.ADD_CONDITION_BETWEEN(SCOLUMN_NAME => 'OPER_DATE', SCONDITION_NAME_FROM => 'DOPER_DATEFrom', SCONDITION_NAME_TO => 'DOPER_DATETo'); /* Состояние */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE', SCONDITION_NAME => 'SUSE_KINDFrom', SJOINS => 'HLSTATETYPES <- RN;HLSTATETYPES'); /* Класс */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME', SCONDITION_NAME => 'SOBJ_KINDFrom', SJOINS => 'OBJ_KIND <- RN;EQOBJKIND'); /* Действия с моделями прогнозирования */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'NCMML_STATUSFrom') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'UDO_PKG_EQUIPDS.CMML_STATUS_BY_EQCONFIG') || '(RN) = :NCMML_STATUS'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'NCMML_STATUS', SVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'NCMML_STATUSFrom')); end if; end EQCONFIG_THOBJ_LIST_COND; /* Формирование списка технических объектов для выбранного узла состава оборудования */ procedure EQCONFIG_THOBJ_LIST ( NEQPARENT in number, -- Рег. номер родительского узла состава оборудования NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) NPAGE_SIZE in number, -- Количество записей на странице (0 - все) CFILTERS in clob, -- Фильтры CORDERS in clob, -- Сортировки NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ COUT out clob -- Сериализованная таблица данных ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса begin /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); /* Читаем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCODE', SCAPTION => 'Обозначение', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNAME', SCAPTION => 'Наименование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DOPER_DATE', SCAPTION => 'Дата ввода в эксплуатацию', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SUSE_KIND', SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NOBJ_KIND', SCAPTION => 'Рег. номер класса технического объекта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SOBJ_KIND', SCAPTION => 'Класс', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 2); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCMML_STATUS', SCAPTION => 'Модель', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BORDER => true, BFILTER => true, RCOL_VALS => RCOL_VALS); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL); /* Формируем запрос */ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select C.RN NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.CODE SCODE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C."NAME" SNAME,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.OPER_DATE DOPER_DATE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ST.CODE SUSE_KIND,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.OBJ_KIND NOBJ_KIND,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' OK.NAME SOBJ_KIND,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'UDO_PKG_EQUIPDS.CMML_STATUS_BY_EQCONFIG') || '(C.RN) NCMML_STATUS'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from EQCONFIG C'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join HLSTATETYPES ST on C.HLSTATETYPES = ST.RN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQOBJKIND OK'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where C.EQPARENT = :NEQPARENT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and C.OBJ_KIND = OK.RN'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and C.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); /* Учтём фильтры */ PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, NCOMPANY => NCOMPANY, SUNIT => 'EquipConfiguration', SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_LIST_COND'), RDATA_GRID => RDG, RFILTERS => RF); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); /* Делаем подстановку параметров */ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NEQPARENT', NVALUE => NEQPARENT); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO); /* Описываем структуру записи курсора */ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 7); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; end if; /* Обходим выбранные записи */ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRN', ICURSOR => ICURSOR, NPOSITION => 1, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, SNAME => 'DOPER_DATE', ICURSOR => ICURSOR, NPOSITION => 4); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SUSE_KIND', ICURSOR => ICURSOR, NPOSITION => 5); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NOBJ_KIND', ICURSOR => ICURSOR, NPOSITION => 6); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SOBJ_KIND', ICURSOR => ICURSOR, NPOSITION => 7); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NCMML_STATUS', ICURSOR => ICURSOR, NPOSITION => 8); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); exception when others then PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); raise; end; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end EQCONFIG_THOBJ_LIST; /* Формирование карточки технического объекта */ procedure EQCONFIG_THOBJ_CARD ( NEQCONFIG in number, -- Рег. номер технического объекта COUT out clob -- Сериализованная карточка ) is NCUR integer; -- Курсор документа для результата XDOC PKG_XMAKE.TNODE; -- Документ для результата XCARD PKG_XMAKE.TNODE; -- XML-карточка begin /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обратимся к данным технического объекта */ for C in (select T.RN NRN, T.CODE SCODE, T.NAME SNAME, T.OPER_DATE DOPER_DATE, OK.NAME SEQOBJKIND from EQCONFIG T, EQOBJKIND OK where T.RN = NEQCONFIG and T.OBJ_KIND = OK.RN) loop /* Соберем карточку */ XCARD := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'techObj', RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'NRN', NVALUE => C.NRN), RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SCODE', SVALUE => C.SCODE), RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SNAME', SVALUE => C.SNAME), RATTRIBUTE03 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'DOPER_DATE', DVALUE => C.DOPER_DATE), RATTRIBUTE04 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEQOBJKIND', SVALUE => C.SEQOBJKIND))); end loop; /* Формируем XML-представление документа ответа */ XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XCARD); /* Сериализуем документ */ 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_THOBJ_CARD; /* Отправка запроса на формирование прогноза технического объекта */ procedure EQCONFIG_THOBJ_FORECAST ( NEQCONFIG in number, -- Рег. номер технического объекта NEQUIPDSCMML in number -- Рег. номер модели ) is NEQUIPDSCMMLH PKG_STD.TREF; -- Рег. номер истории запросов модели CDEMO clob; -- Демо-данные прогноза begin /* Добавляем запись истории запросов */ UDO_PKG_EQUIPDS_BASE.CMMLH_INS(NPRN => NEQUIPDSCMML, NEQCONFIG => NEQCONFIG, SRQ_AUTHID => UTILIZER(), DRQ_DATE => sysdate, BRQ => null, NRN => NEQUIPDSCMMLH); /* Добавим демо-данные */ for C in (select T.TASK from UDO_T_EQUIPDSCMML T where T.RN = NEQUIPDSCMML) loop UDO_PKG_EQUIPDS.CMMLH_DEMO_BUILD(STASK => C.TASK, COUT => CDEMO); UDO_PKG_EQUIPDS_BASE.CMMLH_SET_FORECAST(NRN => NEQUIPDSCMMLH, BFORECAST => CLOB2BLOB(LCDATA => CDEMO)); end loop; end EQCONFIG_THOBJ_FORECAST; /* Формирование ремонтной ведомости для технического объекта */ procedure EQCONFIG_THOBJ_MAKE_EQRPSHEET ( NEQCONFIG in number, -- Рег. номер технического объекта SACATALOG in varchar2, -- Каталог размещения ведомости SEQTECSRVKIND in varchar2, -- Вид ремонта DPLANDATE_FROM in date, -- Плановая дата начала ремонта NIDENT out number -- Идентификатор списка сформированных ведомостей ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCRN PKG_STD.TREF; -- Рег. номер каталога размещения ведомости SJURPERSONS PKG_STD.TSTRING; -- Юридическая принадлежность технического объекта SCURRENCY PKG_STD.TSTRING; -- Валюта ведомости SDOCTYPES PKG_STD.TSTRING; -- Тип документа ведомости SPREF PKG_STD.TSTRING; -- Префикс ведосмости SNUMB PKG_STD.TSTRING; -- Номер ведомости NEQRPSHEET PKG_STD.TREF; -- Рег. номер сформированной ведомости NSELECTLIST PKG_STD.TREF; -- Рег. номер позиции списк сформированных ведомостей begin /* Определяем юридическую принадлежность технического объекта */ begin select JP.CODE into SJURPERSONS from EQCONFIG T, JURPERSONS JP where T.RN = NEQCONFIG and T.JUR_PERS = JP.RN; exception when NO_DATA_FOUND then PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NEQCONFIG, SUNIT_TABLE => 'EquipConfiguration'); end; /* Читаем валюту документа по-умолчанию из параметров */ SCURRENCY := GET_OPTIONS_STR(SCODE => 'Equip_RepairSheets_Currency'); /* Читаем тип документа по-умолчанию из параметров */ SDOCTYPES := GET_OPTIONS_STR(SCODE => 'Equip_RepairSheets_DocType'); /* Читаем префикс документа по-умолчанию из параметров */ SPREF := GET_OPTIONS_STR(SCODE => 'Equip_RepairSheets_DocPref'); /* Формируем очередной номер документа */ P_EQRPSHEETS_GETNEXTNUMB(NCOMPANY => NCOMPANY, SPREF => SPREF, SDOCTYPES => SDOCTYPES, SNUMB => SNUMB); /* Определяем каталог размещения */ FIND_ACATALOG_NAME(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NVERSION => null, SUNITCODE => 'EquipRepairSheets', SNAME => SACATALOG, NRN => NCRN); /* Формируем ведомость */ P_EQRPSHEETS_MAKE_EQRPSHEET(NCOMPANY => NCOMPANY, NCRN => NCRN, SDOCTYPES => SDOCTYPES, SPREF => SPREF, SNUMB => SNUMB, DDOCDATE => sysdate, SJURPERSONS => SJURPERSONS, DPLANDATE_FROM => DPLANDATE_FROM, DPLANDATE_TO => DPLANDATE_FROM, SCURRENCY => SCURRENCY, NCOURSE => 1, SEQTECSRVKIND => SEQTECSRVKIND, NPR_OBJ => null, NTECH_OBJ => NEQCONFIG, STECH_SRV_DIV => null, SRESP_DIV => null, SPERF_DIV => null, SPERFORM_AGN => null, SLEVEL => null, SEQOBJKIND => null, NRN => NEQRPSHEET); /* Добавим ведомость в список */ NIDENT := GEN_IDENT(); P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => NEQRPSHEET, SUNITCODE => 'EquipRepairSheets', NRN => NSELECTLIST); end EQCONFIG_THOBJ_MAKE_EQRPSHEET; end UDO_PKG_EQUIPTCF; /