From 0251797080c4e19a413df8325ba65f7bf74a2325 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 25 Sep 2023 00:26:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=B0=20win-1251=20=D0=B2=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B4=D0=BB=D1=8F=20sql/prc/pck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 3 + db/PKG_P8PANELS.pck | 14 +- db/PKG_P8PANELS_BASE.pck | 636 +++++++------- db/PKG_P8PANELS_PROJECTS.pck | 1474 ++++++++++++++++----------------- db/PKG_P8PANELS_VISUAL.pck | 926 ++++++++++----------- db/UDO_P_P8PANELS_AGNLIST.prc | 86 +- db/UDO_P_P8PANELS_TEST.prc | 4 +- 7 files changed, 1573 insertions(+), 1570 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b1a213b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.sql working-tree-encoding=cp1251 eol=crlf +*.pck working-tree-encoding=cp1251 eol=crlf +*.prc working-tree-encoding=cp1251 eol=crlf diff --git a/db/PKG_P8PANELS.pck b/db/PKG_P8PANELS.pck index 8b429af..c8b388c 100644 --- a/db/PKG_P8PANELS.pck +++ b/db/PKG_P8PANELS.pck @@ -1,25 +1,25 @@ create or replace package PKG_P8PANELS as - /* */ + /* Исполнение действий клиентских приложений */ procedure PROCESS ( - CIN in clob, -- - COUT out clob -- + CIN in clob, -- Входные параметры + COUT out clob -- Результат ); end PKG_P8PANELS; / create or replace package body PKG_P8PANELS as - /* */ + /* Исполнение действий клиентских приложений */ procedure PROCESS ( - CIN in clob, -- - COUT out clob -- + CIN in clob, -- Входные параметры + COUT out clob -- Результат ) is begin - /* */ + /* Базовое исполнение действия */ PKG_P8PANELS_BASE.PROCESS(CIN => CIN, COUT => COUT); end PROCESS; diff --git a/db/PKG_P8PANELS_BASE.pck b/db/PKG_P8PANELS_BASE.pck index 6f9cf9a..4a3098a 100644 --- a/db/PKG_P8PANELS_BASE.pck +++ b/db/PKG_P8PANELS_BASE.pck @@ -1,102 +1,102 @@ create or replace package PKG_P8PANELS_BASE as - /* - ( XML -> JSON) */ + /*Константы - Типовой постфикс тега для массива (при переводе XML -> JSON) */ SXML_ALWAYS_ARRAY_POSTFIX constant PKG_STD.TSTRING := '__SYSTEM__ARRAY__'; - /* */ + /* Конвертация строки в число */ function UTL_S2N ( - SVALUE in varchar2 -- - ) return number; -- + SVALUE in varchar2 -- Конвертируемое строковое значение + ) return number; -- Конвертированное число - /* */ + /* Конвертация даты в число */ function UTL_S2D ( - SVALUE in varchar2 -- - ) return date; -- + SVALUE in varchar2 -- Конвертируемое строковое значение + ) return date; -- Конвертированная дата - /* */ + /* Базовое исполнение действий */ procedure PROCESS ( - CIN in clob, -- - COUT out clob -- + CIN in clob, -- Входные параметры + COUT out clob -- Результат ); end PKG_P8PANELS_BASE; / create or replace package body PKG_P8PANELS_BASE as - /* - */ - SRQ_ACTION_EXEC_STORED constant PKG_STD.TSTRING := 'EXEC_STORED'; -- + /* Константы - коды дествий запросов */ + SRQ_ACTION_EXEC_STORED constant PKG_STD.TSTRING := 'EXEC_STORED'; -- Запрос на исполнение хранимой процедуры - /* - */ - SRQ_TAG_XREQUEST constant PKG_STD.TSTRING := 'XREQUEST'; -- - SRQ_TAG_XPAYLOAD constant PKG_STD.TSTRING := 'XPAYLOAD'; -- - SRQ_TAG_SACTION constant PKG_STD.TSTRING := 'SACTION'; -- - SRQ_TAG_SSTORED constant PKG_STD.TSTRING := 'SSTORED'; -- - SRQ_TAG_SRESP_ARG constant PKG_STD.TSTRING := 'SRESP_ARG'; -- , - SRQ_TAG_XARGUMENTS constant PKG_STD.TSTRING := 'XARGUMENTS'; -- / - SRQ_TAG_XARGUMENT constant PKG_STD.TSTRING := 'XARGUMENT'; -- / - SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'SNAME'; -- - SRQ_TAG_SDATA_TYPE constant PKG_STD.TSTRING := 'SDATA_TYPE'; -- - SRQ_TAG_VALUE constant PKG_STD.TSTRING := 'VALUE'; -- + /* Константы - тэги запросов */ + SRQ_TAG_XREQUEST constant PKG_STD.TSTRING := 'XREQUEST'; -- Корневой тэг запроса + SRQ_TAG_XPAYLOAD constant PKG_STD.TSTRING := 'XPAYLOAD'; -- Тэг для данных запроса + SRQ_TAG_SACTION constant PKG_STD.TSTRING := 'SACTION'; -- Тэг для действия запроса + SRQ_TAG_SSTORED constant PKG_STD.TSTRING := 'SSTORED'; -- Тэг для имени хранимого объекта в запросе + SRQ_TAG_SRESP_ARG constant PKG_STD.TSTRING := 'SRESP_ARG'; -- Тэг для имени аргумента, формирующего данные ответа + SRQ_TAG_XARGUMENTS constant PKG_STD.TSTRING := 'XARGUMENTS'; -- Тэг для списка аргументов хранимого объекта/выборки в запросе + SRQ_TAG_XARGUMENT constant PKG_STD.TSTRING := 'XARGUMENT'; -- Тэг для аргумента хранимого объекта/выборки в запросе + SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'SNAME'; -- Тэг для наименования в запросе + SRQ_TAG_SDATA_TYPE constant PKG_STD.TSTRING := 'SDATA_TYPE'; -- Тэг для типа данных в запросе + SRQ_TAG_VALUE constant PKG_STD.TSTRING := 'VALUE'; -- Тэг для значения в запросе - /* - */ - SRESP_TAG_XPAYLOAD constant PKG_STD.TSTRING := 'XPAYLOAD'; -- - SRESP_TAG_XOUT_ARGUMENTS constant PKG_STD.TSTRING := 'XOUT_ARGUMENTS'; -- - SRESP_TAG_SDATA_TYPE constant PKG_STD.TSTRING := 'SDATA_TYPE'; -- - SRESP_TAG_VALUE constant PKG_STD.TSTRING := 'VALUE'; -- - SRESP_TAG_SNAME constant PKG_STD.TSTRING := 'SNAME'; -- + /* Константы - тэги ответов */ + SRESP_TAG_XPAYLOAD constant PKG_STD.TSTRING := 'XPAYLOAD'; -- Тэг для данных ответа + SRESP_TAG_XOUT_ARGUMENTS constant PKG_STD.TSTRING := 'XOUT_ARGUMENTS'; -- Тэг для выходных аргументов хранимого объекта в ответе + SRESP_TAG_SDATA_TYPE constant PKG_STD.TSTRING := 'SDATA_TYPE'; -- Тэг для типа данных в ответе + SRESP_TAG_VALUE constant PKG_STD.TSTRING := 'VALUE'; -- Тэг для значения в ответе + SRESP_TAG_SNAME constant PKG_STD.TSTRING := 'SNAME'; -- Тэг для наименования в ответе - /* - */ - SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- "" - SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- "" - SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- "" - SDATA_TYPE_CLOB constant PKG_STD.TSTRING := 'CLOB'; -- "" + /* Константы - типы данных */ + SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- Тип данных "строка" + SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- Тип данных "число" + SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- Тип данных "дата" + SDATA_TYPE_CLOB constant PKG_STD.TSTRING := 'CLOB'; -- Тип данных "текст" - /* - */ - SDB_OBJECT_STATE_VALID constant PKG_STD.TSTRING := 'VALID'; -- + /* Константы - состояния объектов БД */ + SDB_OBJECT_STATE_VALID constant PKG_STD.TSTRING := 'VALID'; -- Объект валиден - /* - */ + /* Типы данных - аргументы */ type TARGUMENT is record ( - SNAME PKG_STD.TSTRING, -- - SDATA_TYPE PKG_STD.TSTRING, -- (. SPWS_DATA_TYPE_*) - SVALUE PKG_STD.TSTRING, -- () - NVALUE PKG_STD.TLNUMBER, -- () - DVALUE PKG_STD.TLDATE, -- () - CVALUE clob -- () + SNAME PKG_STD.TSTRING, -- Наименование + SDATA_TYPE PKG_STD.TSTRING, -- Тип данных (см. константы SPWS_DATA_TYPE_*) + SVALUE PKG_STD.TSTRING, -- Значение (строка) + NVALUE PKG_STD.TLNUMBER, -- Значение (число) + DVALUE PKG_STD.TLDATE, -- Значение (дата) + CVALUE clob -- Значение (текст) ); - /* - */ + /* Типы данных - коллекция аргументов запроса */ type TARGUMENTS is table of TARGUMENT; - /* */ + /* Конвертация строки в число */ function UTL_S2N ( - SVALUE in varchar2 -- - ) return number -- + SVALUE in varchar2 -- Конвертируемое строковое значение + ) return number -- Конвертированное число is - NVALUE PKG_STD.TNUMBER; -- + NVALUE PKG_STD.TNUMBER; -- Результат работы begin - /* */ + /* Пробуем конвертировать */ NVALUE := TO_NUMBER(replace(SVALUE, ',', '.')); - /* */ + /* Отдаём результат */ return NVALUE; exception when others then - P_EXCEPTION(0, ' (%s).', SVALUE); + P_EXCEPTION(0, 'Неверный формат числа (%s).', SVALUE); end UTL_S2N; - /* */ + /* Конвертация даты в число */ function UTL_S2D ( - SVALUE in varchar2 -- - ) return date -- + SVALUE in varchar2 -- Конвертируемое строковое значение + ) return date -- Конвертированная дата is - DVALUE PKG_STD.TLDATE; -- + DVALUE PKG_STD.TLDATE; -- Результат работы begin - /* */ + /* Пробуем конвертировать */ begin DVALUE := TO_DATE(SVALUE, 'YYYY-MM-DD'); exception @@ -113,157 +113,157 @@ create or replace package body PKG_P8PANELS_BASE as end; end; end; - /* */ + /* Отдаём результат */ return DVALUE; exception when others then - P_EXCEPTION(0, ' (%s).', SVALUE); + P_EXCEPTION(0, 'Неверный формат даты (%s).', SVALUE); end UTL_S2D; - /* */ + /* Формирование сообщения об отсутствии значения */ function MSG_NO_DATA_MAKE ( - SPATH in varchar2 := null, -- - SMESSAGE_OBJECT in varchar2 := null -- - ) return varchar2 -- + SPATH in varchar2 := null, -- Путь по которому ожидалось значение + SMESSAGE_OBJECT in varchar2 := null -- Наимемнование объекта для формулирования сообщения об ошибке + ) return varchar2 -- Сформированное сообщение об ошибке is - SPATH_ PKG_STD.TSTRING; -- - SMESSAGE_OBJECT_ PKG_STD.TSTRING; -- + SPATH_ PKG_STD.TSTRING; -- Буфер для пути + SMESSAGE_OBJECT_ PKG_STD.TSTRING; -- Буфер для наименования объекта begin - /* */ + /* Подготовим путь к выдаче */ if (SPATH is not null) then SPATH_ := ' (' || SPATH || ')'; end if; - /* */ + /* Подготовим наименование объекта к выдаче */ if (SMESSAGE_OBJECT is not null) then - SMESSAGE_OBJECT_ := ' "' || SMESSAGE_OBJECT || '"'; + SMESSAGE_OBJECT_ := ' элемента "' || SMESSAGE_OBJECT || '"'; else - SMESSAGE_OBJECT_ := ' '; + SMESSAGE_OBJECT_ := ' элемента'; end if; - /* */ - return ' ' || SMESSAGE_OBJECT_ || SPATH_ || '.'; + /* Вернём сформированное сообщение */ + return 'Не указано значение' || SMESSAGE_OBJECT_ || SPATH_ || '.'; end MSG_NO_DATA_MAKE; - /* (PKG_STD) (PWS) */ + /* Конвертация стандартного типа данных (PKG_STD) в тип данных сервиса (PWS) */ function STD_DATA_TYPE_TO_STR ( - NSTD_DATA_TYPE in number -- - ) return varchar2 -- + NSTD_DATA_TYPE in number -- Станартный тип данных + ) return varchar2 -- Соответствующий тип данных сервиса is - SRES PKG_STD.TSTRING; -- + SRES PKG_STD.TSTRING; -- Буфер для результата begin - /* */ + /* Работаем от типа данных */ case NSTD_DATA_TYPE - /* */ + /* Строка */ when PKG_STD.DATA_TYPE_STR then SRES := SDATA_TYPE_STR; - /* */ + /* Число */ when PKG_STD.DATA_TYPE_NUM then SRES := SDATA_TYPE_NUMB; - /* */ + /* Дата */ when PKG_STD.DATA_TYPE_DATE then SRES := SDATA_TYPE_DATE; - /* */ + /* Текст */ when PKG_STD.DATA_TYPE_CLOB then SRES := SDATA_TYPE_CLOB; - /* */ + /* Неизвестный тип данных */ else - P_EXCEPTION(0, ' "%s" .', TO_CHAR(NSTD_DATA_TYPE)); + P_EXCEPTION(0, 'Тип данных "%s" не поддерживается.', TO_CHAR(NSTD_DATA_TYPE)); end case; - /* */ + /* Возвращаем результат */ return SRES; end STD_DATA_TYPE_TO_STR; - /* XML () */ + /* Считывание значения ветки XML (строка) */ function NODE_SVAL_GET ( - XROOT in PKG_XPATH.TNODE, -- - SPATH in varchar2, -- - NREQUIRED in number := 0, -- (0 - , 1 - ) - SMESSAGE_OBJECT in varchar2 := null -- - ) return varchar2 -- + XROOT in PKG_XPATH.TNODE, -- Корневая ветка для считывания значения + SPATH in varchar2, -- Путь для считывания данных + NREQUIRED in number := 0, -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + SMESSAGE_OBJECT in varchar2 := null -- Наимемнование объекта для формулирования сообщения об ошибке + ) return varchar2 -- Считанное значение is - XNODE PKG_XPATH.TNODE; -- ( ) - SVAL PKG_STD.TSTRING; -- + XNODE PKG_XPATH.TNODE; -- Искомая ветка со значением (подходящая под шаблон) + SVAL PKG_STD.TSTRING; -- Результат работы begin - /* */ + /* Найдем нужную ветку по шаблону */ XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH); - /* */ + /* Если там нет ничего */ if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then - /* */ + /* Его и вернём */ SVAL := null; else - /* - - */ + /* Что-то есть - читаем данные */ begin SVAL := PKG_XPATH.VALUE(RNODE => XNODE); exception when others then - P_EXCEPTION(0, ' (%s).', SPATH); + P_EXCEPTION(0, 'Неверный формат строки (%s).', SPATH); end; end if; - /* , - */ + /* Если значения нет, а оно должно быть - скажем об этом */ if ((SVAL is null) and (NREQUIRED = 1)) then P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT)); end if; - /* */ + /* Отдаём результат */ return SVAL; end NODE_SVAL_GET; - /* XML () */ + /* Считывание значения ветки XML (число) */ function NODE_NVAL_GET ( - XROOT in PKG_XPATH.TNODE, -- - SPATH in varchar2, -- - NREQUIRED in number := 0, -- (0 - , 1 - ) - SMESSAGE_OBJECT in varchar2 := null -- - ) return number -- + XROOT in PKG_XPATH.TNODE, -- Корневая ветка для считывания значения + SPATH in varchar2, -- Путь для считывания данных + NREQUIRED in number := 0, -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + SMESSAGE_OBJECT in varchar2 := null -- Наимемнование объекта для формулирования сообщения об ошибке + ) return number -- Считанное значение is - XNODE PKG_XPATH.TNODE; -- ( ) - NVAL PKG_STD.TLNUMBER; -- + XNODE PKG_XPATH.TNODE; -- Искомая ветка со значением (подходящая под шаблон) + NVAL PKG_STD.TLNUMBER; -- Результат работы begin - /* */ + /* Найдем нужную ветку по шаблону */ XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH); - /* */ + /* Если там нет ничего */ if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then - /* */ + /* Его и вернём */ NVAL := null; else - /* - - */ + /* Что-то есть - читаем данные */ begin NVAL := PKG_XPATH.VALUE_NUM(RNODE => XNODE); exception when others then - P_EXCEPTION(0, ' (%s).', SPATH); + P_EXCEPTION(0, 'Неверный формат числа (%s).', SPATH); end; end if; - /* , - */ + /* Если значения нет, а оно должно быть - скажем об этом */ if ((NVAL is null) and (NREQUIRED = 1)) then P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT)); end if; - /* */ + /* Отдаём результат */ return NVAL; end NODE_NVAL_GET; - /* XML () */ + /* Считывание значения ветки XML (дата) */ function NODE_DVAL_GET ( - XROOT in PKG_XPATH.TNODE, -- - SPATH in varchar2, -- - NREQUIRED in number := 0, -- (0 - , 1 - ) - SMESSAGE_OBJECT in varchar2 := null -- - ) return date -- + XROOT in PKG_XPATH.TNODE, -- Корневая ветка для считывания значения + SPATH in varchar2, -- Путь для считывания данных + NREQUIRED in number := 0, -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + SMESSAGE_OBJECT in varchar2 := null -- Наимемнование объекта для формулирования сообщения об ошибке + ) return date -- Считанное значение is - XNODE PKG_XPATH.TNODE; -- ( ) - DVAL PKG_STD.TLDATE; -- + XNODE PKG_XPATH.TNODE; -- Искомая ветка со значением (подходящая под шаблон) + DVAL PKG_STD.TLDATE; -- Результат работы begin - /* */ + /* Найдем нужную ветку по шаблону */ XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH); - /* */ + /* Если там нет ничего */ if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then - /* */ + /* Его и вернём */ DVAL := null; else - /* - - */ + /* Что-то есть - читаем данные */ begin DVAL := PKG_XPATH.VALUE_DATE(RNODE => XNODE); exception @@ -277,449 +277,449 @@ create or replace package body PKG_P8PANELS_BASE as exception when others then P_EXCEPTION(0, - ' (%s). : YYYY-MM-DD"T"HH24:MI:SS.FF3tzh:tzm, YYYY-MM-DD"T"HH24:MI:SS.FF3, YYYY-MM-DD"T"HH24:MI:SS, YYYY-MM-DD.', + 'Неверный формат даты (%s). Ожидалось: YYYY-MM-DD"T"HH24:MI:SS.FF3tzh:tzm, YYYY-MM-DD"T"HH24:MI:SS.FF3, YYYY-MM-DD"T"HH24:MI:SS, YYYY-MM-DD.', SPATH); end; end; end; end if; - /* , - */ + /* Если значения нет, а оно должно быть - скажем об этом */ if ((DVAL is null) and (NREQUIRED = 1)) then P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT)); end if; - /* */ + /* Отдаём результат */ return DVAL; end NODE_DVAL_GET; - /* XML () */ + /* Считывание значения ветки XML (текст) */ function NODE_CVAL_GET ( - XROOT in PKG_XPATH.TNODE, -- - SPATH in varchar2, -- - NREQUIRED in number := 0, -- (0 - , 1 - ) - SMESSAGE_OBJECT in varchar2 := null -- - ) return clob -- + XROOT in PKG_XPATH.TNODE, -- Корневая ветка для считывания значения + SPATH in varchar2, -- Путь для считывания данных + NREQUIRED in number := 0, -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + SMESSAGE_OBJECT in varchar2 := null -- Наимемнование объекта для формулирования сообщения об ошибке + ) return clob -- Считанное значение is - XNODE PKG_XPATH.TNODE; -- ( ) - CVAL clob; -- + XNODE PKG_XPATH.TNODE; -- Искомая ветка со значением (подходящая под шаблон) + CVAL clob; -- Результат работы begin - /* */ + /* Найдем нужную ветку по шаблону */ XNODE := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => XROOT, SPATTERN => SPATH); - /* */ + /* Если там нет ничего */ if (PKG_XPATH.IS_NULL(RNODE => XNODE)) then - /* */ + /* Его и вернём */ CVAL := null; else - /* - - */ + /* Что-то есть - читаем данные */ begin CVAL := PKG_XPATH.VALUE_CLOB(RNODE => XNODE); exception when others then - P_EXCEPTION(0, ' (%s).', SPATH); + P_EXCEPTION(0, 'Неверный формат текстовых данных (%s).', SPATH); end; end if; - /* , - */ + /* Если значения нет, а оно должно быть - скажем об этом */ if ((CVAL is null) and (NREQUIRED = 1)) then P_EXCEPTION(0, MSG_NO_DATA_MAKE(SPATH => SPATH, SMESSAGE_OBJECT => SMESSAGE_OBJECT)); end if; - /* */ + /* Отдаём результат */ return CVAL; end NODE_CVAL_GET; - /* */ + /* Считывание аргумента из коллекции */ function TARGUMENTS_GET ( - ARGUMENTS in TARGUMENTS, -- - SARGUMENT in varchar2, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return TARGUMENT -- + ARGUMENTS in TARGUMENTS, -- Коллекция аргументов + SARGUMENT in varchar2, -- Код аргумента + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return TARGUMENT -- Найденный аргумент is begin - /* */ + /* Если данные в коллекции есть */ if ((ARGUMENTS is not null) and (ARGUMENTS.COUNT > 0)) then - /* */ + /* Обходим её */ for I in ARGUMENTS.FIRST .. ARGUMENTS.LAST loop - /* */ + /* Если встретился нужный аргумент */ if (ARGUMENTS(I).SNAME = SARGUMENT) then - /* */ + /* Вернём его */ return ARGUMENTS(I); end if; end loop; end if; - /* - , */ + /* Если мы здесь - аргумент не нашелся, будем выдавать сообщение об ошибке если он был обязательным */ if (NREQUIRED = 1) then - P_EXCEPTION(0, ' "%s".', SARGUMENT); + P_EXCEPTION(0, 'Не задан обязательный аргумент "%s".', SARGUMENT); else - /* - */ + /* Он не обязательный - вернём отсутствие данных */ return null; end if; end TARGUMENTS_GET; - /* () */ + /* Считывание значения аргумента из коллекции (строка) */ function TARGUMENTS_SVAL_GET ( - ARGUMENTS in TARGUMENTS, -- - SARGUMENT in varchar2, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return varchar2 -- + ARGUMENTS in TARGUMENTS, -- Коллекция аргументов + SARGUMENT in varchar2, -- Код аргумента + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return varchar2 -- Значение аргумента is begin - /* */ + /* Считаем и вернём значение */ return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).SVALUE; end TARGUMENTS_SVAL_GET; - /* () */ + /* Считывание значения параметра из запроса (число) */ function TARGUMENTS_NVAL_GET ( - ARGUMENTS in TARGUMENTS, -- - SARGUMENT in varchar2, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return number -- + ARGUMENTS in TARGUMENTS, -- Коллекция аргументов + SARGUMENT in varchar2, -- Код аргумента + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return number -- Значение аргумента is begin - /* */ + /* Считаем и вернём значение */ return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).NVALUE; end TARGUMENTS_NVAL_GET; - /* () */ + /* Считывание значения параметра из запроса (дата) */ function TARGUMENTS_DVAL_GET ( - ARGUMENTS in TARGUMENTS, -- - SARGUMENT in varchar2, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return date -- + ARGUMENTS in TARGUMENTS, -- Коллекция аргументов + SARGUMENT in varchar2, -- Код аргумента + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return date -- Значение аргумента is begin - /* */ + /* Считаем и вернём значение */ return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).DVALUE; end TARGUMENTS_DVAL_GET; - /* () */ + /* Считывание значения параметра из запроса (текст) */ function TARGUMENTS_CVAL_GET ( - ARGUMENTS in TARGUMENTS, -- - SARGUMENT in varchar2, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return clob -- + ARGUMENTS in TARGUMENTS, -- Коллекция аргументов + SARGUMENT in varchar2, -- Код аргумента + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return clob -- Значение аргумента is begin - /* */ + /* Считаем и вернём значение */ return TARGUMENTS_GET(ARGUMENTS => ARGUMENTS, SARGUMENT => SARGUMENT, NREQUIRED => NREQUIRED).CVALUE; end TARGUMENTS_CVAL_GET; - /* */ + /* Получение корневого элемента тела запроса */ function RQ_ROOT_GET ( - CRQ in clob -- - ) return PKG_XPATH.TNODE -- + CRQ in clob -- Запрос + ) return PKG_XPATH.TNODE -- Корневой элемент первой ветки тела документа is begin - /* */ + /* Возвращаем корневой элемент документа */ return PKG_XPATH.ROOT_NODE(RDOCUMENT => PKG_XPATH.PARSE_FROM_CLOB(LCXML => CRQ)); end RQ_ROOT_GET; - /* */ + /* Получение пути к запросу */ function RQ_PATH_GET - return varchar2 -- + return varchar2 -- Путь к запросу is begin return '/' || SRQ_TAG_XREQUEST; end RQ_PATH_GET; - /* */ + /* Получение пути к элементу действия запроса */ function RQ_ACTION_PATH_GET - return varchar2 -- + return varchar2 -- Путь к элементу действия запроса is begin return RQ_PATH_GET() || '/' || SRQ_TAG_SACTION; end RQ_ACTION_PATH_GET; - /* */ + /* Получение кода действия запроса */ function RQ_ACTION_GET ( - XRQ_ROOT in PKG_XPATH.TNODE := null, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return varchar2 -- + XRQ_ROOT in PKG_XPATH.TNODE := null, -- Корневая ветка запроса + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return varchar2 -- Код действия запроса is begin - /* */ + /* Вернем значение элемента тела с кодом действия */ return NODE_SVAL_GET(XROOT => XRQ_ROOT, SPATH => RQ_ACTION_PATH_GET(), NREQUIRED => NREQUIRED, - SMESSAGE_OBJECT => ' '); + SMESSAGE_OBJECT => 'Код действия'); end RQ_ACTION_GET; - /* */ + /* Получение пути к параметрам запроса */ function RQ_PAYLOAD_PATH_GET - return varchar2 -- + return varchar2 -- Путь к параметрам запроса is begin - /* */ + /* Вернем значение */ return RQ_PATH_GET() || '/' || SRQ_TAG_XPAYLOAD; end RQ_PAYLOAD_PATH_GET; - /* */ + /* Получение пути к элкменту параметров запроса */ function RQ_PAYLOAD_ITEM_PATH_GET ( - SITEM_TAG in varchar2 -- + SITEM_TAG in varchar2 -- Тэг элемента ) - return varchar2 -- + return varchar2 -- Путь к элементу параметров запроса is begin - /* */ + /* Вернем значение */ return RQ_PAYLOAD_PATH_GET() || '/' || SITEM_TAG; end RQ_PAYLOAD_ITEM_PATH_GET; - /* */ + /* Считывание наименования исполняемого хранимого объекта из запроса */ function RQ_PAYLOAD_STORED_GET ( - XRQ_ROOT in PKG_XPATH.TNODE := null, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return varchar2 -- + XRQ_ROOT in PKG_XPATH.TNODE := null, -- Корневая ветка запроса + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return varchar2 -- Наименование исполняемого хранимого объекта из запроса is begin - /* */ + /* Вернем значение элемента тела с наименованием хранимого объекта */ return NODE_SVAL_GET(XROOT => XRQ_ROOT, SPATH => RQ_PAYLOAD_ITEM_PATH_GET(SITEM_TAG => SRQ_TAG_SSTORED), NREQUIRED => NREQUIRED, - SMESSAGE_OBJECT => ' /'); + SMESSAGE_OBJECT => 'Наименование процедуры/функции'); end RQ_PAYLOAD_STORED_GET; - /* */ + /* Проверка исполняемого хранимого объекта из запроса */ procedure RQ_PAYLOAD_STORED_CHECK ( - XRQ_ROOT in PKG_XPATH.TNODE, -- - SSTORED in varchar2 := null -- (null - ) + XRQ_ROOT in PKG_XPATH.TNODE, -- Корневая ветка запроса + SSTORED in varchar2 := null -- Наименование проверяемого хранимого объекта (null - автоматическое считывание из запроса) ) is - SSTORED_ PKG_STD.TSTRING; -- - RSTORED PKG_OBJECT_DESC.TSTORED; -- - SPROCEDURE PKG_STD.TSTRING; -- - SPACKAGE PKG_STD.TSTRING; -- , - RPACKAGE PKG_OBJECT_DESC.TPACKAGE; -- , + SSTORED_ PKG_STD.TSTRING; -- Буфер для наименования проверяемого хранимого объекта + RSTORED PKG_OBJECT_DESC.TSTORED; -- Описание хранимого объекта из БД + SPROCEDURE PKG_STD.TSTRING; -- Буфер для наименования хранимой процедуры + SPACKAGE PKG_STD.TSTRING; -- Буфер для наименования пакета, содержащего хранимый объект + RPACKAGE PKG_OBJECT_DESC.TPACKAGE; -- Описание пакета, содержащего хранимый объект begin - /* */ + /* Считаем наименование объекта из запроса или используем переданное в параметрах */ if (SSTORED is not null) then SSTORED_ := SSTORED; else SSTORED_ := RQ_PAYLOAD_STORED_GET(XRQ_ROOT => XRQ_ROOT, NREQUIRED => 1); end if; - /* , */ + /* Проверим, что это процедура или функция и она вообще существует */ if (PKG_OBJECT_DESC.EXISTS_STORED(SSTORED_NAME => SSTORED_) = 0) then P_EXCEPTION(0, - ' / "' || SSTORED_ || '" .'); + 'Хранимая процедура/функция "' || SSTORED_ || '" не определена.'); else - /* , */ + /* Проверим, что в имени нет ссылки на пакет */ PKG_EXS.UTL_STORED_PARSE_LINK(SSTORED => SSTORED_, SPROCEDURE => SPROCEDURE, SPACKAGE => SPACKAGE); - /* - */ + /* Если в имени есть ссылка на пакет - сначала проверим его состояние */ if (SPACKAGE is not null) then RPACKAGE := PKG_OBJECT_DESC.DESC_PACKAGE(SPACKAGE_NAME => SPACKAGE, BRAISE_ERROR => false); end if; - /* , - */ + /* Если есть ссылка на пакет, или он не валиден - это ошибка */ if ((SPACKAGE is not null) and (RPACKAGE.STATUS <> SDB_OBJECT_STATE_VALID)) then P_EXCEPTION(0, - ' "' || SPACKAGE || - '", /, . .'); + 'Пакет "' || SPACKAGE || + '", содержащий хранимую процедуру/функцию, невалиден. Обращение к объекту невозможно.'); else - /* - , */ + /* Нет ссылки на пакет или он валиден - проверяем глубже, получим описание объекта из БД */ RSTORED := PKG_OBJECT_DESC.DESC_STORED(SSTORED_NAME => SSTORED_, BRAISE_ERROR => false); - /* , */ + /* Проверим, что валидна */ if (RSTORED.STATUS <> SDB_OBJECT_STATE_VALID) then P_EXCEPTION(0, - ' / "' || SSTORED_ || '" . .'); + 'Хранимая процедура/функция "' || SSTORED_ || '" невалидна. Обращение к объекту невозможно.'); else - /* , */ + /* Проверим, что это клиентский объект */ if (PKG_OBJECT_DESC.EXISTS_PRIV_EXECUTE(SSTORED_NAME => COALESCE(RSTORED.PACKAGE_NAME, SSTORED_)) = 0) then P_EXCEPTION(0, - ' / "' || SSTORED_ || - '" . .'); + 'Хранимая процедура/функция "' || SSTORED_ || + '" не является клиентской. Обращение к объекту невозможно.'); end if; end if; end if; end if; end RQ_PAYLOAD_STORED_CHECK; - /* */ + /* Считывание списка аргументов из запроса */ function RQ_PAYLOAD_ARGUMENTS_GET ( - XRQ_ROOT in PKG_XPATH.TNODE, -- - NREQUIRED in number := 0 -- (0 - , 1 - ) - ) return TARGUMENTS -- + XRQ_ROOT in PKG_XPATH.TNODE, -- Корневая ветка запроса + NREQUIRED in number := 0 -- Флаг выдачи сообщения об ошибке в случае отсутствия значения (0 - не выдавать, 1 - выдавать) + ) return TARGUMENTS -- Коллекция аргументов из запроса is - RES TARGUMENTS; -- - SRQ_ARGUMENTS_PATH PKG_STD.TSTRING; -- - XRQ_ARGUMENTS PKG_XPATH.TNODES; -- - XRQ_ARGUMENT PKG_XPATH.TNODE; -- + RES TARGUMENTS; -- Результат работы + SRQ_ARGUMENTS_PATH PKG_STD.TSTRING; -- Полный путь до аргументов выборки в запросе + XRQ_ARGUMENTS PKG_XPATH.TNODES; -- Коллекция элементов документа запроса с аргументами + XRQ_ARGUMENT PKG_XPATH.TNODE; -- Элемент документа запроса с аргументов begin - /* */ + /* Инициализируем результат */ RES := TARGUMENTS(); - /* */ + /* Сформируем полный путь до аргументов в выборке */ SRQ_ARGUMENTS_PATH := RQ_PAYLOAD_ITEM_PATH_GET(SITEM_TAG => SRQ_TAG_XARGUMENTS) || '/' || SRQ_TAG_XARGUMENT; - /* */ + /* Считаем коллекцию аргументов из документа */ XRQ_ARGUMENTS := PKG_XPATH.LIST_NODES(RPARENT_NODE => XRQ_ROOT, SPATTERN => SRQ_ARGUMENTS_PATH); - /* */ + /* Обходим коллекцию аргументов из документа */ for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XRQ_ARGUMENTS) loop - /* */ + /* Берем очередной аргумент */ XRQ_ARGUMENT := PKG_XPATH.ITEM_NODE(RNODES => XRQ_ARGUMENTS, INUMBER => I); - /* */ + /* Добавляем его в выходную коллекцию */ RES.EXTEND(); RES(RES.LAST).SNAME := NODE_SVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_SNAME); RES(RES.LAST).SDATA_TYPE := NODE_SVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_SDATA_TYPE); - /* - */ + /* Проверим корректность данных - наименование */ if (RES(RES.LAST).SNAME is null) then P_EXCEPTION(0, - ' (%s).', + 'Для аргумента не задано наименование (%s).', SRQ_ARGUMENTS_PATH || '/' || SRQ_TAG_SNAME); end if; - /* - */ + /* Проверим корректность данных - тип данных */ if (RES(RES.LAST).SDATA_TYPE is null) then P_EXCEPTION(0, - ' "%s" (%s).', + 'Для аргумента "%s" не задан тип данных (%s).', RES(RES.LAST).SNAME, SRQ_ARGUMENTS_PATH || '/' || SRQ_TAG_SDATA_TYPE); end if; - /* */ + /* Считаем значение в зависимости от типа данных */ case - /* */ + /* Строка */ when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_STR) then RES(RES.LAST).SVALUE := NODE_SVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE); - /* */ + /* Число */ when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_NUMB) then RES(RES.LAST).NVALUE := NODE_NVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE); - /* */ + /* Дата */ when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_DATE) then RES(RES.LAST).DVALUE := NODE_DVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE); - /* */ + /* Текст */ when (RES(RES.LAST).SDATA_TYPE = SDATA_TYPE_CLOB) then RES(RES.LAST).CVALUE := NODE_CVAL_GET(XROOT => XRQ_ARGUMENT, SPATH => SRQ_TAG_VALUE); - /* */ + /* Неподдерживаемый тип данных */ else P_EXCEPTION(0, - ' "%s" "%s" (%s).', + 'Указанный для аргумента "%s" тип данных "%s" не поддерживается (%s).', RES(RES.LAST).SNAME, RES(RES.LAST).SDATA_TYPE, SRQ_ARGUMENTS_PATH || '/' || SRQ_TAG_SDATA_TYPE); end case; end loop; - /* */ + /* Проверка обязательности */ if ((RES.COUNT = 0) and (NREQUIRED = 1)) then - P_EXCEPTION(0, ' (' || SRQ_ARGUMENTS_PATH || ').'); + P_EXCEPTION(0, 'Не указаны аргументы (' || SRQ_ARGUMENTS_PATH || ').'); end if; - /* */ + /* Возвращаем результат */ return RES; end RQ_PAYLOAD_ARGUMENTS_GET; - /* */ + /* Исполнение хранимой процедуры */ procedure EXEC_STORED ( - XRQ_ROOT in PKG_XPATH.TNODE, -- - COUT out clob -- + XRQ_ROOT in PKG_XPATH.TNODE, -- Корневой элемент тела документа запроса + COUT out clob -- Ответ на запрос ) is - SRQ_STORED PKG_STD.TSTRING; -- - SRQ_RESP_ARG PKG_STD.TSTRING; -- - RQ_ARGUMENTS TARGUMENTS; -- - ARGS PKG_OBJECT_DESC.TARGUMENTS; -- - RARG PKG_OBJECT_DESC.TARGUMENT; -- - ARGS_VALS PKG_CONTPRMLOC.TCONTAINER; -- - RARG_VAL PKG_CONTAINER.TPARAM; -- - SARG_NAME PKG_STD.TSTRING; -- - XRESP integer; -- - XRESP_OUT_ARGUMENTS PKG_XMAKE.TNODE; -- - RRESP_ARGUMENT_VALUE PKG_XMAKE.TVALUE; -- - BRESP_ARG_FOUND boolean := false; -- CLOB , SRESP_ARG + SRQ_STORED PKG_STD.TSTRING; -- Наименование исполняемого хранимого объекта из запроса + SRQ_RESP_ARG PKG_STD.TSTRING; -- Наименование выходного аргумента хранимого объекта из запроса для формирования тела ответа + RQ_ARGUMENTS TARGUMENTS; -- Коллекция аргументов хранимого объекта из запроса + ARGS PKG_OBJECT_DESC.TARGUMENTS; -- Коллекция формальных параметров хранимого объекта + RARG PKG_OBJECT_DESC.TARGUMENT; -- Формальный параметр хранимого объекта + ARGS_VALS PKG_CONTPRMLOC.TCONTAINER; -- Контейнер для фактических параметров хранимого объекта + RARG_VAL PKG_CONTAINER.TPARAM; -- Фактический параметр хранимого объекта + SARG_NAME PKG_STD.TSTRING; -- Наименование текущего обрабатываемого фактического параметра хранимого объекта + XRESP integer; -- Документ для ответа + XRESP_OUT_ARGUMENTS PKG_XMAKE.TNODE; -- Элемент для коллекции выходных параметров хранимого объекта + RRESP_ARGUMENT_VALUE PKG_XMAKE.TVALUE; -- Значение выходного параметра хранимого объекта + BRESP_ARG_FOUND boolean := false; -- Флаг присутствия в составе выходных аргументов аргумента с типом CLOB и именем, указанным в параметре запроса SRESP_ARG begin - /* */ + /* Создаём документ для ответа */ XRESP := PKG_XMAKE.OPEN_CURSOR(); - /* */ + /* Проверим хранимый объект в запросе */ RQ_PAYLOAD_STORED_CHECK(XRQ_ROOT => XRQ_ROOT); - /* */ + /* Считываем наименование хранимого объекта из запроса */ SRQ_STORED := RQ_PAYLOAD_STORED_GET(XRQ_ROOT => XRQ_ROOT, NREQUIRED => 1); - /* */ + /* Считываем наименование выходного аргумента хранимого объекта из запроса для формирования тела ответа */ SRQ_RESP_ARG := NODE_SVAL_GET(XROOT => XRQ_ROOT, SPATH => RQ_PAYLOAD_ITEM_PATH_GET(SITEM_TAG => SRQ_TAG_SRESP_ARG), NREQUIRED => 0, - SMESSAGE_OBJECT => ' '); - /* */ + SMESSAGE_OBJECT => 'Наименование выходного аргумента для формирования тела ответа'); + /* Считаем список аргументов из запроса */ RQ_ARGUMENTS := RQ_PAYLOAD_ARGUMENTS_GET(XRQ_ROOT => XRQ_ROOT); - /* */ + /* Считываем описание параметров хранимого объекта */ ARGS := PKG_OBJECT_DESC.DESC_ARGUMENTS(SSTORED_NAME => SRQ_STORED, BRAISE_ERROR => true); - /* */ + /* Обходим входные параметры и формируем коллекцию значений */ for I in 1 .. PKG_OBJECT_DESC.COUNT_ARGUMENTS(RARGUMENTS => ARGS) loop - /* */ + /* Считываем очередной параметр */ RARG := PKG_OBJECT_DESC.FETCH_ARGUMENT(RARGUMENTS => ARGS, IINDEX => I); - /* */ + /* Если это входной параметр */ if (RARG.IN_OUT in (PKG_STD.PARAM_TYPE_IN, PKG_STD.PARAM_TYPE_IN_OUT)) then - /* */ + /* Добавим его значение в коллекцию фактических параметров */ case RARG.DATA_TYPE - /* */ + /* Строка */ when PKG_STD.DATA_TYPE_STR then PKG_CONTPRMLOC.APPENDS(RCONTAINER => ARGS_VALS, SNAME => RARG.ARGUMENT_NAME, SVALUE => TARGUMENTS_SVAL_GET(ARGUMENTS => RQ_ARGUMENTS, SARGUMENT => RARG.ARGUMENT_NAME), NIN_OUT => RARG.IN_OUT); - /* */ + /* Число */ when PKG_STD.DATA_TYPE_NUM then PKG_CONTPRMLOC.APPENDN(RCONTAINER => ARGS_VALS, SNAME => RARG.ARGUMENT_NAME, NVALUE => TARGUMENTS_NVAL_GET(ARGUMENTS => RQ_ARGUMENTS, SARGUMENT => RARG.ARGUMENT_NAME), NIN_OUT => RARG.IN_OUT); - /* */ + /* Дата */ when PKG_STD.DATA_TYPE_DATE then PKG_CONTPRMLOC.APPENDD(RCONTAINER => ARGS_VALS, SNAME => RARG.ARGUMENT_NAME, DVALUE => TARGUMENTS_DVAL_GET(ARGUMENTS => RQ_ARGUMENTS, SARGUMENT => RARG.ARGUMENT_NAME), NIN_OUT => RARG.IN_OUT); - /* */ + /* Текст */ when PKG_STD.DATA_TYPE_CLOB then PKG_CONTPRMLOC.APPENDLC(RCONTAINER => ARGS_VALS, SNAME => RARG.ARGUMENT_NAME, LCVALUE => TARGUMENTS_CVAL_GET(ARGUMENTS => RQ_ARGUMENTS, SARGUMENT => RARG.ARGUMENT_NAME), NIN_OUT => RARG.IN_OUT); - /* */ + /* Неизвестный тип данных */ else P_EXCEPTION(0, - ' (%s) "%s" .', + 'Тип данных (%s) входного параметра "%s" не поддерживается.', RARG.DB_DATA_TYPE, RARG.ARGUMENT_NAME); end case; end if; end loop; - /* */ + /* Исполняем процедуру */ PKG_SQL_CALL.EXECUTE_STORED(SSTORED_NAME => SRQ_STORED, RPARAM_CONTAINER => ARGS_VALS); - /* */ + /* Обходим выходные параметры и собираем их в ответ */ SARG_NAME := PKG_CONTPRMLOC.FIRST_(RCONTAINER => ARGS_VALS); while (SARG_NAME is not null) loop - /* */ + /* Считываем очередной параметр */ RARG_VAL := PKG_CONTPRMLOC.GET(RCONTAINER => ARGS_VALS, SNAME => SARG_NAME); - /* */ + /* Если это выходной параметр */ if (RARG_VAL.IN_OUT in (PKG_STD.PARAM_TYPE_IN_OUT, PKG_STD.PARAM_TYPE_OUT)) then - /* */ + /* Сформируем для него значение в зависимости от его типа */ case RARG_VAL.DATA_TYPE - /* */ + /* Строка */ when PKG_STD.DATA_TYPE_STR then RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP, SVALUE => PKG_CONTPRMLOC.GETS(RCONTAINER => ARGS_VALS, SNAME => RARG_VAL.NAME)); - /* */ + /* Число */ when PKG_STD.DATA_TYPE_NUM then RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP, NVALUE => PKG_CONTPRMLOC.GETN(RCONTAINER => ARGS_VALS, SNAME => RARG_VAL.NAME)); - /* */ + /* Дата */ when PKG_STD.DATA_TYPE_DATE then RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP, DVALUE => PKG_CONTPRMLOC.GETD(RCONTAINER => ARGS_VALS, SNAME => RARG_VAL.NAME)); - /* */ + /* Текст */ when PKG_STD.DATA_TYPE_CLOB then RRESP_ARGUMENT_VALUE := PKG_XMAKE.VALUE(ICURSOR => XRESP, LCVALUE => PKG_CONTPRMLOC.GETLC(RCONTAINER => ARGS_VALS, @@ -729,14 +729,14 @@ create or replace package body PKG_P8PANELS_BASE as BRESP_ARG_FOUND := true; exit; end if; - /* */ + /* Неизвестный тип данных */ else P_EXCEPTION(0, - ' (%s) "%s" .', + 'Тип данных (%s) выходного параметра "%s" не поддерживается.', RARG.DB_DATA_TYPE, RARG.ARGUMENT_NAME); end case; - /* */ + /* Добавим ветку выходного параметра в выходную коллекцию */ XRESP_OUT_ARGUMENTS := PKG_XMAKE.CONCAT(ICURSOR => XRESP, RNODE00 => XRESP_OUT_ARGUMENTS, RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => XRESP, @@ -753,17 +753,17 @@ create or replace package body PKG_P8PANELS_BASE as RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => XRESP, SVALUE => STD_DATA_TYPE_TO_STR(NSTD_DATA_TYPE => RARG_VAL.DATA_TYPE))))); end if; - /* */ + /* Считываем наименование следующего параметра */ SARG_NAME := PKG_CONTPRMLOC.NEXT_(RCONTAINER => ARGS_VALS, SNAME => SARG_NAME); end loop; - /* , */ + /* Проверим, что был найден опциональный аргумент для формирования полного ответа */ if ((SRQ_RESP_ARG is not null) and (not BRESP_ARG_FOUND)) then P_EXCEPTION(0, - ' "%s" "%s" "CLOB".', + 'В составе выходных параметров "%s" отсуствует аргумент "%s" типа "CLOB".', SRQ_STORED, SRQ_RESP_ARG); end if; - /* ( ) */ + /* Собираем ответ (только если не формировали полный ответ через аргумент для формирования полного ответа) */ if (not BRESP_ARG_FOUND) then COUT := PKG_XMAKE.SERIALIZE_TO_CLOB(ICURSOR => XRESP, ITYPE => PKG_XMAKE.CONTENT_, @@ -771,42 +771,42 @@ create or replace package body PKG_P8PANELS_BASE as SNAME => SRESP_TAG_XPAYLOAD, RNODE00 => XRESP_OUT_ARGUMENTS)); end if; - /* */ + /* Очистим контейнер параметров */ PKG_CONTPRMLOC.PURGE(RCONTAINER => ARGS_VALS); - /* */ + /* Освобождаем документ результата */ PKG_XMAKE.CLOSE_CURSOR(ICURSOR => XRESP); exception when others then - /* */ + /* Закроем курсор и вернем ошибку */ PKG_XMAKE.CLOSE_CURSOR(ICURSOR => XRESP); - /* */ + /* Покажем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); end EXEC_STORED; - /* */ + /* Базовое исполнение действий */ procedure PROCESS ( - CIN in clob, -- - COUT out clob -- + CIN in clob, -- Входные параметры + COUT out clob -- Результат ) is - XRQ_ROOT PKG_XPATH.TNODE; -- - SRQ_ACTION PKG_STD.TSTRING; -- + XRQ_ROOT PKG_XPATH.TNODE; -- Корневой элемент тела документа запроса + SRQ_ACTION PKG_STD.TSTRING; -- Код действия из запроса begin PKG_TRACE.REGISTER(SDATA => 'P8PANELS', SDATA1 => CIN); - /* */ + /* Разбираем запрос */ XRQ_ROOT := RQ_ROOT_GET(CRQ => CIN); - /* */ + /* Считываем код действия из запроса */ SRQ_ACTION := RQ_ACTION_GET(XRQ_ROOT => XRQ_ROOT, NREQUIRED => 1); - /* */ + /* Вызываем обработчик в зависимости от кода действия */ case SRQ_ACTION - /* */ + /* Исполнение хранимой процедуры */ when SRQ_ACTION_EXEC_STORED then EXEC_STORED(XRQ_ROOT => XRQ_ROOT, COUT => COUT); - /* */ + /* Неизвестное действие */ else - P_EXCEPTION(0, ' "%s" .', SRQ_ACTION); + P_EXCEPTION(0, 'Действие "%s" не поддерживается.', SRQ_ACTION); end case; end PROCESS; diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index 8b6a729..fbfcef9 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -1,257 +1,257 @@ create or replace package PKG_P8PANELS_PROJECTS as - /* - */ + /* Типы данных - статьи этапа проекта */ type TSTAGE_ART is record ( - NRN FPDARTCL.RN%type, -- . - SCODE FPDARTCL.CODE%type, -- - SNAME FPDARTCL.NAME%type, -- - NPLAN PKG_STD.TNUMBER, -- - NCOST_FACT PKG_STD.TNUMBER, -- (null - ) - NCOST_DIFF PKG_STD.TNUMBER, -- (null - ) - NCTRL_COST PKG_STD.TNUMBER, -- (null - , 0 - , 1 - ) - NCONTR PKG_STD.TNUMBER, -- (null - ) - NCONTR_LEFT PKG_STD.TNUMBER, -- (null - ) - NCTRL_CONTR PKG_STD.TNUMBER -- (null - , 0 - , 1 - ) + NRN FPDARTCL.RN%type, -- Рег. номер статьи + SCODE FPDARTCL.CODE%type, -- Код статьи + SNAME FPDARTCL.NAME%type, -- Наименование статьи + NPLAN PKG_STD.TNUMBER, -- Плановое значение по статье + NCOST_FACT PKG_STD.TNUMBER, -- Фактические затраты (null - не подлежит контролю затрат) + NCOST_DIFF PKG_STD.TNUMBER, -- Отклонение по затратам (null - не подлежит контролю затрат) + NCTRL_COST PKG_STD.TNUMBER, -- Контроль затрат (null - не подлежит контролю затрат, 0 - без отклонений, 1 - есть отклонения) + NCONTR PKG_STD.TNUMBER, -- Законтрактовано (null - не подлежит контролю контрактации) + NCONTR_LEFT PKG_STD.TNUMBER, -- Остаток к контрактации (null - не подлежит контролю контрактации) + NCTRL_CONTR PKG_STD.TNUMBER -- Контроль контрактации (null - не подлежит контролю контрактации, 0 - без отклонений, 1 - есть отклонения) ); - /* - */ + /* Типы данных - коллекция статей этапа проекта */ type TSTAGE_ARTS is table of TSTAGE_ART; - /* */ + /* Отбор проектов */ procedure COND; - /* . () */ + /* Получение рег. номера документа основания (договора) проекта */ function GET_DOC_OSN_LNK_DOCUMENT ( - NRN in number -- . - ) return number; -- . () + NRN in number -- Рег. номер проекта + ) return number; -- Рег. номер документа основания (договора) - /* */ + /* Подбор платежей финансирования проекта */ procedure SELECT_FIN ( - NRN in number, -- . - NDIRECTION in number, -- (0 - , 1 - ) - NIDENT out number -- ( , null - ) + NRN in number, -- Рег. номер проекта + NDIRECTION in number, -- Направление (0 - приход, 1 - расход) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ); - /* */ + /* Получение суммы входящего финансирования проекта */ function GET_FIN_IN ( - NRN in number -- . - ) return number; -- + NRN in number -- Рег. номер проекта + ) return number; -- Сумма входящего финансирования проекта - /* */ + /* Получение суммы исходящего финансирования проекта */ function GET_FIN_OUT ( - NRN in number -- . - ) return number; -- + NRN in number -- Рег. номер проекта + ) return number; -- Сумма исходяшего финансирования проекта - /* */ + /* Получение состояния финансирования проекта */ function GET_CTRL_FIN ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния контрактации проекта */ function GET_CTRL_CONTR ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния соисполнения проекта */ function GET_CTRL_COEXEC ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния сроков проекта */ function GET_CTRL_PERIOD ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния затрат проекта */ function GET_CTRL_COST ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния актирования проекта */ function GET_CTRL_ACT ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Список проектов */ procedure LIST ( - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - CFILTERS in clob, -- - CORDERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CFILTERS in clob, -- Фильтры + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ); - /* */ + /* Отбор этапов проектов */ procedure STAGES_COND; - /* */ + /* Подбор платежей финансирования этапа проекта */ procedure STAGES_SELECT_FIN ( - NPRN in number := null, -- . (null - ) - NRN in number := null, -- . (null - ) - NDIRECTION in number, -- (0 - , 1 - ) - NIDENT out number -- ( , null - ) + NPRN in number := null, -- Рег. номер проекта (null - не отбирать по проекту) + NRN in number := null, -- Рег. номер этапа проекта (null - не отбирать по этапу) + NDIRECTION in number, -- Направление (0 - приход, 1 - расход) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ); - /* */ + /* Получение суммы входящего финансирования этапа проекта */ function STAGES_GET_FIN_IN ( - NRN in number -- . - ) return number; -- + NRN in number -- Рег. номер этапа проекта + ) return number; -- Сумма входящего финансирования проекта - /* */ + /* Получение суммы исходящего финансирования этапа проекта */ function STAGES_GET_FIN_OUT ( - NRN in number -- . - ) return number; -- + NRN in number -- Рег. номер этапа проекта + ) return number; -- Сумма исходяшего финансирования проекта - /* */ + /* Получение состояния финансирования этапа проекта */ function STAGES_GET_CTRL_FIN ( - NRN in number -- . - ) return number; -- (0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number; -- Состояние (0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния контрактации этапа проекта */ function STAGES_GET_CTRL_CONTR ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния соисполнения этапа проекта */ function STAGES_GET_CTRL_COEXEC ( - NRN in number -- . - ) return number; -- (0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number; -- Состояние (0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния сроков этапа проекта */ function STAGES_GET_CTRL_PERIOD ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния затрат этапа проекта */ function STAGES_GET_CTRL_COST ( - NRN in number -- . - ) return number; -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number; -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение состояния актирования этапа проекта */ function STAGES_GET_CTRL_ACT ( - NRN in number -- . - ) return number; -- (0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number; -- Состояние (0 - без отклонений, 1 - есть отклонения) - /* */ + /* Получение остатка срока исполнения этапа проекта */ function STAGES_GET_DAYS_LEFT ( - NRN in number -- . - ) return number; -- (null - ) + NRN in number -- Рег. номер этапа проекта + ) return number; -- Количество дней (null - не определено) - /* */ + /* Подбор записей журнала затрат этапа проекта */ procedure STAGES_SELECT_COST_FACT ( - NRN in number, -- . (null - ) - NIDENT out number -- ( , null - ) + NRN in number, -- Рег. номер этапа проекта (null - не отбирать по этапу) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ); - /* */ + /* Получение суммы фактических затрат этапа проекта */ function STAGES_GET_COST_FACT ( - NRN in number -- . - ) return number; -- + NRN in number -- Рег. номер этапа проекта + ) return number; -- Сумма фактических затрат - /* */ + /* Получение суммы реализации этапа проекта */ function STAGES_GET_SUMM_REALIZ ( - NRN in number, -- . - NFPDARTCL_REALIZ in number -- . - ) return number; -- + NRN in number, -- Рег. номер этапа проекта + NFPDARTCL_REALIZ in number -- Рег. номер статьи калькуляции для реализации + ) return number; -- Сумма реализации - /* */ + /* Список этапов */ procedure STAGES_LIST ( - NPRN in number, -- . - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - CFILTERS in clob, -- - CORDERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NPRN in number, -- Рег. номер проекта + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CFILTERS in clob, -- Фильтры + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ); - /* "PM0010" - " " */ + /* Формирование расчетной таблицы "PM0010" - "Калькуляция этапа проекта" */ procedure STAGES_CT_CALC; - /* */ + /* Подбор записей журнала затрат по статье калькуляции этапа проекта */ procedure STAGE_ARTS_SELECT_COST_FACT ( - NSTAGE in number, -- . - NFPDARTCL in number := null, -- . (null - ) - NFINFLOW_TYPE in number := null, -- (null - , 0 - , 1 - , 2 - ) - NIDENT out number -- ( , null - ) + NSTAGE in number, -- Рег. номер этапа проекта + NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - по всем) + NFINFLOW_TYPE in number := null, -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ); - /* - */ + /* Получение суммы-факт по статье калькуляции этапа проекта */ function STAGE_ARTS_GET_COST_FACT ( - NSTAGE in number, -- . - NFPDARTCL in number := null, -- . (null - ) - NFINFLOW_TYPE in number := null -- (null - , 0 - , 1 - , 2 - ) - ) return number; -- - + NSTAGE in number, -- Рег. номер этапа проекта + NFPDARTCL in number := null, -- Рег. номер статьи калькуляции (null - по всем) + NFINFLOW_TYPE in number := null -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход) + ) return number; -- Сумма-факт по статье - /* */ + /* Подбор записей договоров с соисполнителями по статье калькуляции этапа проекта */ procedure STAGE_ARTS_SELECT_CONTR ( - NSTAGE in number, -- . - NFPDARTCL in number := null, -- . (null - ) - NIDENT out number -- ( , null - ) + NSTAGE in number, -- Рег. номер этапа проекта + NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - по всем) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ); - /* */ + /* Получение списка статей этапа проекта */ procedure STAGE_ARTS_GET ( - NSTAGE in number, -- . - NINC_COST in number := 0, -- (0 - , 1 - ) - NINC_CONTR in number := 0, -- (0 - , 1 - ) - RSTAGE_ARTS out TSTAGE_ARTS -- + NSTAGE in number, -- Рег. номер этапа проекта + NINC_COST in number := 0, -- Включить сведения о затратах (0 - нет, 1 - да) + NINC_CONTR in number := 0, -- Включить сведения о контрактации (0 - нет, 1 - да) + RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта ); - /* */ + /* Список статей калькуляции этапа проекта */ procedure STAGE_ARTS_LIST ( - NSTAGE in number, -- . - CFILTERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NSTAGE in number, -- Рег. номер этапа проекта + CFILTERS in clob, -- Фильтры + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ); - /* */ + /* Список договоров этапа проекта */ procedure STAGE_CONTRACTS_COND; - /* */ + /* Список договоров этапа проекта */ procedure STAGE_CONTRACTS_LIST ( - NSTAGE in number, -- . - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - CFILTERS in clob, -- - CORDERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NSTAGE in number, -- Рег. номер этапа проекта + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CFILTERS in clob, -- Фильтры + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ); end PKG_P8PANELS_PROJECTS; @@ -260,40 +260,40 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* TODO: owner="root" created="20.09.2023" -text=" !!!!" +text="ПРАВА ДОСТУПА!!!!" */ - /* - */ - SYES constant PKG_STD.TSTRING := ''; -- - NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- - SFPDARTCL_REALIZ constant PKG_STD.TSTRING := '14 '; -- + /* Константы - предопределённые значения */ + SYES constant PKG_STD.TSTRING := 'Да'; -- Да + NDAYS_LEFT_LIMIT constant PKG_STD.TNUMBER := 30; -- Лимит отстатка дней для контроля сроков + SFPDARTCL_REALIZ constant PKG_STD.TSTRING := '14 Цена без НДС'; -- Мнемокод статьи калькуляции для учёта реализации - /* - "PM0010" - " " */ - SSTAGES_CT_CALC_SH_CACL constant PKG_STD.TSTRING := ''; -- "" + /* Константы - листы расчётной таблицы "PM0010" - "Калькуляция этапа проекта" */ + SSTAGES_CT_CALC_SH_CACL constant PKG_STD.TSTRING := 'Калькуляция'; -- Лист "Калькуляция" - /* - "PM0010" - " " */ - SSTAGES_CT_CALC_TBL_CLARTS constant PKG_STD.TSTRING := ''; -- " " + /* Константы - таблицы расчётной таблицы "PM0010" - "Калькуляция этапа проекта" */ + SSTAGES_CT_CALC_TBL_CLARTS constant PKG_STD.TSTRING := 'СтатьиКалькуляции'; -- Таблица "Статьи калькуляции" - /* - "PM0010" - " " */ - SSTAGES_CT_CALC_LN_ARTS constant PKG_STD.TSTRING := ''; -- "" + /* Константы - строки расчётной таблицы "PM0010" - "Калькуляция этапа проекта" */ + SSTAGES_CT_CALC_LN_ARTS constant PKG_STD.TSTRING := 'Статьи'; -- Строка "Статьи" - /* - "PM0010" - " " */ - SSTAGES_CT_CALC_CL_NUMB constant PKG_STD.TSTRING := ''; -- "" - SSTAGES_CT_CALC_CL_NAME constant PKG_STD.TSTRING := ''; -- " " - SSTAGES_CT_CALC_CL_SUMM_PL constant PKG_STD.TSTRING := ''; -- " " + /* Константы - колонки расчётной таблицы "PM0010" - "Калькуляция этапа проекта" */ + SSTAGES_CT_CALC_CL_NUMB constant PKG_STD.TSTRING := 'Номер'; -- Колонка "Номер" + SSTAGES_CT_CALC_CL_NAME constant PKG_STD.TSTRING := 'Наименование'; -- Колонка "Наименование статьи" + SSTAGES_CT_CALC_CL_SUMM_PL constant PKG_STD.TSTRING := 'ПлановаяСумма'; -- Колонка "Плановая сумма" - /* - "PM0010" - " " */ - SSTAGES_CT_CALC_PRM_COMP constant PKG_STD.TSTRING := 'PM0010_'; -- "" - SSTAGES_CT_CALC_PRM_PRJ constant PKG_STD.TSTRING := 'PM0010_'; -- " " - SSTAGES_CT_CALC_PRM_STG constant PKG_STD.TSTRING := 'PM0010_'; -- " " - SSTAGES_CT_CALC_PRM_ARTSCAT constant PKG_STD.TSTRING := 'PM0010_'; -- " " + /* Константы - параметры расчётной таблицы "PM0010" - "Калькуляция этапа проекта" */ + SSTAGES_CT_CALC_PRM_COMP constant PKG_STD.TSTRING := 'PM0010_Организация'; -- Параметр "Организация" + SSTAGES_CT_CALC_PRM_PRJ constant PKG_STD.TSTRING := 'PM0010_КодПроекта'; -- Параметр "Код проекта" + SSTAGES_CT_CALC_PRM_STG constant PKG_STD.TSTRING := 'PM0010_НомерЭтапаПроекта'; -- Параметр "Номер этапа проекта" + SSTAGES_CT_CALC_PRM_ARTSCAT constant PKG_STD.TSTRING := 'PM0010_КатСтатКальк'; -- Параметр "Каталог статей калькуляции" - /* */ + /* Считывание записи проекта */ function GET ( - NRN in number -- . - ) return PROJECT%rowtype -- + NRN in number -- Рег. номер проекта + ) return PROJECT%rowtype -- Запись проекта is - RRES PROJECT%rowtype; -- + RRES PROJECT%rowtype; -- Буфер для результата begin select P.* into RRES from PROJECT P where P.RN = NRN; return RRES; @@ -302,67 +302,67 @@ text=" PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NRN, SUNIT_TABLE => 'PROJECT'); end GET; - /* */ + /* Отбор проектов */ procedure COND as begin - /* */ + /* Установка главной таблицы */ PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'PROJECT'); - /* */ + /* Тип проекта */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE', SCONDITION_NAME => 'EDPROJECTTYPE', SJOINS => 'PRJTYPE <- RN;PRJTYPE'); - /* */ + /* Мнемокод */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE', SCONDITION_NAME => 'EDMNEMO'); - /* */ + /* Наименование */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME', SCONDITION_NAME => 'EDNAME'); - /* */ + /* Услованое наименование */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME_USL', SCONDITION_NAME => 'EDNAME_USL'); - /* */ + /* Дата начала план */ PKG_COND_BROKER.ADD_CONDITION_BETWEEN(SCOLUMN_NAME => 'BEGPLAN', SCONDITION_NAME_FROM => 'EDPLANBEGFrom', SCONDITION_NAME_TO => 'EDPLANBEGTo'); - /* */ + /* Дата окончания план */ PKG_COND_BROKER.ADD_CONDITION_BETWEEN(SCOLUMN_NAME => 'ENDPLAN', SCONDITION_NAME_FROM => 'EDPLANENDFrom', SCONDITION_NAME_TO => 'EDPLANENDTo'); - /* */ + /* Состояние */ PKG_COND_BROKER.ADD_CONDITION_ENUM(SCOLUMN_NAME => 'STATE', SCONDITION_NAME => 'CGSTATE'); - /* */ + /* Заказчик */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'AGNABBR', SCONDITION_NAME => 'EDEXT_CUST', SJOINS => 'EXT_CUST <- RN;AGNLIST'); - /* */ + /* Контроль финансирования */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_FIN(RN) = :EDCTRL_FIN'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_FIN', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_FIN')); end if; - /* */ + /* Контроль контрактации */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_CONTR') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR(RN) = :EDCTRL_CONTR'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_CONTR', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_CONTR')); end if; - /* */ + /* Контроль соисполнения */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COEXEC') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC(RN) = :EDCTRL_COEXEC'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COEXEC', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COEXEC')); end if; - /* */ + /* Контроль сроков */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_PERIOD') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD(RN) = :EDCTRL_PERIOD'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_PERIOD', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_PERIOD')); end if; - /* */ + /* Контроль затрат */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COST') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COST(RN) = :EDCTRL_COST'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COST', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COST')); end if; - /* */ + /* Контроль актирования */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_ACT') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_ACT(RN) = :EDCTRL_ACT'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_ACT', @@ -370,14 +370,14 @@ text=" end if; end COND; - /* . () */ + /* Получение рег. номера документа основания (договора) проекта */ function GET_DOC_OSN_LNK_DOCUMENT ( - NRN in number -- . - ) return number -- . () + NRN in number -- Рег. номер проекта + ) return number -- Рег. номер документа основания (договора) is begin - /* */ + /* Подберём договор с заказчиком по ЛС этапа проекта */ for C in (select CN.RN from PROJECTSTAGE PS, STAGES S, @@ -387,79 +387,79 @@ text=" and S.PRN = CN.RN group by CN.RN) loop - /* */ + /* Вернём первый найденный */ return C.RN; end loop; - /* */ + /* Ничего не нашли */ return null; end GET_DOC_OSN_LNK_DOCUMENT; - /* */ + /* Подбор платежей финансирования проекта */ procedure SELECT_FIN ( - NRN in number, -- . - NDIRECTION in number, -- (0 - , 1 - ) - NIDENT out number -- ( , null - ) + NRN in number, -- Рег. номер проекта + NDIRECTION in number, -- Направление (0 - приход, 1 - расход) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ) is begin - /* */ + /* Подберём платежи */ STAGES_SELECT_FIN(NPRN => NRN, NDIRECTION => NDIRECTION, NIDENT => NIDENT); end SELECT_FIN; - /* */ + /* Получение суммы входящего финансирования проекта */ function GET_FIN_IN ( - NRN in number -- . - ) return number -- + NRN in number -- Рег. номер проекта + ) return number -- Сумма входящего финансирования проекта is - NRES PKG_STD.TNUMBER := 0; -- + NRES PKG_STD.TNUMBER := 0; -- Буфер для результата begin - /* */ + /* Обходим этапы и считаем */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop NRES := NRES + STAGES_GET_FIN_IN(NRN => C.RN); end loop; - /* */ + /* Возвращаем результат */ return NRES; end GET_FIN_IN; - /* */ + /* Получение суммы исходящего финансирования проекта */ function GET_FIN_OUT ( - NRN in number -- . - ) return number -- + NRN in number -- Рег. номер проекта + ) return number -- Сумма исходяшего финансирования проекта is - NRES PKG_STD.TNUMBER := 0; -- + NRES PKG_STD.TNUMBER := 0; -- Буфер для результата begin - /* */ + /* Обходим этапы и считаем */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop NRES := NRES + STAGES_GET_FIN_OUT(NRN => C.RN); end loop; - /* */ + /* Возвращаем результат */ return NRES; end GET_FIN_OUT; - /* */ + /* Получение состояния финансирования проекта */ function GET_CTRL_FIN ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - BFOUND boolean := false; -- + BFOUND boolean := false; -- Флаг наличия этапов begin - /* */ + /* Обходим этапы */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop - /* */ + /* Выставим флаг наличия этапов */ BFOUND := true; - /* - */ + /* Если у этапа есть отклонение - оно есть и у проекта */ if (STAGES_GET_CTRL_FIN(NRN => C.RN) = 1) then return 1; end if; end loop; - /* - */ + /* Если мы здесь - отклонений нет */ if (BFOUND) then return 0; else @@ -467,64 +467,64 @@ text=" end if; end GET_CTRL_FIN; - /* */ + /* Получение состояния контрактации проекта */ function GET_CTRL_CONTR ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - NSTAGE_CTRL PKG_STD.TNUMBER; -- - NCNT_STAGES PKG_STD.TNUMBER :=0; -- - NCNT_NULL PKG_STD.TNUMBER :=0; -- "" + NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа + NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов + NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов begin - /* */ + /* Обходим этапы */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop - /* */ + /* Увеличим счётчик этапов */ NCNT_STAGES := NCNT_STAGES + 1; - /* */ + /* Получим состояние этапа */ NSTAGE_CTRL := STAGES_GET_CTRL_CONTR(NRN => C.RN); - /* "" */ + /* Подсчитаем количество "безконтрольных" */ if (NSTAGE_CTRL is null) then NCNT_NULL := NCNT_NULL + 1; end if; - /* - */ + /* Если у этапа есть отклонение - оно есть и у проекта */ if (NSTAGE_CTRL = 1) then return 1; end if; end loop; - /* - */ + /* Если ни один этап не подлежит контролю - то и состояние проекта тоже */ if (NCNT_NULL = NCNT_STAGES) then return null; end if; - /* - */ + /* Если мы здесь - отклонений нет */ if (NCNT_STAGES > 0) then return 0; else - /* */ + /* Нет этапов и нет контроля */ return null; end if; end GET_CTRL_CONTR; - /* */ + /* Получение состояния соисполнения проекта */ function GET_CTRL_COEXEC ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - BFOUND boolean := false; -- + BFOUND boolean := false; -- Флаг наличия этапов begin - /* */ + /* Обходим этапы */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop - /* */ + /* Выставим флаг наличия этапов */ BFOUND := true; - /* - */ + /* Если у этапа есть отклонение - оно есть и у проекта */ if (STAGES_GET_CTRL_COEXEC(NRN => C.RN) = 1) then return 1; end if; end loop; - /* - */ + /* Если мы здесь - отклонений нет */ if (BFOUND) then return 0; else @@ -532,103 +532,103 @@ text=" end if; end GET_CTRL_COEXEC; - /* */ + /* Получение состояния сроков проекта */ function GET_CTRL_PERIOD ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - NSTAGE_CTRL PKG_STD.TNUMBER; -- - NCNT_STAGES PKG_STD.TNUMBER :=0; -- - NCNT_NULL PKG_STD.TNUMBER :=0; -- "" + NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа + NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов + NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов begin - /* */ + /* Обходим этапы */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop - /* */ + /* Увеличим счётчик этапов */ NCNT_STAGES := NCNT_STAGES + 1; - /* */ + /* Получим состояние этапа */ NSTAGE_CTRL := STAGES_GET_CTRL_PERIOD(NRN => C.RN); - /* "" */ + /* Подсчитаем количество "безконтрольных" */ if (NSTAGE_CTRL is null) then NCNT_NULL := NCNT_NULL + 1; end if; - /* - */ + /* Если у этапа есть отклонение - оно есть и у проекта */ if (NSTAGE_CTRL = 1) then return 1; end if; end loop; - /* - */ + /* Если ни один этап не подлежит контролю - то и состояние проекта тоже */ if (NCNT_NULL = NCNT_STAGES) then return null; end if; - /* - */ + /* Если мы здесь - отклонений нет */ if (NCNT_STAGES > 0) then return 0; else - /* */ + /* Нет этапов и нет контроля */ return null; end if; end GET_CTRL_PERIOD; - /* */ + /* Получение состояния затрат проекта */ function GET_CTRL_COST ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - NSTAGE_CTRL PKG_STD.TNUMBER; -- - NCNT_STAGES PKG_STD.TNUMBER :=0; -- - NCNT_NULL PKG_STD.TNUMBER :=0; -- "" + NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа + NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов + NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов begin - /* */ + /* Обходим этапы */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop - /* */ + /* Увеличим счётчик этапов */ NCNT_STAGES := NCNT_STAGES + 1; - /* */ + /* Получим состояние этапа */ NSTAGE_CTRL := STAGES_GET_CTRL_COST(NRN => C.RN); - /* "" */ + /* Подсчитаем количество "безконтрольных" */ if (NSTAGE_CTRL is null) then NCNT_NULL := NCNT_NULL + 1; end if; - /* - */ + /* Если у этапа есть отклонение - оно есть и у проекта */ if (NSTAGE_CTRL = 1) then return 1; end if; end loop; - /* - */ + /* Если ни один этап не подлежит контролю - то и состояние проекта тоже */ if (NCNT_NULL = NCNT_STAGES) then return null; end if; - /* - */ + /* Если мы здесь - отклонений нет */ if (NCNT_STAGES > 0) then return 0; else - /* */ + /* Нет этапов и нет контроля */ return null; end if; end GET_CTRL_COST; - /* */ + /* Получение состояния актирования проекта */ function GET_CTRL_ACT ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - BFOUND boolean := false; -- + BFOUND boolean := false; -- Флаг наличия этапов begin - /* */ + /* Обходим этапы */ for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN) loop - /* */ + /* Выставим флаг наличия этапов */ BFOUND := true; - /* - */ + /* Если у этапа есть отклонение - оно есть и у проекта */ if (STAGES_GET_CTRL_ACT(NRN => C.RN) = 1) then return 1; end if; end loop; - /* - */ + /* Если мы здесь - отклонений нет */ if (BFOUND) then return 0; else @@ -636,118 +636,118 @@ text=" end if; end GET_CTRL_ACT; - /* */ + /* Список проектов */ procedure LIST ( - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - CFILTERS in clob, -- - CORDERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CFILTERS in clob, -- Фильтры + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ) is - NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- - NIDENT PKG_STD.TREF := GEN_IDENT(); -- - RF PKG_P8PANELS_VISUAL.TFILTERS; -- - RO PKG_P8PANELS_VISUAL.TORDERS; -- - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- - NROW_FROM PKG_STD.TREF; -- - NROW_TO PKG_STD.TREF; -- - CSQL clob; -- - ICURSOR integer; -- - NECON_RESP_DP PKG_STD.TREF; -- . " " + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса + NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора + RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов + NROW_FROM PKG_STD.TREF; -- Номер строки с + NROW_TO PKG_STD.TREF; -- Номер строки по + CSQL clob; -- Буфер для запроса + ICURSOR integer; -- Курсор для исполнения запроса + NECON_RESP_DP PKG_STD.TREF; -- Рег. номер ДС "Ответственный экономист" begin - /* */ + /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* */ + /* Читем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); - /* */ + /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); - /* */ + /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* */ + /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', - SCAPTION => '. ', + SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCODE', - SCAPTION => '', + SCAPTION => 'Код', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDMNEMO', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNAME', - SCAPTION => '', + SCAPTION => 'Наименование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDNAME', BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNAME_USL', - SCAPTION => ' ', + SCAPTION => 'Условное наименование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDNAME_USL', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEXPECTED_RES', - SCAPTION => ' ', + SCAPTION => 'Ожидаемые результаты', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SPRJTYPE', - SCAPTION => '', + SCAPTION => 'Тип', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDPROJECTTYPE', BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEXT_CUST', - SCAPTION => '', + SCAPTION => 'Заказчик', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDEXT_CUST', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SGOVCNTRID', - SCAPTION => '', + SCAPTION => 'ИГК', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDOC_OSN', - SCAPTION => '-', + SCAPTION => 'Документ-основание', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_SDOC_OSN', - SCAPTION => '- ( )', + SCAPTION => 'Документ-основание (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_SDOC_OSN', - SCAPTION => '- ( )', + SCAPTION => 'Документ-основание (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SSUBDIV_RESP', - SCAPTION => '-', + SCAPTION => 'Подразделение-исполнитель', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SRESPONSIBLE', - SCAPTION => ' ', + SCAPTION => 'Ответственный исполнитель', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SECON_RESP', - SCAPTION => ' ', + SCAPTION => 'Ответственный экономист', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); @@ -758,7 +758,7 @@ text=" PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 5); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATE', - SCAPTION => '', + SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'CGSTATE', BORDER => true, @@ -766,7 +766,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DBEGPLAN', - SCAPTION => ' ', + SCAPTION => 'Дата начала', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'EDPLANBEGFrom', SCOND_TO => 'EDPLANBEGTo', @@ -774,7 +774,7 @@ text=" BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DENDPLAN', - SCAPTION => ' ', + SCAPTION => 'Дата окончания', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'EDPLANENDFrom', SCOND_TO => 'EDPLANENDTo', @@ -782,49 +782,49 @@ text=" BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCOST_SUM', - SCAPTION => '', + SCAPTION => 'Стоимость', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCURNAMES', - SCAPTION => '', + SCAPTION => 'Валюта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NFIN_IN', - SCAPTION => ' ', + SCAPTION => 'Входящее финансирование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_NFIN_IN', - SCAPTION => ' ( )', + SCAPTION => 'Входящее финансирование (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_NFIN_IN', - SCAPTION => ' ( )', + SCAPTION => 'Входящее финансирование (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NFIN_OUT', - SCAPTION => ' ', + SCAPTION => 'Исходящее финансирование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_NFIN_OUT', - SCAPTION => ' ( )', + SCAPTION => 'Исходящее финансирование (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_NFIN_OUT', - SCAPTION => ' ( )', + SCAPTION => 'Исходящее финансирование (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_FIN', - SCAPTION => '', + SCAPTION => 'Финансирование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_FIN', BORDER => true, @@ -832,7 +832,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_CONTR', - SCAPTION => '', + SCAPTION => 'Контрактация', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_CONTR', BORDER => true, @@ -840,7 +840,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_COEXEC', - SCAPTION => '', + SCAPTION => 'Соисполнители', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_COEXEC', BORDER => true, @@ -848,7 +848,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_PERIOD', - SCAPTION => '', + SCAPTION => 'Сроки', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_PERIOD', BORDER => true, @@ -856,7 +856,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_COST', - SCAPTION => '', + SCAPTION => 'Затраты', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_COST', BORDER => true, @@ -864,17 +864,17 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_ACT', - SCAPTION => '', + SCAPTION => 'Актирование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_ACT', BORDER => true, BFILTER => true, RCOL_VALS => RCOL_VALS); - /* - */ - FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => '.SECON_RESP', NRN => NECON_RESP_DP); - /* */ + /* Определим дополнительные свойства - ответственный экономист */ + FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => 'ПУП.SECON_RESP', NRN => NECON_RESP_DP); + /* Обходим данные */ begin - /* */ + /* Собираем запрос */ CSQL := 'select * from (select D.*, ROWNUM NROW @@ -924,24 +924,24 @@ text=" and P.CURNAMES = CN.RN and P.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F where F.NROW between :NROW_FROM and :NROW_TO'; - /* */ + /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); - /* */ + /* Учтём фильтры */ PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, NCOMPANY => NCOMPANY, SUNIT => 'Projects', SPROCEDURE => 'PKG_P8PANELS_PROJECTS.COND', RDATA_GRID => RDG, RFILTERS => RF); - /* */ + /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); - /* */ + /* Делаем подстановку параметров */ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NECON_RESP_DP', NVALUE => NECON_RESP_DP); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO); - /* */ + /* Описываем структуру записи курсора */ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); @@ -973,14 +973,14 @@ text=" PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31); - /* */ + /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; end if; - /* */ + /* Обходим выбранные записи */ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop - /* */ + /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRN', ICURSOR => ICURSOR, NPOSITION => 1, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); @@ -1084,27 +1084,27 @@ text=" SNAME => 'NCTRL_ACT', ICURSOR => ICURSOR, NPOSITION => 31); - /* */ + /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; - /* */ + /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); exception when others then PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); raise; end; - /* */ + /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end LIST; - /* */ + /* Считывание записи этапа проекта */ function STAGES_GET ( - NRN in number -- . - ) return PROJECTSTAGE%rowtype -- + NRN in number -- Рег. номер этапа проекта + ) return PROJECTSTAGE%rowtype -- Запись этапа проекта is - RRES PROJECTSTAGE%rowtype; -- + RRES PROJECTSTAGE%rowtype; -- Буфер для результата begin select PS.* into RRES from PROJECTSTAGE PS where PS.RN = NRN; return RRES; @@ -1113,53 +1113,53 @@ text=" PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NRN, SUNIT_TABLE => 'PROJECTSTAGE'); end STAGES_GET; - /* */ + /* Отбор этапов проектов */ procedure STAGES_COND as begin - /* */ + /* Установка главной таблицы */ PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'PROJECTSTAGE'); - /* */ + /* Проект */ PKG_COND_BROKER.SET_COLUMN_PRN(SCOLUMN_NAME => 'PRN'); - /* */ + /* Номер */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NUMB', SCONDITION_NAME => 'EDNUMB'); - /* */ + /* Наименование */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME', SCONDITION_NAME => 'EDNAME'); - /* */ + /* Дата начала план */ PKG_COND_BROKER.ADD_CONDITION_BETWEEN(SCOLUMN_NAME => 'BEGPLAN', SCONDITION_NAME_FROM => 'EDPLANBEGFrom', SCONDITION_NAME_TO => 'EDPLANBEGTo'); - /* */ + /* Дата окончания план */ PKG_COND_BROKER.ADD_CONDITION_BETWEEN(SCOLUMN_NAME => 'ENDPLAN', SCONDITION_NAME_FROM => 'EDPLANENDFrom', SCONDITION_NAME_TO => 'EDPLANENDTo'); - /* */ + /* Состояние */ PKG_COND_BROKER.ADD_CONDITION_ENUM(SCOLUMN_NAME => 'STATE', SCONDITION_NAME => 'CGSTATE'); - /* */ + /* Контроль финансирования */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN(RN) = :EDCTRL_FIN'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_FIN', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_FIN')); end if; - /* */ + /* Контроль контрактации */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_CONTR') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR(RN) = :EDCTRL_CONTR'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_CONTR', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_CONTR')); end if; - /* */ + /* Контроль соисполнения */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COEXEC') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COEXEC(RN) = :EDCTRL_COEXEC'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COEXEC', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COEXEC')); end if; - /* */ + /* Контроль сроков */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_PERIOD') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_PERIOD(RN) = :EDCTRL_PERIOD'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_PERIOD', NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_PERIOD')); end if; - /* */ + /* Контроль затрат */ if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COST') = 1) then PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST(RN) = :EDCTRL_COST'); PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COST', @@ -1167,18 +1167,18 @@ text=" end if; end STAGES_COND; - /* */ + /* Подбор платежей финансирования этапа проекта */ procedure STAGES_SELECT_FIN ( - NPRN in number := null, -- . (null - ) - NRN in number := null, -- . (null - ) - NDIRECTION in number, -- (0 - , 1 - ) - NIDENT out number -- ( , null - ) + NPRN in number := null, -- Рег. номер проекта (null - не отбирать по проекту) + NRN in number := null, -- Рег. номер этапа проекта (null - не отбирать по этапу) + NDIRECTION in number, -- Направление (0 - приход, 1 - расход) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ) is - NSELECTLIST PKG_STD.TREF; -- . + NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных begin - /* */ + /* Подберём платежи */ for C in (select PN.COMPANY, PN.RN from PAYNOTES PN, @@ -1198,11 +1198,11 @@ text=" and ((NRN is null) or ((NRN is not null) and (PS.RN = NRN))) and ((NPRN is null) or ((NPRN is not null) and (PS.PRN = NPRN))))) loop - /* */ + /* Сформируем идентификатор буфера */ if (NIDENT is null) then NIDENT := GEN_IDENT(); end if; - /* */ + /* Добавим подобранное в список отмеченных записей */ P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT, NCOMPANY => C.COMPANY, NDOCUMENT => C.RN, @@ -1216,16 +1216,16 @@ text=" end loop; end STAGES_SELECT_FIN; - /* */ + /* Получение суммы финансирования этапа проекта */ function STAGES_GET_FIN ( - NRN in number, -- . - NDIRECTION in number -- (0 - , 1 - ) - ) return number -- + NRN in number, -- Рег. номер этапа проекта + NDIRECTION in number -- Направление (0 - приход, 1 - расход) + ) return number -- Сумма финансирования проекта is - NRES PKG_STD.TNUMBER; -- + NRES PKG_STD.TNUMBER; -- Буфер для рузультата begin - /* */ + /* Суммируем фактические платежи нужного направления по лицевому счёту затрат этапа */ select COALESCE(sum(PN.PAY_SUM * (PN.CURR_RATE_BASE/PN.CURR_RATE)), 0) into NRES from PAYNOTES PN, @@ -1240,167 +1240,167 @@ text=" where PNC.PRN = PN.RN and PNC.FACEACCOUNT = PS.FACEACC and PS.RN = NRN); - /* */ + /* Возвращаем результат */ return NRES; end STAGES_GET_FIN; - /* */ + /* Получение суммы входящего финансирования этапа проекта */ function STAGES_GET_FIN_IN ( - NRN in number -- . - ) return number -- + NRN in number -- Рег. номер этапа проекта + ) return number -- Сумма входящего финансирования проекта is begin return STAGES_GET_FIN(NRN => NRN, NDIRECTION => 0); end STAGES_GET_FIN_IN; - /* */ + /* Получение суммы исходящего финансирования этапа проекта */ function STAGES_GET_FIN_OUT ( - NRN in number -- . - ) return number -- + NRN in number -- Рег. номер этапа проекта + ) return number -- Сумма исходяшего финансирования проекта is begin return STAGES_GET_FIN(NRN => NRN, NDIRECTION => 1); end STAGES_GET_FIN_OUT; - /* */ + /* Получение состояния финансирования этапа проекта */ function STAGES_GET_CTRL_FIN ( - NRN in number -- . - ) return number -- (0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number -- Состояние (0 - без отклонений, 1 - есть отклонения) is begin return 0; end STAGES_GET_CTRL_FIN; - /* */ + /* Получение состояния контрактации этапа проекта */ function STAGES_GET_CTRL_CONTR ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - RSTAGE_ARTS TSTAGE_ARTS; -- - NCNT_NULL PKG_STD.TNUMBER := 0; -- + RSTAGE_ARTS TSTAGE_ARTS; -- Сведения о контрактации по статьям этапа + NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество статей с неопределённым состоянием begin - /* */ + /* Получим сведения о контрактации по статьям */ STAGE_ARTS_GET(NSTAGE => NRN, NINC_CONTR => 1, RSTAGE_ARTS => RSTAGE_ARTS); - /* - */ + /* Если сведения есть - будем разбираться */ if ((RSTAGE_ARTS is not null) and (RSTAGE_ARTS.COUNT > 0)) then for I in RSTAGE_ARTS.FIRST .. RSTAGE_ARTS.LAST loop if (RSTAGE_ARTS(I).NCTRL_CONTR is null) then NCNT_NULL := NCNT_NULL + 1; end if; - /* */ + /* Если хоть одна статья имеет отклонения */ if (RSTAGE_ARTS(I).NCTRL_CONTR = 1) then - /* */ + /* То и этап имеет отклонение */ return 1; end if; end loop; - /* - */ + /* Если ни одна статья не подлежит контролю - то и состояние этапа тоже */ if (NCNT_NULL = RSTAGE_ARTS.COUNT) then return null; end if; - /* - */ + /* Если мы здесь - отклонений нет */ return 0; else - /* */ + /* Нет данных по статьям */ return null; end if; end STAGES_GET_CTRL_CONTR; - /* */ + /* Получение состояния соисполнения этапа проекта */ function STAGES_GET_CTRL_COEXEC ( - NRN in number -- . - ) return number -- (0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number -- Состояние (0 - без отклонений, 1 - есть отклонения) is begin return 0; end STAGES_GET_CTRL_COEXEC; - /* */ + /* Получение состояния сроков этапа проекта */ function STAGES_GET_CTRL_PERIOD ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - NDAYS_LEFT PKG_STD.TNUMBER; -- + NDAYS_LEFT PKG_STD.TNUMBER; -- Остаток дней до завершения этапа begin - /* */ + /* Получим количество дней до завершения */ NDAYS_LEFT := STAGES_GET_DAYS_LEFT(NRN => NRN); - /* - */ + /* Если мы не знаем количества дней - то не можем и контролировать */ if (NDAYS_LEFT is null) then return null; end if; - /* */ + /* Если осталось меньше определённого лимита */ if (NDAYS_LEFT < NDAYS_LEFT_LIMIT) then - /* */ + /* На это необходимо обратить внимание */ return 1; else - /* */ + /* Отклонений нет */ return 0; end if; end STAGES_GET_CTRL_PERIOD; - /* */ + /* Получение состояния затрат этапа проекта */ function STAGES_GET_CTRL_COST ( - NRN in number -- . - ) return number -- (null - , 0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) is - RSTAGE_ARTS TSTAGE_ARTS; -- - NCNT_NULL PKG_STD.TNUMBER := 0; -- + RSTAGE_ARTS TSTAGE_ARTS; -- Сведения о затратах по статьям этапа + NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество статей с неопределённым состоянием begin - /* */ + /* Получим сведения о затратах по статьям */ STAGE_ARTS_GET(NSTAGE => NRN, NINC_COST => 1, RSTAGE_ARTS => RSTAGE_ARTS); - /* - */ + /* Если сведения есть - будем разбираться */ if ((RSTAGE_ARTS is not null) and (RSTAGE_ARTS.COUNT > 0)) then for I in RSTAGE_ARTS.FIRST .. RSTAGE_ARTS.LAST loop if (RSTAGE_ARTS(I).NCTRL_COST is null) then NCNT_NULL := NCNT_NULL + 1; end if; - /* */ + /* Если хоть одна статья имеет отклонения */ if (RSTAGE_ARTS(I).NCTRL_COST = 1) then - /* */ + /* То и этап имеет отклонение */ return 1; end if; end loop; - /* - */ + /* Если ни одна статья не подлежит контролю - то и состояние этапа тоже */ if (NCNT_NULL = RSTAGE_ARTS.COUNT) then return null; end if; - /* - */ + /* Если мы здесь - отклонений нет */ return 0; else - /* */ + /* Нет данных по статьям */ return null; end if; end STAGES_GET_CTRL_COST; - /* */ + /* Получение состояния актирования этапа проекта */ function STAGES_GET_CTRL_ACT ( - NRN in number -- . - ) return number -- (0 - , 1 - ) + NRN in number -- Рег. номер этапа проекта + ) return number -- Состояние (0 - без отклонений, 1 - есть отклонения) is begin return 1; end STAGES_GET_CTRL_ACT; - /* */ + /* Получение остатка срока исполнения этапа проекта */ function STAGES_GET_DAYS_LEFT ( - NRN in number -- . - ) return number -- (null - ) + NRN in number -- Рег. номер этапа проекта + ) return number -- Количество дней (null - не определено) is - RSTG PROJECTSTAGE%rowtype; -- + RSTG PROJECTSTAGE%rowtype; -- Запись этапа begin - /* */ + /* Считаем этап */ RSTG := STAGES_GET(NRN => NRN); - /* */ + /* Вернём остаток дней */ if (RSTG.ENDPLAN is not null) then return RSTG.ENDPLAN - sysdate; else @@ -1408,33 +1408,33 @@ text=" end if; end STAGES_GET_DAYS_LEFT; - /* */ + /* Подбор записей журнала затрат этапа проекта */ procedure STAGES_SELECT_COST_FACT ( - NRN in number, -- . (null - ) - NIDENT out number -- ( , null - ) + NRN in number, -- Рег. номер этапа проекта (null - не отбирать по этапу) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ) is begin STAGE_ARTS_SELECT_COST_FACT(NSTAGE => NRN, NFINFLOW_TYPE => 2, NIDENT => NIDENT); end STAGES_SELECT_COST_FACT; - /* */ + /* Получение суммы фактических затрат этапа проекта */ function STAGES_GET_COST_FACT ( - NRN in number -- . - ) return number -- + NRN in number -- Рег. номер этапа проекта + ) return number -- Сумма фактических затрат is begin return STAGE_ARTS_GET_COST_FACT(NSTAGE => NRN, NFINFLOW_TYPE => 2); end STAGES_GET_COST_FACT; - /* */ + /* Получение суммы реализации этапа проекта */ function STAGES_GET_SUMM_REALIZ ( - NRN in number, -- . - NFPDARTCL_REALIZ in number -- . - ) return number -- + NRN in number, -- Рег. номер этапа проекта + NFPDARTCL_REALIZ in number -- Рег. номер статьи калькуляции для реализации + ) return number -- Сумма реализации is begin if (NFPDARTCL_REALIZ is not null) then @@ -1444,76 +1444,76 @@ text=" end if; end STAGES_GET_SUMM_REALIZ; - /* */ + /* Список этапов */ procedure STAGES_LIST ( - NPRN in number, -- . - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - CFILTERS in clob, -- - CORDERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NPRN in number, -- Рег. номер проекта + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CFILTERS in clob, -- Фильтры + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ) is - NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- - NIDENT PKG_STD.TREF := GEN_IDENT(); -- - RF PKG_P8PANELS_VISUAL.TFILTERS; -- - RO PKG_P8PANELS_VISUAL.TORDERS; -- - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- - NROW_FROM PKG_STD.TREF; -- - NROW_TO PKG_STD.TREF; -- - NFPDARTCL_REALIZ PKG_STD.TREF; -- . - CSQL clob; -- - ICURSOR integer; -- - NCOST_FACT PKG_STD.TNUMBER; -- - NSUMM_REALIZ PKG_STD.TNUMBER; -- - NSUMM_INCOME PKG_STD.TNUMBER; -- - NINCOME_PRC PKG_STD.TNUMBER; -- + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса + NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора + RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов + NROW_FROM PKG_STD.TREF; -- Номер строки с + NROW_TO PKG_STD.TREF; -- Номер строки по + NFPDARTCL_REALIZ PKG_STD.TREF; -- Рег. номер статьи калькуляции для реализации + CSQL clob; -- Буфер для запроса + ICURSOR integer; -- Курсор для исполнения запроса + NCOST_FACT PKG_STD.TNUMBER; -- Сумма фактических затрат по этапу проекта + NSUMM_REALIZ PKG_STD.TNUMBER; -- Сумма реализации по этапу проекта + NSUMM_INCOME PKG_STD.TNUMBER; -- Сумма прибыли по этапу проекта + NINCOME_PRC PKG_STD.TNUMBER; -- Процент прибыли по этапу проекта begin - /* . */ + /* Определим рег. номер статьи калькуляции для учёта реализации */ FIND_FPDARTCL_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SFPDARTCL_REALIZ, NRN => NFPDARTCL_REALIZ); - /* */ + /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* */ + /* Читем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); - /* */ + /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); - /* */ + /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* */ + /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', - SCAPTION => '. ', + SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNUMB', - SCAPTION => '', + SCAPTION => 'Номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDNUMB', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNAME', - SCAPTION => '', + SCAPTION => 'Наименование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDNAME', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEXPECTED_RES', - SCAPTION => ' ', + SCAPTION => 'Ожидаемые результаты', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SFACEACC', - SCAPTION => ' ', + SCAPTION => 'Шифр затрат', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); @@ -1524,7 +1524,7 @@ text=" PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 5); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSTATE', - SCAPTION => '', + SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'CGSTATE', BORDER => true, @@ -1532,7 +1532,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DBEGPLAN', - SCAPTION => ' ', + SCAPTION => 'Дата начала', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'EDPLANBEGFrom', SCOND_TO => 'EDPLANBEGTo', @@ -1540,7 +1540,7 @@ text=" BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DENDPLAN', - SCAPTION => ' ', + SCAPTION => 'Дата окончания', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'EDPLANENDFrom', SCOND_TO => 'EDPLANENDTo', @@ -1548,49 +1548,49 @@ text=" BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCOST_SUM', - SCAPTION => '', + SCAPTION => 'Стоимость', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCURNAMES', - SCAPTION => '', + SCAPTION => 'Валюта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NFIN_IN', - SCAPTION => ' ', + SCAPTION => 'Входящее финансирование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_NFIN_IN', - SCAPTION => ' ( )', + SCAPTION => 'Входящее финансирование (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_NFIN_IN', - SCAPTION => ' ( )', + SCAPTION => 'Входящее финансирование (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NFIN_OUT', - SCAPTION => ' ', + SCAPTION => 'Исходящее финансирование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_NFIN_OUT', - SCAPTION => ' ( )', + SCAPTION => 'Исходящее финансирование (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_NFIN_OUT', - SCAPTION => ' ( )', + SCAPTION => 'Исходящее финансирование (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_FIN', - SCAPTION => '', + SCAPTION => 'Финансирование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_FIN', BORDER => true, @@ -1598,7 +1598,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_CONTR', - SCAPTION => '', + SCAPTION => 'Контрактация', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_CONTR', BORDER => true, @@ -1606,7 +1606,7 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_COEXEC', - SCAPTION => '', + SCAPTION => 'Соисполнители', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_COEXEC', BORDER => true, @@ -1614,12 +1614,12 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NDAYS_LEFT', - SCAPTION => ' ', + SCAPTION => 'Дней до окончания', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_PERIOD', - SCAPTION => '', + SCAPTION => 'Сроки', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_PERIOD', BORDER => true, @@ -1627,45 +1627,45 @@ text=" RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCOST_FACT', - SCAPTION => ' ', + SCAPTION => 'Сумма фактических затрат', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_NCOST_FACT', - SCAPTION => ' ( )', + SCAPTION => 'Сумма фактических затрат (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_NCOST_FACT', - SCAPTION => ' ( )', + SCAPTION => 'Сумма фактических затрат (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSUMM_REALIZ', - SCAPTION => ' ', + SCAPTION => 'Сумма реализации', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSUMM_INCOME', - SCAPTION => ' ', + SCAPTION => 'Сумма прибыли', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NINCOME_PRC', - SCAPTION => ' ', + SCAPTION => 'Процент прибыли', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_COST', - SCAPTION => '', + SCAPTION => 'Затраты', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'EDCTRL_COST', BORDER => true, BFILTER => true, RCOL_VALS => RCOL_VALS); - /* */ + /* Обходим данные */ begin - /* */ + /* Собираем запрос */ CSQL := 'select * from (select D.*, ROWNUM NROW @@ -1704,9 +1704,9 @@ text=" and P.CURNAMES = CN.RN and PS.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F where F.NROW between :NROW_FROM and :NROW_TO'; - /* */ + /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); - /* */ + /* Учтём фильтры */ PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, NCOMPANY => NCOMPANY, NPARENT => NPRN, @@ -1714,15 +1714,15 @@ text=" SPROCEDURE => 'PKG_P8PANELS_PROJECTS.STAGES_COND', RDATA_GRID => RDG, RFILTERS => RF); - /* */ + /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); - /* */ + /* Делаем подстановку параметров */ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFPDARTCL_REALIZ', NVALUE => NFPDARTCL_REALIZ); - /* */ + /* Описываем структуру записи курсора */ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); @@ -1749,14 +1749,14 @@ text=" PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 24); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 25); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 26); - /* */ + /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; end if; - /* */ + /* Обходим выбранные записи */ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop - /* */ + /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRN', ICURSOR => ICURSOR, @@ -1846,46 +1846,46 @@ text=" SNAME => 'NCTRL_COST', ICURSOR => ICURSOR, NPOSITION => 26); - /* */ + /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; - /* */ + /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); exception when others then PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); raise; end; - /* */ + /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end STAGES_LIST; - /* / "PM0010" - " " */ + /* Считывание записи проекта/этапа для расчётной таблицы "PM0010" - "Калькуляция этапа проекта" */ procedure STAGES_CT_CALC_LOAD_PROJECT ( - RPRJ out PROJECT%rowtype, -- - RSTG out PROJECTSTAGE%rowtype -- + RPRJ out PROJECT%rowtype, -- Запись проекта + RSTG out PROJECTSTAGE%rowtype -- Запись этапа проекта ) is - NCOMPANY PKG_STD.TREF; -- . - SPROJECT_CODE PKG_STD.TSTRING; -- - SPROJECT_STAGE_NUMB PKG_STD.TSTRING; -- + NCOMPANY PKG_STD.TREF; -- Рег. номер организации из входных параметров + SPROJECT_CODE PKG_STD.TSTRING; -- Код проета из параметров + SPROJECT_STAGE_NUMB PKG_STD.TSTRING; -- Номер этапа проекта из входных параметров begin - /* "" */ + /* Считывание параметра "Организация" */ PRSG_CALCTAB_IMAGE.READ_PARAMETER_NUM(SNAME => SSTAGES_CT_CALC_PRM_COMP, NVALUE => NCOMPANY); - /* " " */ + /* Считывание параметра "Код проекта" */ PRSG_CALCTAB_IMAGE.READ_PARAMETER_STR(SNAME => SSTAGES_CT_CALC_PRM_PRJ, SVALUE => SPROJECT_CODE); - /* " " */ + /* Считывание параметра "Номер этапа проекта" */ PRSG_CALCTAB_IMAGE.READ_PARAMETER_STR(SNAME => SSTAGES_CT_CALC_PRM_STG, SVALUE => SPROJECT_STAGE_NUMB); - /* */ + /* Читаем данные */ begin - /* */ + /* Проект */ select P.* into RPRJ from PROJECT P where P.COMPANY = NCOMPANY and P.CODE = SPROJECT_CODE; - /* */ + /* Этап */ select PS.* into RSTG from PROJECTSTAGE PS @@ -1894,107 +1894,107 @@ text=" exception when NO_DATA_FOUND then P_EXCEPTION(0, - ' "%s" "%s" "%s" .', - COALESCE(SPROJECT_STAGE_NUMB, '< >'), - COALESCE(SPROJECT_CODE, '< >'), - COALESCE(TO_CHAR(NCOMPANY), '< >')); + 'Этап "%s" проекта "%s" в организации "%s" не определён.', + COALESCE(SPROJECT_STAGE_NUMB, '<НЕ УКАЗАН>'), + COALESCE(SPROJECT_CODE, '<НЕ УКАЗАН>'), + COALESCE(TO_CHAR(NCOMPANY), '<НЕ УКАЗАНА>')); end; end STAGES_CT_CALC_LOAD_PROJECT; - /* "PM0010" - " " */ + /* Формирование заголовков таблиц для расчётной таблицы "PM0010" - "Калькуляция этапа проекта" */ procedure STAGES_CT_CALC_TABLE_CAPTIONS is - RPRJ PROJECT%rowtype; -- - RSTG PROJECTSTAGE%rowtype; -- + RPRJ PROJECT%rowtype; -- Запись проекта + RSTG PROJECTSTAGE%rowtype; -- Запись этапа проекта begin - /* */ + /* Считаем проект и этап */ STAGES_CT_CALC_LOAD_PROJECT(RPRJ => RPRJ, RSTG => RSTG); - /* */ + /* Работаем от имени таблицы */ case PRSG_CALCTAB.TABLE_NAME - /* " " */ + /* Таблица "Статьи калькуляции" */ when SSTAGES_CT_CALC_TBL_CLARTS then - PRSG_CALCTAB_BUILD.WRITE_TABLE_CAPTION(STEXT => ' "' || trim(RSTG.NUMB) || '" "' || + PRSG_CALCTAB_BUILD.WRITE_TABLE_CAPTION(STEXT => 'Калькуляция этапа "' || trim(RSTG.NUMB) || '" проекта "' || RPRJ.CODE || '"'); - /* */ + /* Неизвестная таблица */ else null; end case; end STAGES_CT_CALC_TABLE_CAPTIONS; - /* "PM0010" - " " */ + /* Формирование строк для расчетной таблицы "PM0010" - "Калькуляция этапа проекта" */ procedure STAGES_CT_CALC_BUILD_LINES is - NCOMPANY PKG_STD.TREF; -- . - NVERSION PKG_STD.TREF; -- . " " - SCRN PKG_STD.TSTRING; -- " " - NCRN PKG_STD.TREF; -- . " " - BCREATED boolean := false; -- + NCOMPANY PKG_STD.TREF; -- Рег. номер организации из входных параметров + NVERSION PKG_STD.TREF; -- Рег. номер версии словаря "Статьи затрат" + SCRN PKG_STD.TSTRING; -- Наименование каталога статей калькуляции в словаре "Статьи затрат" + NCRN PKG_STD.TREF; -- Рег. номер каталога статей калькуляции в словаре "Статьи затрат" + BCREATED boolean := false; -- Флаг успешного добавления строк в таблицу begin - /* " " */ + /* Строки для таблицы "Статьи калькуляции" */ if (PRSG_CALCTAB.TABLE_NAME = SSTAGES_CT_CALC_TBL_CLARTS) then - /* "" */ + /* Считывание параметра "Организация" */ PRSG_CALCTAB_IMAGE.READ_PARAMETER_NUM(SNAME => SSTAGES_CT_CALC_PRM_COMP, NVALUE => NCOMPANY); - /* " " */ + /* Считывание параметра "Каталог статей калькуляции" */ PRSG_CALCTAB_IMAGE.READ_PARAMETER_STR(SNAME => SSTAGES_CT_CALC_PRM_ARTSCAT, SVALUE => SCRN); - /* " " */ + /* Находим версию словаря "Статьи затрат" */ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'FinPlanArticles', NVERSION => NVERSION); - /* . */ + /* Находим рег. номер каталога статей калькуляции */ FIND_ACATALOG_NAME(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NVERSION => NVERSION, SUNITCODE => 'FinPlanArticles', SNAME => SCRN, NRN => NCRN); - /* */ + /* Идем по статьям калькуляции */ for C in (select T.RN from FPDARTCL T where T.VERSION = NVERSION and T.CRN = NCRN order by T.CODE) loop - /* */ + /* Добавим строку */ PRSG_CALCTAB_BUILD.APPEND_ROW_COPY(NSOURCE => C.RN); - /* */ + /* Поднимем флаг добавления */ BCREATED := true; end loop; - /* */ + /* Если статей не нашли */ if (not BCREATED) then - P_EXCEPTION(0, ' .'); + P_EXCEPTION(0, 'Не задан набор статей калькуляции.'); end if; end if; end STAGES_CT_CALC_BUILD_LINES; - /* "PM0010" - " " */ + /* Наполнение строк для расчетной таблицы "PM0010" - "Калькуляция этапа проекта" */ procedure STAGES_CT_CALC_FILL_LINES is - RCURSOR PRSG_CALCTAB.TCURSOR; -- - RFPDARTCL FPDARTCL%rowtype; -- - NSUMM_PL PKG_STD.TNUMBER; -- ( ) + RCURSOR PRSG_CALCTAB.TCURSOR; -- Маркер коллекции строк таблицы + RFPDARTCL FPDARTCL%rowtype; -- Запись статьи калькуляции в словаре + NSUMM_PL PKG_STD.TNUMBER; -- Плановая сумма (считанная из хранилища расчётной таблицы) begin - /* " "*/ + /* Выбор листа и таблицы "Статьи калькуляции"*/ PRSG_CALCTAB_IMAGE.SELECT_TABLE(SSHEET_NAME => SSTAGES_CT_CALC_SH_CACL, STABLE_NAME => SSTAGES_CT_CALC_TBL_CLARTS); - /* */ + /* Первая строка */ PRSG_CALCTAB_IMAGE.FIRST_ROW(SROW_NAME => SSTAGES_CT_CALC_LN_ARTS, RCURSOR => RCURSOR); - /* */ + /* Цикл по строкам */ loop - /* C */ + /* Cчитаем статью */ begin select A.* into RFPDARTCL from FPDARTCL A where A.RN = RCURSOR.ROW_SOURCE; exception when NO_DATA_FOUND then PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => RCURSOR.ROW_SOURCE, SUNIT_TABLE => 'FPDARTCL'); end; - /* - "" */ + /* Заполняем колонки - "Номер" */ PRSG_CALCTAB_IMAGE.WRITE_ROW_STR(RCURSOR => RCURSOR, SCOLUMN_NAME => SSTAGES_CT_CALC_CL_NUMB, SVALUE => RFPDARTCL.CODE, NSOURCE => RFPDARTCL.RN); - /* - "" */ + /* Заполняем колонки - "Наименование" */ PRSG_CALCTAB_IMAGE.WRITE_ROW_STR(RCURSOR => RCURSOR, SCOLUMN_NAME => SSTAGES_CT_CALC_CL_NAME, SVALUE => RFPDARTCL.NAME, NSOURCE => RFPDARTCL.RN); - /* - " " */ + /* Заполняем колонки - "Плановая сумма" */ PRSG_CALCTAB_IMAGE.READ_ROW_NUM(RCURSOR => RCURSOR, SCOLUMN_NAME => SSTAGES_CT_CALC_CL_SUMM_PL, NVALUE => NSUMM_PL); @@ -2002,58 +2002,58 @@ text=" SCOLUMN_NAME => SSTAGES_CT_CALC_CL_SUMM_PL, NVALUE => COALESCE(NSUMM_PL, 0), NSOURCE => RFPDARTCL.RN); - /* */ + /* Выходим если строк больше нет */ if (not PRSG_CALCTAB_IMAGE.NEXT_ROW(RCURSOR => RCURSOR)) then exit; end if; end loop; end STAGES_CT_CALC_FILL_LINES; - /* "PM0010" - " " */ + /* Формирование расчетной таблицы "PM0010" - "Калькуляция этапа проекта" */ procedure STAGES_CT_CALC is begin - /* */ + /* Работаем в зависимости от текущего режима вызова */ case - /* */ + /* Инициализация построения */ when (PRSG_CALCTAB.CONTEXT_INIT) then null; - /* */ + /* Формирование заголовков листов */ when (PRSG_CALCTAB.CONTEXT_SHEET_CAPTION) then null; - /* */ + /* Формирование заголовков таблиц */ when (PRSG_CALCTAB.CONTEXT_TABLE_CAPTION) then STAGES_CT_CALC_TABLE_CAPTIONS(); - /* */ + /* Формирование столбцов */ when (PRSG_CALCTAB.CONTEXT_COLUMN_CAPTION) then null; - /* */ + /* Формирование строк */ when (PRSG_CALCTAB.CONTEXT_ROW_COPIES) then STAGES_CT_CALC_BUILD_LINES(); - /* */ + /* Наполнение данными */ when (PRSG_CALCTAB.CONTEXT_BEFORE) then STAGES_CT_CALC_FILL_LINES(); - /* */ + /* Сохранение */ when (PRSG_CALCTAB.CONTEXT_AFTER) then null; - /* */ + /* Прочее */ else null; end case; end STAGES_CT_CALC; - /* */ + /* Подбор записей журнала затрат по статье калькуляции этапа проекта */ procedure STAGE_ARTS_SELECT_COST_FACT ( - NSTAGE in number, -- . - NFPDARTCL in number := null, -- . (null - ) - NFINFLOW_TYPE in number := null, -- (null - , 0 - , 1 - , 2 - ) - NIDENT out number -- ( , null - ) + NSTAGE in number, -- Рег. номер этапа проекта + NFPDARTCL in number := null, -- Рег. номер статьи калькуляции (null - по всем) + NFINFLOW_TYPE in number := null, -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ) is - NSELECTLIST PKG_STD.TREF; -- . + NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных begin - /* */ + /* Подберём записи журнала затрат */ for C in (select CN.COMPANY, CN.RN from PROJECTSTAGE PS, @@ -2070,11 +2070,11 @@ text=" and FA.DEF_FLOW = FT.RN(+) and ((NFINFLOW_TYPE is null) or ((NFINFLOW_TYPE is not null) and (FT.TYPE = NFINFLOW_TYPE)))) loop - /* */ + /* Сформируем идентификатор буфера */ if (NIDENT is null) then NIDENT := GEN_IDENT(); end if; - /* */ + /* Добавим подобранное в список отмеченных записей */ P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT, NCOMPANY => C.COMPANY, NDOCUMENT => C.RN, @@ -2088,17 +2088,17 @@ text=" end loop; end STAGE_ARTS_SELECT_COST_FACT; - /* - */ + /* Получение суммы-факт по статье калькуляции этапа проекта */ function STAGE_ARTS_GET_COST_FACT ( - NSTAGE in number, -- . - NFPDARTCL in number := null, -- . (null - ) - NFINFLOW_TYPE in number := null -- (null - , 0 - , 1 - , 2 - ) - ) return number -- - + NSTAGE in number, -- Рег. номер этапа проекта + NFPDARTCL in number := null, -- Рег. номер статьи калькуляции (null - по всем) + NFINFLOW_TYPE in number := null -- Вид движения по статье (null - по всем, 0 - остаток, 1 - приход, 2 - расход) + ) return number -- Сумма-факт по статье is - NRES PKG_STD.TNUMBER; -- + NRES PKG_STD.TNUMBER; -- Буфер для рузультата begin - /* */ + /* Суммируем факт по лицевому счёту затрат этапа и указанной статье */ select COALESCE(sum(CN.COST_BSUM), 0) into NRES from PROJECTSTAGE PS, @@ -2114,21 +2114,21 @@ text=" and CN.COST_ARTICLE = FA.RN and FA.DEF_FLOW = FT.RN(+) and ((NFINFLOW_TYPE is null) or ((NFINFLOW_TYPE is not null) and (FT.TYPE = NFINFLOW_TYPE))); - /* */ + /* Возвращаем результат */ return NRES; end STAGE_ARTS_GET_COST_FACT; - /* */ + /* Подбор записей договоров с соисполнителями по статье калькуляции этапа проекта */ procedure STAGE_ARTS_SELECT_CONTR ( - NSTAGE in number, -- . - NFPDARTCL in number := null, -- . (null - ) - NIDENT out number -- ( , null - ) + NSTAGE in number, -- Рег. номер этапа проекта + NFPDARTCL in number := null, -- Рег. номер статьи затрат (null - по всем) + NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено) ) is - NSELECTLIST PKG_STD.TREF; -- . + NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных begin - /* */ + /* Подберём записи договоров */ for C in (select distinct S.COMPANY NCOMPANY, S.PRN NRN from PROJECTSTAGEPF EPF, @@ -2137,11 +2137,11 @@ text=" and EPF.FACEACC = S.FACEACC and ((NFPDARTCL is null) or ((NFPDARTCL is not null) and (EPF.COST_ARTICLE = NFPDARTCL)))) loop - /* */ + /* Сформируем идентификатор буфера */ if (NIDENT is null) then NIDENT := GEN_IDENT(); end if; - /* */ + /* Добавим подобранное в список отмеченных записей */ P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT, NCOMPANY => C.NCOMPANY, NDOCUMENT => C.NRN, @@ -2155,38 +2155,38 @@ text=" end loop; end STAGE_ARTS_SELECT_CONTR; - /* */ + /* Получение законтрактованной суммы по статье калькуляции этапа проекта */ function STAGE_ARTS_GET_CONTR ( - NSTAGE in number, -- . - NFPDARTCL in number :=null -- . (null - ) - ) return number -- + NSTAGE in number, -- Рег. номер этапа проекта + NFPDARTCL in number :=null -- Рег. номер статьи затрат (null - по всем) + ) return number -- Сумма контрактов по статье is - RSTG PROJECTSTAGE%rowtype; -- - NTAX_GROUP_DP PKG_STD.TREF; -- . . - SPRJ_TAX_GROUP PKG_STD.TSTRING; -- - NSUM PKG_STD.TNUMBER; -- ( ) - NSUM_TAX PKG_STD.TNUMBER; -- ( ) + RSTG PROJECTSTAGE%rowtype; -- Запись этапа + NTAX_GROUP_DP PKG_STD.TREF; -- Рег. номер доп. свойства для налоговой группы проекта + SPRJ_TAX_GROUP PKG_STD.TSTRING; -- Налоговая группа проекта + NSUM PKG_STD.TNUMBER; -- Сумма контрактов (без налогов) + NSUM_TAX PKG_STD.TNUMBER; -- Сумма контрактов (с налогами) begin - /* */ + /* Считаем запись этапа */ begin select PS.* into RSTG from PROJECTSTAGE PS where PS.RN = NSTAGE; exception when NO_DATA_FOUND then null; end; - /* - */ + /* Если считано успешно - будем искать данные */ if (RSTG.RN is not null) then - /* . . */ + /* Определим рег. номер доп. свойства для налоговой группы проекта */ FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => RSTG.COMPANY, - SCODE => '.TAX_GROUP', + SCODE => 'ПУП.TAX_GROUP', NRN => NTAX_GROUP_DP); - /* */ + /* Считаем налоговую группу проекта */ SPRJ_TAX_GROUP := F_DOCS_PROPS_GET_STR_VALUE(NPROPERTY => NTAX_GROUP_DP, SUNITCODE => 'Projects', NDOCUMENT => RSTG.PRN); - /* */ + /* Считаем сумму этапов договоров с соисполнителями */ select COALESCE(sum(S.STAGE_SUM), 0), COALESCE(sum(S.STAGE_SUMTAX), 0) into NSUM, @@ -2196,7 +2196,7 @@ text=" where EPF.PRN = RSTG.RN and EPF.FACEACC = S.FACEACC and ((NFPDARTCL is null) or ((NFPDARTCL is not null) and (EPF.COST_ARTICLE = NFPDARTCL))); - /* */ + /* Вернём сумму в зависимости от налоговой группы проекта */ if (SPRJ_TAX_GROUP is not null) then return NSUM; else @@ -2207,36 +2207,36 @@ text=" end if; end STAGE_ARTS_GET_CONTR; - /* */ + /* Получение списка статей этапа проекта */ procedure STAGE_ARTS_GET ( - NSTAGE in number, -- . - NINC_COST in number := 0, -- (0 - , 1 - ) - NINC_CONTR in number := 0, -- (0 - , 1 - ) - RSTAGE_ARTS out TSTAGE_ARTS -- + NSTAGE in number, -- Рег. номер этапа проекта + NINC_COST in number := 0, -- Включить сведения о затратах (0 - нет, 1 - да) + NINC_CONTR in number := 0, -- Включить сведения о контрактации (0 - нет, 1 - да) + RSTAGE_ARTS out TSTAGE_ARTS -- Список статей этапа проекта ) is - RSTG PROJECTSTAGE%rowtype; -- - NCTL_COST_DP PKG_STD.TREF; -- . . , - NCTL_CONTR_DP PKG_STD.TREF; -- . . , - I PKG_STD.TNUMBER; -- + RSTG PROJECTSTAGE%rowtype; -- Запись этапа проекта + NCTL_COST_DP PKG_STD.TREF; -- Рег. номер доп. свойства, определяющего необходимость контроля затрат по статье + NCTL_CONTR_DP PKG_STD.TREF; -- Рег. номер доп. свойства, определяющего необходимость контроля контрактации по статье + I PKG_STD.TNUMBER; -- Счётчик статей в результирующей коллекции begin - /* */ + /* Читаем этап */ RSTG := STAGES_GET(NRN => NSTAGE); - /* - */ + /* Определим дополнительные свойства - контроль затрат */ if (NINC_COST = 1) then - FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => RSTG.COMPANY, SCODE => '.CTL_COST', NRN => NCTL_COST_DP); + FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => RSTG.COMPANY, SCODE => 'ПУП.CTL_COST', NRN => NCTL_COST_DP); end if; - /* - */ + /* Определим дополнительные свойства - контроль контрактации */ if (NINC_CONTR = 1) then FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => RSTG.COMPANY, - SCODE => '.CTL_CONTR', + SCODE => 'ПУП.CTL_CONTR', NRN => NCTL_CONTR_DP); end if; - /* */ + /* Инициализируем коллекцию */ RSTAGE_ARTS := TSTAGE_ARTS(); - /* */ + /* Подбираем активную структуру цены этапа проекта и её обходим статьи */ for C in (select CSPA.NUMB SNUMB, A.RN NARTICLE, A.NAME SARTICLE, @@ -2254,42 +2254,42 @@ text=" and CSPA.COST_ARTICLE = A.RN order by CSPA.NUMB) loop - /* */ + /* Добавим строку в коллекцию */ RSTAGE_ARTS.EXTEND(); I := RSTAGE_ARTS.LAST; - /* */ + /* Наполним её значениями из хранилища */ RSTAGE_ARTS(I).NRN := C.NARTICLE; RSTAGE_ARTS(I).SCODE := C.SNUMB; RSTAGE_ARTS(I).SNAME := C.SARTICLE; RSTAGE_ARTS(I).NPLAN := C.NCOST_SUM; - /* */ + /* Если просили включить сведения о затратах и статья поддерживает это */ if ((NINC_COST = 1) and (UPPER(F_DOCS_PROPS_GET_STR_VALUE(NPROPERTY => NCTL_COST_DP, SUNITCODE => 'FinPlanArticles', NDOCUMENT => RSTAGE_ARTS(I).NRN)) = UPPER(SYES)) and (RSTAGE_ARTS(I).NPLAN is not null)) then - /* */ + /* Фактические затраты по статье */ RSTAGE_ARTS(I).NCOST_FACT := STAGE_ARTS_GET_COST_FACT(NSTAGE => NSTAGE, NFPDARTCL => RSTAGE_ARTS(I).NRN); - /* (-) */ + /* Отклонение затрат (план-факт) */ RSTAGE_ARTS(I).NCOST_DIFF := RSTAGE_ARTS(I).NPLAN - RSTAGE_ARTS(I).NCOST_FACT; - /* */ + /* Контроль затрат */ if (RSTAGE_ARTS(I).NCOST_DIFF >= 0) then RSTAGE_ARTS(I).NCTRL_COST := 0; else RSTAGE_ARTS(I).NCTRL_COST := 1; end if; end if; - /* */ + /* Если просили включить сведения о контрактах и статья поддерживает это */ if ((NINC_CONTR = 1) and (UPPER(F_DOCS_PROPS_GET_STR_VALUE(NPROPERTY => NCTL_CONTR_DP, SUNITCODE => 'FinPlanArticles', NDOCUMENT => RSTAGE_ARTS(I).NRN)) = UPPER(SYES)) and (RSTAGE_ARTS(I).NPLAN is not null)) then - /* */ + /* Законтрактовано */ RSTAGE_ARTS(I).NCONTR := STAGE_ARTS_GET_CONTR(NSTAGE => NSTAGE, NFPDARTCL => RSTAGE_ARTS(I).NRN); - /* */ + /* Осталось законтрактовать */ RSTAGE_ARTS(I).NCONTR_LEFT := RSTAGE_ARTS(I).NPLAN - RSTAGE_ARTS(I).NCONTR; - /* */ + /* Контроль контрактации */ if (RSTAGE_ARTS(I).NCONTR_LEFT >= 0) then RSTAGE_ARTS(I).NCTRL_CONTR := 0; else @@ -2299,99 +2299,99 @@ text=" end loop; end STAGE_ARTS_GET; - /* */ + /* Список статей калькуляции этапа проекта */ procedure STAGE_ARTS_LIST ( - NSTAGE in number, -- . - CFILTERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NSTAGE in number, -- Рег. номер этапа проекта + CFILTERS in clob, -- Фильтры + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ) is - RF PKG_P8PANELS_VISUAL.TFILTERS; -- - RF_CTRL_COST PKG_P8PANELS_VISUAL.TFILTER; -- " ()" - NCTRL_COST_FROM PKG_STD.TNUMBER; -- " ()" - NCTRL_COST_TO PKG_STD.TNUMBER; -- " ()" - RF_CTRL_CONTR PKG_P8PANELS_VISUAL.TFILTER; -- " ()" - NCTRL_CONTR_FROM PKG_STD.TNUMBER; -- " ()" - NCTRL_CONTR_TO PKG_STD.TNUMBER; -- " ()" - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- - RSTAGE_ARTS TSTAGE_ARTS; -- + RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры + RF_CTRL_COST PKG_P8PANELS_VISUAL.TFILTER; -- Фильтр по колонке "Контроль (затраты)" + NCTRL_COST_FROM PKG_STD.TNUMBER; -- Нижняя граница диапазона фильтра по колонке "Контроль (затраты)" + NCTRL_COST_TO PKG_STD.TNUMBER; -- Верхняя граница диапазона фильтра по колонке "Контроль (затраты)" + RF_CTRL_CONTR PKG_P8PANELS_VISUAL.TFILTER; -- Фильтр по колонке "Контроль (контрактация)" + NCTRL_CONTR_FROM PKG_STD.TNUMBER; -- Нижняя граница диапазона фильтра по колонке "Контроль (контрактация)" + NCTRL_CONTR_TO PKG_STD.TNUMBER; -- Верхняя граница диапазона фильтра по колонке "Контроль (контрактация)" + RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов + RSTAGE_ARTS TSTAGE_ARTS; -- Список статей этапа проекта begin - /* */ + /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* */ + /* Найдем фильтр по контролю затрат */ RF_CTRL_COST := PKG_P8PANELS_VISUAL.TFILTERS_FIND(RFILTERS => RF, SNAME => 'NCTRL_COST'); PKG_P8PANELS_VISUAL.TFILTER_TO_NUMBER(RFILTER => RF_CTRL_COST, NFROM => NCTRL_COST_FROM, NTO => NCTRL_COST_TO); - /* */ + /* Найдем фильтр по контролю контрактации */ RF_CTRL_CONTR := PKG_P8PANELS_VISUAL.TFILTERS_FIND(RFILTERS => RF, SNAME => 'NCTRL_CONTR'); PKG_P8PANELS_VISUAL.TFILTER_TO_NUMBER(RFILTER => RF_CTRL_CONTR, NFROM => NCTRL_CONTR_FROM, NTO => NCTRL_CONTR_TO); - /* */ + /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* */ + /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', - SCAPTION => '. ', + SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNUMB', - SCAPTION => '', + SCAPTION => 'Номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNAME', - SCAPTION => ' ', + SCAPTION => 'Наименование статьи', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NPLAN', - SCAPTION => '', + SCAPTION => 'План', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCOST_FACT', - SCAPTION => ' ', + SCAPTION => 'Фактические затраты', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCOST_DIFF', - SCAPTION => ' ', + SCAPTION => 'Отклонение по затратам', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_COST', - SCAPTION => ' ()', + SCAPTION => 'Контроль (затраты)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BFILTER => true, RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCONTR', - SCAPTION => '', + SCAPTION => 'Законтрактовано', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCONTR_LEFT', - SCAPTION => ' ', + SCAPTION => 'Осталось законтрактовать', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NCTRL_CONTR', - SCAPTION => ' ()', + SCAPTION => 'Контроль (контрактация)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BFILTER => true, RCOL_VALS => RCOL_VALS); - /* */ + /* Сформируем сведения по статям этапа проекта */ STAGE_ARTS_GET(NSTAGE => NSTAGE, NINC_COST => 1, NINC_CONTR => 1, RSTAGE_ARTS => RSTAGE_ARTS); - /* */ + /* Обходим собранные статьи */ if ((RSTAGE_ARTS is not null) and (RSTAGE_ARTS.COUNT > 0)) then for I in RSTAGE_ARTS.FIRST .. RSTAGE_ARTS.LAST loop - /* */ + /* Если прошли фильтр */ if (((NCTRL_COST_FROM is null) or ((NCTRL_COST_FROM is not null) and (NCTRL_COST_FROM = RSTAGE_ARTS(I).NCTRL_COST))) and ((NCTRL_CONTR_FROM is null) or ((NCTRL_CONTR_FROM is not null) and (NCTRL_CONTR_FROM = RSTAGE_ARTS(I).NCTRL_CONTR)))) then - /* */ + /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => RSTAGE_ARTS(I).NRN, @@ -2409,64 +2409,64 @@ text=" PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCTRL_CONTR', NVALUE => RSTAGE_ARTS(I).NCTRL_CONTR); - /* */ + /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; end loop; end if; - /* */ + /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end STAGE_ARTS_LIST; - /* */ + /* Список договоров этапа проекта */ procedure STAGE_CONTRACTS_COND is begin - /* */ + /* Установка главной таблицы */ PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'PROJECTSTAGEPF'); - /* */ + /* Этап проекта */ PKG_COND_BROKER.SET_COLUMN_PRN(SCOLUMN_NAME => 'PRN'); - /* */ + /* Соисполнитель */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'AGNNAME', SCONDITION_NAME => 'EDAGENT', SJOINS => 'PERFORMER <- RN;AGNLIST'); - /* */ + /* Статья затрат */ PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE', SCONDITION_NAME => 'EDSCOST_ART', SJOINS => 'COST_ARTICLE <- RN;FPDARTCL'); - /* - */ + /* Группа - этап договора */ PKG_COND_BROKER.SET_GROUP(SGROUP_NAME => 'STAGES', STABLE_NAME => 'STAGES', SCOLUMN_NAME => 'FACEACC', SPARENT_COLUMN_NAME => 'FACEACC'); - /* - */ + /* Этап договора - номер этапа */ PKG_COND_BROKER.ADD_GROUP_CONDITION_CODE(SGROUP_NAME => 'STAGES', SCOLUMN_NAME => 'NUMB', SCONDITION_NAME => 'EDSTAGE', IALIGN => 20); - /* - */ + /* Этап договора - дата начала этапа */ PKG_COND_BROKER.ADD_GROUP_CONDITION_BETWEEN(SGROUP_NAME => 'STAGES', SCOLUMN_NAME => 'BEGIN_DATE', SCONDITION_NAME_FROM => 'EDCSTAGE_BEGIN_DATEFrom', SCONDITION_NAME_TO => 'EDCSTAGE_BEGIN_DATETo'); - /* - */ + /* Этап договора - дата окончания этапа */ PKG_COND_BROKER.ADD_GROUP_CONDITION_BETWEEN(SGROUP_NAME => 'STAGES', SCOLUMN_NAME => 'END_DATE', SCONDITION_NAME_FROM => 'EDCSTAGE_END_DATEFrom', SCONDITION_NAME_TO => 'EDCSTAGE_END_DATETo'); - /* - */ + /* Этап договора - префикс договора */ PKG_COND_BROKER.ADD_GROUP_CONDITION_CODE(SGROUP_NAME => 'STAGES', SCOLUMN_NAME => 'DOC_PREF', SCONDITION_NAME => 'EDDOC_PREF', SJOINS => 'PRN <- RN;CONTRACTS', IALIGN => 80); - /* - */ + /* Этап договора - номер договора */ PKG_COND_BROKER.ADD_GROUP_CONDITION_CODE(SGROUP_NAME => 'STAGES', SCOLUMN_NAME => 'DOC_NUMB', SCONDITION_NAME => 'EDDOC_NUMB', SJOINS => 'PRN <- RN;CONTRACTS', IALIGN => 80); - /* - */ + /* Этап договора - дата договора */ PKG_COND_BROKER.ADD_GROUP_CONDITION_BETWEEN(SGROUP_NAME => 'STAGES', SCOLUMN_NAME => 'DOC_DATE', SCONDITION_NAME_FROM => 'EDDOC_DATEFrom', @@ -2474,83 +2474,83 @@ text=" SJOINS => 'PRN <- RN;CONTRACTS'); end STAGE_CONTRACTS_COND; - /* */ + /* Список договоров этапа проекта */ procedure STAGE_CONTRACTS_LIST ( - NSTAGE in number, -- . - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - CFILTERS in clob, -- - CORDERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NSTAGE in number, -- Рег. номер этапа проекта + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CFILTERS in clob, -- Фильтры + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ) is - NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- - NIDENT PKG_STD.TREF := GEN_IDENT(); -- - RF PKG_P8PANELS_VISUAL.TFILTERS; -- - RO PKG_P8PANELS_VISUAL.TORDERS; -- - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- - NROW_FROM PKG_STD.TREF; -- - NROW_TO PKG_STD.TREF; -- - CSQL clob; -- - ICURSOR integer; -- + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса + NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора + RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + NROW_FROM PKG_STD.TREF; -- Номер строки с + NROW_TO PKG_STD.TREF; -- Номер строки по + CSQL clob; -- Буфер для запроса + ICURSOR integer; -- Курсор для исполнения запроса begin - /* */ + /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* */ + /* Читем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); - /* */ + /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); - /* */ + /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* */ + /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', - SCAPTION => '. ', + SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDOC_PREF', - SCAPTION => '', + SCAPTION => 'Префикс', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDDOC_PREF', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_SDOC_PREF', - SCAPTION => ' ( )', + SCAPTION => 'Префикс (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_SDOC_PREF', - SCAPTION => ' ( )', + SCAPTION => 'Префикс (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDOC_NUMB', - SCAPTION => '', + SCAPTION => 'Номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDDOC_NUMB', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SLNK_UNIT_SDOC_NUMB', - SCAPTION => ' ( )', + SCAPTION => 'Номер (код раздела ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NLNK_DOCUMENT_SDOC_NUMB', - SCAPTION => ' ( )', + SCAPTION => 'Номер (документ ссылки)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DDOC_DATE', - SCAPTION => '', + SCAPTION => 'Дата', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'EDDOC_DATEFrom', SCOND_TO => 'EDDOC_DATETo', @@ -2558,46 +2558,46 @@ text=" BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEXT_NUMBER', - SCAPTION => ' ', + SCAPTION => 'Внешний номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SAGENT', - SCAPTION => '', + SCAPTION => 'Соисполнитель', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDAGENT', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SAGENT_INN', - SCAPTION => ' ', + SCAPTION => 'ИНН соисполнителя', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SAGENT_KPP', - SCAPTION => ' ', + SCAPTION => 'КПП соисполнителя', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SGOVCNTRID', - SCAPTION => '', + SCAPTION => 'ИГК', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCSTAGE', - SCAPTION => '', + SCAPTION => 'Этап', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDSTAGE', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCSTAGE_DESCRIPTION', - SCAPTION => ' ', + SCAPTION => 'Описание этапа', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DCSTAGE_BEGIN_DATE', - SCAPTION => ' ', + SCAPTION => 'Дата начала', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'EDCSTAGE_BEGIN_DATEFrom', SCOND_TO => 'EDCSTAGE_BEGIN_DATETo', @@ -2605,7 +2605,7 @@ text=" BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DCSTAGE_END_DATE', - SCAPTION => ' ', + SCAPTION => 'Дата окончания', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'EDCSTAGE_END_DATEFrom', SCOND_TO => 'EDCSTAGE_END_DATETo', @@ -2613,24 +2613,24 @@ text=" BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NSUMM', - SCAPTION => '', + SCAPTION => 'Сумма', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCURR', - SCAPTION => '', + SCAPTION => 'Валюта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCOST_ART', - SCAPTION => ' ', + SCAPTION => 'Статья затрат', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'EDSCOST_ART', BORDER => true, BFILTER => true); - /* */ + /* Обходим данные */ begin - /* */ + /* Собираем запрос */ CSQL := 'select * from (select D.*, ROWNUM NROW @@ -2669,9 +2669,9 @@ text=" and CN.GOVCNTRID = GC.RN(+) and PSPF.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F where F.NROW between :NROW_FROM and :NROW_TO'; - /* */ + /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); - /* */ + /* Учтём фильтры */ PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, NCOMPANY => NCOMPANY, NPARENT => NSTAGE, @@ -2679,14 +2679,14 @@ text=" SPROCEDURE => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_COND', RDATA_GRID => RDG, RFILTERS => RF); - /* */ + /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); - /* */ + /* Делаем подстановку параметров */ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO); - /* */ + /* Описываем структуру записи курсора */ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); @@ -2707,14 +2707,14 @@ text=" PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 18); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 19); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 20); - /* */ + /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; end if; - /* */ + /* Обходим выбранные записи */ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop - /* */ + /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRN', ICURSOR => ICURSOR, @@ -2784,17 +2784,17 @@ text=" SNAME => 'SCOST_ART', ICURSOR => ICURSOR, NPOSITION => 20); - /* */ + /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; - /* */ + /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); exception when others then PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); raise; end; - /* */ + /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end STAGE_CONTRACTS_LIST; diff --git a/db/PKG_P8PANELS_VISUAL.pck b/db/PKG_P8PANELS_VISUAL.pck index f5689e9..5a34fec 100644 --- a/db/PKG_P8PANELS_VISUAL.pck +++ b/db/PKG_P8PANELS_VISUAL.pck @@ -1,302 +1,302 @@ create or replace package PKG_P8PANELS_VISUAL as - /* - */ - SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- "" - SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- "" - SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- "" + /* Константы - типы данных */ + SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- Тип данных "строка" + SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- Тип данных "число" + SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- Тип данных "дата" - /* - */ - SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- - SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- + /* Константы - направление сортировки */ + SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию + SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию - /* - */ + /* Типы данных - значение колонки таблицы данных */ type TCOL_VAL is record ( - SVALUE PKG_STD.TLSTRING, -- () - NVALUE PKG_STD.TNUMBER, -- () - DVALUE PKG_STD.TLDATE -- () + SVALUE PKG_STD.TLSTRING, -- Значение (строка) + NVALUE PKG_STD.TNUMBER, -- Значение (число) + DVALUE PKG_STD.TLDATE -- Значение (дата) ); - /* - */ + /* Типы данных - коллекция значений колонки таблицы данных */ type TCOL_VALS is table of TCOL_VAL; - /* - */ + /* Типы данных - описатель колонки таблицы данных */ type TCOL_DEF is record ( - SNAME PKG_STD.TSTRING, -- - SCAPTION PKG_STD.TSTRING, -- - SDATA_TYPE PKG_STD.TSTRING, -- (. SDATA_TYPE_*) - SCOND_FROM PKG_STD.TSTRING, -- - SCOND_TO PKG_STD.TSTRING, -- - BVISIBLE boolean, -- - BORDER boolean, -- - BFILTER boolean, -- - RCOL_VALS TCOL_VALS -- + SNAME PKG_STD.TSTRING, -- Наименование + SCAPTION PKG_STD.TSTRING, -- Заголовок + SDATA_TYPE PKG_STD.TSTRING, -- Тип данных (см. константы SDATA_TYPE_*) + SCOND_FROM PKG_STD.TSTRING, -- Наименование нижней границы условия отбора + SCOND_TO PKG_STD.TSTRING, -- Наименование верхней границы условия отбора + BVISIBLE boolean, -- Разрешить отображение + BORDER boolean, -- Разрешить сортировку + BFILTER boolean, -- Разрешить отбор + RCOL_VALS TCOL_VALS -- Предопределённые значения ); - /* - */ + /* Типы данных - коллекция описателей колонок таблицы данных */ type TCOL_DEFS is table of TCOL_DEF; - /* - */ + /* Типы данных - колонка */ type TCOL is record ( - SNAME PKG_STD.TSTRING, -- - RCOL_VAL TCOL_VAL -- + SNAME PKG_STD.TSTRING, -- Наименование + RCOL_VAL TCOL_VAL -- Значение ); - /* - */ + /* Типы данных - коллекция колонок */ type TCOLS is table of TCOL; - /* - */ + /* Типы данных - строка */ type TROW is record ( - RCOLS TCOLS -- + RCOLS TCOLS -- Колонки ); - /* - */ + /* Типы данных - коллекция строк */ type TROWS is table of TROW; - /* - */ + /* Типы данных - таблица данных */ type TDATA_GRID is record ( - RCOL_DEFS TCOL_DEFS, -- - RROWS TROWS -- + RCOL_DEFS TCOL_DEFS, -- Описание колонок + RROWS TROWS -- Данные строк ); - /* - */ + /* Типы данных - фильтр */ type TFILTER is record ( - SNAME PKG_STD.TSTRING, -- - SFROM PKG_STD.TSTRING, -- "" - STO PKG_STD.TSTRING -- "" + SNAME PKG_STD.TSTRING, -- Наименование + SFROM PKG_STD.TSTRING, -- Значение "с" + STO PKG_STD.TSTRING -- Значение "по" ); - /* - */ + /* Типы данных - коллекция фильтров */ type TFILTERS is table of TFILTER; - /* - */ + /* Типы данных - сортировка */ type TORDER is record ( - SNAME PKG_STD.TSTRING, -- - SDIRECTION PKG_STD.TSTRING -- (. SORDER_DIRECTION_*) + SNAME PKG_STD.TSTRING, -- Наименование + SDIRECTION PKG_STD.TSTRING -- Направление (см. константы SORDER_DIRECTION_*) ); - /* - */ + /* Типы данных - коллекция сортировок */ type TORDERS is table of TORDER; - /* */ + /* Расчет диапаона выдаваемых записей */ procedure UTL_ROWS_LIMITS_CALC ( - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - NROW_FROM out number, -- - NROW_TO out number -- + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + NROW_FROM out number, -- Нижняя граница диапазона + NROW_TO out number -- Верхняя граница диапазона ); - /* */ + /* Формирование наименования условия отбора для нижней границы */ function UTL_COND_NAME_MAKE_FROM ( - SNAME in varchar2 -- - ) return varchar2; -- + SNAME in varchar2 -- Наименование колонки + ) return varchar2; -- Результат - /* */ + /* Формирование наименования условия отбора для верхней границы */ function UTL_COND_NAME_MAKE_TO ( - SNAME in varchar2 -- - ) return varchar2; -- + SNAME in varchar2 -- Наименование колонки + ) return varchar2; -- Результат - /* */ + /* Добавление значения в коллекцию */ procedure TCOL_VALS_ADD ( - RCOL_VALS in out nocopy TCOL_VALS, -- - SVALUE in varchar2 := null, -- () - NVALUE in number := null, -- () - DVALUE in date := null, -- () - BCLEAR in boolean := false -- (false - , true - ) + RCOL_VALS in out nocopy TCOL_VALS, -- Коллекция значений + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); - /* */ + /* Формирование строки */ function TROW_MAKE - return TROW; -- + return TROW; -- Результат работы - /* */ + /* Добавление колонки к строке */ procedure TROW_ADD_COL ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - SVALUE in varchar2 := null, -- () - NVALUE in number := null, -- () - DVALUE in date := null, -- () - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); - /* */ + /* Добавление строковой колонки к строке из курсора динамического запроса */ procedure TROW_ADD_CUR_COLS ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - ICURSOR in integer, -- - NPOSITION in number, -- - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); - /* */ + /* Добавление числовой колонки к строке из курсора динамического запроса */ procedure TROW_ADD_CUR_COLN ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - ICURSOR in integer, -- - NPOSITION in number, -- - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); - /* "" */ + /* Добавление колонки типа "дата" к строке из курсора динамического запроса */ procedure TROW_ADD_CUR_COLD ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - ICURSOR in integer, -- - NPOSITION in number, -- - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); - /* */ + /* Формирование таблицы данныз */ function TDATA_GRID_MAKE - return TDATA_GRID; -- + return TDATA_GRID; -- Результат работы - /* */ + /* Поиск описания колонки в таблице данных по наименованию */ function TDATA_GRID_FIND_COL_DEF ( - RDATA_GRID in TDATA_GRID, -- - SNAME in varchar2 -- - ) return TCOL_DEF; -- (null - ) + RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + SNAME in varchar2 -- Наименование колонки + ) return TCOL_DEF; -- Найденное описание (null - если не нашли) - /* */ + /* Добавление описания колонки к таблице данных */ procedure TDATA_GRID_ADD_COL_DEF ( - RDATA_GRID in out nocopy TDATA_GRID, -- - SNAME in varchar2, -- - SCAPTION in varchar2, -- - SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- (. SDATA_TYPE_*) - SCOND_FROM in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_FROM) - SCOND_TO in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_TO) - BVISIBLE in boolean := true, -- - BORDER in boolean := false, -- - BFILTER in boolean := false, -- - RCOL_VALS in TCOL_VALS := null, -- - BCLEAR in boolean := false -- (false - , true - ) + RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + SNAME in varchar2, -- Наименование колонки + SCAPTION in varchar2, -- Заголовок колонки + SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных колонки (см. константы SDATA_TYPE_*) + SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM) + SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO) + BVISIBLE in boolean := true, -- Разрешить отображение + BORDER in boolean := false, -- Разрешить сортировку по колонке + BFILTER in boolean := false, -- Разрешить отбор по колонке + RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения колонки + BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ); - /* */ + /* Добавление описания колонки к таблице данных */ procedure TDATA_GRID_ADD_ROW ( - RDATA_GRID in out nocopy TDATA_GRID, -- - RROW in TROW, -- - BCLEAR in boolean := false -- (false - , true - ) + RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + RROW in TROW, -- Строка + BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ); - /* */ + /* Сериализация таблицы данных */ function TDATA_GRID_TO_XML ( - RDATA_GRID in TDATA_GRID, -- - NINCLUDE_DEF in number := 1 -- (0 - , 1 - ) - ) return clob; -- XML- + RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да) + ) return clob; -- XML-описание - /* */ + /* Конвертация значений фильтра в число */ procedure TFILTER_TO_NUMBER ( - RFILTER in TFILTER, -- - NFROM out number, -- - NTO out number -- + RFILTER in TFILTER, -- Фильтр + NFROM out number, -- Значение нижней границы диапазона + NTO out number -- Значение верхней границы диапазона ); - /* */ + /* Конвертация значений фильтра в дату */ procedure TFILTER_TO_DATE ( - RFILTER in TFILTER, -- - DFROM out date, -- - DTO out date -- + RFILTER in TFILTER, -- Фильтр + DFROM out date, -- Значение нижней границы диапазона + DTO out date -- Значение верхней границы диапазона ); - /* */ + /* Поиск фильтра в коллекции */ function TFILTERS_FIND ( - RFILTERS in TFILTERS, -- - SNAME in varchar2 -- - ) return TFILTER; -- (null - ) + RFILTERS in TFILTERS, -- Коллекция фильтров + SNAME in varchar2 -- Наименование + ) return TFILTER; -- Найденный фильтр (null - если не нашли) - /* */ + /* Десериализация фильтров */ function TFILTERS_FROM_XML ( - CFILTERS in clob -- (BASE64(...)) - ) return TFILTERS; -- + CFILTERS in clob -- Сериализованное представление фильтров (BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)) + ) return TFILTERS; -- Результат работы - /* */ + /* Применение параметров фильтрации в запросе */ procedure TFILTERS_SET_QUERY ( - NIDENT in number, -- - NCOMPANY in number, -- . - NPARENT in number := null, -- . - SUNIT in varchar2, -- - SPROCEDURE in varchar2, -- - RDATA_GRID in TDATA_GRID, -- - RFILTERS in TFILTERS -- + NIDENT in number, -- Идентификатор отбора + NCOMPANY in number, -- Рег. номер организации + NPARENT in number := null, -- Рег. номер родителя + SUNIT in varchar2, -- Код раздела + SPROCEDURE in varchar2, -- Наименование серверной процедуры отбора + RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + RFILTERS in TFILTERS -- Коллекция фильтров ); - /* */ + /* Десериализация сортировок */ function TORDERS_FROM_XML ( - CORDERS in clob -- (BASE64(ASC/DESC...)) - ) return TORDERS; -- + CORDERS in clob -- Сериализованное представление сотрировок (BASE64(ИМЯASC/DESC...)) + ) return TORDERS; -- Результат работы - /* */ + /* Применение параметров сортировки в запросе */ procedure TORDERS_SET_QUERY ( - RDATA_GRID in TDATA_GRID, -- - RORDERS in TORDERS, -- - SPATTERN in varchar2, -- - CSQL in out nocopy clob -- + RDATA_GRID in TDATA_GRID, -- Описание таблицы + RORDERS in TORDERS, -- Коллекция сортировок + SPATTERN in varchar2, -- Шаблон для подстановки условий отбора в запрос + CSQL in out nocopy clob -- Буфер запроса ); end PKG_P8PANELS_VISUAL; / create or replace package body PKG_P8PANELS_VISUAL as - /* - */ - SRQ_TAG_XROOT constant PKG_STD.TSTRING := 'XROOT'; -- - SRQ_TAG_XFILTERS constant PKG_STD.TSTRING := 'filters'; -- - SRQ_TAG_XORDERS constant PKG_STD.TSTRING := 'orders'; -- - SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'name'; -- - SRQ_TAG_SDIRECTION constant PKG_STD.TSTRING := 'direction'; -- - SRQ_TAG_SFROM constant PKG_STD.TSTRING := 'from'; -- "" - SRQ_TAG_STO constant PKG_STD.TSTRING := 'to'; -- "" + /* Константы - тэги запросов */ + SRQ_TAG_XROOT constant PKG_STD.TSTRING := 'XROOT'; -- Тэг для корня данных запроса + SRQ_TAG_XFILTERS constant PKG_STD.TSTRING := 'filters'; -- Тэг для строк данных + SRQ_TAG_XORDERS constant PKG_STD.TSTRING := 'orders'; -- Тэг для описания колонок + SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'name'; -- Тэг для наименования + SRQ_TAG_SDIRECTION constant PKG_STD.TSTRING := 'direction'; -- Тэг для направления + SRQ_TAG_SFROM constant PKG_STD.TSTRING := 'from'; -- Тэг для значения "с" + SRQ_TAG_STO constant PKG_STD.TSTRING := 'to'; -- Тэг для значения "по" - /* - */ - SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- - SRESP_TAG_XROWS constant PKG_STD.TSTRING := 'XROWS'; -- - SRESP_TAG_XCOLUMNS_DEF constant PKG_STD.TSTRING := 'XCOLUMNS_DEF'; -- + /* Константы - тэги ответов */ + SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Тэг для корня описания данных + SRESP_TAG_XROWS constant PKG_STD.TSTRING := 'XROWS'; -- Тэг для строк данных + SRESP_TAG_XCOLUMNS_DEF constant PKG_STD.TSTRING := 'XCOLUMNS_DEF'; -- Тэг для описания колонок - /* - */ - SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- - SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- - SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- - SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- - SRESP_ATTR_ORDER constant PKG_STD.TSTRING := 'order'; -- - SRESP_ATTR_FILTER constant PKG_STD.TSTRING := 'filter'; -- - SRESP_ATTR_VALUES constant PKG_STD.TSTRING := 'values'; -- + /* Константы - атрибуты ответов */ + SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования + SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи + SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных + SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости + SRESP_ATTR_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки + SRESP_ATTR_FILTER constant PKG_STD.TSTRING := 'filter'; -- Атрибут для флага отбора + SRESP_ATTR_VALUES constant PKG_STD.TSTRING := 'values'; -- Атрибут для значений - /* - */ - SCOND_FROM_POSTFIX constant PKG_STD.TSTRING := 'From'; -- - SCOND_TO_POSTFIX constant PKG_STD.TSTRING := 'To'; -- + /* Константы - параметры условий отбора */ + SCOND_FROM_POSTFIX constant PKG_STD.TSTRING := 'From'; -- Постфикс наименования нижней границы условия отбора + SCOND_TO_POSTFIX constant PKG_STD.TSTRING := 'To'; -- Постфикс наименования верхней границы условия отбора - /* */ + /* Расчет диапаона выдаваемых записей */ procedure UTL_ROWS_LIMITS_CALC ( - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - NROW_FROM out number, -- - NROW_TO out number -- + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + NROW_FROM out number, -- Нижняя граница диапазона + NROW_TO out number -- Верхняя граница диапазона ) is begin @@ -310,81 +310,81 @@ create or replace package body PKG_P8PANELS_VISUAL as end if; end UTL_ROWS_LIMITS_CALC; - /* */ + /* Формирование наименования условия отбора для нижней границы */ function UTL_COND_NAME_MAKE_FROM ( - SNAME in varchar2 -- - ) return varchar2 -- + SNAME in varchar2 -- Наименование колонки + ) return varchar2 -- Результат is begin return SNAME || SCOND_FROM_POSTFIX; end UTL_COND_NAME_MAKE_FROM; - /* */ + /* Формирование наименования условия отбора для верхней границы */ function UTL_COND_NAME_MAKE_TO ( - SNAME in varchar2 -- - ) return varchar2 -- + SNAME in varchar2 -- Наименование колонки + ) return varchar2 -- Результат is begin return SNAME || SCOND_TO_POSTFIX; end UTL_COND_NAME_MAKE_TO; - /* */ + /* Формирование значения */ function TCOL_VAL_MAKE ( - SVALUE in varchar2, -- () - NVALUE in number, -- () - DVALUE in date -- () - ) return TCOL_VAL -- + SVALUE in varchar2, -- Значение (строка) + NVALUE in number, -- Значение (число) + DVALUE in date -- Значение (дата) + ) return TCOL_VAL -- Результат работы is - RRES TCOL_VAL; -- + RRES TCOL_VAL; -- Буфер для результата begin - /* */ + /* Формируем объект */ RRES.SVALUE := SVALUE; RRES.NVALUE := NVALUE; RRES.DVALUE := DVALUE; - /* */ + /* Возвращаем результат */ return RRES; end TCOL_VAL_MAKE; - /* */ + /* Добавление значения в коллекцию */ procedure TCOL_VALS_ADD ( - RCOL_VALS in out nocopy TCOL_VALS, -- - SVALUE in varchar2 := null, -- () - NVALUE in number := null, -- () - DVALUE in date := null, -- () - BCLEAR in boolean := false -- (false - , true - ) + RCOL_VALS in out nocopy TCOL_VALS, -- Коллекция значений + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin - /* */ + /* Инициализируем коллекцию если необходимо */ if ((RCOL_VALS is null) or (BCLEAR)) then RCOL_VALS := TCOL_VALS(); end if; - /* */ + /* Добавляем элемент */ RCOL_VALS.EXTEND(); RCOL_VALS(RCOL_VALS.LAST) := TCOL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); end TCOL_VALS_ADD; - /* */ + /* Формирование описания колонки */ function TCOL_DEF_MAKE ( - SNAME in varchar2, -- - SCAPTION in varchar2, -- - SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- (. SDATA_TYPE_*) - SCOND_FROM in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_FROM) - SCOND_TO in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_TO) - BVISIBLE in boolean := true, -- - BORDER in boolean := false, -- - BFILTER in boolean := false, -- - RCOL_VALS in TCOL_VALS := null -- - ) return TCOL_DEF -- + SNAME in varchar2, -- Наименование + SCAPTION in varchar2, -- Заголовок + SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных (см. константы SDATA_TYPE_*) + SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM) + SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO) + BVISIBLE in boolean := true, -- Разрешить отображение + BORDER in boolean := false, -- Разрешить сортировку + BFILTER in boolean := false, -- Разрешить отбор + RCOL_VALS in TCOL_VALS := null -- Предопределённые значения + ) return TCOL_DEF -- Результат работы is - RRES TCOL_DEF; -- + RRES TCOL_DEF; -- Буфер для результата begin - /* */ + /* Формируем объект */ RRES.SNAME := SNAME; RRES.SCAPTION := SCAPTION; RRES.SDATA_TYPE := COALESCE(SDATA_TYPE, SDATA_TYPE_STR); @@ -394,32 +394,32 @@ create or replace package body PKG_P8PANELS_VISUAL as RRES.BORDER := COALESCE(BORDER, false); RRES.BFILTER := COALESCE(BFILTER, false); RRES.RCOL_VALS := COALESCE(RCOL_VALS, TCOL_VALS()); - /* */ + /* Возвращаем результат */ return RRES; end TCOL_DEF_MAKE; - /* */ + /* Добавление описания колонки в коллекцию */ procedure TCOL_DEFS_ADD ( - RCOL_DEFS in out nocopy TCOL_DEFS, -- - SNAME in varchar2, -- - SCAPTION in varchar2, -- - SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- (. SDATA_TYPE_*) - SCOND_FROM in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_FROM) - SCOND_TO in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_TO) - BVISIBLE in boolean := true, -- - BORDER in boolean := false, -- - BFILTER in boolean := false, -- - RCOL_VALS in TCOL_VALS := null, -- - BCLEAR in boolean := false -- (false - , true - ) + RCOL_DEFS in out nocopy TCOL_DEFS, -- Коллекция описаний колонок + SNAME in varchar2, -- Наименование + SCAPTION in varchar2, -- Заголовок + SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных (см. константы SDATA_TYPE_*) + SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM) + SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO) + BVISIBLE in boolean := true, -- Разрешить отображение + BORDER in boolean := false, -- Разрешить сортировку + BFILTER in boolean := false, -- Разрешить отбор + RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin - /* */ + /* Инициализируем коллекцию если необходимо */ if ((RCOL_DEFS is null) or (BCLEAR)) then RCOL_DEFS := TCOL_DEFS(); end if; - /* */ + /* Добавляем элемент */ RCOL_DEFS.EXTEND(); RCOL_DEFS(RCOL_DEFS.LAST) := TCOL_DEF_MAKE(SNAME => SNAME, SCAPTION => SCAPTION, @@ -432,15 +432,15 @@ create or replace package body PKG_P8PANELS_VISUAL as RCOL_VALS => RCOL_VALS); end TCOL_DEFS_ADD; - /* */ + /* Поиск описания колонки по наименованию */ function TCOL_DEFS_FIND ( - RCOL_DEFS in TCOL_DEFS, -- - SNAME in varchar2 -- - ) return TCOL_DEF -- (null - ) + RCOL_DEFS in TCOL_DEFS, -- Описание колонок таблицы данных + SNAME in varchar2 -- Наименование + ) return TCOL_DEF -- Найденное описание (null - если не нашли) is begin - /* */ + /* Обходим колонки из коллекции описаний */ if ((RCOL_DEFS is not null) and (RCOL_DEFS.COUNT > 0)) then for I in RCOL_DEFS.FIRST .. RCOL_DEFS.LAST loop @@ -449,37 +449,37 @@ create or replace package body PKG_P8PANELS_VISUAL as end if; end loop; end if; - /* */ + /* Ничего не нашли */ return null; end TCOL_DEFS_FIND; - /* */ + /* Сериализация описания колонки таблицы данных */ procedure TCOL_DEFS_TO_XML ( - RCOL_DEFS in TCOL_DEFS -- + RCOL_DEFS in TCOL_DEFS -- Описание колонок таблицы данных ) is begin - /* */ + /* Обходим колонки из коллекции */ if ((RCOL_DEFS is not null) and (RCOL_DEFS.COUNT > 0)) then for I in RCOL_DEFS.FIRST .. RCOL_DEFS.LAST loop - /* */ + /* Открываем описание колонки */ PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XCOLUMNS_DEF); - /* */ + /* Атрибуты колонки */ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCOL_DEFS(I).SNAME); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RCOL_DEFS(I).SCAPTION); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DATA_TYPE, SVALUE => RCOL_DEFS(I).SDATA_TYPE); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RCOL_DEFS(I).BVISIBLE); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ORDER, BVALUE => RCOL_DEFS(I).BORDER); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FILTER, BVALUE => RCOL_DEFS(I).BFILTER); - /* */ + /* Предопределённые значения */ if (RCOL_DEFS(I).RCOL_VALS is not null) and (RCOL_DEFS(I).RCOL_VALS.COUNT > 0) then for V in RCOL_DEFS(I).RCOL_VALS.FIRST .. RCOL_DEFS(I).RCOL_VALS.LAST loop - /* */ + /* Открываем описание предопределённого значения */ PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_VALUES); - /* */ + /* Значение */ case RCOL_DEFS(I).SDATA_TYPE when SDATA_TYPE_STR then PKG_XFAST.VALUE(SVALUE => RCOL_DEFS(I).RCOL_VALS(V).SVALUE); @@ -489,168 +489,168 @@ create or replace package body PKG_P8PANELS_VISUAL as PKG_XFAST.VALUE(DVALUE => RCOL_DEFS(I).RCOL_VALS(V).DVALUE); else P_EXCEPTION(0, - ' "%s" ("%s").', - COALESCE(RCOL_DEFS(I).SNAME, '< >'), - COALESCE(RCOL_DEFS(I).SDATA_TYPE, '< ˨>')); + 'Описание колонки "%s" таблицы данных содержит неподдерживаемый тип данных ("%s").', + COALESCE(RCOL_DEFS(I).SNAME, '<НЕ ОПРЕДЕЛЕНА>'), + COALESCE(RCOL_DEFS(I).SDATA_TYPE, '<НЕ ОПРЕДЕЛЁН>')); end case; - /* */ + /* Закрываем описание предопределённого значения */ PKG_XFAST.UP(); end loop; end if; - /* */ + /* Закрываем описание колонки */ PKG_XFAST.UP(); end loop; end if; end TCOL_DEFS_TO_XML; - /* */ + /* Формирование колонки */ function TCOL_MAKE ( - SNAME in varchar2, -- - SVALUE in varchar2 := null, -- () - NVALUE in number := null, -- () - DVALUE in date := null -- () - ) return TCOL -- + SNAME in varchar2, -- Наименование колонки + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null -- Значение (дата) + ) return TCOL -- Результат работы is - RRES TCOL; -- + RRES TCOL; -- Буфер для результата begin - /* */ + /* Формируем объект */ RRES.SNAME := SNAME; RRES.RCOL_VAL := TCOL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); - /* */ + /* Возвращаем результат */ return RRES; end TCOL_MAKE; - /* */ + /* Добавление колонки в коллекцию */ procedure TCOLS_ADD ( - RCOLS in out nocopy TCOLS, -- - SNAME in varchar2, -- - SVALUE in varchar2 := null, -- () - NVALUE in number := null, -- () - DVALUE in date := null, -- () - BCLEAR in boolean := false -- (false - , true - ) + RCOLS in out nocopy TCOLS, -- Коллекция колонок + SNAME in varchar2, -- Наименование колонки + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin - /* */ + /* Инициализируем коллекцию если необходимо */ if ((RCOLS is null) or (BCLEAR)) then RCOLS := TCOLS(); end if; - /* */ + /* Добавляем элемент */ RCOLS.EXTEND(); RCOLS(RCOLS.LAST) := TCOL_MAKE(SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); end TCOLS_ADD; - /* */ + /* Формирование строки */ function TROW_MAKE - return TROW -- + return TROW -- Результат работы is - RRES TROW; -- + RRES TROW; -- Буфер для результата begin - /* */ + /* Формируем объект */ RRES.RCOLS := TCOLS(); - /* */ + /* Возвращаем результат */ return RRES; end TROW_MAKE; - /* */ + /* Добавление колонки к строке */ procedure TROW_ADD_COL ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - SVALUE in varchar2 := null, -- () - NVALUE in number := null, -- () - DVALUE in date := null, -- () - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin - /* */ + /* Сформируем колонку и добавим её к коллекции колонок строки */ TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE, BCLEAR => BCLEAR); end TROW_ADD_COL; - /* */ + /* Добавление строковой колонки к строке из курсора динамического запроса */ procedure TROW_ADD_CUR_COLS ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - ICURSOR in integer, -- - NPOSITION in number, -- - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is - SVALUE PKG_STD.TLSTRING; -- + SVALUE PKG_STD.TLSTRING; -- Буфер для значения курсора begin - /* */ + /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => NPOSITION, SVALUE => SVALUE); - /* */ + /* Сформируем колонку и добавим её к коллекции колонок строки */ TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => SVALUE, NVALUE => null, DVALUE => null, BCLEAR => BCLEAR); end TROW_ADD_CUR_COLS; - /* */ + /* Добавление числовой колонки к строке из курсора динамического запроса */ procedure TROW_ADD_CUR_COLN ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - ICURSOR in integer, -- - NPOSITION in number, -- - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is - NVALUE PKG_STD.TNUMBER; -- + NVALUE PKG_STD.TNUMBER; -- Буфер для значения курсора begin - /* */ + /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => NPOSITION, NVALUE => NVALUE); - /* */ + /* Сформируем колонку и добавим её к коллекции колонок строки */ TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => null, NVALUE => NVALUE, DVALUE => null, BCLEAR => BCLEAR); end TROW_ADD_CUR_COLN; - /* "" */ + /* Добавление колонки типа "дата" к строке из курсора динамического запроса */ procedure TROW_ADD_CUR_COLD ( - RROW in out nocopy TROW, -- - SNAME in varchar2, -- - ICURSOR in integer, -- - NPOSITION in number, -- - BCLEAR in boolean := false -- (false - , true - ) + RROW in out nocopy TROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is - DVALUE PKG_STD.TLDATE; -- + DVALUE PKG_STD.TLDATE; -- Буфер для значения курсора begin - /* */ + /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => NPOSITION, DVALUE => DVALUE); - /* */ + /* Сформируем колонку и добавим её к коллекции колонок строки */ TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => null, NVALUE => null, DVALUE => DVALUE, BCLEAR => BCLEAR); end TROW_ADD_CUR_COLD; - /* */ + /* Сериализация строки данных таблицы данных */ procedure TROWS_TO_XML ( - RCOL_DEFS in TCOL_DEFS, -- - RROWS in TROWS -- + RCOL_DEFS in TCOL_DEFS, -- Описание колонок таблицы данных + RROWS in TROWS -- Строки таблицы данных ) is - RCOL_DEF TCOL_DEF; -- + RCOL_DEF TCOL_DEF; -- Описание текущей сериализуемой колонки begin - /* */ + /* Обходим строки из коллекции */ if ((RROWS is not null) and (RROWS.COUNT > 0)) then for I in RROWS.FIRST .. RROWS.LAST loop - /* */ + /* Открываем строку */ PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XROWS); - /* */ + /* Обходим колонки строки */ if ((RROWS(I).RCOLS is not null) and (RROWS(I).RCOLS.COUNT > 0)) then for J in RROWS(I).RCOLS.FIRST .. RROWS(I).RCOLS.LAST loop - /* */ + /* Найдём описание колонки */ RCOL_DEF := TCOL_DEFS_FIND(RCOL_DEFS => RCOL_DEFS, SNAME => RROWS(I).RCOLS(J).SNAME); if (RCOL_DEF.SNAME is null) then P_EXCEPTION(0, - ' "%s" .', + 'Описание колонки "%s" таблицы данных не определено.', RROWS(I).RCOLS(J).SNAME); end if; - /* */ + /* Добавлением значение колонки как атрибут строки */ case RCOL_DEF.SDATA_TYPE when SDATA_TYPE_STR then PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, SVALUE => RROWS(I).RCOLS(J).RCOL_VAL.SVALUE); @@ -660,60 +660,60 @@ create or replace package body PKG_P8PANELS_VISUAL as PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, DVALUE => RROWS(I).RCOLS(J).RCOL_VAL.DVALUE); else P_EXCEPTION(0, - ' "%s" ("%s").', + 'Описание колонки "%s" таблицы данных содержит неподдерживаемый тип данных ("%s").', RCOL_DEFS(I).SNAME, - COALESCE(RCOL_DEFS(I).SDATA_TYPE, '< ˨>')); + COALESCE(RCOL_DEFS(I).SDATA_TYPE, '<НЕ ОПРЕДЕЛЁН>')); end case; end loop; end if; - /* */ + /* Закрываем строку */ PKG_XFAST.UP(); end loop; end if; end TROWS_TO_XML; - /* */ + /* Формирование таблицы данныз */ function TDATA_GRID_MAKE - return TDATA_GRID -- + return TDATA_GRID -- Результат работы is - RRES TDATA_GRID; -- + RRES TDATA_GRID; -- Буфер для результата begin - /* */ + /* Формируем объект */ RRES.RCOL_DEFS := TCOL_DEFS(); RRES.RROWS := TROWS(); - /* */ + /* Возвращаем результат */ return RRES; end TDATA_GRID_MAKE; - /* */ + /* Поиск описания колонки в таблице данных по наименованию */ function TDATA_GRID_FIND_COL_DEF ( - RDATA_GRID in TDATA_GRID, -- - SNAME in varchar2 -- - ) return TCOL_DEF -- (null - ) + RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + SNAME in varchar2 -- Наименование колонки + ) return TCOL_DEF -- Найденное описание (null - если не нашли) is begin return TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => SNAME); end TDATA_GRID_FIND_COL_DEF; - /* */ + /* Добавление описания колонки к таблице данных */ procedure TDATA_GRID_ADD_COL_DEF ( - RDATA_GRID in out nocopy TDATA_GRID, -- - SNAME in varchar2, -- - SCAPTION in varchar2, -- - SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- (. SDATA_TYPE_*) - SCOND_FROM in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_FROM) - SCOND_TO in varchar2 := null, -- (null - UTL_COND_NAME_MAKE_TO) - BVISIBLE in boolean := true, -- - BORDER in boolean := false, -- - BFILTER in boolean := false, -- - RCOL_VALS in TCOL_VALS := null, -- - BCLEAR in boolean := false -- (false - , true - ) + RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + SNAME in varchar2, -- Наименование колонки + SCAPTION in varchar2, -- Заголовок колонки + SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных колонки (см. константы SDATA_TYPE_*) + SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM) + SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO) + BVISIBLE in boolean := true, -- Разрешить отображение + BORDER in boolean := false, -- Разрешить сортировку по колонке + BFILTER in boolean := false, -- Разрешить отбор по колонке + RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения колонки + BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin - /* */ + /* Формируем описание и добавляем в коллекцию таблицы данных */ TCOL_DEFS_ADD(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => SNAME, SCAPTION => SCAPTION, @@ -727,153 +727,153 @@ create or replace package body PKG_P8PANELS_VISUAL as BCLEAR => BCLEAR); end TDATA_GRID_ADD_COL_DEF; - /* */ + /* Добавление описания колонки к таблице данных */ procedure TDATA_GRID_ADD_ROW ( - RDATA_GRID in out nocopy TDATA_GRID, -- - RROW in TROW, -- - BCLEAR in boolean := false -- (false - , true - ) + RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + RROW in TROW, -- Строка + BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin - /* */ + /* Инициализируем коллекцию если необходимо */ if ((RDATA_GRID.RROWS is null) or (BCLEAR)) then RDATA_GRID.RROWS := TROWS(); end if; - /* */ + /* Добавляем элемент */ RDATA_GRID.RROWS.EXTEND(); RDATA_GRID.RROWS(RDATA_GRID.RROWS.LAST) := RROW; end TDATA_GRID_ADD_ROW; - /* */ + /* Сериализация таблицы данных */ function TDATA_GRID_TO_XML ( - RDATA_GRID in TDATA_GRID, -- - NINCLUDE_DEF in number := 1 -- (0 - , 1 - ) - ) return clob -- XML- + RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да) + ) return clob -- XML-описание is - CRES clob; -- + CRES clob; -- Буфер для результата begin - /* XML */ + /* Начинаем формирование XML */ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); - /* */ + /* Открываем корень */ PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA); - /* */ + /* Если необходимо включить описание колонок */ if (NINCLUDE_DEF = 1) then TCOL_DEFS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS); end if; - /* */ + /* Формируем описание строк */ TROWS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS,RROWS => RDATA_GRID.RROWS); - /* */ + /* Закрываем корень */ PKG_XFAST.UP(); - /* */ + /* Сериализуем */ CRES := PKG_XFAST.SERIALIZE_TO_CLOB(); - /* XML */ + /* Завершаем формирование XML */ PKG_XFAST.EPILOGUE(); - /* */ + /* Возвращаем полученное */ return CRES; exception when others then - /* XML */ + /* Завершаем формирование XML */ PKG_XFAST.EPILOGUE(); - /* */ + /* Вернем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); end TDATA_GRID_TO_XML; - /* */ + /* Конвертация значений фильтра в число */ procedure TFILTER_TO_NUMBER ( - RFILTER in TFILTER, -- - NFROM out number, -- - NTO out number -- + RFILTER in TFILTER, -- Фильтр + NFROM out number, -- Значение нижней границы диапазона + NTO out number -- Значение верхней границы диапазона ) is begin - /* */ + /* Нижняя граница диапазона */ if (RFILTER.SFROM is not null) then begin NFROM := PKG_P8PANELS_BASE.UTL_S2N(SVALUE => RFILTER.SFROM); exception when others then P_EXCEPTION(0, - ' (%s) .', + 'Неверный формат числа (%s) в указанной нижней границе диапазона фильтра.', RFILTER.SFROM); end; end if; - /* */ + /* Верхняя граница диапазона */ if (RFILTER.STO is not null) then begin NTO := PKG_P8PANELS_BASE.UTL_S2N(SVALUE => RFILTER.STO); exception when others then P_EXCEPTION(0, - ' (%s) .', + 'Неверный формат числа (%s) в указанной верхней границе диапазона фильтра.', RFILTER.STO); end; end if; end TFILTER_TO_NUMBER; - /* */ + /* Конвертация значений фильтра в дату */ procedure TFILTER_TO_DATE ( - RFILTER in TFILTER, -- - DFROM out date, -- - DTO out date -- + RFILTER in TFILTER, -- Фильтр + DFROM out date, -- Значение нижней границы диапазона + DTO out date -- Значение верхней границы диапазона ) is begin - /* */ + /* Нижняя граница диапазона */ if (RFILTER.SFROM is not null) then begin DFROM := PKG_P8PANELS_BASE.UTL_S2D(SVALUE => RFILTER.SFROM); exception when others then P_EXCEPTION(0, - ' (%s) .', + 'Неверный формат даты (%s) в указанной нижней границе диапазона фильтра.', RFILTER.SFROM); end; end if; - /* */ + /* Верхняя граница диапазона */ if (RFILTER.STO is not null) then begin DTO := PKG_P8PANELS_BASE.UTL_S2D(SVALUE => RFILTER.STO); exception when others then P_EXCEPTION(0, - ' (%s) .', + 'Неверный формат даты (%s) в указанной верхней границе диапазона фильтра.', RFILTER.STO); end; end if; end TFILTER_TO_DATE; - /* */ + /* Формирование фильтра */ function TFILTER_MAKE ( - SNAME in varchar2, -- - SFROM in varchar2, -- "" - STO in varchar2 -- "" - ) return TFILTER -- + SNAME in varchar2, -- Наименование + SFROM in varchar2, -- Значение "с" + STO in varchar2 -- Значение "по" + ) return TFILTER -- Результат работы is - RRES TFILTER; -- + RRES TFILTER; -- Буфер для результата begin - /* */ + /* Формируем объект */ RRES.SNAME := SNAME; RRES.SFROM := SFROM; RRES.STO := STO; - /* */ + /* Возвращаем результат */ return RRES; end TFILTER_MAKE; - /* */ + /* Поиск фильтра в коллекции */ function TFILTERS_FIND ( - RFILTERS in TFILTERS, -- - SNAME in varchar2 -- - ) return TFILTER -- (null - ) + RFILTERS in TFILTERS, -- Коллекция фильтров + SNAME in varchar2 -- Наименование + ) return TFILTER -- Найденный фильтр (null - если не нашли) is begin - /* */ + /* Обходим фильтры из коллекции */ if ((RFILTERS is not null) and (RFILTERS.COUNT > 0)) then for I in RFILTERS.FIRST .. RFILTERS.LAST loop @@ -882,102 +882,102 @@ create or replace package body PKG_P8PANELS_VISUAL as end if; end loop; end if; - /* */ + /* Ничего не нашли */ return null; end TFILTERS_FIND; - /* */ + /* Десериализация фильтров */ function TFILTERS_FROM_XML ( - CFILTERS in clob -- (BASE64(...)) - ) return TFILTERS -- + CFILTERS in clob -- Сериализованное представление фильтров (BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)) + ) return TFILTERS -- Результат работы is - RFILTERS TFILTERS; -- - XDOC PKG_XPATH.TDOCUMENT; -- XML - XROOT PKG_XPATH.TNODE; -- XML - XNODE PKG_XPATH.TNODE; -- - XNODES PKG_XPATH.TNODES; -- + RFILTERS TFILTERS; -- Буфер для результата работы + XDOC PKG_XPATH.TDOCUMENT; -- Документ XML + XROOT PKG_XPATH.TNODE; -- Корень документа XML + XNODE PKG_XPATH.TNODE; -- Буфер узла документа + XNODES PKG_XPATH.TNODES; -- Буфер коллекции узлов документа begin - /* */ + /* Вернём выходную коллекцию */ RFILTERS := TFILTERS(); - /* XML */ + /* Разбираем XML */ XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' || BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CFILTERS), SCHARSET => PKG_CHARSET.CHARSET_UTF_()) || ''); - /* */ + /* Считываем корневой узел */ XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC); - /* */ + /* Считывание списка записей */ XNODES := PKG_XPATH.LIST_NODES(RPARENT_NODE => XROOT, SPATTERN => '/' || SRQ_TAG_XROOT || '/' || SRQ_TAG_XFILTERS); - /* */ + /* Цикл по списку записией */ for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XNODES) loop - /* */ + /* Считаем элемент по его номеру */ XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I); - /* */ + /* Добавим его в коллекцию */ RFILTERS.EXTEND(); RFILTERS(RFILTERS.LAST) := TFILTER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME), SFROM => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SFROM), STO => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_STO)); end loop; - /* */ + /* Освободим документ */ PKG_XPATH.FREE(RDOCUMENT => XDOC); - /* */ + /* Вернём результат */ return RFILTERS; exception when others then - /* */ + /* Освободим документ */ PKG_XPATH.FREE(RDOCUMENT => XDOC); - /* */ + /* Вернем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); end TFILTERS_FROM_XML; - /* */ + /* Применение параметров фильтрации в запросе */ procedure TFILTERS_SET_QUERY ( - NIDENT in number, -- - NCOMPANY in number, -- . - NPARENT in number := null, -- . - SUNIT in varchar2, -- - SPROCEDURE in varchar2, -- - RDATA_GRID in TDATA_GRID, -- - RFILTERS in TFILTERS -- + NIDENT in number, -- Идентификатор отбора + NCOMPANY in number, -- Рег. номер организации + NPARENT in number := null, -- Рег. номер родителя + SUNIT in varchar2, -- Код раздела + SPROCEDURE in varchar2, -- Наименование серверной процедуры отбора + RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + RFILTERS in TFILTERS -- Коллекция фильтров ) is - RCOL_DEF TCOL_DEF; -- - BENUM boolean; -- - NFROM PKG_STD.TNUMBER; -- - NTO PKG_STD.TNUMBER; -- - DFROM PKG_STD.TLDATE; -- - DTO PKG_STD.TLDATE; -- + RCOL_DEF TCOL_DEF; -- Описание текущей фильтруемой колонки + BENUM boolean; -- Флаг начиличия перечисляемых значений + NFROM PKG_STD.TNUMBER; -- Буфер для верхней границы диапазона отбора чисел + NTO PKG_STD.TNUMBER; -- Буфер для нижней границы диапазона отбора чисел + DFROM PKG_STD.TLDATE; -- Буфер для верхней границы диапазона отбора дат + DTO PKG_STD.TLDATE; -- Буфер для нижней границы диапазона отбора дат begin - /* - */ + /* Формирование условий отбора - Пролог */ PKG_COND_BROKER.PROLOGUE(IMODE => PKG_COND_BROKER.MODE_SMART_, NIDENT => NIDENT); - /* - */ + /* Формирование условий отбора - Установка процедуры серверного отбора */ PKG_COND_BROKER.SET_PROCEDURE(SPROCEDURE_NAME => SPROCEDURE); - /* - */ + /* Формирование условий отбора - Установка раздела */ PKG_COND_BROKER.SET_UNIT(SUNITCODE => SUNIT); - /* - */ + /* Формирование условий отбора - Установка организации */ PKG_COND_BROKER.SET_COMPANY(NCOMPANY => NCOMPANY); - /* - */ + /* Формирование условий отбора - Установка родителя */ if (NPARENT is not null) then PKG_COND_BROKER.SET_PARENT(NPARENT => NPARENT); end if; - /* , */ + /* Обходим фильтр, если задан */ if ((RFILTERS is not null) and (RFILTERS.COUNT > 0)) then for I in RFILTERS.FIRST .. RFILTERS.LAST loop - /* */ + /* Найдем фильтруемую колонку в описании */ RCOL_DEF := TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RFILTERS(I).SNAME); if (RCOL_DEF.SNAME is not null) then - /* */ + /* Определимся с наличием перечисляемых значений */ if ((RCOL_DEF.RCOL_VALS is not null) and (RCOL_DEF.RCOL_VALS.COUNT > 0)) then BENUM := true; else BENUM := false; end if; - /* */ + /* Установим для неё условие отобра согласно типу данных */ case RCOL_DEF.SDATA_TYPE when SDATA_TYPE_STR then begin @@ -1025,96 +1025,96 @@ create or replace package body PKG_P8PANELS_VISUAL as end; else P_EXCEPTION(0, - ' "%s" ("%s").', + 'Описание колонки "%s" таблицы данных содержит неподдерживаемый тип данных ("%s").', RCOL_DEF.SNAME, - COALESCE(RCOL_DEF.SDATA_TYPE, '< ˨>')); + COALESCE(RCOL_DEF.SDATA_TYPE, '<НЕ ОПРЕДЕЛЁН>')); end case; end if; end loop; end if; - /* - */ + /* Формирование условий отбора - Эпилог */ PKG_COND_BROKER.EPILOGUE(); end TFILTERS_SET_QUERY; - /* */ + /* Формирование сортировки */ function TORDER_MAKE ( - SNAME in varchar2, -- - SDIRECTION in varchar2 -- (. SORDER_DIRECTION_*) - ) return TORDER -- + SNAME in varchar2, -- Наименование + SDIRECTION in varchar2 -- Направление (см. константы SORDER_DIRECTION_*) + ) return TORDER -- Результат работы is - RRES TORDER; -- + RRES TORDER; -- Буфер для результата begin - /* */ + /* Формируем объект */ RRES.SNAME := SNAME; RRES.SDIRECTION := SDIRECTION; - /* */ + /* Возвращаем результат */ return RRES; end TORDER_MAKE; - /* */ + /* Десериализация сортировок */ function TORDERS_FROM_XML ( - CORDERS in clob -- (BASE64(ASC/DESC...)) - ) return TORDERS -- + CORDERS in clob -- Сериализованное представление сотрировок (BASE64(ИМЯASC/DESC...)) + ) return TORDERS -- Результат работы is - RORDERS TORDERS; -- - XDOC PKG_XPATH.TDOCUMENT; -- XML - XROOT PKG_XPATH.TNODE; -- XML - XNODE PKG_XPATH.TNODE; -- - XNODES PKG_XPATH.TNODES; -- + RORDERS TORDERS; -- Буфер для результата работы + XDOC PKG_XPATH.TDOCUMENT; -- Документ XML + XROOT PKG_XPATH.TNODE; -- Корень документа XML + XNODE PKG_XPATH.TNODE; -- Буфер узла документа + XNODES PKG_XPATH.TNODES; -- Буфер коллекции узлов документа begin - /* */ + /* Инициализируем выходную коллекцию */ RORDERS := TORDERS(); - /* XML */ + /* Разбираем XML */ XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' || BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CORDERS), SCHARSET => PKG_CHARSET.CHARSET_UTF_()) || ''); - /* */ + /* Считываем корневой узел */ XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC); - /* */ + /* Считывание списка записей */ XNODES := PKG_XPATH.LIST_NODES(RPARENT_NODE => XROOT, SPATTERN => '/' || SRQ_TAG_XROOT || '/' || SRQ_TAG_XORDERS); - /* */ + /* Цикл по списку записией */ for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XNODES) loop - /* */ + /* Считаем элемент по его номеру */ XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I); - /* */ + /* Добавим его в коллекцию */ RORDERS.EXTEND(); RORDERS(RORDERS.LAST) := TORDER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME), SDIRECTION => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SDIRECTION)); end loop; - /* */ + /* Освободим документ */ PKG_XPATH.FREE(RDOCUMENT => XDOC); - /* */ + /* Вернём результат */ return RORDERS; exception when others then - /* */ + /* Освободим документ */ PKG_XPATH.FREE(RDOCUMENT => XDOC); - /* */ + /* Вернем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); end TORDERS_FROM_XML; - /* */ + /* Применение параметров сортировки в запросе */ procedure TORDERS_SET_QUERY ( - RDATA_GRID in TDATA_GRID, -- - RORDERS in TORDERS, -- - SPATTERN in varchar2, -- - CSQL in out nocopy clob -- + RDATA_GRID in TDATA_GRID, -- Описание таблицы + RORDERS in TORDERS, -- Коллекция сортировок + SPATTERN in varchar2, -- Шаблон для подстановки условий отбора в запрос + CSQL in out nocopy clob -- Буфер запроса ) is - CSQL_ORDERS clob; -- + CSQL_ORDERS clob; -- Буфер для условий сортировки в запросе begin - /* */ + /* Если сортировка задана */ if ((RORDERS is not null) and (RORDERS.COUNT > 0)) then CSQL_ORDERS := ' order by '; for I in RORDERS.FIRST .. RORDERS.LAST loop - /* - , SQL- */ + /* Перед добавлением в запрос - обязательная проверка, чтобы избежать SQL-инъекций */ if ((TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RORDERS(I).SNAME).SNAME is not null) and (RORDERS(I).SDIRECTION in (SORDER_DIRECTION_ASC, SORDER_DIRECTION_DESC))) then CSQL_ORDERS := CSQL_ORDERS || RORDERS(I).SNAME || ' ' || RORDERS(I).SDIRECTION; diff --git a/db/UDO_P_P8PANELS_AGNLIST.prc b/db/UDO_P_P8PANELS_AGNLIST.prc index a4cc187..59e70cb 100644 --- a/db/UDO_P_P8PANELS_AGNLIST.prc +++ b/db/UDO_P_P8PANELS_AGNLIST.prc @@ -1,53 +1,53 @@ create or replace procedure UDO_P_P8PANELS_AGNLIST ( - NPAGE_NUMBER in number, -- ( NPAGE_SIZE=0) - NPAGE_SIZE in number, -- (0 - ) - CFILTERS in clob, -- - CORDERS in clob, -- - NINCLUDE_DEF in number, -- - COUT out clob -- + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CFILTERS in clob, -- Фильтры + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ) is - NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- - NIDENT PKG_STD.TREF := GEN_IDENT(); -- - RF PKG_P8PANELS_VISUAL.TFILTERS; -- - RO PKG_P8PANELS_VISUAL.TORDERS; -- - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- - NROW_FROM PKG_STD.TREF; -- - NROW_TO PKG_STD.TREF; -- - CSQL clob; -- - ICURSOR integer; -- - RAGENT AGNLIST%rowtype; -- + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса + NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора + RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов + NROW_FROM PKG_STD.TREF; -- Номер строки с + NROW_TO PKG_STD.TREF; -- Номер строки по + CSQL clob; -- Буфер для запроса + ICURSOR integer; -- Курсор для исполнения запроса + RAGENT AGNLIST%rowtype; -- Буфер для записи курсора begin - /* */ + /* Читаем фильтры */ RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); - /* */ + /* Читем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); - /* */ + /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); - /* */ + /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); - /* */ + /* Добавляем в таблицу описание колонок */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'RN', - SCAPTION => '. ', + SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'AGNABBR', - SCAPTION => '', + SCAPTION => 'Мнемокод', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'AgentAbbr', BORDER => true, BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'AGNNAME', - SCAPTION => '', + SCAPTION => 'Наименование', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SCOND_FROM => 'AgentName', BORDER => true, @@ -56,7 +56,7 @@ begin PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'AGNTYPE', - SCAPTION => '', + SCAPTION => 'Тип', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SCOND_FROM => 'AgentType', BORDER => true, @@ -64,15 +64,15 @@ begin RCOL_VALS => RCOL_VALS); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'AGNBURN', - SCAPTION => ' ', + SCAPTION => 'Дата рождения', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, SCOND_FROM => 'AgentBornFrom', SCOND_TO => 'AgentBornTo', BORDER => true, BFILTER => true); - /* */ + /* Обходим данные */ begin - /* */ + /* Собираем запрос */ CSQL := 'select * from (select D.*, ROWNUM NROW @@ -84,60 +84,60 @@ begin from AGNLIST AG where AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F where F.NROW between :NROW_FROM and :NROW_TO'; - /* */ + /* Учтём сортировки */ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); - /* */ + /* Учтём фильтры */ PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, NCOMPANY => NCOMPANY, SUNIT => 'AGNLIST', SPROCEDURE => 'P_AGNLIST_BASE_COND', RDATA_GRID => RDG, RFILTERS => RF); - /* */ + /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); - /* */ + /* Делаем подстановку параметров */ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO); - /* */ + /* Описываем структуру записи курсора */ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4); PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5); - /* */ + /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; end if; - /* */ + /* Обходим выбранные записи */ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop - /* */ + /* Извлекаем очередную запись */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => RAGENT.RN); PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 2, SVALUE => RAGENT.AGNABBR); PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 3, SVALUE => RAGENT.AGNNAME); PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 4, NVALUE => RAGENT.AGNTYPE); PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 5, DVALUE => RAGENT.AGNBURN); - /* */ + /* Инициализируем строку таблицы данных */ RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(); - /* */ + /* Добавляем колонки с данными */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'RN', NVALUE => RAGENT.RN); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNABBR', SVALUE => RAGENT.AGNABBR); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNNAME', SVALUE => RAGENT.AGNNAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNTYPE', NVALUE => RAGENT.AGNTYPE); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'AGNBURN', DVALUE => RAGENT.AGNBURN); - /* */ + /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; - /* */ + /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); exception when others then PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); raise; end; - /* */ + /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end; / diff --git a/db/UDO_P_P8PANELS_TEST.prc b/db/UDO_P_P8PANELS_TEST.prc index d93271d..b9e5003 100644 --- a/db/UDO_P_P8PANELS_TEST.prc +++ b/db/UDO_P_P8PANELS_TEST.prc @@ -14,8 +14,8 @@ begin NRES:=NRN*2; --DBMS_LOCK.SLEEP(3); if (DDATE is not null) then p_exception(0, to_char(ddate, 'dd.mm.yyyy hh24:mi:ss')); end if; - SRES:=' '; - COUT:=' '; + SRES:='Очень хорошая погода'; + COUT:='Просто текст'; --COUT:='333444123dfgsfg'; --COUT:='333444qqq555qsvfvr432123dfgsfg'; DD := DDATE;