P8-ExchangeService/db/UDO_PKG_EXS_INV.pck

573 lines
29 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

create or replace package UDO_PKG_EXS_INV as
/* Электронная инвентаризация - аутентификация */
procedure CHECKAUTH
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
);
/* Электронная инвентаризация - считывание пользователей */
procedure GETUSERS
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
);
/* Электронная инвентаризация - считывание типов ведомостей */
procedure GETSHEETTYPES
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
);
/* Электронная инвентаризация - считывание заголовков ведомостей инвентаризации */
procedure GETSHEETS
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
);
/* Электронная инвентаризация - считывание состава ведомостей инвентаризации */
procedure GETSHEETITEMS
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
);
/* Электронная инвентаризация - считывание мест хранения */
procedure GETSTORAGES
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
);
/* Электронная инвентаризация - сохранение результатов инвентаризации */
procedure SAVESHEETITEM
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
);
end;
/
create or replace package body UDO_PKG_EXS_INV as
/* Константы - тэги */
STSD constant varchar2(40) := 'tsd';
SCHECKAUTHRESPONSE constant varchar2(40) := 'CheckAuthResponse';
SGETUSERSRESPONSE constant varchar2(40) := 'GetUsersResponse';
SGETSHEETTYPESRESPONSE constant varchar2(40) := 'GetSheetTypesResponse';
SGETSHEETSRESPONSE constant varchar2(40) := 'GetSheetsResponse';
SDEVICEID constant varchar2(40) := 'DeviceID';
SRESULT constant varchar2(40) := 'Result';
SSOAPENV constant varchar2(40) := 'soapenv';
SENVELOPE constant varchar2(40) := 'Envelope';
SHEADER constant varchar2(40) := 'Header';
SBODY constant varchar2(40) := 'Body';
SITEM constant varchar2(40) := 'Item';
SCODE constant varchar2(40) := 'Code';
SNAME constant varchar2(40) := 'Name';
STYPECODE constant varchar2(40) := 'TypeCode';
SPREFIX constant varchar2(40) := 'Prefix';
SNUMBER constant varchar2(40) := 'Number';
SDATE constant varchar2(40) := 'Date';
/* Создание ветки XML */
function UTL_CREATENODE
(
XDOC in DBMS_XMLDOM.DOMDOCUMENT, -- Документ
STAG in varchar2, -- Наименование тэга
SNS in varchar2 default null, -- Пространство имён
SVAL in varchar2 default null -- Значение тэга
)
return DBMS_XMLDOM.DOMNODE -- Ссылка на сформированный тэг документа
is
XEL DBMS_XMLDOM.DOMELEMENT; -- Элемент пространства имён
XNODE DBMS_XMLDOM.DOMNODE; -- Формируемая ветка
XTEXT DBMS_XMLDOM.DOMNODE; -- Текст (значение) формируемой ветки
begin
/* Если задано пространство имён */
if (SNS is not null) then
/* Создаём элемент с его использованием */
XEL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => STAG, NS => SNS);
XNODE := DBMS_XMLDOM.MAKENODE(ELEM => XEL);
DBMS_XMLDOM.SETPREFIX(N => XNODE, PREFIX => SNS);
else
/* Или без него */
XEL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => STAG);
XNODE := DBMS_XMLDOM.MAKENODE(ELEM => XEL);
end if;
/* Значение размещаем в текстовой части ветки */
if (SVAL is not null) then
XTEXT := DBMS_XMLDOM.APPENDCHILD(N => XNODE,
NEWCHILD => DBMS_XMLDOM.MAKENODE(T => DBMS_XMLDOM.CREATETEXTNODE(DOC => XDOC,
DATA => SVAL)));
end if;
/* Вернем результат */
return XNODE;
end UTL_CREATENODE;
/* Считывание значения ветки XML */
function UTL_GETNODEVAL
(
XROOTNODE in DBMS_XMLDOM.DOMNODE, -- Корневая ветка для считывания значения
SPATTERN in varchar2 -- Шаблон для считывания данных
)
return varchar2 -- Считанное значение
is
XNODE DBMS_XMLDOM.DOMNODE; -- Искомая ветка со значением (подходящая под шаблон)
SVAL PKG_STD.TSTRING; -- Результат работы
begin
/* Найдем нужную ветку по шаблону */
XNODE := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XROOTNODE, PATTERN => SPATTERN);
/* Если там нет ничего */
if (DBMS_XMLDOM.ISNULL(N => XNODE)) then
/* Его и вернём */
return null;
end if;
/* Что-то есть - читаем данные */
SVAL := DBMS_XMLDOM.GETNODEVALUE(DBMS_XMLDOM.GETFIRSTCHILD(N => XNODE));
/* Отдаём результат */
return SVAL;
end UTL_GETNODEVAL;
/* Создание документа для ответа */
procedure UTL_CREATERESPONSEDOC
(
XDOC out DBMS_XMLDOM.DOMDOCUMENT -- Буфер для документа
)
is
begin
/* Создаём новый документ */
XDOC := DBMS_XMLDOM.NEWDOMDOCUMENT();
/* Выставляем параметры заголовка */
DBMS_XMLDOM.SETVERSION(DOC => XDOC, VERSION => '1.0" encoding="UTF-8');
/* Выставляем кодировку */
DBMS_XMLDOM.SETCHARSET(DOC => XDOC, CHARSET => 'UTF-8');
end UTL_CREATERESPONSEDOC;
/* Формировние ответа на запрос из XML-документа (обёртывание в конверт подготовленных данных) */
function UTL_CREATERESPONSE
(
XDOC in DBMS_XMLDOM.DOMDOCUMENT, -- Документ
XCONTENT in DBMS_XMLDOM.DOMNODE -- Наименование тэга с отправляемым контентом
) return clob -- Результат работы
is
XMAIN_NODE DBMS_XMLDOM.DOMNODE;
XENVELOPE_EL DBMS_XMLDOM.DOMELEMENT;
XENVELOPE DBMS_XMLDOM.DOMNODE;
XHEADER DBMS_XMLDOM.DOMNODE;
XBODY DBMS_XMLDOM.DOMNODE;
XNODE DBMS_XMLDOM.DOMNODE;
CDATA clob; -- Буфер для результата
begin
/* Подготовим документ */
XMAIN_NODE := DBMS_XMLDOM.MAKENODE(DOC => XDOC);
/* Обернём его в конверт */
XENVELOPE_EL := DBMS_XMLDOM.CREATEELEMENT(DOC => XDOC, TAGNAME => SENVELOPE, NS => SSOAPENV);
DBMS_XMLDOM.SETATTRIBUTE(ELEM => XENVELOPE_EL,
name => 'xmlns:soapenv',
NEWVALUE => 'http://schemas.xmlsoap.org/soap/envelope/');
DBMS_XMLDOM.SETATTRIBUTE(ELEM => XENVELOPE_EL,
name => 'xmlns:tsd',
NEWVALUE => 'http://www.example.org/TSDService/');
XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => XENVELOPE_EL);
DBMS_XMLDOM.SETPREFIX(N => XENVELOPE, PREFIX => SSOAPENV);
XENVELOPE := DBMS_XMLDOM.APPENDCHILD(N => XMAIN_NODE, NEWCHILD => XENVELOPE);
/* Сформируем заголовок */
XHEADER := UTL_CREATENODE(XDOC => XDOC, STAG => SHEADER, SNS => SSOAPENV);
XHEADER := DBMS_XMLDOM.APPENDCHILD(N => XENVELOPE, NEWCHILD => XHEADER);
/* Сформируем тело */
XBODY := UTL_CREATENODE(XDOC => XDOC, STAG => SBODY, SNS => SSOAPENV);
XBODY := DBMS_XMLDOM.APPENDCHILD(N => XENVELOPE, NEWCHILD => XBODY);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XBODY, NEWCHILD => XCONTENT);
/* Конвертируем в CLOB */
DBMS_LOB.CREATETEMPORARY(LOB_LOC => CDATA, CACHE => true, DUR => DBMS_LOB.SESSION);
DBMS_XMLDOM.WRITETOCLOB(DOC => XDOC, CL => CDATA, CHARSET => 'UTF-8');
DBMS_XMLDOM.FREEDOCUMENT(DOC => XDOC);
/* Вернем результат */
return CDATA;
end UTL_CREATERESPONSE;
/* Электронная инвентаризация - аутентификация */
procedure CHECKAUTH
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
XCHECKAUTHRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа
XRESULT DBMS_XMLDOM.DOMNODE; -- Результат аутентификации
XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа
XDOC DBMS_XMLDOM.DOMDOCUMENT; -- Документ
XMLPARCER DBMS_XMLPARSER.PARSER; -- Парсер
XENVELOPE DBMS_XMLDOM.DOMNODE; -- Конверт
XBODY DBMS_XMLDOM.DOMNODE; -- Тело документа
XNODELIST DBMS_XMLDOM.DOMNODELIST; -- Ветки тела документа
XNODE_ROOT DBMS_XMLDOM.DOMNODE; -- Корневой элемент первой ветки тела документа
CRESPONSE clob; -- Буфер для ответа
CREQ clob; -- Буфер для запроса
SREQDEVICEID varchar2(30); -- Идентификатор устройства из запроса
begin
/* Считаем запись очереди */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Возьмем текст запроса */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
/* Создаем инстанс XML парсера */
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
/* Разбираем XML из запроса */
DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ);
/* Берем XML документ из разобранного */
XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER);
/* Считываем корневой элемент */
XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC));
/* Считываем элемент тело */
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY);
/* Считываем дочерние элементы тела */
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY);
/* Берем первый дочерний элемент */
XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0);
/* Считываем идентификатор устройства */
SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID);
/* Контроль индетификатора устройства по лицензии */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Подготавливаем документ для ответа */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */
if (SREQDEVICEID is not null) then
/* Т.к. пока проверок нет никаких - всегда возвращаем положительный ответ */
XCHECKAUTHRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SCHECKAUTHRESPONSE, SNS => STSD);
XRESULT := UTL_CREATENODE(XDOC => XDOC, STAG => SRESULT, SNS => STSD, SVAL => 'true');
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XCHECKAUTHRESPONSE, NEWCHILD => XRESULT);
/* Оборачиваем его в конверт */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XCHECKAUTHRESPONSE);
end if;
/* Возвращаем ответ */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT,
SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK,
BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8'));
exception
when others then
/* Вернём ошибку */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm);
end CHECKAUTH;
/* Электронная инвентаризация - считывание пользователей */
procedure GETUSERS
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
XGETUSERSRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа
XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа
XITEM DBMS_XMLDOM.DOMNODE; -- Элемент ответного списка
XCODE DBMS_XMLDOM.DOMNODE; -- Код элемента ответного списка
XNAME DBMS_XMLDOM.DOMNODE; -- Нименование элемента ответного списка
XDOC DBMS_XMLDOM.DOMDOCUMENT; -- Документ
XMLPARCER DBMS_XMLPARSER.PARSER; -- Парсер
XENVELOPE DBMS_XMLDOM.DOMNODE; -- Конверт
XBODY DBMS_XMLDOM.DOMNODE; -- Тело документа
XNODELIST DBMS_XMLDOM.DOMNODELIST; -- Ветки тела документа
XNODE_ROOT DBMS_XMLDOM.DOMNODE; -- Корневой элемент первой ветки тела документа
CRESPONSE clob; -- Буфер для ответа
CREQ clob; -- Буфер для запроса
SREQDEVICEID varchar2(30); -- Идентификатор устройства из запроса
begin
/* Считаем запись очереди */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Возьмем текст запроса */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
/* Создаем инстанс XML парсера */
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
/* Разбираем XML из запроса */
DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ);
/* Берем XML документ из разобранного */
XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER);
/* Считываем корневой элемент */
XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC));
/* Считываем элемент тело */
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY);
/* Считываем дочерние элементы тела */
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY);
/* Берем первый дочерний элемент */
XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0);
/* Считываем идентификатор устройства */
SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID);
/* Контроль индетификатора устройства по лицензии */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Подготавливаем документ для ответа */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */
if (SREQDEVICEID is not null) then
/* Создаём пространство имён для ответа */
XGETUSERSRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETUSERSRESPONSE, SNS => STSD);
/* Обходим сотрудников-инвентаризаторов */
for REC in (select T.RN,
A.AGNABBR
from INVPERSONS T,
AGNLIST A
where T.COMPANY = 136018
and T.AGNLIST = A.RN)
loop
/* Собираем информацию по сотруднику в ответ */
XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD);
XCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SCODE, SNS => STSD, SVAL => REC.RN);
XNAME := UTL_CREATENODE(XDOC => XDOC, STAG => SNAME, SNS => STSD, SVAL => REC.AGNABBR);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNAME);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETUSERSRESPONSE, NEWCHILD => XITEM);
end loop;
/* Оборачиваем ответ в конверт */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETUSERSRESPONSE);
end if;
/* Возвращаем ответ */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT,
SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK,
BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8'));
exception
when others then
/* Вернём ошибку */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm);
end GETUSERS;
/* Электронная инвентаризация - считывание типов ведомостей */
procedure GETSHEETTYPES
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
XGETSHEETTYPESRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа
XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа
XITEM DBMS_XMLDOM.DOMNODE; -- Элемент ответного списка
XCODE DBMS_XMLDOM.DOMNODE; -- Код элемента ответного списка
XNAME DBMS_XMLDOM.DOMNODE; -- Нименование элемента ответного списка
XDOC DBMS_XMLDOM.DOMDOCUMENT; -- Документ
XMLPARCER DBMS_XMLPARSER.PARSER; -- Парсер
XENVELOPE DBMS_XMLDOM.DOMNODE; -- Конверт
XBODY DBMS_XMLDOM.DOMNODE; -- Тело документа
XNODELIST DBMS_XMLDOM.DOMNODELIST; -- Ветки тела документа
XNODE_ROOT DBMS_XMLDOM.DOMNODE; -- Корневой элемент первой ветки тела документа
CRESPONSE clob; -- Буфер для ответа
CREQ clob; -- Буфер для запроса
SREQDEVICEID varchar2(30); -- Идентификатор устройства из запроса
begin
/* Считаем запись очереди */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Возьмем текст запроса */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
/* Создаем инстанс XML парсера */
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
/* Разбираем XML из запроса */
DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ);
/* Берем XML документ из разобранного */
XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER);
/* Считываем корневой элемент */
XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC));
/* Считываем элемент тело */
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY);
/* Считываем дочерние элементы тела */
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY);
/* Берем первый дочерний элемент */
XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0);
/* Считываем идентификатор устройства */
SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID);
/* Контроль индетификатора устройства по лицензии */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Подготавливаем документ для ответа */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */
if (SREQDEVICEID is not null) then
/* Создаём пространство имён для ответа */
XGETSHEETTYPESRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETSHEETTYPESRESPONSE, SNS => STSD);
/* Обходим типы документов связанные с разделом "Электронные инвенторизации" */
for REC in (select T.RN,
T.DOCCODE
from DOCTYPES T,
COMPVERLIST CV
where T.VERSION = CV.VERSION
and CV.COMPANY = 136018
and T.RN in (select DOCRN from DOCPARAMS where DOCPARAMS.UNITCODE = 'ElectronicInventories')
order by T.DOCCODE)
loop
/* Собираем информацию по типу документа в ответ */
XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD);
XCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SCODE, SNS => STSD, SVAL => REC.RN);
XNAME := UTL_CREATENODE(XDOC => XDOC, STAG => SNAME, SNS => STSD, SVAL => REC.DOCCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNAME);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETSHEETTYPESRESPONSE, NEWCHILD => XITEM);
end loop;
/* Оборачиваем ответ в конверт */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETSHEETTYPESRESPONSE);
end if;
/* Возвращаем ответ */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT,
SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK,
BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8'));
exception
when others then
/* Вернём ошибку */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm);
end GETSHEETTYPES;
/* Электронная инвентаризация - считывание заголовков ведомостей инвентаризации */
procedure GETSHEETS
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
XGETSHEETSRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа
XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа
XITEM DBMS_XMLDOM.DOMNODE; -- Элемент ответного списка
XCODE DBMS_XMLDOM.DOMNODE; -- Код элемента ответного списка
XNAME DBMS_XMLDOM.DOMNODE; -- Нименование элемента ответного списка
XTYPECODE DBMS_XMLDOM.DOMNODE; -- Тип ведомости элемента ответного списка
XPREFIX DBMS_XMLDOM.DOMNODE; -- Префикс ведомости элемента ответного списка
XNUMBER DBMS_XMLDOM.DOMNODE; -- Номер ведомости элемента ответного списка
XDATE DBMS_XMLDOM.DOMNODE; -- Дата ведомости элемента ответного списка
XDOC DBMS_XMLDOM.DOMDOCUMENT; -- Документ
XMLPARCER DBMS_XMLPARSER.PARSER; -- Парсер
XENVELOPE DBMS_XMLDOM.DOMNODE; -- Конверт
XBODY DBMS_XMLDOM.DOMNODE; -- Тело документа
XNODELIST DBMS_XMLDOM.DOMNODELIST; -- Ветки тела документа
XNODE_ROOT DBMS_XMLDOM.DOMNODE; -- Корневой элемент первой ветки тела документа
CRESPONSE clob; -- Буфер для ответа
CREQ clob; -- Буфер для запроса
SREQDEVICEID varchar2(30); -- Идентификатор устройства из запроса
NREQTYPECODE number(17); -- Тип ведомости из запроса (параметр отбора)
SREQPREFIX varchar2(30); -- Префикс ведомости из запроса (параметр отбора)
SREQNUMBER varchar2(30); -- Номер ведомости из запроса (параметр отбора)
DREQDATE date; -- Дата ведомости из запроса (параметр отбора)
begin
/* Считаем запись очереди */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Возьмем текст запроса */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG);
/* Создаем инстанс XML парсера */
XMLPARCER := DBMS_XMLPARSER.NEWPARSER;
/* Разбираем XML из запроса */
DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ);
/* Берем XML документ из разобранного */
XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER);
/* Считываем корневой элемент */
XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC));
/* Считываем элемент тело */
XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY);
/* Считываем дочерние элементы тела */
XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY);
/* Берем первый дочерний элемент */
XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0);
/* Считываем идентификатор устройства */
SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID);
/* Считываем "Тип ведомости" (параметр отбора) */
NREQTYPECODE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => STYPECODE));
/* Считываем "Префикс" (параметр отбора) */
SREQPREFIX := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SPREFIX);
/* Считываем "Номер" (параметр отбора) */
SREQNUMBER := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SNUMBER);
/* Считываем "Дату" (параметр отбора) */
DREQDATE := TO_DATE(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDATE), 'yyyy-mm-dd');
/* Контроль индетификатора устройства по лицензии */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Подготавливаем документ для ответа */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */
if (SREQDEVICEID is not null) then
/* Создаём пространство имён для ответа */
XGETSHEETSRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETSHEETSRESPONSE, SNS => STSD);
/* Обходим типы документов связанные с разделом "Электронные инвенторизации" */
for REC in (select T.RN,
T.DOC_TYPE,
DT.DOCCODE as DOC_TYPE_CODE,
trim(T.DOC_PREF) as DOC_PREF,
trim(T.DOC_NUMB) as DOC_NUMB,
T.DOC_DATE
from ELINVENTORY T,
DOCTYPES DT
where T.COMPANY = 136018
and T.DOC_TYPE = DT.RN
and (NREQTYPECODE is null or (NREQTYPECODE is not null and T.DOC_TYPE = NREQTYPECODE))
and (SREQPREFIX is null or (SREQPREFIX is not null and trim(T.DOC_PREF) = SREQPREFIX))
and (SREQNUMBER is null or (SREQNUMBER is not null and trim(T.DOC_NUMB) = SREQNUMBER))
and (DREQDATE is null or (DREQDATE is not null and T.DOC_DATE = DREQDATE)))
loop
/* Собираем информацию по ведомости в ответ */
XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD);
XCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SCODE, SNS => STSD, SVAL => REC.RN);
XNAME := UTL_CREATENODE(XDOC => XDOC,
STAG => SNAME,
SNS => STSD,
SVAL => REC.DOC_TYPE_CODE || ', ' || REC.DOC_PREF || '-' || REC.DOC_NUMB || ', ' ||
TO_CHAR(REC.DOC_DATE, 'dd.mm.yyyy'));
XTYPECODE := UTL_CREATENODE(XDOC => XDOC, STAG => STYPECODE, SNS => STSD, SVAL => REC.DOC_TYPE);
XPREFIX := UTL_CREATENODE(XDOC => XDOC, STAG => SPREFIX, SNS => STSD, SVAL => REC.DOC_PREF);
XNUMBER := UTL_CREATENODE(XDOC => XDOC, STAG => SNUMBER, SNS => STSD, SVAL => REC.DOC_NUMB);
XDATE := UTL_CREATENODE(XDOC => XDOC,
STAG => SDATE,
SNS => STSD,
SVAL => TO_CHAR(REC.DOC_DATE, 'yyyy-mm-dd'));
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNAME);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XTYPECODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XPREFIX);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNUMBER);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XDATE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETSHEETSRESPONSE, NEWCHILD => XITEM);
end loop;
/* Оборачиваем ответ в конверт */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETSHEETSRESPONSE);
end if;
/* Возвращаем ответ */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT,
SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK,
BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8'));
exception
when others then
/* Вернём ошибку */
PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm);
end GETSHEETS;
/* Электронная инвентаризация - считывание состава ведомостей инвентаризации */
procedure GETSHEETITEMS
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
begin
null;
end GETSHEETITEMS;
/* Электронная инвентаризация - считывание мест хранения */
procedure GETSTORAGES
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
begin
null;
end GETSTORAGES;
/* Электронная инвентаризация - сохранение результатов инвентаризации */
procedure SAVESHEETITEM
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
begin
null;
end SAVESHEETITEM;
end;
/