create or replace package UDO_PKG_EQUIPDS as /* Список "Выборки данных оборудования" */ procedure LIST ( COUT out clob -- Сериализованная таблица данных ); /* Клиентское добавление "Выборки данных оборудования" */ procedure INS ( SCODE in varchar2, -- Мнемокод SNAME in varchar2, -- Наименование NRN out number -- Регистрационный номер ); /* Клиентское удаление "Выборки данных оборудования" */ procedure DEL ( NRN in number -- Регистрационный номер ); /* Клиентское формирование "Выборки данных оборудования" по классу технического объекта */ procedure MAKE ( SEQUIPDS in varchar2, -- Выборка данных оборудования SEQOBJKIND in varchar2, -- Класс оборудования SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой SEXSSERVICEFN_SEND_RQCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами обработки внешней системой NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных ); /* Карточка "Выборки данных оборудования (классы оборудования)" */ procedure CM_CARD ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная карточка ); /* Список "Выборки данных оборудования (классы оборудования)" */ procedure CM_LIST ( NEQUIPDS in number, -- Рег. номер выборки данных COUT out clob -- Сериализованный список ); /* Клиентское добавление "Выборки данных оборудования (классы оборудования)" */ procedure CM_INS ( NPRN in number, -- Родитель SEQOBJKIND in varchar2, -- Класс оборудования SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой SEXSSERVICEFN_SEND_RQCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами обработки внешней системой NRN out number -- Регистрационный номер ); /* Клиентское исправление "Выборки данных оборудования (классы оборудования)" */ procedure CM_UPD ( NRN in number, -- Регистрационный номер SEQOBJKIND in varchar2, -- Класс оборудования SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой SEXSSERVICEFN_SEND_RQCB in varchar2 -- Функция сервиса обмена для приёма Call-back запросов с результатами обработки внешней системой ); /* Клиентское удаление "Выборки данных оборудования (классы оборудования)" */ procedure CM_DEL ( NRN in number -- Регистрационный номер ); /* Клиентское получение списка доступных выборок данных "Выборки данных оборудования (классы оборудования)" */ procedure CM_DATASET_LIST ( NRN in number, -- Регистрационный номер NSTATUS in number := null, -- Статус (null - все, см. константы UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_*) COUT out clob -- Сериализованный список ); /* Список "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ); /* Удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_DEL ( NRN in number -- Регистрационный номер ); /* Формирование "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_MAKE ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных NDATASET_IDENT in number, -- Идентификатор буфера данных NDATASET_CONFIG_IDENT in number, -- Идентификатор буфера описания данных NCLEAR in number := 0 -- Флаг очистки имеющихся файлов данных (0 - не очищать, 1 - очистить) ); /* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_UPLOAD ( NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных ); /* Передача внешней системе "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_SEND_MD ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных NDATASET_ID in number -- Идентификатор выборки ); /* Список "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ); /* Клиентское добавление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_INS ( NPRN in number, -- Родитель STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*) NDATASET_ID in number, -- Идентификатор выборки NRN out number -- Регистрационный номер ); /* Клиентское удаление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_DEL ( NRN in number -- Регистрационный номер ); /* Обработка внешней системой "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_SEND_RQ ( NEQUIPDSCMML in number -- Рег. номер модели класса оборудования выборки данных ); /* Состояние "Выборки данных оборудования (классы оборудования, модели)" по единице оборудования */ function CMML_STATUS_BY_EQCONFIG ( NEQCONFIG in number -- Рег. номер позиции состава оборудования ) return number; -- Код действия с моделью (0 - нет моделей, 1 - есть модели в процессе обучения, 2 - есть обученные модели) /* Список "Выборки данных оборудования (классы оборудования, модели)" по единице оборудования */ procedure CMML_LIST_BY_EQCONFIG ( NEQCONFIG in number, -- Рег. номер позиции состава оборудования COUT out clob -- Сериализованная таблица данных ); /* Формирование данных прогноза "Выборки данных оборудования (классы оборудования, модели, история запросов)" */ procedure CMMLH_BUILD_FORECAST ( COUT out clob -- Данные прогноза ); /* Извлечение описания из данных прогноза "Выборки данных оборудования (классы оборудования, модели, история запросов)" */ procedure CMMLH_PARSE_FORECAST ( CFORECAST in clob, -- Данные прогноза NFORECAST out number -- Значение прогноза ); /* Список "Выборки данных оборудования (классы оборудования, модели, история запросов)" по единице оборудования */ procedure CMMLH_LIST_BY_EQCONFIG ( NEQCONFIG in number, -- Рег. номер позиции состава оборудования COUT out clob -- Сериализованная таблица данных ); end UDO_PKG_EQUIPDS; / create or replace package body UDO_PKG_EQUIPDS as /* Список "Выборки данных оборудования" */ procedure LIST ( COUT out clob -- Сериализованная таблица данных ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NCUR integer; -- Курсор документа для результата XDOC PKG_XMAKE.TNODE; -- Документ для результата XDS PKG_XMAKE.TNODE; -- Элемент для выборки данных NACCESS PKG_STD.TNUMBER := 0; -- Флаг наличия доступа к моделям (0 - доступа нет, 1 - доступ есть) begin /* Проверим права доступа */ if (UDO_PKG_EQUIPDS_BASE.UTL_ACCESS_CHECK(SUSER => UTILIZER(), STABLE => 'UDO_T_EQUIPDS', SACTION => 'UDO_EQUIPDS_SELECT')) then NACCESS := 1; end if; /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обходим выборки данных */ for C in (select T.RN NRN, T.CODE SCODE, T.NAME SNAME from UDO_T_EQUIPDS T where T.COMPANY = NCOMPANY and NACCESS = 1 order by T.NAME) loop XDS := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XDS, RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDS', RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'NRN', SVALUE => C.NRN), RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SCODE', SVALUE => C.SCODE), RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SNAME', SVALUE => C.SNAME)))); end loop; /* Формируем XML-представление ответа */ XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XDS, RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'NACCESS', RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR, NVALUE => NACCESS))); /* Конвертируем в 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 LIST; /* Клиентское добавление "Выборки данных оборудования" */ procedure INS ( SCODE in varchar2, -- Мнемокод SNAME in varchar2, -- Наименование NRN out number -- Регистрационный номер ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация begin /* Проверим параметры */ if (SCODE is null) then P_EXCEPTION(0, 'Не указан мнемокод.'); end if; if (SNAME is null) then P_EXCEPTION(0, 'Не указано наименование.'); end if; /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDS', SACTION => 'UDO_EQUIPDS_INSERT'); /* Добавляем запись */ UDO_PKG_EQUIPDS_BASE.INS(NCOMPANY => NCOMPANY, SCODE => SCODE, SNAME => SNAME, NRN => NRN); end INS; /* Клиентское удаление "Выборки данных оборудования" */ procedure DEL ( NRN in number -- Регистрационный номер ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDS', SACTION => 'UDO_EQUIPDS_DELETE', NDOCUMENT => NRN); /* Удаляем запись */ UDO_PKG_EQUIPDS_BASE.DEL(NRN => NRN, NCOMPANY => NCOMPANY); end DEL; /* Клиентское формирование "Выборки данных оборудования" по классу технического объекта */ procedure MAKE ( SEQUIPDS in varchar2, -- Выборка данных оборудования SEQOBJKIND in varchar2, -- Класс оборудования SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой SEXSSERVICEFN_SEND_RQCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами обработки внешней системой NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация begin /* Проверим параметры */ if (SEQUIPDS is null) then P_EXCEPTION(0, 'Не указана выборка данных.'); end if; if (SEQOBJKIND is null) then P_EXCEPTION(0, 'Не указан класс оборудования.'); end if; if (SDICMUNTS is null) then P_EXCEPTION(0, 'Не указана единица измерения выборки.'); end if; if (SUSERPROCS_DATA is null) then P_EXCEPTION(0, 'Не указана процедура формирования данных выборки.'); end if; if ((SEXSSERVICE_UPLOAD is null) or (SEXSSERVICEFN_UPLOAD is null)) then P_EXCEPTION(0, 'Не указана функция обмена для выгрузки данных.'); end if; if ((SEXSSERVICE_SEND_MD is null) or (SEXSSERVICEFN_SEND_MD is null)) then P_EXCEPTION(0, 'Не указана функция обмена для передачи внешней системе.'); end if; if ((SEXSSERVICE_SEND_MDCB is null) or (SEXSSERVICEFN_SEND_MDCB is null)) then P_EXCEPTION(0, 'Не указана функция обмена для приёма обратной связи о передече внешней системе.'); end if; if ((SEXSSERVICE_SEND_RQ is null) or (SEXSSERVICEFN_SEND_RQ is null)) then P_EXCEPTION(0, 'Не указана функция обмена для обработки внешней системой.'); end if; if ((SEXSSERVICE_SEND_RQCB is null) or (SEXSSERVICEFN_SEND_RQCB is null)) then P_EXCEPTION(0, 'Не указана функция обмена для приёма обратной связи об обработке внешней системой.'); end if; /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDS', SACTION => 'UDO_EQUIPDS_MAKE'); /* Проверим наличие такой выборки */ UDO_PKG_EQUIPDS_BASE.FIND_BY_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SEQUIPDS, NRN => NEQUIPDS); /* Выборки нет */ if (NEQUIPDS is null) then /* Добавим выборку данных */ INS(SCODE => SEQUIPDS, SNAME => SEQUIPDS, NRN => NEQUIPDS); else /* Выборка есть - надо проверить в ней наличие класса оборудования */ UDO_PKG_EQUIPDS_BASE.CM_FIND_BY_EQOBJKIND(NFLAG_SMART => 1, NPRN => NEQUIPDS, SEQOBJKIND => SEQOBJKIND, NRN => NEQUIPDSCM); end if; /* Класса оборудования в выборке нет */ if (NEQUIPDSCM is null) then /* Добавляем запись класса оборудования */ CM_INS(NPRN => NEQUIPDS, SEQOBJKIND => SEQOBJKIND, SDICMUNTS => SDICMUNTS, SUSERPROCS_DATA => SUSERPROCS_DATA, SEXSSERVICE_UPLOAD => SEXSSERVICE_UPLOAD, SEXSSERVICEFN_UPLOAD => SEXSSERVICEFN_UPLOAD, SEXSSERVICE_SEND_MD => SEXSSERVICE_SEND_MD, SEXSSERVICEFN_SEND_MD => SEXSSERVICEFN_SEND_MD, SEXSSERVICE_SEND_MDCB => SEXSSERVICE_SEND_MDCB, SEXSSERVICEFN_SEND_MDCB => SEXSSERVICEFN_SEND_MDCB, SEXSSERVICE_SEND_RQ => SEXSSERVICE_SEND_RQ, SEXSSERVICEFN_SEND_RQ => SEXSSERVICEFN_SEND_RQ, SEXSSERVICE_SEND_RQCB => SEXSSERVICE_SEND_RQCB, SEXSSERVICEFN_SEND_RQCB => SEXSSERVICEFN_SEND_RQCB, NRN => NEQUIPDSCM); end if; end MAKE; /* Карточка "Выборки данных оборудования (классы оборудования)" */ procedure CM_CARD ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная карточка ) is NCUR integer; -- Курсор документа для результата XDOC PKG_XMAKE.TNODE; -- Документ для результата XEQUIPDSCM PKG_XMAKE.TNODE; -- Элемент для карточки begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_SELECT'); /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обращаемся к данным класса оборудования */ for C in (select T.RN NRN, FORMAT_HIER_NAME(null, null, OK.FULLCODE) SSEQOBJKIND, OK.NAME SNAME, DM.MEAS_MNEMO SDICMUNTS, UP.CODE SUSERPROCS_DATA, SU.CODE SEXSSERVICE_UPLOAD, SFU.CODE SEXSSERVICEFN_UPLOAD, SMD.CODE SEXSSERVICE_SEND_MD, SFMD.CODE SEXSSERVICEFN_SEND_MD, SMDCB.CODE SEXSSERVICE_SEND_MDCB, SFMDCB.CODE SEXSSERVICEFN_SEND_MDCB, SRQ.CODE SEXSSERVICE_SEND_RQ, SFRQ.CODE SEXSSERVICEFN_SEND_RQ, SRQCB.CODE SEXSSERVICE_SEND_RQCB, SFRQCB.CODE SEXSSERVICEFN_SEND_RQCB from UDO_T_EQUIPDSCM T, EQOBJKIND OK, USERPROCS UP, EXSSERVICE SU, EXSSERVICEFN SFU, EXSSERVICE SMD, EXSSERVICEFN SFMD, EXSSERVICE SMDCB, EXSSERVICEFN SFMDCB, EXSSERVICE SRQ, EXSSERVICEFN SFRQ, EXSSERVICE SRQCB, EXSSERVICEFN SFRQCB, DICMUNTS DM where T.RN = NEQUIPDSCM and T.EQOBJKIND = OK.RN and T.USERPROCS_DATA = UP.RN and T.EXSSERVICEFN_UPLOAD = SFU.RN and SFU.PRN = SU.RN and T.EXSSERVICEFN_SEND_MD = SFMD.RN and SFMD.PRN = SMD.RN and T.EXSSERVICEFN_SEND_MDCB = SFMDCB.RN and SFMDCB.PRN = SMDCB.RN and T.EXSSERVICEFN_SEND_RQ = SFRQ.RN and SFRQ.PRN = SRQ.RN and T.EXSSERVICEFN_SEND_RQCB = SFRQCB.RN and SFRQCB.PRN = SRQCB.RN and T.DICMUNTS = DM.RN) loop /* Собираем карточку класса оборудования */ XEQUIPDSCM := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XEQUIPDSCM', RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'NRN', SVALUE => C.NRN), RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SSEQOBJKIND', SVALUE => C.SSEQOBJKIND), RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SNAME', SVALUE => C.SNAME), RATTRIBUTE03 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SDICMUNTS', SVALUE => C.SDICMUNTS), RATTRIBUTE04 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SUSERPROCS_DATA', SVALUE => C.SUSERPROCS_DATA), RATTRIBUTE05 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_UPLOAD', SVALUE => C.SEXSSERVICE_UPLOAD), RATTRIBUTE06 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_UPLOAD', SVALUE => C.SEXSSERVICEFN_UPLOAD), RATTRIBUTE07 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_SEND_MD', SVALUE => C.SEXSSERVICE_SEND_MD), RATTRIBUTE08 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_SEND_MD', SVALUE => C.SEXSSERVICEFN_SEND_MD), RATTRIBUTE09 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_SEND_MDCB', SVALUE => C.SEXSSERVICE_SEND_MDCB), RATTRIBUTE10 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_SEND_MDCB', SVALUE => C.SEXSSERVICEFN_SEND_MDCB), RATTRIBUTE11 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_SEND_RQ', SVALUE => C.SEXSSERVICE_SEND_RQ), RATTRIBUTE12 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_SEND_RQ', SVALUE => C.SEXSSERVICEFN_SEND_RQ), RATTRIBUTE13 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_SEND_RQCB', SVALUE => C.SEXSSERVICE_SEND_RQCB), RATTRIBUTE14 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_SEND_RQCB', SVALUE => C.SEXSSERVICEFN_SEND_RQCB))); end loop; /* Формируем XML-представление ответа */ XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XEQUIPDSCM); /* Конвертируем в 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 CM_CARD; /* Список "Выборки данных оборудования (классы оборудования)" */ procedure CM_LIST ( NEQUIPDS in number, -- Рег. номер выборки данных COUT out clob -- Сериализованный список ) is NCUR integer; -- Курсор документа для результата XDOC PKG_XMAKE.TNODE; -- Документ для результата XDSCM PKG_XMAKE.TNODE; -- Элемент для выборки данных begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_SELECT'); /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обходим классы оборудования заданной выборки данных */ for C in (select T.RN NRN, OK.CODE SCODE, OK.NAME SNAME, DM.MEAS_MNEMO SDICMUNTS, UPD.CODE SUSERPROCS_DATA, UPL.CODE SEXSSERVICEFN_UPLOAD, SMD.CODE SEXSSERVICEFN_SEND_MD, SRQ.CODE SEXSSERVICEFN_SEND_RQ from UDO_T_EQUIPDSCM T, EQOBJKIND OK, DICMUNTS DM, USERPROCS UPD, EXSSERVICEFN UPL, EXSSERVICEFN SMD, EXSSERVICEFN SRQ where T.PRN = NEQUIPDS and T.EQOBJKIND = OK.RN and T.DICMUNTS = DM.RN and T.USERPROCS_DATA = UPD.RN and T.EXSSERVICEFN_UPLOAD = UPL.RN and T.EXSSERVICEFN_SEND_MD = SMD.RN and T.EXSSERVICEFN_SEND_RQ = SRQ.RN order by OK.CODE) loop XDSCM := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XDSCM, RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDSCM', RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'NRN', SVALUE => 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 => 'SDICMUNTS', SVALUE => C.SDICMUNTS), RATTRIBUTE04 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SUSERPROCS_DATA', SVALUE => C.SUSERPROCS_DATA), RATTRIBUTE05 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_UPLOAD', SVALUE => C.SEXSSERVICEFN_UPLOAD), RATTRIBUTE06 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_SEND_MD', SVALUE => C.SEXSSERVICEFN_SEND_MD), RATTRIBUTE07 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICEFN_SEND_RQ', SVALUE => C.SEXSSERVICEFN_SEND_RQ)))); end loop; /* Формируем XML-представление ответа */ XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XDSCM); /* Конвертируем в 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 CM_LIST; /* Клиентское добавление "Выборки данных оборудования (классы оборудования)" */ procedure CM_INS ( NPRN in number, -- Родитель SEQOBJKIND in varchar2, -- Класс оборудования SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой SEXSSERVICEFN_SEND_RQCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами обработки внешней системой NRN out number -- Регистрационный номер ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация NEQOBJKIND PKG_STD.TREF; -- Рег. номер класса оборудования NDICMUNTS PKG_STD.TREF; -- Рег. номер единицы измерения выборки NUSERPROCS_DATA PKG_STD.TREF; -- Рег. номер процедуры формирования NEXSSERVICEFN_UPLOAD PKG_STD.TREF; -- Рег. номер функции обмена для выгрузки данных NEXSSERVICEFN_SEND_MD PKG_STD.TREF; -- Рег. номер Функции обмена для передачи внешней системе NEXSSERVICEFN_SEND_MDCB PKG_STD.TREF; -- Рег. номер call-back функции обмена для передачи внешней системе NEXSSERVICEFN_SEND_RQ PKG_STD.TREF; -- Рег. номер функции обмена для обработки внешней системой NEXSSERVICEFN_SEND_RQCB PKG_STD.TREF; -- Рег. номер call-back функции обмена для обработки внешней системой begin /* Проверим параметры */ if (NPRN is null) then P_EXCEPTION(0, 'Не указана родительская выборка данных.'); end if; if (SEQOBJKIND is null) then P_EXCEPTION(0, 'Не указан класс оборудования.'); end if; if (SDICMUNTS is null) then P_EXCEPTION(0, 'Не указана единица измерения выборки.'); end if; if (SUSERPROCS_DATA is null) then P_EXCEPTION(0, 'Не указана процедура формирования данных выборки.'); end if; if ((SEXSSERVICE_UPLOAD is null) or (SEXSSERVICEFN_UPLOAD is null)) then P_EXCEPTION(0, 'Не указана функция обмена для выгрузки данных.'); end if; if ((SEXSSERVICE_SEND_MD is null) or (SEXSSERVICEFN_SEND_MD is null)) then P_EXCEPTION(0, 'Не указана функция обмена для передачи внешней системе.'); end if; if ((SEXSSERVICE_SEND_MDCB is null) or (SEXSSERVICEFN_SEND_MDCB is null)) then P_EXCEPTION(0, 'Не указана функция обмена для приёма обратной связи о передече внешней системе.'); end if; if ((SEXSSERVICE_SEND_RQ is null) or (SEXSSERVICEFN_SEND_RQ is null)) then P_EXCEPTION(0, 'Не указана функция обмена для обработки внешней системой.'); end if; if ((SEXSSERVICE_SEND_RQCB is null) or (SEXSSERVICEFN_SEND_RQCB is null)) then P_EXCEPTION(0, 'Не указана функция обмена для приёма обратной связи об обработке внешней системой.'); end if; /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_INSERT'); /* Разыменуем ссылки */ UDO_PKG_EQUIPDS_BASE.CM_JOINS(NCOMPANY => NCOMPANY, SEQOBJKIND => SEQOBJKIND, SDICMUNTS => SDICMUNTS, SUSERPROCS_DATA => SUSERPROCS_DATA, SEXSSERVICE_UPLOAD => SEXSSERVICE_UPLOAD, SEXSSERVICEFN_UPLOAD => SEXSSERVICEFN_UPLOAD, SEXSSERVICE_SEND_MD => SEXSSERVICE_SEND_MD, SEXSSERVICEFN_SEND_MD => SEXSSERVICEFN_SEND_MD, SEXSSERVICE_SEND_MDCB => SEXSSERVICE_SEND_MDCB, SEXSSERVICEFN_SEND_MDCB => SEXSSERVICEFN_SEND_MDCB, SEXSSERVICE_SEND_RQ => SEXSSERVICE_SEND_RQ, SEXSSERVICEFN_SEND_RQ => SEXSSERVICEFN_SEND_RQ, SEXSSERVICE_SEND_RQCB => SEXSSERVICE_SEND_RQCB, SEXSSERVICEFN_SEND_RQCB => SEXSSERVICEFN_SEND_RQCB, NEQOBJKIND => NEQOBJKIND, NDICMUNTS => NDICMUNTS, NUSERPROCS_DATA => NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD => NEXSSERVICEFN_UPLOAD, NEXSSERVICEFN_SEND_MD => NEXSSERVICEFN_SEND_MD, NEXSSERVICEFN_SEND_MDCB => NEXSSERVICEFN_SEND_MDCB, NEXSSERVICEFN_SEND_RQ => NEXSSERVICEFN_SEND_RQ, NEXSSERVICEFN_SEND_RQCB => NEXSSERVICEFN_SEND_RQCB); /* Добавляем запись */ UDO_PKG_EQUIPDS_BASE.CM_INS(NPRN => NPRN, NEQOBJKIND => NEQOBJKIND, NDICMUNTS => NDICMUNTS, NUSERPROCS_DATA => NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD => NEXSSERVICEFN_UPLOAD, NEXSSERVICEFN_SEND_MD => NEXSSERVICEFN_SEND_MD, NEXSSERVICEFN_SEND_MDCB => NEXSSERVICEFN_SEND_MDCB, NEXSSERVICEFN_SEND_RQ => NEXSSERVICEFN_SEND_RQ, NEXSSERVICEFN_SEND_RQCB => NEXSSERVICEFN_SEND_RQCB, NRN => NRN); end CM_INS; /* Клиентское исправление "Выборки данных оборудования (классы оборудования)" */ procedure CM_UPD ( NRN in number, -- Регистрационный номер SEQOBJKIND in varchar2, -- Класс оборудования SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе SEXSSERVICE_SEND_MDCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICEFN_SEND_MDCB in varchar2, -- Функция сервиса обмена для приёма Call-back запросов с результатами передачи внешней системе SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой SEXSSERVICE_SEND_RQCB in varchar2, -- Сервис обмена для приёма Call-back запросов с результатами обработки внешней системой SEXSSERVICEFN_SEND_RQCB in varchar2 -- Функция сервиса обмена для приёма Call-back запросов с результатами обработки внешней системой ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация NEQOBJKIND PKG_STD.TREF; -- Рег. номер класса оборудования NDICMUNTS PKG_STD.TREF; -- Рег. номер единицы измерения выборки NUSERPROCS_DATA PKG_STD.TREF; -- Рег. номер процедуры формирования NEXSSERVICEFN_UPLOAD PKG_STD.TREF; -- Рег. номер функции обмена для выгрузки данных NEXSSERVICEFN_SEND_MD PKG_STD.TREF; -- Рег. номер Функции обмена для передачи внешней системе NEXSSERVICEFN_SEND_MDCB PKG_STD.TREF; -- Рег. номер call-back функции обмена для передачи внешней системе NEXSSERVICEFN_SEND_RQ PKG_STD.TREF; -- Рег. номер функции обмена для обработки внешней системой NEXSSERVICEFN_SEND_RQCB PKG_STD.TREF; -- Рег. номер call-back функции обмена для обработки внешней системой begin /* Проверим параметры */ if (NRN is null) then P_EXCEPTION(0, 'Не указан идентификатор исправляемого класса оборудования выборки данных.'); end if; if (SEQOBJKIND is null) then P_EXCEPTION(0, 'Не указан класс оборудования.'); end if; if (SDICMUNTS is null) then P_EXCEPTION(0, 'Не указана единица измерения выборки.'); end if; if (SUSERPROCS_DATA is null) then P_EXCEPTION(0, 'Не указана процедура формирования данных выборки.'); end if; if ((SEXSSERVICE_UPLOAD is null) or (SEXSSERVICEFN_UPLOAD is null)) then P_EXCEPTION(0, 'Не указана функция обмена для выгрузки данных.'); end if; if ((SEXSSERVICE_SEND_MD is null) or (SEXSSERVICEFN_SEND_MD is null)) then P_EXCEPTION(0, 'Не указана функция обмена для передачи внешней системе.'); end if; if ((SEXSSERVICE_SEND_MDCB is null) or (SEXSSERVICEFN_SEND_MDCB is null)) then P_EXCEPTION(0, 'Не указана функция обмена для приёма обратной связи о передече внешней системе.'); end if; if ((SEXSSERVICE_SEND_RQ is null) or (SEXSSERVICEFN_SEND_RQ is null)) then P_EXCEPTION(0, 'Не указана функция обмена для обработки внешней системой.'); end if; if ((SEXSSERVICE_SEND_RQCB is null) or (SEXSSERVICEFN_SEND_RQCB is null)) then P_EXCEPTION(0, 'Не указана функция обмена для приёма обратной связи об обработке внешней системой.'); end if; /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_UPDATE'); /* Разыменуем ссылки */ UDO_PKG_EQUIPDS_BASE.CM_JOINS(NCOMPANY => NCOMPANY, SEQOBJKIND => SEQOBJKIND, SDICMUNTS => SDICMUNTS, SUSERPROCS_DATA => SUSERPROCS_DATA, SEXSSERVICE_UPLOAD => SEXSSERVICE_UPLOAD, SEXSSERVICEFN_UPLOAD => SEXSSERVICEFN_UPLOAD, SEXSSERVICE_SEND_MD => SEXSSERVICE_SEND_MD, SEXSSERVICEFN_SEND_MD => SEXSSERVICEFN_SEND_MD, SEXSSERVICE_SEND_MDCB => SEXSSERVICE_SEND_MDCB, SEXSSERVICEFN_SEND_MDCB => SEXSSERVICEFN_SEND_MDCB, SEXSSERVICE_SEND_RQ => SEXSSERVICE_SEND_RQ, SEXSSERVICEFN_SEND_RQ => SEXSSERVICEFN_SEND_RQ, SEXSSERVICE_SEND_RQCB => SEXSSERVICE_SEND_RQCB, SEXSSERVICEFN_SEND_RQCB => SEXSSERVICEFN_SEND_RQCB, NEQOBJKIND => NEQOBJKIND, NDICMUNTS => NDICMUNTS, NUSERPROCS_DATA => NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD => NEXSSERVICEFN_UPLOAD, NEXSSERVICEFN_SEND_MD => NEXSSERVICEFN_SEND_MD, NEXSSERVICEFN_SEND_MDCB => NEXSSERVICEFN_SEND_MDCB, NEXSSERVICEFN_SEND_RQ => NEXSSERVICEFN_SEND_RQ, NEXSSERVICEFN_SEND_RQCB => NEXSSERVICEFN_SEND_RQCB); /* Исправляем запись */ UDO_PKG_EQUIPDS_BASE.CM_UPD(NRN => NRN, NEQOBJKIND => NEQOBJKIND, NDICMUNTS => NDICMUNTS, NUSERPROCS_DATA => NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD => NEXSSERVICEFN_UPLOAD, NEXSSERVICEFN_SEND_MD => NEXSSERVICEFN_SEND_MD, NEXSSERVICEFN_SEND_MDCB => NEXSSERVICEFN_SEND_MDCB, NEXSSERVICEFN_SEND_RQ => NEXSSERVICEFN_SEND_RQ, NEXSSERVICEFN_SEND_RQCB => NEXSSERVICEFN_SEND_RQCB); end CM_UPD; /* Клиентское удаление "Выборки данных оборудования (классы оборудования)" */ procedure CM_DEL ( NRN in number -- Регистрационный номер ) is begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_DELETE', NDOCUMENT => NRN); /* Удаляем запись */ UDO_PKG_EQUIPDS_BASE.CM_DEL(NRN => NRN); end CM_DEL; /* Клиентское получение списка доступных выборок данных "Выборки данных оборудования (классы оборудования)" */ procedure CM_DATASET_LIST ( NRN in number, -- Регистрационный номер NSTATUS in number := null, -- Статус (null - все, см. константы UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_*) COUT out clob -- Сериализованный список ) is NCUR integer; -- Курсор документа для результата XDOC PKG_XMAKE.TNODE; -- Документ для результата XDSCM_DATASET PKG_XMAKE.TNODE; -- Элемент для выборки данных begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_SELECT'); /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обходим выборки, зафиксированные в файлах данных */ for C in (select distinct T.DATASET_ID NDATASET_ID, T.DATASET_TS DDATASET_TS from UDO_T_EQUIPDSCMFL T where T.PRN = NRN and ((NSTATUS is null) or ((NSTATUS is not null) and (T.STATUS = NSTATUS))) order by T.DATASET_TS) loop XDSCM_DATASET := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XDSCM_DATASET, RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDSCM_DATASET', RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'value', SVALUE => C.NDATASET_ID), RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'name', SVALUE => UDO_PKG_EQUIPDS_BASE.UTL_DATASET_MAKE_NAME(NDATASET_ID => C.NDATASET_ID, DDATASET_TS => C.DDATASET_TS))))); end loop; /* Формируем XML-представление ответа */ XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XDSCM_DATASET); /* Конвертируем в 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 CM_DATASET_LIST; /* Список "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ) is RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_SELECT'); /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDATASET', SCAPTION => 'Выборка', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SFILE_NAME', SCAPTION => 'Имя', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDESCR', SCAPTION => 'Описание', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATUS', SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SERR', SCAPTION => 'Сообщение об ошибке', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SACTIONS', SCAPTION => 'Действия', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); /* Обходим данные */ for C in (select T.RN NRN, T.DATASET_ID NDATASET_ID, T.DATASET_TS DDATASET_TS, T.FILE_NAME SFILE_NAME, T.DESCR SDESCR, T.STATUS NSTATUS, T.ERR SERR from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM order by T.RN) loop /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SDATASET', SVALUE => UDO_PKG_EQUIPDS_BASE.UTL_DATASET_MAKE_NAME(NDATASET_ID => C.NDATASET_ID, DDATASET_TS => C.DDATASET_TS)); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SFILE_NAME', SVALUE => C.SFILE_NAME); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SDESCR', SVALUE => C.SDESCR); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS'); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMFL_LIST; /* Удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_DEL ( NRN in number -- Регистрационный номер ) is begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_DELETE', NDOCUMENT => NRN); /* Выполним базовое удаление */ UDO_PKG_EQUIPDS_BASE.CMFL_DEL(NRN => NRN); end CMFL_DEL; /* Формирование "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_MAKE ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных NDATASET_IDENT in number, -- Идентификатор буфера данных NDATASET_CONFIG_IDENT in number, -- Идентификатор буфера описания данных NCLEAR in number := 0 -- Флаг очистки имеющихся файлов данных (0 - не очищать, 1 - очистить) ) is NCMFL PKG_STD.TREF; -- Рег. номер добавленного файла данных NFILES_CNT PKG_STD.TNUMBER := 0; -- Количество найденных файлов выборки NCONFIG_CNT PKG_STD.TNUMBER := 0; -- Количество найденных описаний выборки DDATASET_TS PKG_STD.TLDATE; -- Буфер для времени формирования данных выборки begin /* Проверим параметры */ if (NDATASET_IDENT is null) then P_EXCEPTION(0, 'Пользовательская процедура формирования данных не вернула идентификатор буфера выборки.'); end if; if (NDATASET_CONFIG_IDENT is null) then P_EXCEPTION(0, 'Пользовательская процедура формирования данных не вернула идентификатор буфера описания выборки.'); end if; /* Зачистим старые файлы */ if (NCLEAR = 1) then for C in (select T.RN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM) loop UDO_PKG_EQUIPDS_BASE.CMFL_DEL(NRN => C.RN); end loop; end if; /* Зафиксируем время формирования */ DDATASET_TS := sysdate; /* Добавим новые файлы выборки */ for C in (select F.* from FILE_BUFFER F where F.IDENT = NDATASET_IDENT and F.DATA is not null and F.BDATA is not null and F.FILENAME is not null) loop NFILES_CNT := NFILES_CNT + 1; UDO_PKG_EQUIPDS_BASE.CMFL_INS(NPRN => NEQUIPDSCM, SFILE_NAME => C.FILENAME, SDESCR => C.DATA, BDATASET => C.BDATA, NDATASET_ID => NDATASET_IDENT, DDATASET_TS => DDATASET_TS, NRN => NCMFL); end loop; /* Добавим описание выборки */ for C in (select F.* from FILE_BUFFER F where F.IDENT = NDATASET_CONFIG_IDENT and F.DATA is not null) loop NCONFIG_CNT := NCONFIG_CNT + 1; UDO_PKG_EQUIPDS_BASE.CM_SET_DATA_CONFIG(NRN => NEQUIPDSCM, BDATA_CONFIG => C.DATA); end loop; /* Проверим, что сформировали данные */ if (NFILES_CNT = 0) then P_EXCEPTION(0, 'Пользовательская процедура формирования данных не вернула выборку.'); end if; if (NCONFIG_CNT = 0) then P_EXCEPTION(0, 'Пользовательская процедура формирования данных не вернула описание выборки.'); end if; /* Зачистим буфер */ P_FILE_BUFFER_CLEAR(NIDENT => NDATASET_IDENT); P_FILE_BUFFER_CLEAR(NIDENT => NDATASET_CONFIG_IDENT); end CMFL_MAKE; /* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_UPLOAD ( NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NIDENT PKG_STD.TREF; -- Идентификатор выбранных файлов NTMP PKG_STD.TREF; -- Рег. номер записи буфера begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_UPLOAD'); /* Обходим файлы данных для загрузки */ for C in (select T.RN NRN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM and T.STATUS in (UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_REGISTERED, UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_UPLOAD_ERR)) loop /* Сформируем идентификатор выборки, если ещё не делали этого */ if (NIDENT is null) then NIDENT := GEN_IDENT(); end if; /* Добавляем файл в выборку */ P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => C.NRN, SUNITCODE => 'UDO_T_EQUIPDSCMFL', NRN => NTMP); end loop; /* Проверим, что в выборку попали данные */ if (NIDENT is null) then P_EXCEPTION(0, 'Нет данных для загрузки на сервер. Сначала необходимо выполнить формирование обучающей выборки.'); end if; /* Устанавливаем статус - загружается на сервер */ for C in (select SL.DOCUMENT NRN from SELECTLIST SL where SL.IDENT = NIDENT and SL.UNITCODE = 'UDO_T_EQUIPDSCMFL') loop UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_UPLOADING); end loop; /* Ставим задачу на зугрузку в очередь */ UDO_PKG_EQUIPDS_DATAPROCESS.UPLOAD(NCOMPANY => NCOMPANY, NIDENT => NIDENT, NEQUIPDSCM => NEQUIPDSCM); /* Очищаем выборку */ P_SELECTLIST_CLEAR(NIDENT => NIDENT); end CMFL_UPLOAD; /* Передача внешней системе "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_SEND_MD ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных NDATASET_ID in number -- Идентификатор выборки ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NIDENT PKG_STD.TREF; -- Идентификатор выбранных файлов NTMP PKG_STD.TREF; -- Рег. номер записи буфера begin /* Проверим параметры */ if (NDATASET_ID is null) then P_EXCEPTION(0, 'Не указана выборка.'); end if; /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_SEND_MD'); /* Обходим файлы данных для передаче внешней системе */ for C in (select T.RN NRN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM and T.DATASET_ID = NDATASET_ID and T.STATUS = UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_UPLOADED) loop /* Сформируем идентификатор выборки, если ещё не делали этого */ if (NIDENT is null) then NIDENT := GEN_IDENT(); end if; /* Добавляем файл в выборку */ P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => C.NRN, SUNITCODE => 'UDO_T_EQUIPDSCMFL', NRN => NTMP); end loop; /* Проверим, что в выборку попали данные */ if (NIDENT is null) then P_EXCEPTION(0, 'Нет данных для передачи внешней системе. Сначала необходимо выполнить передачу данных на сервер.'); end if; /* Ставим задачу на передачу внешней системе */ UDO_PKG_EQUIPDS_DATAPROCESS.SEND_MD(NCOMPANY => NCOMPANY, NIDENT => NIDENT, NEQUIPDSCM => NEQUIPDSCM); /* Очищаем выборку */ P_SELECTLIST_CLEAR(NIDENT => NIDENT); end CMFL_SEND_MD; /* Список "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ) is RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_SELECT'); /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STASK', SCAPTION => 'Задача', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SHINT => 'Алгоритм прогонозирования модели:
' || UDO_PKG_EQUIPDS_BASE.CMML_TASK_HINT()); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NPRECISION_F', SCAPTION => 'Точность', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDATASET', SCAPTION => 'Выборка', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATUS', SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SERR', SCAPTION => 'Сообщение об ошибке', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SACTIONS', SCAPTION => 'Действия', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); /* Обходим данные */ for C in (select T.RN NRN, T.TASK STASK, T.PRECISION_F NPRECISION_F, T.DATASET_ID NDATASET_ID, (select F.DATASET_TS from UDO_T_EQUIPDSCMFL F where F.DATASET_ID = T.DATASET_ID and ROWNUM <= 1) DDATASET_TS, T.STATUS NSTATUS, T.ERR SERR from UDO_T_EQUIPDSCMML T where T.PRN = NEQUIPDSCM order by T.RN) loop /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STASK', SVALUE => C.STASK); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRECISION_F', NVALUE => C.NPRECISION_F); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SDATASET', SVALUE => UDO_PKG_EQUIPDS_BASE.UTL_DATASET_MAKE_NAME(NDATASET_ID => C.NDATASET_ID, DDATASET_TS => C.DDATASET_TS)); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS'); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMML_LIST; /* Клиентское добавление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_INS ( NPRN in number, -- Родитель STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*) NDATASET_ID in number, -- Идентификатор выборки NRN out number -- Регистрационный номер ) is begin /* Проверим параметры */ if (STASK is null) then P_EXCEPTION(0, 'Не указана задача.'); end if; if (NDATASET_ID is null) then P_EXCEPTION(0, 'Не указана выборка.'); end if; /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_INSERT'); /* Добавляем запись */ UDO_PKG_EQUIPDS_BASE.CMML_INS(NPRN => NPRN, STASK => STASK, NDATASET_ID => NDATASET_ID, NRN => NRN); end CMML_INS; /* Клиентское удаление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_DEL ( NRN in number -- Регистрационный номер ) is begin /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_DELETE', NDOCUMENT => NRN); /* Удаляем запись */ UDO_PKG_EQUIPDS_BASE.CMML_DEL(NRN => NRN); end CMML_DEL; /* Обработка внешней системой "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_SEND_RQ ( NEQUIPDSCMML in number -- Рег. номер модели класса оборудования выборки данных ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации RCMML UDO_T_EQUIPDSCMML%rowtype; -- Запись модели NCOUNT PKG_STD.TNUMBER; -- Количество файлов данных модели, переданных внешней системе begin /* Считаем модель */ RCMML := UDO_PKG_EQUIPDS_BASE.CMML_GET(NFLAG_SMART => 0, NRN => NEQUIPDSCMML); /* Проверим права доступа */ UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_SEND_RQ', NDOCUMENT => RCMML.RN); /* Проверим, что у класса оборудования есть файлы данных, переданные внешней системе */ begin select count(T.RN) into NCOUNT from UDO_T_EQUIPDSCMFL T where T.PRN = RCMML.PRN and T.DATASET_ID = RCMML.DATASET_ID and T.STATUS = UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_SENT; exception when others then P_EXCEPTION(0, 'Не удалось проверить состояние файлов данных выборки.'); end; if (NCOUNT = 0) then P_EXCEPTION(0, 'У выборки класса оборудования нет файлов данных, переданных фреймворку - обучение невозможно.'); end if; /* Отправим запрос на обучение */ UDO_PKG_EQUIPDS_DATAPROCESS.SEND_RQ(NCOMPANY => NCOMPANY, NEQUIPDSCMML => RCMML.RN); end CMML_SEND_RQ; /* Состояние "Выборки данных оборудования (классы оборудования, модели)" по единице оборудования */ function CMML_STATUS_BY_EQCONFIG ( NEQCONFIG in number -- Рег. номер позиции состава оборудования ) return number -- Код действия с моделью (0 - нет моделей, 1 - есть модели в процессе обучения, 2 - есть обученные модели) is NRES PKG_STD.TNUMBER; -- Буфер для результата begin /* По умолчанию - моделей нет */ NRES := 0; /* Обходим модели */ for C in (select ML.STATUS from UDO_T_EQUIPDSCM CM, UDO_T_EQUIPDSCMML ML where CM.EQOBJKIND = (select CF.OBJ_KIND from EQCONFIG CF where CF.RN = NEQCONFIG) and CM.RN = ML.PRN) loop /* Модель есть */ if (NRES < UDO_PKG_EQUIPDS_BASE.NCMML_STATUS_PROCESSED) then NRES := 1; end if; /* Если она уже обучена */ if (C.STATUS = UDO_PKG_EQUIPDS_BASE.NCMML_STATUS_PROCESSED) then NRES := 2; end if; end loop; /* Возвращаем результат */ return NRES; end CMML_STATUS_BY_EQCONFIG; /* Список "Выборки данных оборудования (классы оборудования, модели)" по единице оборудования */ procedure CMML_LIST_BY_EQCONFIG ( NEQCONFIG in number, -- Рег. номер позиции состава оборудования COUT out clob -- Сериализованная таблица данных ) is RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы begin /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', SCAPTION => 'Рег. номер модели', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NEQUIPDS', SCAPTION => 'Рег. номер выборки', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NEQUIPDSCM', SCAPTION => 'Рег. номер класса оборудования выборки', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNEQUIPDS', SCAPTION => 'Выборка', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STASK', SCAPTION => 'Задача', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SHINT => 'Алгоритм прогонозирования модели:
' || UDO_PKG_EQUIPDS_BASE.CMML_TASK_HINT()); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NPRECISION_F', SCAPTION => 'Точность', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATUS', SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SERR', SCAPTION => 'Сообщение об ошибке', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SACTIONS', SCAPTION => 'Действия', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); /* Обходим данные */ for C in (select T.RN NRN, CM.PRN NEQUIPDS, T.PRN NEQUIPDSCM, DS.NAME SNEQUIPDS, T.TASK STASK, T.PRECISION_F NPRECISION_F, T.STATUS NSTATUS, T.ERR SERR from UDO_T_EQUIPDSCMML T, UDO_T_EQUIPDSCM CM, UDO_T_EQUIPDS DS where T.PRN = CM.RN and CM.PRN = DS.RN and CM.EQOBJKIND = (select CF.OBJ_KIND from EQCONFIG CF where CF.RN = NEQCONFIG) order by T.RN) loop /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NEQUIPDS', NVALUE => C.NEQUIPDS); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NEQUIPDSCM', NVALUE => C.NEQUIPDSCM); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SNEQUIPDS', SVALUE => C.SNEQUIPDS); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STASK', SVALUE => C.STASK); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRECISION_F', NVALUE => C.NPRECISION_F); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS'); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMML_LIST_BY_EQCONFIG; /* Формирование данных прогноза "Выборки данных оборудования (классы оборудования, модели, история запросов)" */ procedure CMMLH_BUILD_FORECAST ( COUT out clob -- Данные прогноза ) is NCUR integer; -- Курсор документа для результата XDOC PKG_XMAKE.TNODE; -- Документ для результата XROOT PKG_XMAKE.TNODE; -- Содержимое корневого узла документа NFORECAST PKG_STD.TNUMBER; -- Прогноз по заданной задаче begin /* Вычислим прогноз - количество периодов в указанных ЕИ до достижения предельного состояния */ NFORECAST := ROUND(DBMS_RANDOM.VALUE(10, 60)); /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Заполним прогноз */ XROOT := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XROOT, RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'NFORECAST', RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR, NVALUE => NFORECAST))); /* Формируем XML-представление ответа */ XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XROOT); /* Конвертируем в 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 CMMLH_BUILD_FORECAST; /* Извлечение описания из данных прогноза "Выборки данных оборудования (классы оборудования, модели, история запросов)" */ procedure CMMLH_PARSE_FORECAST ( CFORECAST in clob, -- Данные прогноза NFORECAST out number -- Значение прогноза ) is XDOC PKG_XPATH.TDOCUMENT; -- Десериализованный демо-прогноз XROOT PKG_XPATH.TNODE; -- Корневой элемент данных begin /* Разбираем демо-даные */ XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => CFORECAST); /* Извлекаем корневой элемент */ XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC); /* Читаем прогноз */ NFORECAST := PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => 'XDATA/NFORECAST')); exception when others then null; end CMMLH_PARSE_FORECAST; /* Список "Выборки данных оборудования (классы оборудования, модели, история запросов)" по единице оборудования */ procedure CMMLH_LIST_BY_EQCONFIG ( NEQCONFIG in number, -- Рег. номер позиции состава оборудования COUT out clob -- Сериализованная таблица данных ) is RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы begin /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SRQ_AUTHID', SCAPTION => 'Пользователь', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SRQ_DATE', SCAPTION => 'Дата/время запроса', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEQUIPDS_CODE', SCAPTION => 'Выборка', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEQUIPDSCMML_TASK', SCAPTION => 'Задача', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SHINT => UDO_PKG_EQUIPDS_BASE.CMML_TASK_HINT()); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NEQUIPDSCMML_PRECISION_F', SCAPTION => 'Точность', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STO_FORECAST_DESC', SCAPTION => 'Прогноз', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SHINT => 'Формат прогноза: "XXЕИ / YY%", где
' || 'XXЕИ - время до перехода в критическое состояние в ЕИ ресурса единицы оборудования (часы/дни/месяцы/рабочие циклы и т.п.)
' || 'YY% - вероятность перехода в критическое состояние до следующего ТО и ремонта

' || 'Цвет прогноза:
' || UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_FORECAST_CLR(NMODE => 0)); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STO_FORECAST_DESC_COLOR', SCAPTION => 'Цвет прогноза', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STO_FORECAST', SCAPTION => 'Данные карточки прогноза для конкретного технического объекта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); /* Обходим данные */ for C in (select T.RN NRN, T.RQ_AUTHID SRQ_AUTHID, T.RQ_DATE DRQ_DATE, TO_CHAR(T.RQ_DATE, 'dd.mm.yyyy hh24:mi:ss') SRQ_DATE, DS.CODE SEQUIPDS_CODE, ML.TASK SEQUIPDSCMML_TASK, ML.PRECISION_F NEQUIPDSCMML_PRECISION_F, DM.MEAS_MNEMO SDICMUNTS, T.FORECAST BFORECAST, null NFORECAST, null STO_FORECAST_DESC, null STO_FORECAST_DESC_COLOR, null STO_FORECAST from UDO_T_EQUIPDSCMMLH T, UDO_T_EQUIPDSCMML ML, UDO_T_EQUIPDSCM CM, UDO_T_EQUIPDS DS, DICMUNTS DM where T.EQCONFIG = NEQCONFIG and T.PRN = ML.RN and ML.PRN = CM.RN and CM.PRN = DS.RN and CM.DICMUNTS = DM.RN order by T.RN desc) loop /* Извлекаем данные из прогноза фреймворка */ CMMLH_PARSE_FORECAST(CFORECAST => BLOB2CLOB(LBDATA => C.BFORECAST), NFORECAST => C.NFORECAST); /* Формируем данные карточки прогноза для конкретного тех. объекта */ UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_FORECAST_CRD(NEQCONFIG => NEQCONFIG, DFORECAST_DATE => C.DRQ_DATE, NFORECAST => C.NFORECAST, SDICMUNTS => C.SDICMUNTS, STASK => C.SEQUIPDSCMML_TASK, COUT => C.STO_FORECAST); /* Извлекаем прогноз и цвет для видимой колонки таблицы из карточки прогноза для конкретного тех. объекта */ UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_FORECAST_CRDP(CFORECAST => C.STO_FORECAST, SFORECAST_DESC => C.STO_FORECAST_DESC, SFORECAST_DESC_COLOR => C.STO_FORECAST_DESC_COLOR); /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRQ_AUTHID', SVALUE => C.SRQ_AUTHID); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRQ_DATE', SVALUE => C.SRQ_DATE); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SEQUIPDS_CODE', SVALUE => C.SEQUIPDS_CODE); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SEQUIPDSCMML_TASK', SVALUE => C.SEQUIPDSCMML_TASK); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NEQUIPDSCMML_PRECISION_F', NVALUE => C.NEQUIPDSCMML_PRECISION_F); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST_DESC', SVALUE => C.STO_FORECAST_DESC); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST_DESC_COLOR', SVALUE => C.STO_FORECAST_DESC_COLOR); PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST', SVALUE => C.STO_FORECAST); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMMLH_LIST_BY_EQCONFIG; end UDO_PKG_EQUIPDS; /