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