diff --git a/db/UDO_PKG_EXS_INV.pck b/db/UDO_PKG_EXS_INV.pck index e2ff9fa..4a1e6ed 100644 --- a/db/UDO_PKG_EXS_INV.pck +++ b/db/UDO_PKG_EXS_INV.pck @@ -121,6 +121,44 @@ create or replace package body UDO_PKG_EXS_INV as SMESSAGE constant varchar2(40) := 'Message'; SERRORMESSAGE constant varchar2(40) := 'ErrorMessage'; + /* Нормализация сообщения об ошибке */ + function UTL_CORRECT_ERR + ( + SERR varchar2 -- Сообщение об ошибке + ) return varchar2 -- Нормализованное сообщение об ошибке + is + STMP PKG_STD.TSTRING; -- Буфер для обработки + SRES PKG_STD.TSTRING; -- Результат работы + NB PKG_STD.TLNUMBER; -- Позиция начала удаляемой подстроки + NE PKG_STD.TLNUMBER; -- Позиция окончания удаляемой подстроки + begin + /* Инициализируем буфер */ + STMP := SERR; + /* Удаляем лишние спецсимволы и техническую информацию из ошибки */ + begin + while (INSTR(STMP + ,'ORA') <> 0) + loop + NB := INSTR(STMP + ,'ORA'); + NE := INSTR(STMP + ,':' + ,NB); + STMP := trim(replace(STMP + ,trim(SUBSTR(STMP + ,NB + ,NE - NB + 1)) + ,'')); + end loop; + SRES := STMP; + exception + when others then + SRES := SERR; + end; + /* Возвращаем резульат */ + return SRES; + end UTL_CORRECT_ERR; + /* Создание ветки XML */ function UTL_CREATENODE ( @@ -241,17 +279,19 @@ create or replace package body UDO_PKG_EXS_INV as /* Формирование ответа с ошибкой */ function UTL_CREATEERRORRESPONSE ( - XDOC in DBMS_XMLDOM.DOMDOCUMENT, -- Документ - SMSG in varchar2 -- Сообщение об ошибке - ) return clob -- Результат работы + 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; -- Буфер для результата + XDOC DBMS_XMLDOM.DOMDOCUMENT; -- Документ + XFAULT DBMS_XMLDOM.DOMNODE; -- Корневой узел + XDETAIL DBMS_XMLDOM.DOMNODE; -- Узел для детализации ошибки + XERRMSG DBMS_XMLDOM.DOMNODE; -- Узел с сообщением об ошибке + XMSG DBMS_XMLDOM.DOMNODE; -- Узел текстом сообщения + XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для узла + CDATA clob; -- Буфер для результата begin + /* Создаём документ для ответа */ + UTL_CREATERESPONSEDOC(XDOC => XDOC); /* Собираем ошибку в ответ */ XFAULT := UTL_CREATENODE(XDOC => XDOC, STAG => SFAULT, SNS => SSOAPENV); XDETAIL := UTL_CREATENODE(XDOC => XDOC, STAG => SDETAIL); @@ -265,7 +305,6 @@ create or replace package body UDO_PKG_EXS_INV as return CDATA; end UTL_CREATEERRORRESPONSE; - /* Считывание значения структурного элемента из иерархии адреса географического понятия */ function UTL_GEOGRAFY_GET_HIER_ITEM ( @@ -312,46 +351,52 @@ create or replace package body UDO_PKG_EXS_INV as 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; + 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; + exception + /* Перехватываем возможные ошибки */ + when others then + CRESPONSE := UTL_CREATEERRORRESPONSE(SMSG => UTL_CORRECT_ERR(SERR => sqlerrm)); + end; /* Возвращаем ответ */ 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; @@ -378,60 +423,66 @@ create or replace package body UDO_PKG_EXS_INV as 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; + 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; + exception + /* Перехватываем возможные ошибки */ + when others then + CRESPONSE := UTL_CREATEERRORRESPONSE(SMSG => UTL_CORRECT_ERR(SERR => sqlerrm)); + end; /* Возвращаем ответ */ 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; @@ -458,62 +509,68 @@ create or replace package body UDO_PKG_EXS_INV as 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; + 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; + exception + /* Перехватываем возможные ошибки */ + when others then + CRESPONSE := UTL_CREATEERRORRESPONSE(SMSG => UTL_CORRECT_ERR(SERR => sqlerrm)); + end; /* Возвращаем ответ */ 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; @@ -548,91 +605,97 @@ create or replace package body UDO_PKG_EXS_INV as 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; + 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; + exception + /* Перехватываем возможные ошибки */ + when others then + CRESPONSE := UTL_CREATEERRORRESPONSE(SMSG => UTL_CORRECT_ERR(SERR => sqlerrm)); + end; /* Возвращаем ответ */ 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; @@ -665,116 +728,125 @@ create or replace package body UDO_PKG_EXS_INV as 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; + 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; + exception + /* Перехватываем возможные ошибки */ + when others then + CRESPONSE := UTL_CREATEERRORRESPONSE(SMSG => UTL_CORRECT_ERR(SERR => sqlerrm)); + end; /* Возвращаем ответ */ 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; @@ -811,101 +883,107 @@ create or replace package body UDO_PKG_EXS_INV as 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; + 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; + exception + /* Перехватываем возможные ошибки */ + when others then + CRESPONSE := UTL_CREATEERRORRESPONSE(SMSG => UTL_CORRECT_ERR(SERR => sqlerrm)); + end; /* Возвращаем ответ */ 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; @@ -961,139 +1039,142 @@ create or replace package body UDO_PKG_EXS_INV as 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 + 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 + P_EXCEPTION(0, + 'Местонахождение инвентарных объектов с штрих-кодом "%s" не найдено', + SREQSTORAGECODE); + end; + end if; + /* Пробуем найти позицию ведомости инвентаризации по штрих-коду (если передан рег. номер ведомости и пока нет ошибок) */ + if (NREQSHEETCODE is not 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 + P_EXCEPTION(0, + 'Инвентарная карточка с штрих-кодом "%s" не найдена', + SREQITEMCODE); + end; + end; + end if; /* И у нас есть штрихкод фактического местонахождения */ if (SDICPLACEBARCODE is not null) then /* Если позиция ведомости инвентаризации найдена */ @@ -1138,12 +1219,10 @@ create or replace package body UDO_PKG_EXS_INV as NRN => NTMP); end if; else - SERR := 'Не удалось определить фактическое местонахождение'; + P_EXCEPTION(0, + 'Не удалось определить фактическое местонахождение'); end if; end if; - end if; - /* Если нет ошибок */ - if (SERR is null) then /* Создаём пространство имён для ответа */ XSAVESHEETITEMRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SSAVESHEETITEMRESPONSE, SNS => STSD); /* Формируем результат */ @@ -1151,17 +1230,19 @@ create or replace package body UDO_PKG_EXS_INV as 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; + exception + /* Перехватываем возможные ошибки */ + when others then + CRESPONSE := UTL_CREATEERRORRESPONSE(SMSG => UTL_CORRECT_ERR(SERR => sqlerrm)); + end; /* Возвращаем ответ */ 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;