Контроль наличия роли для администрирования, интеграция с "Сервисами обмена", удаление файлов выборок по одному, контроль возможности перехода к статусу (для файла выборки, модели)
This commit is contained in:
parent
e59247fd2d
commit
d82d4646d3
@ -33,7 +33,7 @@ create or replace package UDO_PKG_EQUIPDS as
|
||||
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))
|
||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования
|
||||
NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных
|
||||
@ -82,6 +82,21 @@ create or replace package UDO_PKG_EQUIPDS as
|
||||
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
|
||||
(
|
||||
@ -105,7 +120,7 @@ create or replace package UDO_PKG_EQUIPDS as
|
||||
procedure CMML_INS
|
||||
(
|
||||
NPRN in number, -- Родитель
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict))
|
||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NRN out number -- Регистрационный номер
|
||||
);
|
||||
@ -159,11 +174,6 @@ end UDO_PKG_EQUIPDS;
|
||||
/
|
||||
create or replace package body UDO_PKG_EQUIPDS as
|
||||
|
||||
/*
|
||||
TODO: owner="root" created="06.08.2024"
|
||||
text="Проверка прав доступа на работу с ""Выборками данных"""
|
||||
*/
|
||||
|
||||
/* Список "Выборки данных оборудования" */
|
||||
procedure LIST
|
||||
(
|
||||
@ -174,7 +184,14 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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();
|
||||
/* Обходим выборки данных */
|
||||
@ -183,6 +200,7 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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,
|
||||
@ -201,7 +219,12 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
SVALUE => C.SNAME))));
|
||||
end loop;
|
||||
/* Формируем XML-представление ответа */
|
||||
XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XDS);
|
||||
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_,
|
||||
@ -223,6 +246,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
is
|
||||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация
|
||||
begin
|
||||
/* Проверим права доступа */
|
||||
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;
|
||||
@ -235,6 +260,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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;
|
||||
@ -252,7 +279,7 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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))
|
||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования
|
||||
NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных
|
||||
@ -261,6 +288,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация
|
||||
NEQUIPDSCMML PKG_STD.TREF; -- Рег. номер модели
|
||||
begin
|
||||
/* Проверим права доступа */
|
||||
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);
|
||||
/* Выборки нет */
|
||||
@ -313,6 +342,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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();
|
||||
/* Обращаемся к данным класса оборудования */
|
||||
@ -388,6 +419,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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();
|
||||
/* Обходим классы оборудования заданной выборки данных */
|
||||
@ -482,6 +515,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
NEXSSERVICEFN_SEND_MD PKG_STD.TREF; -- Рег. номер Функции обмена для передачи внешней системе
|
||||
NEXSSERVICEFN_SEND_RQ PKG_STD.TREF; -- Рег. номер функции обмена для обработки внешней системой
|
||||
begin
|
||||
/* Проверим права доступа */
|
||||
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_INSERT');
|
||||
/* Разыменуем ссылки */
|
||||
UDO_PKG_EQUIPDS_BASE.CM_JOINS(NCOMPANY => NCOMPANY,
|
||||
SEQOBJKIND => SEQOBJKIND,
|
||||
@ -517,9 +552,11 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
)
|
||||
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;
|
||||
end CM_DEL;
|
||||
|
||||
/* Список "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_LIST
|
||||
@ -531,6 +568,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
|
||||
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
|
||||
begin
|
||||
/* Проверим права доступа */
|
||||
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_SELECT');
|
||||
/* Инициализируем таблицу данных */
|
||||
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
|
||||
/* Добавляем в таблицу описание колонок */
|
||||
@ -556,6 +595,10 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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.FILE_NAME SFILE_NAME,
|
||||
@ -572,6 +615,7 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
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.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS');
|
||||
/* Добавляем строку в таблицу */
|
||||
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
||||
end loop;
|
||||
@ -579,40 +623,165 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
|
||||
end CMFL_LIST;
|
||||
|
||||
/* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_UPLOAD
|
||||
/* Удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_DEL
|
||||
(
|
||||
NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных
|
||||
NRN 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)
|
||||
/* Проверим права доступа */
|
||||
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; -- Количество найденных описаний выборки
|
||||
begin
|
||||
/* Проверим параметры */
|
||||
if (COALESCE(NDATASET_IDENT, 0) = 0) then
|
||||
P_EXCEPTION(0,
|
||||
'Пользовательская процедура формирования данных не вернула идентификатор буфера выборки.');
|
||||
end if;
|
||||
if (COALESCE(NDATASET_CONFIG_IDENT, 0) = 0) 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;
|
||||
/* Добавим новые файлы выборки */
|
||||
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
|
||||
UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => 2, SQUEUE_ID => C.NRN, SERR => null);
|
||||
NFILES_CNT := NFILES_CNT + 1;
|
||||
UDO_PKG_EQUIPDS_BASE.CMFL_INS(NPRN => NEQUIPDSCM,
|
||||
SFILE_NAME => C.FILENAME,
|
||||
SDESCR => C.DATA,
|
||||
BDATASET => C.BDATA,
|
||||
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 -- Рег. номер класса оборудования выборки данных
|
||||
NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных
|
||||
)
|
||||
is
|
||||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||||
NIDENT PKG_STD.TREF; -- Идентификатор выбранных файлов
|
||||
NTMP PKG_STD.TREF; -- Рег. номер записи буфера
|
||||
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)
|
||||
/* Проверим права доступа */
|
||||
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.STATUS = UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_UPLOADED)
|
||||
loop
|
||||
UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => 5, SQUEUE_ID => C.NRN, SERR => null);
|
||||
/* Сформируем идентификатор выборки, если ещё не делали этого */
|
||||
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;
|
||||
|
||||
/* Список "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
@ -625,6 +794,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
|
||||
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
|
||||
begin
|
||||
/* Проверим права доступа */
|
||||
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_SELECT');
|
||||
/* Инициализируем таблицу данных */
|
||||
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
|
||||
/* Добавляем в таблицу описание колонок */
|
||||
@ -689,12 +860,14 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
procedure CMML_INS
|
||||
(
|
||||
NPRN in number, -- Родитель
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict))
|
||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NRN out number -- Регистрационный номер
|
||||
)
|
||||
is
|
||||
begin
|
||||
/* Проверим права доступа */
|
||||
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_INSERT');
|
||||
/* Добавляем запись */
|
||||
UDO_PKG_EQUIPDS_BASE.CMML_INS(NPRN => NPRN, STASK => STASK, NPRECISION_P => NPRECISION_P, NRN => NRN);
|
||||
end CMML_INS;
|
||||
@ -706,6 +879,8 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
)
|
||||
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;
|
||||
@ -713,25 +888,37 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
/* Обработка внешней системой "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
procedure CMML_SEND_RQ
|
||||
(
|
||||
NEQUIPDSCMML in number -- Рег. номер модели класса оборудования выборки данных
|
||||
NEQUIPDSCMML in number -- Рег. номер модели класса оборудования выборки данных
|
||||
)
|
||||
is
|
||||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||||
RCMML UDO_T_EQUIPDSCMML%rowtype; -- Запись модели
|
||||
NCOUNT PKG_STD.TNUMBER; -- Количество файлов данных модели, переданных внешней системе
|
||||
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;
|
||||
/* Считаем модель */
|
||||
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.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;
|
||||
|
||||
/* Состояние "Выборки данных оборудования (классы оборудования, модели)" по единице оборудования */
|
||||
@ -752,11 +939,11 @@ text="Проверка прав доступа на работу с ""Выбор
|
||||
and CM.RN = ML.PRN)
|
||||
loop
|
||||
/* Модель есть */
|
||||
if (NRES < 2) then
|
||||
if (NRES < UDO_PKG_EQUIPDS_BASE.NCMML_STATUS_PROCESSED) then
|
||||
NRES := 1;
|
||||
end if;
|
||||
/* Если она уже обучена */
|
||||
if (C.STATUS = 2) then
|
||||
if (C.STATUS = UDO_PKG_EQUIPDS_BASE.NCMML_STATUS_PROCESSED) then
|
||||
NRES := 2;
|
||||
end if;
|
||||
end loop;
|
||||
|
@ -1,5 +1,42 @@
|
||||
create or replace package UDO_PKG_EQUIPDS_BASE as
|
||||
|
||||
/* Константы - состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
NCMFL_STATUS_REGISTERED constant PKG_STD.TNUMBER := 0; -- Зарегистрирован
|
||||
NCMFL_STATUS_UPLOADING constant PKG_STD.TNUMBER := 1; -- Загружается на сервер
|
||||
NCMFL_STATUS_UPLOADED constant PKG_STD.TNUMBER := 2; -- Успешно загружен на сервер
|
||||
NCMFL_STATUS_UPLOAD_ERR constant PKG_STD.TNUMBER := 3; -- Ошибка загрузки на сервер
|
||||
NCMFL_STATUS_SENDING constant PKG_STD.TNUMBER := 4; -- Загружается во внешнюю систему
|
||||
NCMFL_STATUS_SENT constant PKG_STD.TNUMBER := 5; -- Успешно загружен во внешнюю систему
|
||||
NCMFL_STATUS_SEND_ERR constant PKG_STD.TNUMBER := 6; -- При загрузке во внешнюю систему произошла ошибка
|
||||
|
||||
/* Константы - типовые задачи "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
SCMML_TASK_TCF constant PKG_STD.TSTRING := 'TCF'; -- TCF - оценка технического состояния (Technical Condition Forecast)
|
||||
SCMML_TASK_RUL constant PKG_STD.TSTRING := 'RUL'; -- RUL - прогнозирование остаточного ресурса (Remaining Useful Life)
|
||||
SCMML_TASK_FP constant PKG_STD.TSTRING := 'FP'; -- FP - Прогнозирование отказа (Failure Predict)
|
||||
|
||||
/* Константы - состояния "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
NCMML_STATUS_REGISTERED constant PKG_STD.TNUMBER := 0; -- Зарегистрирована
|
||||
NCMML_STATUS_PROCESSING constant PKG_STD.TNUMBER := 1; -- Обрабатывается внешней системой
|
||||
NCMML_STATUS_PROCESSED constant PKG_STD.TNUMBER := 2; -- Успешно обработана внешней системой
|
||||
NCMML_STATUS_PROCESS_ERR constant PKG_STD.TNUMBER := 3; -- При обработке внешней системой произошла ошибка
|
||||
|
||||
/* Проверка прав доступа */
|
||||
function UTL_ACCESS_CHECK
|
||||
(
|
||||
SUSER in varchar2, -- Пользователь
|
||||
STABLE in varchar2, -- Таблица раздела
|
||||
SACTION in varchar2, -- Действие в разделе
|
||||
NDOCUMENT in number := null -- Регистрационный номер документа
|
||||
) return boolean; -- Флаг доступа (false - нет доступа, true - доступ есть)
|
||||
|
||||
/* Проверка прав доступа (процедурная обёртка) */
|
||||
procedure UTL_ACCESS
|
||||
(
|
||||
STABLE in varchar2, -- Таблица раздела
|
||||
SACTION in varchar2, -- Действие в разделе
|
||||
NDOCUMENT in number :=null -- Регистрационный номер документа
|
||||
);
|
||||
|
||||
/* Считывание записи "Выборки данных оборудования" по регистрационному номеру */
|
||||
function GET
|
||||
(
|
||||
@ -109,12 +146,27 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
|
||||
NRN in number -- Регистрационный номер
|
||||
);
|
||||
|
||||
/* Базовая установка описания структуры выборки "Выборки данных оборудования (классы оборудования)" */
|
||||
procedure CM_SET_DATA_CONFIG
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
BDATA_CONFIG in clob -- Описание структуры выборки
|
||||
);
|
||||
|
||||
/* Считывание записи "Выборки данных оборудования (классы оборудования, файлы данных)" по регистрационному номеру */
|
||||
function CMFL_GET
|
||||
(
|
||||
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
|
||||
NRN in number -- Регистрационный номер
|
||||
) return UDO_T_EQUIPDSCMFL%rowtype; -- Запись файла данных класса оборудования выборки данных
|
||||
|
||||
/* Базовое добавление "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_INS
|
||||
(
|
||||
NPRN in number, -- Родитель
|
||||
SFILE_NAME in varchar2, -- Имя файла
|
||||
SDESCR in varchar2, -- Описание
|
||||
BDATASET in blob, -- Данные выборки
|
||||
NRN out number -- Регистрационный номер
|
||||
);
|
||||
|
||||
@ -134,18 +186,25 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
|
||||
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_SET_STATUS
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (0 - зарегистрирован, 1 - загружается на сервер, 2 - успешно загружен на сервер, 3 - ошибка загрузки на сервер, 4 - загружается во внешнюю систему, 5 - успешно загружен во внешнюю систему, 6 - при загрузке во внешнюю систему произошла ошибка)
|
||||
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 -- Сообщение об ошибке
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (см. константы NCMFL_STATUS_*)
|
||||
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 := null -- Сообщение об ошибке
|
||||
);
|
||||
|
||||
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели)" по регистрационному номеру */
|
||||
function CMML_GET
|
||||
(
|
||||
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
|
||||
NRN in number -- Регистрационный номер
|
||||
) return UDO_T_EQUIPDSCMML%rowtype; -- Запись модели класса оборудования выборки данных
|
||||
|
||||
/* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */
|
||||
procedure CMML_FIND_BY_TASK
|
||||
(
|
||||
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
|
||||
NPRN in number, -- Родитель
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NRN out number -- Регистрационный номер
|
||||
);
|
||||
@ -154,7 +213,7 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
|
||||
procedure CMML_INS
|
||||
(
|
||||
NPRN in number, -- Родитель
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NRN out number -- Регистрационный номер
|
||||
);
|
||||
@ -163,7 +222,7 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
|
||||
procedure CMML_UPD
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
|
||||
NPRECISION_P in number -- Точность (план)
|
||||
);
|
||||
|
||||
@ -183,16 +242,16 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
|
||||
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
procedure CMML_SET_STATUS
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (0 - зарегистрирована, 1 - обрабатывается внешней системой, 2 - успешно обработана внешней системой, 3 - при обработке внешней системой произошла ошибка)
|
||||
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 -- Сообщение об ошибке
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (см. константы NCMML_STATUS_*)
|
||||
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 := null -- Сообщение об ошибке
|
||||
);
|
||||
|
||||
/* Формирование наименования для задачи "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
function CMML_TASK_NAME
|
||||
(
|
||||
STASK in varchar2 -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2 -- Задача (см. константы SCMML_TASK_*) */
|
||||
) return varchar2; -- Наименование задачи
|
||||
|
||||
/* Формирование подсказки для задачи "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
@ -242,6 +301,56 @@ end UDO_PKG_EQUIPDS_BASE;
|
||||
/
|
||||
create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
|
||||
/*Константы - мнемокод роли администратора, разрешающей обучение моделей */
|
||||
SROLE_ML_ADMIN constant PKG_STD.TSTRING := 'ML_ADMIN';
|
||||
|
||||
/* Проверка прав доступа */
|
||||
function UTL_ACCESS_CHECK
|
||||
(
|
||||
SUSER in varchar2, -- Пользователь
|
||||
STABLE in varchar2, -- Таблица раздела
|
||||
SACTION in varchar2, -- Действие в разделе
|
||||
NDOCUMENT in number := null -- Регистрационный номер документа
|
||||
) return boolean -- Флаг доступа (false - нет доступа, true - доступ есть)
|
||||
is
|
||||
begin
|
||||
/* Проверим наличие роли администратора у пользователя */
|
||||
for C in (select UR.RN
|
||||
from USERROLES UR,
|
||||
ROLES R,
|
||||
USERLIST UL
|
||||
where UR.ROLEID = R.RN
|
||||
and UR.AUTHID = UL.AUTHID
|
||||
and UL.AUTHID = SUSER
|
||||
and R.ROLENAME = SROLE_ML_ADMIN)
|
||||
loop
|
||||
/* Роль есть */
|
||||
return true;
|
||||
end loop;
|
||||
/* Прав доступа нет */
|
||||
return false;
|
||||
end UTL_ACCESS_CHECK;
|
||||
|
||||
/* Проверка прав доступа (процедурная обёртка) */
|
||||
procedure UTL_ACCESS
|
||||
(
|
||||
STABLE in varchar2, -- Таблица раздела
|
||||
SACTION in varchar2, -- Действие в разделе
|
||||
NDOCUMENT in number :=null -- Регистрационный номер документа
|
||||
)
|
||||
is
|
||||
begin
|
||||
if (not UDO_PKG_EQUIPDS_BASE.UTL_ACCESS_CHECK(SUSER => UTILIZER(),
|
||||
STABLE => STABLE,
|
||||
SACTION => SACTION,
|
||||
NDOCUMENT => NDOCUMENT)) then
|
||||
P_EXCEPTION(0,
|
||||
'У вас нет прав доступа для выполнения действия "%s" в таблице "%s".',
|
||||
SACTION,
|
||||
STABLE);
|
||||
end if;
|
||||
end UTL_ACCESS;
|
||||
|
||||
/* Считывание записи "Выборки данных оборудования" по регистрационному номеру */
|
||||
function GET
|
||||
(
|
||||
@ -531,12 +640,45 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
delete from UDO_T_EQUIPDSCM T where T.RN = NRN;
|
||||
end CM_DEL;
|
||||
|
||||
/* Базовая установка описания структуры выборки "Выборки данных оборудования (классы оборудования)" */
|
||||
procedure CM_SET_DATA_CONFIG
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
BDATA_CONFIG in clob -- Описание структуры выборки
|
||||
)
|
||||
is
|
||||
begin
|
||||
/* Установим описание структуры выборки */
|
||||
update UDO_T_EQUIPDSCM T set T.DATA_CONFIG = BDATA_CONFIG where T.RN = NRN;
|
||||
end CM_SET_DATA_CONFIG;
|
||||
|
||||
/* Считывание записи "Выборки данных оборудования (классы оборудования, файлы данных)" по регистрационному номеру */
|
||||
function CMFL_GET
|
||||
(
|
||||
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
|
||||
NRN in number -- Регистрационный номер
|
||||
) return UDO_T_EQUIPDSCMFL%rowtype -- Запись файла данных класса оборудования выборки данных
|
||||
is
|
||||
RES UDO_T_EQUIPDSCMFL%rowtype; -- Буфер для результата
|
||||
begin
|
||||
/* Считывание записи */
|
||||
begin
|
||||
select T.* into RES from UDO_T_EQUIPDSCMFL T where T.RN = NRN;
|
||||
exception
|
||||
when NO_DATA_FOUND then
|
||||
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCMFL');
|
||||
end;
|
||||
/* Возврат результата */
|
||||
return RES;
|
||||
end CMFL_GET;
|
||||
|
||||
/* Базовое добавление "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_INS
|
||||
(
|
||||
NPRN in number, -- Родитель
|
||||
SFILE_NAME in varchar2, -- Имя файла
|
||||
SDESCR in varchar2, -- Описание
|
||||
BDATASET in blob, -- Данные выборки
|
||||
NRN out number -- Регистрационный номер
|
||||
)
|
||||
is
|
||||
@ -545,21 +687,29 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
NRN := GEN_ID();
|
||||
/* Добавляем запись */
|
||||
insert into UDO_T_EQUIPDSCMFL
|
||||
(RN, PRN, FILE_NAME, DESCR, QUEUE_ID, STATUS, ERR)
|
||||
(RN, PRN, FILE_NAME, DESCR, QUEUE_ID, STATUS, ERR, DATASET)
|
||||
values
|
||||
(NRN, NPRN, SFILE_NAME, SDESCR, null, 0, null);
|
||||
(NRN, NPRN, SFILE_NAME, SDESCR, null, NCMFL_STATUS_REGISTERED, null, BDATASET);
|
||||
end CMFL_INS;
|
||||
|
||||
/* Базовое удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_DEL
|
||||
(
|
||||
NRN in number -- Регистрационный номер
|
||||
NRN in number -- Регистрационный номер
|
||||
)
|
||||
is
|
||||
RREC UDO_T_EQUIPDSCMFL%rowtype; -- Обрабатываемая запись
|
||||
begin
|
||||
/* Считаем запись */
|
||||
RREC := CMFL_GET(NFLAG_SMART => 0, NRN => NRN);
|
||||
/* Можно удалять только в статусах: зарегистрирован, успешно загружен на сервер, ошибка загрузки на сервер, успешно загружен во внешнюю систему, при загрузке во внешнюю систему произошла ошибка */
|
||||
if (RREC.STATUS not in
|
||||
(NCMFL_STATUS_REGISTERED, NCMFL_STATUS_UPLOADED, NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SENT, NCMFL_STATUS_SEND_ERR)) then
|
||||
P_EXCEPTION(0, 'Файл данных обрабатывается, удаление невозможно.');
|
||||
end if;
|
||||
/* Удалим запись */
|
||||
delete from UDO_T_EQUIPDSCMFL T where T.RN = NRN;
|
||||
end CMFL_DEL;
|
||||
end CMFL_DEL;
|
||||
|
||||
/* Базовая установка имени файла "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_SET_FILE_NAME
|
||||
@ -576,27 +726,66 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
|
||||
procedure CMFL_SET_STATUS
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (0 - зарегистрирован, 1 - загружается на сервер, 2 - успешно загружен на сервер, 3 - ошибка загрузки на сервер, 4 - загружается во внешнюю систему, 5 - успешно загружен во внешнюю систему, 6 - при загрузке во внешнюю систему произошла ошибка)
|
||||
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 -- Сообщение об ошибке
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (см. константы NCMFL_STATUS_*)
|
||||
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 := null -- Сообщение об ошибке
|
||||
)
|
||||
is
|
||||
SQUEUE_ID_ PKG_STD.TSTRING := SQUEUE_ID; -- Буфер для идентификатора очереди обработки
|
||||
SERR_ PKG_STD.TSTRING := SERR; -- Буфер для сообщения об ошибке
|
||||
begin
|
||||
/* Проверим идентификатор очереди */
|
||||
if ((NSTATUS in (NCMFL_STATUS_SENDING, NCMFL_STATUS_SENT)) and (SQUEUE_ID_ is null)) then
|
||||
P_EXCEPTION(0,
|
||||
'Идентификатор очереди обработки обязателен для перевода файла данных в состояния "Загружается во внешнюю систему", "Успешно загружен во внешнюю систему".');
|
||||
end if;
|
||||
/* Проверим сообщение об ошибке */
|
||||
if ((NSTATUS in (NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SEND_ERR)) and (SERR_ is null)) then
|
||||
P_EXCEPTION(0,
|
||||
'Текст сообщения об ошибке обязателен для перевода файла данных в состояния "Ошибка загрузки на сервер", "Ошибка загрузки во внешнюю систему".');
|
||||
end if;
|
||||
/* Удалим идентификатор очереди обработки и сообщение об ошибке для тех статусов, где они не нужны */
|
||||
if (NSTATUS not in (NCMFL_STATUS_SENDING, NCMFL_STATUS_SENT)) then
|
||||
SQUEUE_ID_ := null;
|
||||
end if;
|
||||
if (NSTATUS not in (NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SEND_ERR)) then
|
||||
SERR_ := null;
|
||||
end if;
|
||||
/* Установим состояние и сопутствующие ему атрибуты */
|
||||
update UDO_T_EQUIPDSCMFL T
|
||||
set T.STATUS = NSTATUS,
|
||||
T.QUEUE_ID = SQUEUE_ID,
|
||||
T.ERR = SERR
|
||||
T.QUEUE_ID = SQUEUE_ID_,
|
||||
T.ERR = SERR_
|
||||
where T.RN = NRN;
|
||||
end CMFL_SET_STATUS;
|
||||
|
||||
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели)" по регистрационному номеру */
|
||||
function CMML_GET
|
||||
(
|
||||
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
|
||||
NRN in number -- Регистрационный номер
|
||||
) return UDO_T_EQUIPDSCMML%rowtype -- Запись модели класса оборудования выборки данных
|
||||
is
|
||||
RES UDO_T_EQUIPDSCMML%rowtype; -- Буфер для результата
|
||||
begin
|
||||
/* Считывание записи */
|
||||
begin
|
||||
select T.* into RES from UDO_T_EQUIPDSCMML T where T.RN = NRN;
|
||||
exception
|
||||
when NO_DATA_FOUND then
|
||||
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCMML');
|
||||
end;
|
||||
/* Возврат результата */
|
||||
return RES;
|
||||
end CMML_GET;
|
||||
|
||||
/* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */
|
||||
procedure CMML_FIND_BY_TASK
|
||||
(
|
||||
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
|
||||
NPRN in number, -- Родитель
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NRN out number -- Регистрационный номер
|
||||
)
|
||||
@ -624,7 +813,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
procedure CMML_INS
|
||||
(
|
||||
NPRN in number, -- Родитель
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
|
||||
NPRECISION_P in number, -- Точность (план)
|
||||
NRN out number -- Регистрационный номер
|
||||
)
|
||||
@ -636,18 +825,26 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
insert into UDO_T_EQUIPDSCMML
|
||||
(RN, PRN, TASK, PRECISION_P, PRECISION_F, QUEUE_ID, STATUS, ERR)
|
||||
values
|
||||
(NRN, NPRN, STASK, NPRECISION_P, null, null, 0, null);
|
||||
(NRN, NPRN, STASK, NPRECISION_P, null, null, NCMML_STATUS_REGISTERED, null);
|
||||
end CMML_INS;
|
||||
|
||||
/* Базовое исправление "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
procedure CMML_UPD
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
NPRECISION_P in number -- Точность (план)
|
||||
NRN in number, -- Регистрационный номер
|
||||
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
|
||||
NPRECISION_P in number -- Точность (план)
|
||||
)
|
||||
is
|
||||
RREC UDO_T_EQUIPDSCMML%rowtype; -- Обрабатываемая запись
|
||||
begin
|
||||
/* Считаем запись */
|
||||
RREC := CMML_GET(NFLAG_SMART => 0, NRN => NRN);
|
||||
/* Можно изменять только в статусах: зарегистрирована, при обработке внешней системой произошла ошибка */
|
||||
if (RREC.STATUS not in (NCMML_STATUS_REGISTERED, NCMML_STATUS_PROCESS_ERR)) then
|
||||
P_EXCEPTION(0,
|
||||
'Модель обрабатывается или уже успешно обработана, изменение невозможно.');
|
||||
end if;
|
||||
/* Исправим данные */
|
||||
update UDO_T_EQUIPDSCMML T
|
||||
set T.TASK = STASK,
|
||||
@ -658,10 +855,17 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
procedure CMML_DEL
|
||||
(
|
||||
NRN in number -- Регистрационный номер
|
||||
NRN in number -- Регистрационный номер
|
||||
)
|
||||
is
|
||||
RREC UDO_T_EQUIPDSCMML%rowtype; -- Обрабатываемая запись
|
||||
begin
|
||||
/* Считаем запись */
|
||||
RREC := CMML_GET(NFLAG_SMART => 0, NRN => NRN);
|
||||
/* Можно удалять только в статусах: зарегистрирована, успешно обработана внешней системой, при обработке внешней системой произошла ошибка */
|
||||
if (RREC.STATUS not in (NCMML_STATUS_REGISTERED, NCMML_STATUS_PROCESSED, NCMML_STATUS_PROCESS_ERR)) then
|
||||
P_EXCEPTION(0, 'Модель обрабатывается, удаление невозможно.');
|
||||
end if;
|
||||
/* Удалим историю */
|
||||
for C in (select T.RN from UDO_T_EQUIPDSCMMLH T where T.PRN = NRN)
|
||||
loop
|
||||
@ -686,34 +890,53 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
procedure CMML_SET_STATUS
|
||||
(
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (0 - зарегистрирована, 1 - обрабатывается внешней системой, 2 - успешно обработана внешней системой, 3 - при обработке внешней системой произошла ошибка)
|
||||
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 -- Сообщение об ошибке
|
||||
NRN in number, -- Регистрационный номер
|
||||
NSTATUS in number, -- Состояние (см. константы NCMML_STATUS_*)
|
||||
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
|
||||
SERR in varchar2 := null -- Сообщение об ошибке
|
||||
)
|
||||
is
|
||||
SQUEUE_ID_ PKG_STD.TSTRING := SQUEUE_ID; -- Буфер для идентификатора очереди обработки
|
||||
SERR_ PKG_STD.TSTRING := SERR; -- Буфер для сообщения об ошибке
|
||||
begin
|
||||
/* Проверим идентификатор очереди */
|
||||
if ((NSTATUS in (NCMML_STATUS_PROCESSING, NCMML_STATUS_PROCESSED)) and (SQUEUE_ID_ is null)) then
|
||||
P_EXCEPTION(0,
|
||||
'Идентификатор очереди обработки обязателен для перевода модели в состояния "Обрабатывается внешней системой", "Успешно обработана внешней системой".');
|
||||
end if;
|
||||
/* Проверим сообщение об ошибке */
|
||||
if ((NSTATUS in (NCMML_STATUS_PROCESS_ERR)) and (SERR_ is null)) then
|
||||
P_EXCEPTION(0,
|
||||
'Текст сообщения об ошибке обязателен для перевода модели в состояние "Ошибка обработки внешней системой".');
|
||||
end if;
|
||||
/* Удалим идентификатор очереди обработки и сообщение об ошибке для тех статусов, где они не нужны */
|
||||
if (NSTATUS not in (NCMML_STATUS_PROCESSING, NCMML_STATUS_PROCESSED)) then
|
||||
SQUEUE_ID_ := null;
|
||||
end if;
|
||||
if (NSTATUS not in (NCMML_STATUS_PROCESS_ERR)) then
|
||||
SERR_ := null;
|
||||
end if;
|
||||
/* Установим состояние и сопутствующие ему атрибуты */
|
||||
update UDO_T_EQUIPDSCMML T
|
||||
set T.STATUS = NSTATUS,
|
||||
T.QUEUE_ID = SQUEUE_ID,
|
||||
T.ERR = SERR
|
||||
T.QUEUE_ID = SQUEUE_ID_,
|
||||
T.ERR = SERR_
|
||||
where T.RN = NRN;
|
||||
end CMML_SET_STATUS;
|
||||
|
||||
/* Формирование наименования для задачи "Выборки данных оборудования (классы оборудования, модели)" */
|
||||
function CMML_TASK_NAME
|
||||
(
|
||||
STASK in varchar2 -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2 -- Задача (см. константы SCMML_TASK_*) */
|
||||
) return varchar2 -- Наименование задачи
|
||||
is
|
||||
begin
|
||||
case STASK
|
||||
when 'TCF' then
|
||||
when SCMML_TASK_TCF then
|
||||
return 'Оценка технического состояния';
|
||||
when 'RUL' then
|
||||
when SCMML_TASK_RUL then
|
||||
return 'Прогноз остаточного ресурса';
|
||||
when 'FP' then
|
||||
when SCMML_TASK_FP then
|
||||
return 'Прогноз отказа';
|
||||
else
|
||||
return 'Вид задачи оценки не поддерживается';
|
||||
@ -725,9 +948,9 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
||||
return varchar2 -- Подсказка для задачи
|
||||
is
|
||||
begin
|
||||
return '<b>TCF</b> - ' || CMML_TASK_NAME(STASK => 'TCF') || ' (<b>T</b>echnical <b>C</b>ondition <b>F</b>orecast)<br>' ||
|
||||
'<b>RUL</b> - ' || CMML_TASK_NAME(STASK => 'RUL') || ' (<b>R</b>emaining <b>U</b>seful <b>L</b>ife)<br>' ||
|
||||
'<b>FP</b> - ' || CMML_TASK_NAME(STASK => 'FP') || ' (<b>F</b>ailure <b>P</b>redict)';
|
||||
return '<b>TCF</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_TCF) || ' (<b>T</b>echnical <b>C</b>ondition <b>F</b>orecast)<br>' ||
|
||||
'<b>RUL</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_RUL) || ' (<b>R</b>emaining <b>U</b>seful <b>L</b>ife)<br>' ||
|
||||
'<b>FP</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_FP) || ' (<b>F</b>ailure <b>P</b>redict)';
|
||||
end CMML_TASK_HINT;
|
||||
|
||||
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */
|
||||
|
@ -82,7 +82,7 @@ create or replace package UDO_PKG_EQUIPTCF as
|
||||
DFORECAST_DATE in date, -- Дата получения прогноза
|
||||
NFORECAST in number, -- Прогнозное значение, полученное от фреймворка
|
||||
SDICMUNTS in varchar2, -- Единица измерения выборки
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*) */
|
||||
COUT out clob -- Данные детальной карточки прогноза
|
||||
);
|
||||
|
||||
@ -785,7 +785,7 @@ text="Проверка прав доступа при формировании
|
||||
DFORECAST_DATE in date, -- Дата получения прогноза
|
||||
NFORECAST in number, -- Прогнозное значение, полученное от фреймворка
|
||||
SDICMUNTS in varchar2, -- Единица измерения выборки
|
||||
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
|
||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*) */
|
||||
COUT out clob -- Данные детальной карточки прогноза
|
||||
)
|
||||
is
|
||||
@ -977,7 +977,7 @@ text="Проверка прав доступа при формировании
|
||||
UDO_T_EQUIPDSCMML CMML
|
||||
where T.EQCONFIG = NEQCONFIG
|
||||
and T.PRN = CMML.RN
|
||||
and CMML.TASK = 'RUL'
|
||||
and CMML.TASK = UDO_PKG_EQUIPDS_BASE.SCMML_TASK_RUL
|
||||
order by T.RQ_DATE desc)
|
||||
loop
|
||||
DFORECAST_DATE := C.DFORECAST_DATE;
|
||||
|
@ -2,23 +2,28 @@ create or replace procedure UDO_P_EQUIPDSCMFL_CREATE
|
||||
/* Тестовая процедура формирования данных выборки */
|
||||
(
|
||||
NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных
|
||||
NCNT in number -- Количество формируемых файлов
|
||||
NCNT in number, -- Количество формируемых файлов
|
||||
NDATASET_IDENT out number, -- Идентификатор буфера данных
|
||||
NDATASET_CONFIG_IDENT out number -- Идентификатор буфера описания данных
|
||||
)
|
||||
is
|
||||
NTMP PKG_STD.TREF; -- Рег. номер добавленного файла данных
|
||||
begin
|
||||
/* Зачистим старые файлы */
|
||||
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;
|
||||
/* Добавим новые файлы */
|
||||
/* Сформируем идентификаторы */
|
||||
NDATASET_IDENT := GEN_IDENT();
|
||||
NDATASET_CONFIG_IDENT := GEN_IDENT();
|
||||
/* Добавим новые файлы данных */
|
||||
for I in 1 .. NCNT
|
||||
loop
|
||||
UDO_PKG_EQUIPDS_BASE.CMFL_INS(NPRN => NEQUIPDSCM,
|
||||
SFILE_NAME => 'data_' || NEQUIPDSCM || '_' || I || '.xml',
|
||||
SDESCR => 'Описание для файла №' || I,
|
||||
NRN => NTMP);
|
||||
P_FILE_BUFFER_INSERT(NIDENT => NDATASET_IDENT,
|
||||
CFILENAME => 'data_' || NEQUIPDSCM || '_' || I || '_' || TO_CHAR(sysdate, 'yyyymmddhh24miss') ||
|
||||
'.xml',
|
||||
CDATA => 'Описание для файла №' || I,
|
||||
BLOBDATA => CLOB2BLOB(LCDATA => 'Содержимое для файла №' || I));
|
||||
end loop;
|
||||
/* Добавим описание файлов данных */
|
||||
P_FILE_BUFFER_INSERT(NIDENT => NDATASET_CONFIG_IDENT,
|
||||
CFILENAME => null,
|
||||
CDATA => 'Описание структуры выборки',
|
||||
BLOBDATA => null);
|
||||
end;
|
||||
/
|
||||
|
@ -15,16 +15,18 @@ create table UDO_T_EQUIPDSCMFL
|
||||
STATUS number(1) default 0 not null,
|
||||
/* Сообщение об ошибке */
|
||||
ERR varchar2(4000) default null,
|
||||
/* Данные */
|
||||
DATASET blob,
|
||||
/* Ключи */
|
||||
constraint UDO_C_EQUIPDSCMFL_RN_PK primary key (RN),
|
||||
constraint UDO_C_EQUIPDSCMFL_PRN_FK foreign key (PRN) references UDO_T_EQUIPDSCM(RN),
|
||||
constraint UDO_C_EQUIPDSCMFL_FLNM_NB check (rtrim(FILE_NAME) is not null),
|
||||
constraint UDO_C_EQUIPDSCMFL_DESCR_NB check ((DESCR is null) or (rtrim(DESCR) is not null)),
|
||||
constraint UDO_C_EQUIPDSCMFL_QID_NB check ((QUEUE_ID is null) or (rtrim(QUEUE_ID) is not null)),
|
||||
constraint UDO_C_EQUIPDSCMFL_QID_CH check (((STATUS in (4, 5, 6)) and (QUEUE_ID is not null)) or (STATUS not in (4, 5, 6))),
|
||||
constraint UDO_C_EQUIPDSCMFL_QID_CH check (((STATUS in (4, 5)) and (QUEUE_ID is not null)) or ((STATUS not in (4, 5)) and (QUEUE_ID is null))),
|
||||
constraint UDO_C_EQUIPDSCMFL_STATUS_CH check (STATUS in (0, 1, 2, 3, 4, 5, 6)),
|
||||
constraint UDO_C_EQUIPDSCMFL_ERR_NB check ((ERR is null) or (rtrim(ERR) is not null)),
|
||||
constraint UDO_C_EQUIPDSCMFL_ERR_CH check (((STATUS in (3, 6)) and (ERR is not null)) or (STATUS not in (3, 6))),
|
||||
constraint UDO_C_EQUIPDSCMFL_ERR_CH check (((STATUS in (3, 6)) and (ERR is not null)) or ((STATUS not in (3, 6)) and (ERR is null))),
|
||||
constraint UDO_C_EQUIPDSCMFL_FLNM_UN unique (PRN, FILE_NAME),
|
||||
constraint UDO_C_EQUIPDSCMFL_QID_UN unique (FILE_NAME, QUEUE_ID)
|
||||
);
|
||||
|
@ -25,10 +25,10 @@ create table UDO_T_EQUIPDSCMML
|
||||
constraint UDO_C_EQUIPDSCMML_PRECP_CH check ((PRECISION_P > 0) and (PRECISION_P <= 100)),
|
||||
constraint UDO_C_EQUIPDSCMML_PRECF_CH check ((PRECISION_F is null) or ((PRECISION_F is not null) and (PRECISION_F > 0) and (PRECISION_F <= 100))),
|
||||
constraint UDO_C_EQUIPDSCMML_QID_NB check ((QUEUE_ID is null) or (rtrim(QUEUE_ID) is not null)),
|
||||
constraint UDO_C_EQUIPDSCMML_QID_CH check (((STATUS in (1, 2, 3)) and (QUEUE_ID is not null)) or (STATUS not in (1, 2, 3))),
|
||||
constraint UDO_C_EQUIPDSCMML_QID_CH check (((STATUS in (1, 2)) and (QUEUE_ID is not null)) or ((STATUS not in (1, 2)) and (QUEUE_ID is null))),
|
||||
constraint UDO_C_EQUIPDSCMML_STATUS_CH check (STATUS in (0, 1, 2, 3)),
|
||||
constraint UDO_C_EQUIPDSCMML_ERR_NB check ((ERR is null) or (rtrim(ERR) is not null)),
|
||||
constraint UDO_C_EQUIPDSCMML_ERR_CH check (((STATUS in (3)) and (ERR is not null)) or (STATUS not in (3))),
|
||||
constraint UDO_C_EQUIPDSCMML_ERR_CH check (((STATUS in (3)) and (ERR is not null)) or ((STATUS not in (3)) and (ERR is null))),
|
||||
constraint UDO_C_EQUIPDSCMML_UN unique (PRN, TASK, PRECISION_P),
|
||||
constraint UDO_C_EQUIPDSCMML_QID_UN unique (QUEUE_ID)
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user