From 75f02e4528c56aaaf9ac141c6622b12c9c6abcae Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sun, 13 Jan 2019 03:30:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D1=8B=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D1=80=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B8=D0=BD=D0=B2=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8,=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=BE=D0=B2=20=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B8=D0=BD=D0=B2=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8,=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=20=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F,=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B8=D0=BD=D0=B2=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D0=B8,=20=D0=B8=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B0=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D0=B2=20=D0=B8=D0=BD=D0=B2=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20(GETSHEETTYP?= =?UTF-8?q?ES,=20GETSHEETS,=20GETSHEETITEMS,=20GETSTORAGES,=20SAVESHEETITE?= =?UTF-8?q?M).=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80?= =?UTF-8?q?=D1=8B=20=D0=BE=D0=B1=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B8=D0=BD=D0=B2?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20(GETSHEETTYPES)=20=D0=B8=20=D0=B7=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=BA=D0=BE=D0=B2=20=D0=B2=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B8=D0=BD=D0=B2=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?(GETSHEETS)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/UDO_PKG_EXS_INV.pck | 299 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 287 insertions(+), 12 deletions(-) diff --git a/db/UDO_PKG_EXS_INV.pck b/db/UDO_PKG_EXS_INV.pck index 462209d..fb32544 100644 --- a/db/UDO_PKG_EXS_INV.pck +++ b/db/UDO_PKG_EXS_INV.pck @@ -14,23 +14,64 @@ create or replace package UDO_PKG_EXS_INV as 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(20) := 'tsd'; - SCHECKAUTHRESPONSE constant varchar2(20) := 'CheckAuthResponse'; - SGETUSERSRESPONSE constant varchar2(20) := 'GetUsersResponse'; - SDEVICEID constant varchar2(20) := 'DeviceID'; - SRESULT constant varchar2(20) := 'Result'; - SSOAPENV constant varchar2(20) := 'soapenv'; - SENVELOPE constant varchar2(20) := 'Envelope'; - SHEADER constant varchar2(20) := 'Header'; - SBODY constant varchar2(20) := 'Body'; - SITEM constant varchar2(20) := 'Item'; - SCODE constant varchar2(20) := 'Code'; - SNAME constant varchar2(20) := 'Name'; + STSD constant varchar2(40) := 'tsd'; + SCHECKAUTHRESPONSE constant varchar2(40) := 'CheckAuthResponse'; + SGETUSERSRESPONSE constant varchar2(40) := 'GetUsersResponse'; + SGETSHEETTYPESRESPONSE constant varchar2(40) := 'GetSheetTypesResponse'; + SGETSHEETSRESPONSE constant varchar2(40) := 'GetSheetsResponse'; + SDEVICEID constant varchar2(40) := 'DeviceID'; + SRESULT constant varchar2(40) := 'Result'; + SSOAPENV constant varchar2(40) := 'soapenv'; + SENVELOPE constant varchar2(40) := 'Envelope'; + SHEADER constant varchar2(40) := 'Header'; + SBODY constant varchar2(40) := 'Body'; + SITEM constant varchar2(40) := 'Item'; + SCODE constant varchar2(40) := 'Code'; + SNAME constant varchar2(40) := 'Name'; + STYPECODE constant varchar2(40) := 'TypeCode'; + SPREFIX constant varchar2(40) := 'Prefix'; + SNUMBER constant varchar2(40) := 'Number'; + SDATE constant varchar2(40) := 'Date'; /* Создание ветки XML */ function UTL_CREATENODE @@ -293,5 +334,239 @@ create or replace package body UDO_PKG_EXS_INV as PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm); end GETUSERS; + /* Электронная инвентаризация - считывание типов ведомостей */ + procedure GETSHEETTYPES + ( + NIDENT in number, -- Идентификатор процесса + NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена + ) + is + REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди + XGETSHEETTYPESRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа + XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа + XITEM DBMS_XMLDOM.DOMNODE; -- Элемент ответного списка + XCODE DBMS_XMLDOM.DOMNODE; -- Код элемента ответного списка + XNAME DBMS_XMLDOM.DOMNODE; -- Нименование элемента ответного списка + XDOC DBMS_XMLDOM.DOMDOCUMENT; -- Документ + XMLPARCER DBMS_XMLPARSER.PARSER; -- Парсер + XENVELOPE DBMS_XMLDOM.DOMNODE; -- Конверт + XBODY DBMS_XMLDOM.DOMNODE; -- Тело документа + XNODELIST DBMS_XMLDOM.DOMNODELIST; -- Ветки тела документа + XNODE_ROOT DBMS_XMLDOM.DOMNODE; -- Корневой элемент первой ветки тела документа + CRESPONSE clob; -- Буфер для ответа + CREQ clob; -- Буфер для запроса + SREQDEVICEID varchar2(30); -- Идентификатор устройства из запроса + begin + /* Считаем запись очереди */ + REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE); + /* Возьмем текст запроса */ + CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG); + /* Создаем инстанс XML парсера */ + XMLPARCER := DBMS_XMLPARSER.NEWPARSER; + /* Разбираем XML из запроса */ + DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ); + /* Берем XML документ из разобранного */ + XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER); + /* Считываем корневой элемент */ + XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC)); + /* Считываем элемент тело */ + XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY); + /* Считываем дочерние элементы тела */ + XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY); + /* Берем первый дочерний элемент */ + XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0); + /* Считываем идентификатор устройства */ + SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID); + /* Контроль индетификатора устройства по лицензии */ + /* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */ + /* Подготавливаем документ для ответа */ + UTL_CREATERESPONSEDOC(XDOC => XDOC); + /* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */ + if (SREQDEVICEID is not null) then + /* Создаём пространство имён для ответа */ + XGETSHEETTYPESRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETSHEETTYPESRESPONSE, SNS => STSD); + /* Обходим типы документов связанные с разделом "Электронные инвенторизации" */ + for REC in (select T.RN, + T.DOCCODE + from DOCTYPES T, + COMPVERLIST CV + where T.VERSION = CV.VERSION + and CV.COMPANY = 136018 + and T.RN in (select DOCRN from DOCPARAMS where DOCPARAMS.UNITCODE = 'ElectronicInventories') + order by T.DOCCODE) + loop + /* Собираем информацию по типу документа в ответ */ + XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD); + XCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SCODE, SNS => STSD, SVAL => REC.RN); + XNAME := UTL_CREATENODE(XDOC => XDOC, STAG => SNAME, SNS => STSD, SVAL => REC.DOCCODE); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XCODE); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNAME); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETSHEETTYPESRESPONSE, NEWCHILD => XITEM); + end loop; + /* Оборачиваем ответ в конверт */ + CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETSHEETTYPESRESPONSE); + end if; + /* Возвращаем ответ */ + PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, + SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK, + BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8')); + exception + when others then + /* Вернём ошибку */ + PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm); + end GETSHEETTYPES; + + /* Электронная инвентаризация - считывание заголовков ведомостей инвентаризации */ + procedure GETSHEETS + ( + NIDENT in number, -- Идентификатор процесса + NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена + ) + is + REXSQUEUE EXSQUEUE%rowtype; -- Запись позиции очереди + XGETSHEETSRESPONSE DBMS_XMLDOM.DOMNODE; -- Корневой элемент ответа + XNODE DBMS_XMLDOM.DOMNODE; -- Буфер для ветки ответа + XITEM DBMS_XMLDOM.DOMNODE; -- Элемент ответного списка + XCODE DBMS_XMLDOM.DOMNODE; -- Код элемента ответного списка + XNAME DBMS_XMLDOM.DOMNODE; -- Нименование элемента ответного списка + XTYPECODE DBMS_XMLDOM.DOMNODE; -- Тип ведомости элемента ответного списка + XPREFIX DBMS_XMLDOM.DOMNODE; -- Префикс ведомости элемента ответного списка + XNUMBER DBMS_XMLDOM.DOMNODE; -- Номер ведомости элемента ответного списка + XDATE DBMS_XMLDOM.DOMNODE; -- Дата ведомости элемента ответного списка + XDOC DBMS_XMLDOM.DOMDOCUMENT; -- Документ + XMLPARCER DBMS_XMLPARSER.PARSER; -- Парсер + XENVELOPE DBMS_XMLDOM.DOMNODE; -- Конверт + XBODY DBMS_XMLDOM.DOMNODE; -- Тело документа + XNODELIST DBMS_XMLDOM.DOMNODELIST; -- Ветки тела документа + XNODE_ROOT DBMS_XMLDOM.DOMNODE; -- Корневой элемент первой ветки тела документа + CRESPONSE clob; -- Буфер для ответа + CREQ clob; -- Буфер для запроса + SREQDEVICEID varchar2(30); -- Идентификатор устройства из запроса + NREQTYPECODE number(17); -- Тип ведомости из запроса (параметр отбора) + SREQPREFIX varchar2(30); -- Префикс ведомости из запроса (параметр отбора) + SREQNUMBER varchar2(30); -- Номер ведомости из запроса (параметр отбора) + DREQDATE date; -- Дата ведомости из запроса (параметр отбора) + begin + /* Считаем запись очереди */ + REXSQUEUE := GET_EXSQUEUE_ID(NFLAG_SMART => 0, NRN => NEXSQUEUE); + /* Возьмем текст запроса */ + CREQ := BLOB2CLOB(LBDATA => REXSQUEUE.MSG); + /* Создаем инстанс XML парсера */ + XMLPARCER := DBMS_XMLPARSER.NEWPARSER; + /* Разбираем XML из запроса */ + DBMS_XMLPARSER.PARSECLOB(P => XMLPARCER, DOC => CREQ); + /* Берем XML документ из разобранного */ + XDOC := DBMS_XMLPARSER.GETDOCUMENT(P => XMLPARCER); + /* Считываем корневой элемент */ + XENVELOPE := DBMS_XMLDOM.MAKENODE(ELEM => DBMS_XMLDOM.GETDOCUMENTELEMENT(DOC => XDOC)); + /* Считываем элемент тело */ + XBODY := DBMS_XSLPROCESSOR.SELECTSINGLENODE(N => XENVELOPE, PATTERN => SBODY); + /* Считываем дочерние элементы тела */ + XNODELIST := DBMS_XMLDOM.GETCHILDNODES(N => XBODY); + /* Берем первый дочерний элемент */ + XNODE_ROOT := DBMS_XMLDOM.ITEM(NL => XNODELIST, IDX => 0); + /* Считываем идентификатор устройства */ + SREQDEVICEID := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDEVICEID); + /* Считываем "Тип ведомости" (параметр отбора) */ + NREQTYPECODE := TO_NUMBER(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => STYPECODE)); + /* Считываем "Префикс" (параметр отбора) */ + SREQPREFIX := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SPREFIX); + /* Считываем "Номер" (параметр отбора) */ + SREQNUMBER := UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SNUMBER); + /* Считываем "Дату" (параметр отбора) */ + DREQDATE := TO_DATE(UTL_GETNODEVAL(XROOTNODE => XNODE_ROOT, SPATTERN => SDATE), 'yyyy-mm-dd'); + /* Контроль индетификатора устройства по лицензии */ + /* UTL_CHECK_DEVICEID(SDEVICEID => SREQDEVICEID); */ + /* Подготавливаем документ для ответа */ + UTL_CREATERESPONSEDOC(XDOC => XDOC); + /* Вместо проверки по лицензии - пока просто проверка на то, что идентификатор устройства был передан */ + if (SREQDEVICEID is not null) then + /* Создаём пространство имён для ответа */ + XGETSHEETSRESPONSE := UTL_CREATENODE(XDOC => XDOC, STAG => SGETSHEETSRESPONSE, SNS => STSD); + /* Обходим типы документов связанные с разделом "Электронные инвенторизации" */ + for REC in (select T.RN, + T.DOC_TYPE, + DT.DOCCODE as DOC_TYPE_CODE, + trim(T.DOC_PREF) as DOC_PREF, + trim(T.DOC_NUMB) as DOC_NUMB, + T.DOC_DATE + from ELINVENTORY T, + DOCTYPES DT + where T.COMPANY = 136018 + and T.DOC_TYPE = DT.RN + and (NREQTYPECODE is null or (NREQTYPECODE is not null and T.DOC_TYPE = NREQTYPECODE)) + and (SREQPREFIX is null or (SREQPREFIX is not null and trim(T.DOC_PREF) = SREQPREFIX)) + and (SREQNUMBER is null or (SREQNUMBER is not null and trim(T.DOC_NUMB) = SREQNUMBER)) + and (DREQDATE is null or (DREQDATE is not null and T.DOC_DATE = DREQDATE))) + loop + /* Собираем информацию по ведомости в ответ */ + XITEM := UTL_CREATENODE(XDOC => XDOC, STAG => SITEM, SNS => STSD); + XCODE := UTL_CREATENODE(XDOC => XDOC, STAG => SCODE, SNS => STSD, SVAL => REC.RN); + XNAME := UTL_CREATENODE(XDOC => XDOC, + STAG => SNAME, + SNS => STSD, + SVAL => REC.DOC_TYPE_CODE || ', ' || REC.DOC_PREF || '-' || REC.DOC_NUMB || ', ' || + TO_CHAR(REC.DOC_DATE, 'dd.mm.yyyy')); + XTYPECODE := UTL_CREATENODE(XDOC => XDOC, STAG => STYPECODE, SNS => STSD, SVAL => REC.DOC_TYPE); + XPREFIX := UTL_CREATENODE(XDOC => XDOC, STAG => SPREFIX, SNS => STSD, SVAL => REC.DOC_PREF); + XNUMBER := UTL_CREATENODE(XDOC => XDOC, STAG => SNUMBER, SNS => STSD, SVAL => REC.DOC_NUMB); + XDATE := UTL_CREATENODE(XDOC => XDOC, + STAG => SDATE, + SNS => STSD, + SVAL => TO_CHAR(REC.DOC_DATE, 'yyyy-mm-dd')); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XCODE); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNAME); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XTYPECODE); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XPREFIX); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XNUMBER); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XITEM, NEWCHILD => XDATE); + XNODE := DBMS_XMLDOM.APPENDCHILD(N => XGETSHEETSRESPONSE, NEWCHILD => XITEM); + end loop; + /* Оборачиваем ответ в конверт */ + CRESPONSE := UTL_CREATERESPONSE(XDOC => XDOC, XCONTENT => XGETSHEETSRESPONSE); + end if; + /* Возвращаем ответ */ + PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, + SRESULT => PKG_EXS.SPRC_RESP_RESULT_OK, + BRESP => CLOB2BLOB(LCDATA => CRESPONSE, SCHARSET => 'UTF8')); + exception + when others then + /* Вернём ошибку */ + PKG_EXS.PRC_RESP_RESULT_SET(NIDENT => NIDENT, SRESULT => PKG_EXS.SPRC_RESP_RESULT_ERR, SMSG => sqlerrm); + end GETSHEETS; + + /* Электронная инвентаризация - считывание состава ведомостей инвентаризации */ + procedure GETSHEETITEMS + ( + NIDENT in number, -- Идентификатор процесса + NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена + ) + is + begin + null; + end GETSHEETITEMS; + + /* Электронная инвентаризация - считывание мест хранения */ + procedure GETSTORAGES + ( + NIDENT in number, -- Идентификатор процесса + NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена + ) + is + begin + null; + end GETSTORAGES; + + /* Электронная инвентаризация - сохранение результатов инвентаризации */ + procedure SAVESHEETITEM + ( + NIDENT in number, -- Идентификатор процесса + NEXSQUEUE in number -- Регистрационный номер обрабатываемой позиции очереди обмена + ) + is + begin + null; + end SAVESHEETITEM; + end; /