From cf22f5143ddc48153d0689c83f9f77683ad3ca67 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sun, 10 Dec 2023 19:27:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=94:=20=D0=9F=D0=B0=D0=BA=D0=B5=D1=82?= =?UTF-8?q?=20=D1=81=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=D0=BE=D0=B2=20(TDATA=5FGRI?= =?UTF-8?q?D,=20TCHART)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_SAMPLES.pck | 200 ++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/db/PKG_P8PANELS_SAMPLES.pck b/db/PKG_P8PANELS_SAMPLES.pck index b26a41d..231b5bb 100644 --- a/db/PKG_P8PANELS_SAMPLES.pck +++ b/db/PKG_P8PANELS_SAMPLES.pck @@ -19,6 +19,23 @@ create or replace package PKG_P8PANELS_SAMPLES as ( NRN in number -- Рег. номер удаляемого ); + + /* Таблица данных */ + procedure DATA_GRID + ( + 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 CHART + ( + COUT out clob -- Сериализованный график + ); end PKG_P8PANELS_SAMPLES; / @@ -175,6 +192,189 @@ create or replace package body PKG_P8PANELS_SAMPLES as begin P_AGNLIST_DELETE(NCOMPANY => GET_SESSION_COMPANY(), RN => NRN); end AGNLIST_DELETE; + + /* Таблица данных */ + procedure DATA_GRID + ( + 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; -- Описание таблицы + RAGN_TYPES PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределенные значения "Типа контрагентов" + 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 => 'SAGNABBR', + SCAPTION => 'Мнемокод', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'AgentAbbr', + BVISIBLE => true, + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNNAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'AgentName', + BVISIBLE => true, + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 0); + PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NAGNTYPE', + SCAPTION => 'Тип', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'AgentType', + BVISIBLE => true, + BORDER => true, + BFILTER => true, + RCOL_VALS => RAGN_TYPES, + SHINT => 'В Системе бывают контрагенты двух типов:
' || + 'Юридическое лицо - организация, которая имеет в собственности, хозяйственном ведении ' || + 'или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' || + 'имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям.
' || + 'Физическое лицо - субъект правовых отношений, представляющий собой одного человека.'); + /* Обходим данные */ + begin + /* Собираем запрос */ + CSQL := 'select * + from (select D.*, + ROWNUM NROW + from (select AG.AGNABBR SAGNABBR, + AG.AGNNAME SAGNNAME, + AG.AGNTYPE NAGNTYPE + from AGNLIST AG + where exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ null from USERPRIV UP where UP.CATALOG = AG.CRN and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ UR.ROLEID from USERROLES UR where UR.AUTHID = UTILIZER) + union all + select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ null from USERPRIV UP where UP.CATALOG = AG.CRN and UP.AUTHID = UTILIZER) + and 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_STR(ICURSOR => ICURSOR, IPOSITION => 1); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 3); + /* Делаем выборку */ + 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_COLS(RROW => RDG_ROW, SNAME => 'SAGNABBR', ICURSOR => ICURSOR, NPOSITION => 1, BCLEAR => true); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGNNAME', ICURSOR => ICURSOR, NPOSITION => 2); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NAGNTYPE', ICURSOR => ICURSOR, NPOSITION => 3); + /* Добавляем строку в таблицу */ + 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 DATA_GRID; + + /* Диаграмма Ганта */ + procedure GANTT + is + begin + null; + end GANTT; + + /* График */ + procedure CHART + ( + COUT out clob -- Сериализованный график + ) + is + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса + RCH PKG_P8PANELS_VISUAL.TCHART; -- График + RCH_DS PKG_P8PANELS_VISUAL.TCHART_DATASET; -- Набор данных + RATTR_VALS PKG_P8PANELS_VISUAL.TCHART_DATASET_ITEM_ATTR_VALS; -- Атрибуты элемента набора данных + begin + /* Сформируем заголовок графика */ + RCH := PKG_P8PANELS_VISUAL.TCHART_MAKE(STYPE => PKG_P8PANELS_VISUAL.SCHART_TYPE_BAR, + STITLE => 'Топ 5 контрагентов по сумме договоров', + SLGND_POS => PKG_P8PANELS_VISUAL.SCHART_LGND_POS_RIGHT); + /* Сформируем набор данных */ + RCH_DS := PKG_P8PANELS_VISUAL.TCHART_DATASET_MAKE(SCAPTION => 'Сумма договоров'); + /* Обходим договоры, сгруппированные по контрагентам */ + for C in (select D.SAGENT, + D.NSUM + from (select AG.AGNABBR SAGENT, + sum(CN.DOC_SUMTAX * (CN.CURBASE / CN.CURCOURS)) NSUM + from CONTRACTS CN, + AGNLIST AG + where CN.COMPANY = NCOMPANY + and CN.AGENT = AG.RN + group by AG.AGNABBR + order by 2 desc) D + where ROWNUM <= 5) + loop + /* Добавим метку для контрагента */ + PKG_P8PANELS_VISUAL.TCHART_ADD_LABEL(RCHART => RCH, SLABEL => C.SAGENT); + /* Сформируем дополнительные атрибуты для клиентского приложения - будем использовать их при открытии раздела "Договоры" для отбора */ + PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, + SNAME => 'SCOND', + SVALUE => 'in_SAGENT', + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, + SNAME => 'SCOND_VALUE', + SVALUE => C.SAGENT); + /* Добавим контрагента в набор данных */ + PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => C.NSUM, RATTR_VALS => RATTR_VALS); + end loop; + /* Добавим набор данных в график */ + PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS); + /* Сериализуем описание */ + COUT := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1); + end CHART; end PKG_P8PANELS_SAMPLES; /