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;
/