P8-ExchangeService/db/UDO_PKG_EXS_INV.pck

1170 lines
68 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
/* Считывание значения структурного элемента из иерархии адреса географического понятия */
function UTL_GEOGRAFY_GET_HIER_ITEM
(
NGEOGRAFY in number, -- Регистрационный номер географического понятия
NGEOGRTYPE in number -- Тип искомого структурного элемента адреса (1 - страна, 2 - регион, 3 - район, 4 - населенный пункт, 5 - улица, 6 - административный округ, 7 - муниципальный округ, 8 - город, 9 - уровень внутригородской территории, 10 - уровень дополнительных территорий, 11 - уровень подчиненных дополнительным территориям объектов)
) return varchar2; -- Наименование найденного стуктурного элемента адреса
/* Электронная инвентаризация - аутентификация */
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';
SGETSTORAGESRESPONSE constant varchar2(40) := 'GetStoragesResponse';
SGETSHEETITEMSRESPONSE constant varchar2(40) := 'GetSheetItemsResponse';
SSAVESHEETITEMRESPONSE constant varchar2(40) := 'SaveSheetItemResponse';
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';
SSHEETCODE constant varchar2(40) := 'SheetCode';
SMNEMOCODE constant varchar2(40) := 'MnemoCode';
SLATITUDE constant varchar2(40) := 'Latitude';
SLONGITUDE constant varchar2(40) := 'Longitude';
SPOSTCODE constant varchar2(40) := 'Postcode';
SCOUNTRY constant varchar2(40) := 'Country';
SREGION constant varchar2(40) := 'Region';
SLOCALITY constant varchar2(40) := 'Locality';
SSTREET constant varchar2(40) := 'Street';
SHOUSENUMBER constant varchar2(40) := 'HouseNumber';
SSTORAGEMNEMOCODE constant varchar2(40) := 'StorageMnemoCode';
SUSERCODE constant varchar2(40) := 'UserCode';
SITEMCODE constant varchar2(40) := 'ItemCode';
SITEMNAME constant varchar2(40) := 'ItemName';
SITEMMNEMOCODE constant varchar2(40) := 'ItemMnemoCode';
SITEMNUMBER constant varchar2(40) := 'ItemNumber';
SQUANTITY constant varchar2(40) := 'Quantity';
SSTORAGEISNEW constant varchar2(40) := 'StorageIsNew';
SSTORAGECODE constant varchar2(40) := 'StorageCode';
SSTORAGENAME constant varchar2(40) := 'StorageName';
SSTORAGEPOSTCODE constant varchar2(40) := 'StoragePostcode';
SSTORAGECOUNTRY constant varchar2(40) := 'StorageCountry';
SSTORAGEREGION constant varchar2(40) := 'StorageRegion';
SSTORAGELOCALITY constant varchar2(40) := 'StorageLocality';
SSTORAGESTREET constant varchar2(40) := 'StorageStreet';
SSTORAGEHOUSENUMBER constant varchar2(40) := 'StorageHouseNumber';
SSTORAGELATITUDE constant varchar2(40) := 'StorageLatitude';
SSTORAGELONGITUDE constant varchar2(40) := 'StorageLongitude';
SCHECKDATE constant varchar2(40) := 'CheckDate';
SCOMMENT constant varchar2(40) := 'Comment';
SDISTANCETOSTORAGE constant varchar2(40) := 'DistanceToStorage';
SFLOOR constant varchar2(40) := 'Floor';
SROOM constant varchar2(40) := 'Room';
SRACK constant varchar2(40) := 'Rack';
SFAULT constant varchar2(40) := 'Fault';
SDETAIL constant varchar2(40) := 'detail';
SMESSAGE constant varchar2(40) := 'Message';
SERRORMESSAGE constant varchar2(40) := 'ErrorMessage';
/* Создание ветки 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;
/* Формирование ответа с ошибкой */
function UTL_CREATEERRORRESPONSE
(
XDOC in DBMS_XMLDOM.DOMDOCUMENT, -- Документ
SMSG in varchar2 -- Сообщение об ошибке
) return clob -- Результат работы
is
XFAULT DBMS_XMLDOM.DOMNODE; --
XDETAIL DBMS_XMLDOM.DOMNODE; --
XERRMSG DBMS_XMLDOM.DOMNODE; --
XMSG DBMS_XMLDOM.DOMNODE; --
XNODE DBMS_XMLDOM.DOMNODE; --
CDATA clob; -- Буфер для результата
begin
/* Собираем ошибку в ответ */
XFAULT := UTL_CREATENODE(XDOC => XDOC, STAG => SFAULT, SNS => SSOAPENV);
XDETAIL := UTL_CREATENODE(XDOC => XDOC, STAG => SDETAIL);
XERRMSG := UTL_CREATENODE(XDOC => XDOC, STAG => SERRORMESSAGE, SNS => STSD);
XMSG := UTL_CREATENODE(XDOC => XDOC, STAG => SMESSAGE, SNS => STSD, SVAL => SMSG);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XERRMSG, NEWCHILD => XMSG);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XDETAIL, NEWCHILD => XERRMSG);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XFAULT, NEWCHILD => XDETAIL);
CDATA := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XFAULT);
/* Возвращаем результат */
return CDATA;
end UTL_CREATEERRORRESPONSE;
/* Считывание значения структурного элемента из иерархии адреса географического понятия */
function UTL_GEOGRAFY_GET_HIER_ITEM
(
NGEOGRAFY in number, -- Регистрационный номер географического понятия
NGEOGRTYPE in number -- Тип искомого структурного элемента адреса (1 - страна, 2 - регион, 3 - район, 4 - населенный пункт, 5 - улица, 6 - административный округ, 7 - муниципальный округ, 8 - город, 9 - уровень внутригородской территории, 10 - уровень дополнительных территорий, 11 - уровень подчиненных дополнительным территориям объектов)
) return varchar2 -- Наименование найденного стуктурного элемента адреса
is
SRES PKG_STD.TSTRING; -- Результат работы
begin
/* Обходим адрес снизу вверх */
for REC in (select G.GEOGRNAME,
G.GEOGRTYPE
from GEOGRAFY G
connect by prior G.PRN = G.RN
start with G.RN = NGEOGRAFY)
loop
if (REC.GEOGRTYPE = NGEOGRTYPE) then
SRES := REC.GEOGRNAME;
exit;
end if;
end loop;
/* Вернём результат */
return SRES;
end UTL_GEOGRAFY_GET_HIER_ITEM;
/* Электронная инвентаризация - аутентификация */
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 PKG_STD.TSTRING; -- Идентификатор устройства из запроса
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 PKG_STD.TSTRING; -- Идентификатор устройства из запроса
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 PKG_STD.TSTRING; -- Идентификатор устройства из запроса
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 PKG_STD.TSTRING; -- Идентификатор устройства из запроса
NREQTYPECODE PKG_STD.TREF; -- Тип ведомости из запроса (параметр отбора)
SREQPREFIX PKG_STD.TSTRING; -- Префикс ведомости из запроса (параметр отбора)
SREQNUMBER PKG_STD.TSTRING; -- Номер ведомости из запроса (параметр отбора)
DREQDATE PKG_STD.TLDATE; -- Дата ведомости из запроса (параметр отбора)
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
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
XGETSHEETITEMSRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа
XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа
XITEM DBMS_XMLDOM.DOMNODE; -- Элемент ответного списка
XSTORAGEMNEMOCODE DBMS_XMLDOM.DOMNODE; -- Мнемокод местоположения для элемента ответного списка
XUSERCODE DBMS_XMLDOM.DOMNODE; -- МОЛ для элемента ответного списка
XITEMCODE DBMS_XMLDOM.DOMNODE; -- Идентификатор ОС для элемента ответного списка
XITEMNAME DBMS_XMLDOM.DOMNODE; -- Наименование ОС для элемента ответного списка
XITEMMNEMOCODE DBMS_XMLDOM.DOMNODE; -- Код ОС для элемента ответного списка
XITEMNUMBER DBMS_XMLDOM.DOMNODE; -- Номер ОС для элемента ответного списка
XQUANTITY 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 PKG_STD.TSTRING; -- Идентификатор устройства из запроса
NREQSHEETCODE PKG_STD.TREF; -- Ведомость из запроса (параметр отбора)
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);
/* Считываем "Регистрационный номер ведомости" (параметр отбора) */
NREQSHEETCODE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSHEETCODE));
/* Контроль индетификатора устройства по лицензии */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Подготавливаем документ для ответа */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */
if (SREQDEVICEID is not null) then
/* Создаём пространство имён для ответа */
XGETSHEETITEMSRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETSHEETITEMSRESPONSE, SNS => STSD);
/* Обходим типы документов связанные с разделом "Электронные инвентаризации" */
for REC in (select T.RN NRN,
T.COMPANY NCOMPANY,
T.BARCODE SBARCODE,
T.IS_LOADED NIS_LOADED,
DECODE(T.INVPACK, null, O.PLACE_MNEMO, OP.PLACE_MNEMO) SSTORAGEMNEMOCODE,
DECODE(T.INVPACK, null, O.BARCODE, OP.BARCODE) SOBARCODE,
T.INVPERSONS NINVPERSONS,
DECODE(PS.RN,
null,
DECODE(T.INVPACK, null, DECODE(T.INVSUBST, null, I.BARCODE, U.BARCODE), P.BARCODE),
PS.BARCODE) SIBARCODE,
N1.NOMEN_CODE SNOM_CODE,
N1.NOMEN_NAME SNOM_NAME,
I.INV_NUMBER SINV_NUMBER,
'1' SQUANTITY
from ELINVOBJECT T,
INVENTORY I,
DICPLACE O,
DICPLACE OP,
INVPACK P,
INVPACKPOS PS,
INVSUBST U,
DICNOMNS N1
where T.COMPANY = 136018
and T.PRN = NREQSHEETCODE
and T.INVENTORY = I.RN
and I.OBJECT_PLACE = O.RN(+)
and T.INVPACK = P.RN(+)
and P.OBJECT_PLACE = OP.RN(+)
and T.INVPACK = PS.PRN(+)
and T.INVSUBST = PS.INVSUBST(+)
and T.INVSUBST = U.RN(+)
and I.NOMENCLATURE = N1.RN)
loop
/* Собираем информацию по элементам ведомости в ответ */
XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD);
XSTORAGEMNEMOCODE := UTL_CREATENODE(XDOC => XDOC,
STAG => SSTORAGEMNEMOCODE,
SNS => STSD,
SVAL => REC.SSTORAGEMNEMOCODE);
XUSERCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SUSERCODE, SNS => STSD, SVAL => trim(REC.NINVPERSONS));
XITEMCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SITEMCODE, SNS => STSD, SVAL => trim(REC.SIBARCODE));
XITEMNAME := UTL_CREATENODE(XDOC => XDOC, STAG => SITEMNAME, SNS => STSD, SVAL => trim(REC.SNOM_NAME));
XITEMMNEMOCODE := UTL_CREATENODE(XDOC => XDOC,
STAG => SITEMMNEMOCODE,
SNS => STSD,
SVAL => trim(REC.SNOM_CODE));
XITEMNUMBER := UTL_CREATENODE(XDOC => XDOC,
STAG => SITEMNUMBER,
SNS => STSD,
SVAL => trim(REC.SINV_NUMBER));
XQUANTITY := UTL_CREATENODE(XDOC => XDOC, STAG => SQUANTITY, SNS => STSD, SVAL => REC.SQUANTITY);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XSTORAGEMNEMOCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XUSERCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XITEMCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XITEMNAME);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XITEMMNEMOCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XITEMNUMBER);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XQUANTITY);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETSHEETITEMSRESPONSE, NEWCHILD => XITEM);
/* Выставим дату выгрузки в терминал для позиции ведомости инвентаризации */
P_ELINVOBJECT_BASE_UPDATE(NCOMPANY => REC.NCOMPANY,
NRN => REC.NRN,
DUNLOAD_DATE => sysdate,
DINV_DATE => null,
NINVPERSONS => REC.NINVPERSONS,
SBARCODE => REC.SBARCODE,
NIS_LOADED => REC.NIS_LOADED);
end loop;
/* Оборачиваем ответ в конверт */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETSHEETITEMSRESPONSE);
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 GETSHEETITEMS;
/* Электронная инвентаризация - считывание мест хранения */
procedure GETSTORAGES
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
XGETSTORAGESRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа
XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа
XITEM DBMS_XMLDOM.DOMNODE; -- Элемент ответного списка
XCODE DBMS_XMLDOM.DOMNODE; -- Код элемента ответного списка
XNAME DBMS_XMLDOM.DOMNODE; -- Нименование элемента ответного списка
XMNEMOCODE DBMS_XMLDOM.DOMNODE; -- Мнемокод местоположения для элемента ответного списка
XLATITUDE DBMS_XMLDOM.DOMNODE; -- Широта местоположения для элемента ответного списка
XLONGITUDE DBMS_XMLDOM.DOMNODE; -- Долгота местоположения для элемента ответного списка
XPOSTCODE DBMS_XMLDOM.DOMNODE; -- Почтовый индекс местоположения для элемента ответного списка
XCOUNTRY DBMS_XMLDOM.DOMNODE; -- Страна местоположения для элемента ответного списка
XREGION DBMS_XMLDOM.DOMNODE; -- Регион местоположения для элемента ответного списка
XLOCALITY DBMS_XMLDOM.DOMNODE; -- Населённый пункт местоположения для элемента ответного списка
XSTREET DBMS_XMLDOM.DOMNODE; -- Улица местоположения для элемента ответного списка
XHOUSENUMBER 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 PKG_STD.TSTRING; -- Идентификатор устройства из запроса
NREQSHEETCODE PKG_STD.TREF; -- Ведомость из запроса (параметр отбора)
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);
/* Считываем "Регистрационный номер ведомости" (параметр отбора) */
NREQSHEETCODE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSHEETCODE));
/* Контроль индетификатора устройства по лицензии */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Подготавливаем документ для ответа */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */
if (SREQDEVICEID is not null) then
/* Создаём пространство имён для ответа */
XGETSTORAGESRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETSTORAGESRESPONSE, SNS => STSD);
/* Обходим места хранения */
for REC in (select T.RN NRN,
T.PLACE_MNEMO SMNEMOCODE,
T.PLACE_NAME SNAME,
UDO_F_GET_DOC_PROP_VAL_STR('LATITUDE', 'ObjPlace', T.RN) SLATITUDE,
UDO_F_GET_DOC_PROP_VAL_STR('LONGITUDE', 'ObjPlace', T.RN) SLONGITUDE,
nvl(T.ADDR_POST, G.POSTAL_CODE) SPOSTCODE,
UTL_GEOGRAFY_GET_HIER_ITEM(G.RN, 1) SCOUNTRY,
UTL_GEOGRAFY_GET_HIER_ITEM(G.RN, 2) SREGION,
NVL(UTL_GEOGRAFY_GET_HIER_ITEM(G.RN, 8),
NVL(UTL_GEOGRAFY_GET_HIER_ITEM(G.RN, 4),
NVL(UTL_GEOGRAFY_GET_HIER_ITEM(G.RN, 3), UTL_GEOGRAFY_GET_HIER_ITEM(G.RN, 2)))) SLOCALITY,
UTL_GEOGRAFY_GET_HIER_ITEM(G.RN, 5) SSTREET,
T.ADDR_HOUSE SHOUSENUMBER,
T.BARCODE SBARCODE
from DICPLACE T,
GEOGRAFY G
where T.COMPANY = 136018
and T.GEOGRAFY = G.RN(+)
and ((NREQSHEETCODE is null) or
((NREQSHEETCODE is not null) and
(T.RN in (select DECODE(EO.INVPACK, null, INV.OBJECT_PLACE, P.OBJECT_PLACE)
from ELINVOBJECT EO,
INVENTORY INV,
INVPACK P
where EO.PRN = NREQSHEETCODE
and EO.INVENTORY = INV.RN
and EO.INVPACK = P.RN(+))))))
loop
/* Собираем информацию по месту хранения в ответ */
XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD);
XCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SCODE, SNS => STSD, SVAL => REC.SBARCODE);
XNAME := UTL_CREATENODE(XDOC => XDOC, STAG => SNAME, SNS => STSD, SVAL => REC.SNAME);
XMNEMOCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SMNEMOCODE, SNS => STSD, SVAL => REC.SMNEMOCODE);
XLATITUDE := UTL_CREATENODE(XDOC => XDOC, STAG => SLATITUDE, SNS => STSD, SVAL => REC.SLATITUDE);
XLONGITUDE := UTL_CREATENODE(XDOC => XDOC, STAG => SLONGITUDE, SNS => STSD, SVAL => REC.SLONGITUDE);
XPOSTCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SPOSTCODE, SNS => STSD, SVAL => REC.SPOSTCODE);
XCOUNTRY := UTL_CREATENODE(XDOC => XDOC, STAG => SCOUNTRY, SNS => STSD, SVAL => REC.SCOUNTRY);
XREGION := UTL_CREATENODE(XDOC => XDOC, STAG => SREGION, SNS => STSD, SVAL => REC.SREGION);
XLOCALITY := UTL_CREATENODE(XDOC => XDOC, STAG => SLOCALITY, SNS => STSD, SVAL => REC.SLOCALITY);
XSTREET := UTL_CREATENODE(XDOC => XDOC, STAG => SSTREET, SNS => STSD, SVAL => REC.SSTREET);
XHOUSENUMBER := UTL_CREATENODE(XDOC => XDOC, STAG => SHOUSENUMBER, SNS => STSD, SVAL => REC.SHOUSENUMBER);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNAME);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XMNEMOCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XLATITUDE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XLONGITUDE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XPOSTCODE);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XCOUNTRY);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XREGION);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XLOCALITY);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XSTREET);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XHOUSENUMBER);
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETSTORAGESRESPONSE, NEWCHILD => XITEM);
end loop;
/* Оборачиваем ответ в конверт */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETSTORAGESRESPONSE);
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 GETSTORAGES;
/* Электронная инвентаризация - сохранение результатов инвентаризации */
procedure SAVESHEETITEM
(
NIDENT in number, -- Идентификатор процесса
NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена
)
is
REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди
XSAVESHEETITEMRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа
XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа
XITEM 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 PKG_STD.TSTRING; -- Идентификатор устройства из запроса
NREQSHEETCODE PKG_STD.TREF; -- Ведомость из запроса (параметр сохранения)
NREQUSERCODE PKG_STD.TREF; -- Регистрационный номер МОЛ из запроса (параметр сохранения)
SREQSTORAGEMNEMOCODE PKG_STD.TSTRING; -- Мнемокод места хранения из запроса (параметр сохранения)
NREQSTORAGEISNEW PKG_STD.TNUMBER; -- Признак нового места хранения из запроса (параметр сохранения)
SREQSTORAGECODE PKG_STD.TSTRING; -- Штрих-код места хранения из запроса (параметр сохранения)
SREQSTORAGENAME PKG_STD.TSTRING; -- Наименование места хранения из запроса (параметр сохранения)
SREQSTORAGEPOSTCODE PKG_STD.TSTRING; -- Почтовый индекс места хранения из запроса (параметр сохранения)
SREQSTORAGECOUNTRY PKG_STD.TSTRING; -- Страна места хранения из запроса (параметр сохранения)
SREQSTORAGEREGION PKG_STD.TSTRING; -- Регион места хранения из запроса (параметр сохранения)
SREQSTORAGELOCALITY PKG_STD.TSTRING; -- Населенный пункт места хранения из запроса (параметр сохранения)
SREQSTORAGESTREET PKG_STD.TSTRING; -- Улица места хранения из запроса (параметр сохранения)
SREQSTORAGEHOUSENUMBER PKG_STD.TSTRING; -- Номер дома места хранения из запроса (параметр сохранения)
NREQSTORAGELATITUDE PKG_STD.TLNUMBER; -- Широта места хранения из запроса (параметр сохранения)
NREQSTORAGELONGITUDE PKG_STD.TLNUMBER; -- Долгота места хранения из запроса (параметр сохранения)
SREQITEMCODE PKG_STD.TSTRING; -- Штрих-код ОС из запроса (параметр сохранения)
SREQITEMNAME PKG_STD.TSTRING; -- Наименование номенклатуры ОС из запроса (параметр сохранения)
SREQITEMMNEMOCODE PKG_STD.TSTRING; -- Мнемокод номенклатуры ОС из запроса (параметр сохранения)
SREQITEMNUMBER PKG_STD.TSTRING; -- Инвентарный номер ОС из запроса (параметр сохранения)
NREQQUANTITY PKG_STD.TQUANT; -- Количество ОС из запроса (параметр сохранения)
DREQCHECKDATE PKG_STD.TLDATE; -- Дата проведения инвентаризации ОС из запроса (параметр сохранения)
SREQCOMMENT PKG_STD.TLSTRING; -- Комментарий МОЛ ОС из запроса (параметр сохранения)
NREQLATITUDE PKG_STD.TLNUMBER; -- Широта из запроса (параметр сохранения)
NREQLONGITUDE PKG_STD.TLNUMBER; -- Долгота из запроса (параметр сохранения)
NREQDISTANCETOSTORAGE PKG_STD.TLNUMBER; -- Расстояние до места хранения ОС из запроса (параметр сохранения)
SREQFLOOR PKG_STD.TSTRING; -- Этаж расположения ОС из запроса (параметр сохранения)
SREQROOM PKG_STD.TSTRING; -- Помещение расположения ОС из запроса (параметр сохранения)
SREQRACK PKG_STD.TSTRING; -- Стеллаж расположения ОС из запроса (параметр сохранения)
NELINVOBJECT PKG_STD.TREF; -- Рег. номер позиции ведомости инвентаризации
SDICPLACEBARCODE PKG_STD.TSTRING; -- Штрих-код места хранения gсогласно ведомости
NINVENTORY PKG_STD.TREF; -- Рег. номер ОС (карточки "Инвентарной картотеки")
NCOMPANY PKG_STD.TREF; -- Рег. номер организации
NPROPERTY PKG_STD.TREF; -- Рег. номер ДС позиции ведомости инвентаризации для хранения комментария
SERR PKG_STD.TSTRING; -- Буфер для ошибок
NTMP PKG_STD.TREF; -- Буфер для рег. номеров
begin
/* Инициализируем организацию */
NCOMPANY := 136018;
/* Инициализируем ДС для хранения примечания */
FIND_DOCS_PROPS_CODE(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, SCODE => 'COMMENT', NRN => NPROPERTY);
/* Считаем запись очереди */
REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE);
/* Возьмем текст запроса */
CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG, SCHARSET => 'UTF8');
/* Создаем инстанс 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);
/* Считываем "Регистрационный номер ведомости" (параметр сохранения) */
NREQSHEETCODE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSHEETCODE));
/* Считываем "Регистрационный номер МОЛ" (параметр сохранения) */
NREQUSERCODE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SUSERCODE));
/* Считываем "Мнемокод места хранения" (параметр сохранения) */
SREQSTORAGEMNEMOCODE := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGEMNEMOCODE);
/* Считываем "Признак нового места хранения" (параметр сохранения) */
NREQSTORAGEISNEW := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGEISNEW));
/* Считываем "Штрих-код места хранения" (параметр сохранения) */
SREQSTORAGECODE := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGECODE);
/* Считываем "Наименование места хранения" (параметр сохранения) */
SREQSTORAGENAME := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGENAME);
/* Считываем "Почтовый индекс места хранения" (параметр сохранения) */
SREQSTORAGEPOSTCODE := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGEPOSTCODE);
/* Считываем "Страна места хранения" (параметр сохранения) */
SREQSTORAGECOUNTRY := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGECOUNTRY);
/* Считываем "Регион места хранения" (параметр сохранения) */
SREQSTORAGEREGION := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGEREGION);
/* Считываем "Населенный пункт места хранения" (параметр сохранения) */
SREQSTORAGELOCALITY := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGELOCALITY);
/* Считываем "Улица места хранения" (параметр сохранения) */
SREQSTORAGESTREET := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGESTREET);
/* Считываем "Номер дома места хранения" (параметр сохранения) */
SREQSTORAGEHOUSENUMBER := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGEHOUSENUMBER);
/* Считываем "Широта места хранения" (параметр сохранения) */
NREQSTORAGELATITUDE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGELATITUDE));
/* Считываем "Долгота места хранения" (параметр сохранения) */
NREQSTORAGELONGITUDE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SSTORAGELONGITUDE));
/* Считываем "Штрих-код ОС" (параметр сохранения) */
SREQITEMCODE := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SITEMCODE);
/* Считываем "Наименование номенклатуры ОС" (параметр сохранения) */
SREQITEMNAME := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SITEMNAME);
/* Считываем "Мнемокод номенклатуры ОС" (параметр сохранения) */
SREQITEMMNEMOCODE := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SITEMMNEMOCODE);
/* Считываем "Инвентарный номер ОС" (параметр сохранения) */
SREQITEMNUMBER := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SITEMNUMBER);
/* Считываем "Количество ОС" (параметр сохранения) */
NREQQUANTITY := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SQUANTITY));
/* Считываем "Дата проведения инвентаризации ОС" (параметр сохранения) */
DREQCHECKDATE := TO_DATE(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SCHECKDATE), 'YYYY-MM-DD"T"HH24:MI:SS');
/* Считываем "Комментарий МОЛ ОС" (параметр сохранения) */
SREQCOMMENT := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SCOMMENT);
/* Считываем "Широта" (параметр сохранения) */
NREQLATITUDE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SLATITUDE));
/* Считываем "Долгота" (параметр сохранения) */
NREQLONGITUDE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SLONGITUDE));
/* Считываем "Расстояние до места хранения ОС" (параметр сохранения) */
NREQDISTANCETOSTORAGE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDISTANCETOSTORAGE));
/* Считываем "Этаж расположения ОС" (параметр сохранения) */
SREQFLOOR := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SFLOOR);
/* Считываем "Помещение расположения ОС" (параметр сохранения) */
SREQROOM := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SROOM);
/* Считываем "Стеллаж расположения ОС" (параметр сохранения) */
SREQRACK := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SRACK);
/* Контроль индетификатора устройства по лицензии */
/* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */
/* Подготавливаем документ для ответа */
UTL_CREATERESPONSEDOC(XDOC => XDOC);
/* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */
if (SREQDEVICEID is not null) then
if ((NREQSHEETCODE is not null) and (DREQCHECKDATE is not null)) then
/*
TODO: owner="root" created="14.01.2019"
text="Понять зачем мы это делаем (дальше результаты проверки не идут).
Надо реализовать добавление нового местонахождения + смену текущего"
*/
/* Если задан штрих-код местанхождения ОС */
if (SREQSTORAGECODE is not null) then
/* Проверяем наличие местонахохждения */
begin
select T.BARCODE
into SDICPLACEBARCODE
from DICPLACE T
where T.COMPANY = NCOMPANY
and T.BARCODE = SREQSTORAGECODE;
exception
when NO_DATA_FOUND then
SERR := 'Местонахождение инвентарных объектов с штрих-кодом "' || SREQSTORAGECODE || '" не найдено';
end;
end if;
/* Пробуем найти позицию ведомости инвентаризации по штрих-коду (если передан рег. номер ведомости и пока нет ошибок) */
if ((NREQSHEETCODE is not null) and (SERR is null)) then
begin
select T.NRN
into NELINVOBJECT
from V_ELINVOBJECT T
where T.NCOMPANY = NCOMPANY
and T.NPRN = NREQSHEETCODE
and T.SIBARCODE = SREQITEMCODE;
exception
when NO_DATA_FOUND then
/* Ищем рег. номер ИК по штрихкоду, если не нашли позицию ведомости инвентаризации */
begin
select T.RN
into NINVENTORY
from INVENTORY T
where T.BARCODE = SREQITEMCODE
and T.COMPANY = NCOMPANY;
exception
when NO_DATA_FOUND then
SERR := 'Инвентарная карточка с штрих-кодом "' || SREQITEMCODE || '" не найдена';
end;
end;
end if;
/* Если нет ошибок при проверках */
if (SERR is null) then
/* И у нас есть штрихкод фактического местонахождения */
if (SDICPLACEBARCODE is not null) then
/* Если позиция ведомости инвентаризации найдена */
if (NELINVOBJECT is not null) then
/* Обновим её */
for C in (select T.* from ELINVOBJECT T where T.RN = NELINVOBJECT)
loop
P_DOCS_PROPS_VALS_BASE_MODIFY(NDOCUMENT => C.RN,
SUNITCODE => 'ElectronicInventoriesObjects',
NPROPERTY => NPROPERTY,
SSTR_VALUE => SREQCOMMENT,
NNUM_VALUE => null,
DDATE_VALUE => null,
NRN => NTMP);
P_ELINVOBJECT_BASE_UPDATE(NCOMPANY => C.COMPANY,
NRN => C.RN,
DUNLOAD_DATE => C.UNLOAD_DATE,
DINV_DATE => DREQCHECKDATE,
NINVPERSONS => NREQUSERCODE,
SBARCODE => SDICPLACEBARCODE,
NIS_LOADED => C.IS_LOADED);
end loop;
else
/* Или добавим в ведомость найденную ИК если не нашли позицию ведомости по штрих-коду */
P_ELINVOBJECT_BASE_INSERT(NCOMPANY => NCOMPANY,
NPRN => NREQSHEETCODE,
NINVENTORY => NINVENTORY,
NINVSUBST => null,
NINVPACK => null,
DUNLOAD_DATE => null,
DINV_DATE => DREQCHECKDATE,
NINVPERSONS => NREQUSERCODE,
SBARCODE => SDICPLACEBARCODE,
NIS_LOADED => 1,
NRN => NELINVOBJECT);
P_DOCS_PROPS_VALS_BASE_MODIFY(NDOCUMENT => NELINVOBJECT,
SUNITCODE => 'ElectronicInventoriesObjects',
NPROPERTY => NPROPERTY,
SSTR_VALUE => SREQCOMMENT,
NNUM_VALUE => null,
DDATE_VALUE => null,
NRN => NTMP);
end if;
else
SERR := 'Не удалось определить фактическое местонахождение';
end if;
end if;
end if;
/* Если нет ошибок */
if (SERR is null) then
/* Создаём пространство имён для ответа */
XSAVESHEETITEMRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SSAVESHEETITEMRESPONSE, SNS => STSD);
/* Формируем результат */
XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SRESULT, SNS => STSD, SVAL => 'true');
XNODE := DBMS_XMLDOM.APPENDCHILD(N => XSAVESHEETITEMRESPONSE, NEWCHILD => XITEM);
/* Оборачиваем ответ в конверт */
CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XSAVESHEETITEMRESPONSE);
else
CRESPONSE := UTL_CREATEERRORRESPONSE(XDOC => XDOC, SMSG => SERR);
end if;
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 SAVESHEETITEM;
end;
/