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_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) NPRECISION_P in number, -- Точность (план) 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_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой NRN out number -- Регистрационный номер ); /* Клиентское удаление "Выборки данных оборудования (классы оборудования)" */ procedure CM_DEL ( NRN in number -- Регистрационный номер ); /* Список "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ); /* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_UPLOAD ( NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных ); /* Передача внешней системе "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_SEND_MD ( NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных ); /* Список "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ); /* Клиентское добавление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_INS ( NPRN in number, -- Родитель STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) NPRECISION_P 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_DEMO_BUILD ( STASK in varchar2, -- Задача COUT out clob -- Данные демо-прогноза ); /* Список "Выборки данных оборудования (классы оборудования, модели, история запросов)" по единице оборудования */ procedure CMMLH_LIST_BY_EQCONFIG ( NEQCONFIG in number, -- Рег. номер позиции состава оборудования COUT out clob -- Сериализованная таблица данных ); end UDO_PKG_EQUIPDS; / create or replace package body UDO_PKG_EQUIPDS as /* TODO: owner="root" created="06.08.2024" text="Проверка прав доступа на работу с ""Выборками данных""" */ /* Список "Выборки данных оборудования" */ procedure LIST ( COUT out clob -- Сериализованная таблица данных ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NCUR integer; -- Курсор документа для результата XDOC PKG_XMAKE.TNODE; -- Документ для результата XDS PKG_XMAKE.TNODE; -- Элемент для выборки данных begin /* Открываем документ */ 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 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); /* Конвертируем в 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 /* Добавляем запись */ 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.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_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) NPRECISION_P in number, -- Точность (план) NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация NEQUIPDSCMML PKG_STD.TREF; -- Рег. номер модели begin /* Проверим наличие такой выборки */ 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_RQ => SEXSSERVICE_SEND_RQ, SEXSSERVICEFN_SEND_RQ => SEXSSERVICEFN_SEND_RQ, NRN => NEQUIPDSCM); end if; /* Проверим наличие такой модели */ UDO_PKG_EQUIPDS_BASE.CMML_FIND_BY_TASK(NFLAG_SMART => 1, NPRN => NEQUIPDSCM, STASK => STASK, NPRECISION_P => NPRECISION_P, NRN => NEQUIPDSCMML); /* Модели нет */ if (NEQUIPDSCMML is null) then /* Добавим модель */ CMML_INS(NPRN => NEQUIPDSCM, STASK => STASK, NPRECISION_P => NPRECISION_P, NRN => NEQUIPDSCMML); 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 /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обращаемся к данным класса оборудования */ for C in (select T.RN NRN, OK.NAME SNAME, UP.CODE SUSERPROCS_DATA, SU.CODE || '/' || SFU.CODE SEXSSERVICE_UPLOAD, SMD.CODE || '/' || SFMD.CODE SEXSSERVICE_SEND_MD, SRQ.CODE || '/' || SFRQ.CODE SEXSSERVICE_SEND_RQ from UDO_T_EQUIPDSCM T, EQOBJKIND OK, USERPROCS UP, EXSSERVICE SU, EXSSERVICEFN SFU, EXSSERVICE SMD, EXSSERVICEFN SFMD, EXSSERVICE SRQ, EXSSERVICEFN SFRQ 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_RQ = SFRQ.RN and SFRQ.PRN = SRQ.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 => 'SNAME', SVALUE => C.SNAME), RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SUSERPROCS_DATA', SVALUE => C.SUSERPROCS_DATA), RATTRIBUTE03 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_UPLOAD', SVALUE => C.SEXSSERVICE_UPLOAD), RATTRIBUTE04 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_SEND_MD', SVALUE => C.SEXSSERVICE_SEND_MD), RATTRIBUTE05 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SEXSSERVICE_SEND_RQ', SVALUE => C.SEXSSERVICE_SEND_RQ))); 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 /* Открываем документ */ 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_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой 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_RQ PKG_STD.TREF; -- Рег. номер функции обмена для обработки внешней системой begin /* Разыменуем ссылки */ 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_RQ => SEXSSERVICE_SEND_RQ, SEXSSERVICEFN_SEND_RQ => SEXSSERVICEFN_SEND_RQ, NEQOBJKIND => NEQOBJKIND, NDICMUNTS => NDICMUNTS, NUSERPROCS_DATA => NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD => NEXSSERVICEFN_UPLOAD, NEXSSERVICEFN_SEND_MD => NEXSSERVICEFN_SEND_MD, NEXSSERVICEFN_SEND_RQ => NEXSSERVICEFN_SEND_RQ); /* Добавляем запись */ 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_RQ => NEXSSERVICEFN_SEND_RQ, NRN => NRN); end CM_INS; /* Клиентское удаление "Выборки данных оборудования (классы оборудования)" */ procedure CM_DEL ( NRN in number -- Регистрационный номер ) is begin /* Удаляем запись */ UDO_PKG_EQUIPDS_BASE.CM_DEL(NRN => NRN); end CM_DEL; /* Список "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ) is RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы begin /* Инициализируем таблицу данных */ 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 => 'SFILE_NAME', SCAPTION => 'Имя', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDESCR', SCAPTION => 'Описание', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATUS', SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SERR', SCAPTION => 'Сообщение об ошибке', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); /* Обходим данные */ for C in (select T.RN NRN, 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.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SFILE_NAME', SVALUE => C.SFILE_NAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SDESCR', SVALUE => C.SDESCR); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMFL_LIST; /* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_UPLOAD ( NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных ) is begin /* TODO: owner="root" created="07.08.2024" text="Реализовать проверку возможности выполнения действия и установки статусов" */ /* Выставим состояние файлам данных класса оборудования */ for C in (select T.RN NRN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM) loop UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => 2, SQUEUE_ID => C.NRN, SERR => null); end loop; end CMFL_UPLOAD; /* Передача внешней системе "Выборки данных оборудования (классы оборудования, файлы данных)" */ procedure CMFL_SEND_MD ( NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных ) is begin /* TODO: owner="root" created="07.08.2024" text="Реализовать проверку возможности выполнения действия и установки статусов" */ /* Выставим состояние файлам данных класса оборудования */ for C in (select T.RN NRN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM) loop UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => 5, SQUEUE_ID => C.NRN, SERR => null); end loop; end CMFL_SEND_MD; /* Список "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_LIST ( NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных COUT out clob -- Сериализованная таблица данных ) is RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы begin /* Инициализируем таблицу данных */ 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 => 'STASK', SCAPTION => 'Задача', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SHINT => 'Алгоритм прогонозирования модели:
' || UDO_PKG_EQUIPDS_BASE.CMML_TASK_HINT()); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NPRECISION_P', SCAPTION => 'Точность (план)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NPRECISION_F', SCAPTION => 'Точность (факт)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATUS', SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SERR', SCAPTION => 'Сообщение об ошибке', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_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_P NPRECISION_P, T.PRECISION_F NPRECISION_F, T.STATUS NSTATUS, T.ERR SERR from UDO_T_EQUIPDSCMML T where T.PRN = NEQUIPDSCM order by T.RN) loop /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STASK', SVALUE => C.STASK); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRECISION_P', NVALUE => C.NPRECISION_P); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRECISION_F', NVALUE => C.NPRECISION_F); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS'); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMML_LIST; /* Клиентское добавление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_INS ( NPRN in number, -- Родитель STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) NPRECISION_P in number, -- Точность (план) NRN out number -- Регистрационный номер ) is begin /* Добавляем запись */ UDO_PKG_EQUIPDS_BASE.CMML_INS(NPRN => NPRN, STASK => STASK, NPRECISION_P => NPRECISION_P, NRN => NRN); end CMML_INS; /* Клиентское удаление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_DEL ( NRN in number -- Регистрационный номер ) is begin /* Удаляем запись */ UDO_PKG_EQUIPDS_BASE.CMML_DEL(NRN => NRN); end CMML_DEL; /* Обработка внешней системой "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_SEND_RQ ( NEQUIPDSCMML in number -- Рег. номер модели класса оборудования выборки данных ) is begin /* TODO: owner="root" created="07.08.2024" text="Реализовать проверку возможности выполнения действия и установки статусов" */ /* Обратимся к модели */ for C in (select T.RN NRN, T.PRECISION_P NPRECISION_P from UDO_T_EQUIPDSCMML T where T.RN = NEQUIPDSCMML) loop /* Установим фактическую точность */ UDO_PKG_EQUIPDS_BASE.CMML_SET_PRECISION_F(NRN => C.NRN, NPRECISION_F => C.NPRECISION_P); /* Установим состояние модели */ UDO_PKG_EQUIPDS_BASE.CMML_SET_STATUS(NRN => C.NRN, NSTATUS => 2, SQUEUE_ID => C.NRN, SERR => null); end loop; 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 < 2) then NRES := 1; end if; /* Если она уже обучена */ if (C.STATUS = 2) 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.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы begin /* Инициализируем таблицу данных */ 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 => 'NEQUIPDS', SCAPTION => 'Рег. номер выборки', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NEQUIPDSCM', SCAPTION => 'Рег. номер класса оборудования выборки', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNEQUIPDS', SCAPTION => 'Выборка', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_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.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NPRECISION_P', SCAPTION => 'Точность (план)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NPRECISION_F', SCAPTION => 'Точность (факт)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATUS', SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SERR', SCAPTION => 'Сообщение об ошибке', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_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_P NPRECISION_P, 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.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NEQUIPDS', NVALUE => C.NEQUIPDS); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NEQUIPDSCM', NVALUE => C.NEQUIPDSCM); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SNEQUIPDS', SVALUE => C.SNEQUIPDS); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STASK', SVALUE => C.STASK); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRECISION_P', NVALUE => C.NPRECISION_P); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRECISION_F', NVALUE => C.NPRECISION_F); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS'); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMML_LIST_BY_EQCONFIG; /* Формирование демо-прогноза */ procedure CMMLH_DEMO_BUILD ( STASK in varchar2, -- Задача COUT out clob -- Данные демо-прогноза ) is RCH PKG_P8PANELS_VISUAL.TCHART; -- График RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных DMONTH date; -- Месяц прогноза begin /* Сформируем заголовок графика */ RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_LINE, STITLE => 'Прогноз на 5 месяцев', SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_RIGHT); /* Сформируем набор данных */ RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => STASK); /* Генерируем случайные данные */ for I in 1 .. 5 loop /* Добавим метку для месяца */ DMONTH := ADD_MONTHS(sysdate, I); PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => F_GET_MONTH(NVALUE => EXTRACT(month from DMONTH)) || ' ' || TO_CHAR(DMONTH, 'yyyy')); /* Добавим месяц в набор данных */ PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => ROUND(DBMS_RANDOM.VALUE(1, 100))); end loop; /* Добавим набор данных в график */ PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS); /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1); end CMMLH_DEMO_BUILD; /* Извлечение прогноза из демо-данных */ function CMMLH_DEMO_FORECAST_PARSE ( CFORECAST in clob -- Данные демо-прогноза ) return 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); /* Возвращаем значение за ближайший месяц */ return PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => 'XDATA/XCHART/datasets/data')); exception when others then return null; end CMMLH_DEMO_FORECAST_PARSE; /* Список "Выборки данных оборудования (классы оборудования, модели, история запросов)" по единице оборудования */ procedure CMMLH_LIST_BY_EQCONFIG ( NEQCONFIG in number, -- Рег. номер позиции состава оборудования COUT out clob -- Сериализованная таблица данных ) is RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы begin /* Инициализируем таблицу данных */ 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 => 'SRQ_AUTHID', SCAPTION => 'Пользователь', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SRQ_DATE', SCAPTION => 'Дата/время запроса', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEQUIPDS_CODE', SCAPTION => 'Выборка', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_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.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NEQUIPDSCMML_PRECISION_F', SCAPTION => 'Точность (факт)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NFORECAST', SCAPTION => 'Прогноз', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SHINT => 'Опасность - вероятность сбоя более 60%.
' || 'Внимание - вероятность сбоя от 30% до 60%
' || 'В норме - вероятность сбоев менее 30%'); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SFORECAST', SCAPTION => 'Данные прогноза', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); /* Обходим данные */ for C in (select T.RN NRN, T.RQ_AUTHID SRQ_AUTHID, 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, null NFORECAST, null SFORECAST, T.FORECAST BFORECAST from UDO_T_EQUIPDSCMMLH T, UDO_T_EQUIPDSCMML ML, UDO_T_EQUIPDSCM CM, UDO_T_EQUIPDS DS where T.EQCONFIG = NEQCONFIG and T.PRN = ML.RN and ML.PRN = CM.RN and CM.PRN = DS.RN order by T.RN desc) loop /* Конвертируем данные прогноза */ C.SFORECAST := BLOB2CLOB(LBDATA => C.BFORECAST); /* Извлекаем прогноз */ C.NFORECAST := CMMLH_DEMO_FORECAST_PARSE(CFORECAST => C.SFORECAST); /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRQ_AUTHID', SVALUE => C.SRQ_AUTHID); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRQ_DATE', SVALUE => C.SRQ_DATE); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SEQUIPDS_CODE', SVALUE => C.SEQUIPDS_CODE); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SEQUIPDSCMML_TASK', SVALUE => C.SEQUIPDSCMML_TASK); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NEQUIPDSCMML_PRECISION_F', NVALUE => C.NEQUIPDSCMML_PRECISION_F); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NFORECAST', NVALUE => C.NFORECAST); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SFORECAST', SVALUE => C.SFORECAST); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end CMMLH_LIST_BY_EQCONFIG; end UDO_PKG_EQUIPDS; /