create or replace package PKG_P8PANELS_RRPCONFED as /* Получение разделов регламентированного отчёта */ procedure RRPCONF_GET_SECTIONS ( NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта COUT out clob -- Список разделов ); /* Добавление раздела регламентированного отчёта */ procedure RRPCONFSCTN_INSERT ( NPRN in number, -- Ид. настройки форм регламентированного отчёта SCODE in varchar2, -- Мнемокод SNAME in varchar2, -- Наименование NRN out number -- Ид. созданной записи ); /* Исправление раздела регламентированного отчёта */ procedure RRPCONFSCTN_UPDATE ( NRN in number, -- Ид. раздела SCODE in varchar2, -- Мнемокод раздела SNAME in varchar2 -- Наименование раздела ); /* Удаление раздела регламентированного отчёта */ procedure RRPCONFSCTN_DELETE ( NRN in number -- Ид. раздела ); /* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */ procedure RRPCONFSCTNMRK_GET_CODES ( NRN in number, -- Ид. показателя раздела SRRPCONF out varchar2, -- Код настройки формы регламентированного отчёта SRRPCONFSCTN out varchar2, -- Код раздела SRRPCONFSCTNMRK out varchar2 -- Код показателя раздела ); /* Формирование кода и наименования показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_GET_CODE_NAME ( SSCTNCODE in varchar2, -- Мнемокод раздела SROWCODE in varchar2, -- Мнемокод строки NROWVER in number, -- Ид. редакции строки SCOLUMNCODE in varchar2, -- Мнемокод графы NCOLUMNVER in number, -- Ид. редакции графы SCODE out varchar2, -- Мнемокод показателя раздела SNAME out varchar2 -- Наименование показателя раздела ); /* Добавление показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_INSERT ( NPRN in number, -- Ид. раздела SCODE in varchar2, -- Мнемокод показателя раздела SNAME in varchar2, -- Наименование показателя раздела SCOLCODE in varchar2, -- Мнемокод графы SCOLVER in varchar2, -- Мнемокод редакции графы SROWCODE in varchar2, -- Мнемокод строки SROWVER in varchar2, -- Мнемокод редакции строки NRN out number -- Ид. созданной записи ); /* Исправление показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_UPDATE ( NRN in number, -- Ид. показателя раздела SNAME in varchar2 -- Новое наименование ); /* Удаление показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_DELETE ( NRN in number -- Ид. показателя раздела ); end PKG_P8PANELS_RRPCONFED; / create or replace package body PKG_P8PANELS_RRPCONFED as /* Получение разделов регламентированного отчёта */ procedure RRPCONF_GET_SECTIONS ( NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта COUT out clob -- Список разделов ) is NVERSION PKG_STD.TREF; -- Рег. номер версии словаря контрагентов RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы CDG clob; -- XML данных раздела CCURCLOB clob; -- XML текущего раздела NCURRN PKG_STD.TREF; -- Ид. текущего раздела SCURCODE PKG_STD.TSTRING; -- Мнемокод текущего раздела SCURNAME PKG_STD.TSTRING; -- Наименование текущего раздела SCUR_ROW PKG_STD.TSTRING := 'default'; -- Текущая строка таблицы CXML PKG_CONTVALLOC2NS.TCONTAINER; -- Контейнер для данных XML /* Курсор с отбором показателей раздела по ид. раздела */ cursor C1 (NSCTN_RN in number) is select T.RN NRN, T.PRN NPRN, T.RRPCONF NRRPCONF, T.RRPPRM NRRPPRM, T.CODE SCODE, T.NAME SNAME, R.CODE SROW_CODE, R.NAME SROW_NAME, C.CODE SCOLUMN_CODE, C.NAME SCOLUMN_NAME from RRPCONFSCTNMRK T, RRPROW R, RRPCOLUMN C where T.PRN in (select T2.RN from RRPCONFSCTN T2 where T2.PRN = NRN_RRPCONF and T2.VERSION = NVERSION) and T.VERSION = NVERSION and T.RRPROW = R.RN (+) and T.RRPCOLUMN = C.RN (+) and T.PRN = NSCTN_RN order by T.CODE; /* Курсор с отбором граф раздела по ид. раздела */ cursor CN (NSCTN_RN in number) is select distinct(C.CODE) SCOLUMN_CODE, C.NAME SCOLUMN_NAME from RRPCONFSCTNMRK T, RRPCOLUMN C where T.PRN in (select T2.RN from RRPCONFSCTN T2 where T2.PRN = NRN_RRPCONF and T2.VERSION = NVERSION) and T.VERSION = NVERSION and T.RRPCOLUMN = C.RN (+) and T.PRN = NSCTN_RN order by SCOLUMN_CODE; begin /* Очистка контейнера */ PKG_CONTVALLOC2NS.PURGE(RCONTAINER => CXML); /* Определение версии раздела */ NVERSION := GET_SESSION_VERSION(SUNITCODE => 'RRPConfig'); /* Цикл по разделам настройки форм регламентированного отчёта */ for C in (select T.RN NRN, T.VERSION NVERSION, T.CRN NCRN, T.PRN NPRN, T.CODE SCODE, T.NAME SNAME from RRPCONFSCTN T where T.PRN = NRN_RRPCONF and T.VERSION = NVERSION) loop /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1); /* Формируем структуру заголовка */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SROW_NAME', SCAPTION => 'Наименование строки', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, NWIDTH => 150); /* Цикл формирования колонок с графами */ for CL in CN(C.NRN) loop PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCOL_' || CL.SCOLUMN_CODE, SCAPTION => CL.SCOLUMN_NAME, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN_' || CL.SCOLUMN_CODE, SCAPTION => CL.SCOLUMN_NAME || ' Идентификаторы', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); end loop; /* Для нового раздела очищаем переменную кода строки */ SCUR_ROW := 'default'; /* Инициализируем строку */ RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(); /* Цикл заполнения строк данными о показателях раздела */ for CR in C1(C.NRN) loop /* Если новая строка */ if (SCUR_ROW != CR.SROW_CODE) then /* Если строка не первая */ if (SCUR_ROW != 'default') then /* Добавим строку для раздела */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); /* Инициализируем новую строку */ RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(); end if; /* Запоминаем мнемокод новой строки */ SCUR_ROW := CR.SROW_CODE; /* Заполняем наименование строки */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => CR.SROW_NAME); end if; /* Заполняем наименование показателя раздела */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || CR.SCOLUMN_CODE, SVALUE => CR.SNAME); /* Заполняем ид. показателя раздела */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN_' || CR.SCOLUMN_CODE, NVALUE => CR.NRN); end loop; /* Добавим последнюю строку для раздела */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); /* Сериализуем описание */ CDG := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); /* Заполняем контейнер данными о разделе */ PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_CODE', SVALUE => C.SCODE); PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_NAME', SVALUE => C.SNAME); PKG_CONTVALLOC2NS.PUTLC(RCONTAINER => CXML, NTABID => C.NRN, SROWID => C.NRN || '_CLOB', LCVALUE => CDG); end loop; /* Формируем XML с данными */ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); PKG_XFAST.DOWN_NODE(SNAME => 'DATA'); /* Цикл по контейнеру с данными о разделах */ for X in 1 .. PKG_CONTVALLOC2NS.COUNT_(RCONTAINER => CXML) loop /* Ид. раздела */ if (X = 1) then NCURRN := PKG_CONTVALLOC2NS.FIRST_(RCONTAINER => CXML); else NCURRN := PKG_CONTVALLOC2NS.NEXT_(RCONTAINER => CXML, NTABID => NCURRN); end if; /* Мнемокод раздела */ SCURCODE := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_CODE'); /* Наименование раздела */ SCURNAME := PKG_CONTVALLOC2NS.GETS(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_NAME'); /* Clob с показателями раздела */ CCURCLOB := PKG_CONTVALLOC2NS.GETLC(RCONTAINER => CXML, NTABID => NCURRN, SROWID => NCURRN || '_CLOB'); /* Формирование элемента XML с данными о разделе */ PKG_XFAST.DOWN_NODE(SNAME => 'SECTIONS'); PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => NCURRN); PKG_XFAST.ATTR(SNAME => 'SCODE', SVALUE => SCURCODE); PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => SCURNAME); PKG_XFAST.VALUE_XML(LCVALUE => CCURCLOB); PKG_XFAST.UP(); end loop; PKG_XFAST.UP(); /* Сериализуем описание */ COUT := PKG_XFAST.SERIALIZE_TO_CLOB(); PKG_XFAST.EPILOGUE(); /* Очистка контейнера */ PKG_CONTVALLOC2NS.PURGE(RCONTAINER => CXML); end RRPCONF_GET_SECTIONS; /* Добавление раздела регламентированного отчёта */ procedure RRPCONFSCTN_INSERT ( NPRN in number, -- Ид. настройки форм регламентированного отчёта SCODE in varchar2, -- Мнемокод SNAME in varchar2, -- Наименование NRN out number -- Ид. созданной записи ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации begin /* Добавим раздел */ P_RRPCONFSCTN_INSERT(NCOMPANY => NCOMPANY, NPRN => NPRN, SCODE => SCODE, SNAME => SNAME, SRRPCONFSCTN => null, SRRPPRMGRP => null, SNOTE => null, NHTML_HIDE => 0, NHTML_HIDE_NAME_COL => 0, NHTML_MAKE_HIER_GRP => 0, SCLSF_CODE => null, NLINKS_UPDATE => 0, NDUP_RN => null, NRN => NRN); end RRPCONFSCTN_INSERT; /* Исправление раздела регламентированного отчёта */ procedure RRPCONFSCTN_UPDATE ( NRN in number, -- Ид. раздела SCODE in varchar2, -- Мнемокод раздела SNAME in varchar2 -- Наименование раздела ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации RES RRPCONFSCTN%rowtype; -- Запись раздела настройки формы регламентированного отчета RRRPCONFSCTN RRPCONFSCTN%rowtype; RRRPPRMGRP RRPPRMGRP%rowtype; begin /* Считаем исправляемую запись */ RES := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN); /* Считаем запись родительского этапа */ if (RES.RRPCONFSCTN is not null) then RRRPCONFSCTN := GET_RRPCONFSCTN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RES.RRPCONFSCTN); end if; /* Считаем запись группы параметров */ if (RES.RRPPRMGRP is not null) then RRRPPRMGRP := GET_RRPPRMGRP_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RES.RRPPRMGRP); end if; /* Исправим раздел */ P_RRPCONFSCTN_UPDATE(NRN => RES.RN, NCOMPANY => NCOMPANY, SCODE => SCODE, SNAME => SNAME, SRRPCONFSCTN => RRRPCONFSCTN.CODE, SRRPPRMGRP => RRRPPRMGRP.CODE, SNOTE => RES.NOTE, NHTML_HIDE => RES.HTML_HIDE, NHTML_HIDE_NAME_COL => RES.HTML_HIDE_NAME_COL, NHTML_MAKE_HIER_GRP => RES.HTML_MAKE_HIER_GRP, SCLSF_CODE => RES.CLSF_CODE, NFORMULA_UPDATE => 1, NMARK_UPDATE => 1); end RRPCONFSCTN_UPDATE; /* Удаление раздела регламентированного отчёта */ procedure RRPCONFSCTN_DELETE ( NRN in number -- Ид. раздела ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации begin /* Удалим раздел */ P_RRPCONFSCTN_DELETE(NRN => NRN, NCOMPANY => NCOMPANY); end RRPCONFSCTN_DELETE; /* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */ procedure RRPCONFSCTNMRK_GET_CODES ( NRN in number, -- Ид. показателя раздела SRRPCONF out varchar2, -- Код настройки формы регламентированного отчёта SRRPCONFSCTN out varchar2, -- Код раздела SRRPCONFSCTNMRK out varchar2 -- Код показателя раздела ) is NVERSION PKG_STD.TREF := GET_SESSION_VERSION(SUNITCODE => 'RRPConfig'); -- Версия раздела begin select R.CODE, RS.CODE, RSM.CODE into SRRPCONF, SRRPCONFSCTN, SRRPCONFSCTNMRK from RRPCONF R, RRPCONFSCTN RS, RRPCONFSCTNMRK RSM where R.RN in (select RRPCONF from RRPCONFSCTNMRK where RN = NRN and VERSION = NVERSION) and RS.RN in (select PRN from RRPCONFSCTNMRK where RN = NRN and VERSION = NVERSION) and RSM.RN = NRN; exception when NO_DATA_FOUND then P_EXCEPTION(0, 'По выбранному показателю раздела не найдено данных.'); when TOO_MANY_ROWS then P_EXCEPTION(0, 'По выбранному показателю раздела найдено несколько записей.'); end RRPCONFSCTNMRK_GET_CODES; /* Формирование кода и наименования показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_GET_CODE_NAME ( SSCTNCODE in varchar2, -- Мнемокод раздела SROWCODE in varchar2, -- Мнемокод строки NROWVER in number, -- Ид. редакции строки SCOLUMNCODE in varchar2, -- Мнемокод графы NCOLUMNVER in number, -- Ид. редакции графы SCODE out varchar2, -- Мнемокод показателя раздела SNAME out varchar2 -- Наименование показателя раздела ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NROWRN PKG_STD.TREF; -- Ид. строки NCOLUMNRN PKG_STD.TREF; -- Ид. графы begin /* Сформируем код показателя */ P_RRPCONFSCTNMRK_MAKE_CODE(SRRPCONFSCTN => SSCTNCODE, SRRPROW => SROWCODE, SRRPCOLUMN => SCOLUMNCODE, SCODE => SCODE); /* Найдем рег. номер строки показателя */ FIND_RRPROW_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, NCOMPANY => NCOMPANY, NRRPVERSION => NROWVER, SCODE => SROWCODE, NRN => NROWRN); /* Найдем рег. номер графы показателя */ FIND_RRPCOLUMN_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, NCOMPANY => NCOMPANY, NRRPVERSION => NCOLUMNVER, SCODE => SCOLUMNCODE, NRN => NCOLUMNRN); /* Сформируем наименование показателя */ P_RRPCONFSCTNMRK_MAKE_NAME(NCOMPANY => NCOMPANY, NRRPROW => NROWRN, NRRPCOLUMN => NCOLUMNRN, NCHANGE_NAME => 1, NCHANGE_NAME_PARENT => 0, SNAME => SNAME); end RRPCONFSCTNMRK_GET_CODE_NAME; /* Добавление показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_INSERT ( NPRN in number, -- Ид. раздела SCODE in varchar2, -- Мнемокод показателя раздела SNAME in varchar2, -- Наименование показателя раздела SCOLCODE in varchar2, -- Мнемокод графы SCOLVER in varchar2, -- Мнемокод редакции графы SROWCODE in varchar2, -- Мнемокод строки SROWVER in varchar2, -- Мнемокод редакции строки NRN out number -- Ид. созданной записи ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации begin /* Добавим показатель */ P_RRPCONFSCTNMRK_INSERT(NCOMPANY => NCOMPANY, NPRN => NPRN, NNUMB => F_RRPCONFSCTNMRK_NEXT_NUMB(NCOMPANY => NCOMPANY, NPRN => NPRN), SCODE => SCODE, SNAME => SNAME, SRRPROW => SROWCODE, SRRPVERSION_ROW => SROWVER, SRRPCOLUMN => SCOLCODE, SRRPVERSION_COLUMN => SCOLVER, SPKG_ROW => null, SPRC_ROW => null, SPKG_COL => null, SPRC_COL => null, SRRPPRM => null, NIGNORE_ZOOM => 0, NIGNORE_SHARP => 0, SCLSF_CODE => null, SNOTE => null, NDUP_RN => null, NRN => NRN); end RRPCONFSCTNMRK_INSERT; /* Исправление показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_UPDATE ( NRN in number, -- Ид. показателя раздела SNAME in varchar2 -- Новое наименование ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации RESSCTNMRK RRPCONFSCTNMRK%rowtype; -- Запись настройки показателя регламентированного отчета RESROW RRPROW%rowtype; -- Запись строки регламентированного отчета RESCOLUMN RRPCOLUMN%rowtype; -- Запись графы регламентированного отчета RRRPPRM RRPPRM%rowtype; -- Запись типового параметра регламентированного отчета SROWVER PKG_STD.TSTRING; -- Мнемокод редакции строки SCOLVER PKG_STD.TSTRING; -- Мнемокод редакции графы begin /* Получение записи параметра раздела */ RESSCTNMRK := GET_RRPCONFSCTNMRK_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => NRN); /* Получение записи строки */ RESROW := GET_RRPROW_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RESSCTNMRK.RRPROW); /* Получение записи графы */ RESCOLUMN := GET_RRPCOLUMN_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RESSCTNMRK.RRPCOLUMN); /* Получение мнемокода редакции строки */ if (RESROW.RRPVERSION is not null) then SROWVER := GET_RRPVERSION_CODE_ID(NFLAG_SMART => 0, NRN => RESROW.RRPVERSION); end if; /* Получение мнемокода редакции графы */ if (RESCOLUMN.RRPVERSION is not null) then SCOLVER := GET_RRPVERSION_CODE_ID(NFLAG_SMART => 0, NRN => RESCOLUMN.RRPVERSION); end if; /* Получение записи типового параметра */ if (RESSCTNMRK.RRPPRM is not null) then RRRPPRM := GET_RRPPRM_ID(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, NRN => RESSCTNMRK.RRPPRM); end if; /* Исправим показатель */ P_RRPCONFSCTNMRK_UPDATE(NRN => NRN, NCOMPANY => NCOMPANY, NNUMB => RESSCTNMRK.NUMB, SCODE => RESSCTNMRK.CODE, SNAME => SNAME, SRRPROW => RESROW.CODE, SRRPVERSION_ROW => SROWVER, SRRPCOLUMN => RESCOLUMN.CODE, SRRPVERSION_COLUMN => SCOLVER, SPKG_ROW => RESSCTNMRK.PKG_ROW, SPRC_ROW => RESSCTNMRK.PRC_ROW, SPKG_COL => RESSCTNMRK.PKG_COL, SPRC_COL => RESSCTNMRK.PRC_COL, SRRPPRM => RRRPPRM.CODE, NIGNORE_ZOOM => RESSCTNMRK.IGNORE_ZOOM, NIGNORE_SHARP => RESSCTNMRK.IGNORE_SHARP, SCLSF_CODE => RESSCTNMRK.CLSF_CODE, NFORMULA_UPDATE => 0, SNOTE => RESSCTNMRK.NOTE); end RRPCONFSCTNMRK_UPDATE; /* Удаление показателя раздела регламентированного отчёта */ procedure RRPCONFSCTNMRK_DELETE ( NRN in number -- Ид. показателя раздела ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации begin /* Удалим показатель */ P_RRPCONFSCTNMRK_DELETE(NCOMPANY => NCOMPANY, NRN => NRN); end RRPCONFSCTNMRK_DELETE; end PKG_P8PANELS_RRPCONFED; /