forked from CITKParus/P8-Panels
		
	
		
			
				
	
	
		
			654 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
			
		
		
	
	
			654 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
| create or replace package PKG_P8PANELS_SAMPLES as
 | ||
| 
 | ||
|   /* Получение списка контрагентов */
 | ||
|   procedure AGNLIST_GET
 | ||
|   (
 | ||
|     COUT                    out clob    -- Список контрагентов
 | ||
|   );
 | ||
| 
 | ||
|   /* Добавление контрагента */
 | ||
|   procedure AGNLIST_INSERT
 | ||
|   (
 | ||
|     SAGNABBR                in varchar2, -- Мнемокод
 | ||
|     SAGNNAME                in varchar2, -- Наименование
 | ||
|     NRN                     out number   -- Рег. номер добавленного
 | ||
|   );
 | ||
| 
 | ||
|   /* Удаление контрагента */
 | ||
|   procedure AGNLIST_DELETE
 | ||
|   (
 | ||
|     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    -- Сериализованный график
 | ||
|   );
 | ||
|   
 | ||
|   /* Инициализация буфера данных для диаграмма Ганта */
 | ||
|   procedure GANTT_INIT
 | ||
|   (
 | ||
|     NIDENT                  in out number -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
 | ||
|   );
 | ||
|   
 | ||
|   /* Сбор данных для отображения диаграммы Ганта */
 | ||
|   procedure GANTT
 | ||
|   (
 | ||
|     NIDENT                  in number,  -- Идентификатор процесса
 | ||
|     COUT                    out clob    -- Сериализованные данные для диаграммы Ганта
 | ||
|   );
 | ||
|   
 | ||
|   /* Исправление задачи в диаграмме Ганта */
 | ||
|   procedure GANTT_MODIFY
 | ||
|   (
 | ||
|     NIDENT                  in number,  -- Идентификатор буфера
 | ||
|     NRN                     in number,  -- Рег. номер записи
 | ||
|     DDATE_FROM              in date,    -- Дата начала задачи
 | ||
|     DDATE_TO                in date     -- Дата окончания задачи 
 | ||
|   );
 | ||
|   
 | ||
| end PKG_P8PANELS_SAMPLES;
 | ||
| /
 | ||
| create or replace package body PKG_P8PANELS_SAMPLES as
 | ||
| 
 | ||
|   /* Получение списка контрагентов */
 | ||
|   procedure AGNLIST_GET
 | ||
|   (
 | ||
|     COUT                    out clob      -- Список контрагентов
 | ||
|   )
 | ||
|   is
 | ||
|     NVERSION                PKG_STD.TREF; -- Рег. номер версии словаря контрагентов
 | ||
|   begin
 | ||
|     NVERSION := GET_SESSION_VERSION(SUNITCODE => 'AGNLIST');
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
 | ||
|     for C in (select TMP.*
 | ||
|                 from (select D.*,
 | ||
|                              ROWNUM NROWNUM
 | ||
|                         from (select T.RN      NRN,
 | ||
|                                      T.AGNABBR SAGNABBR,
 | ||
|                                      T.AGNNAME SAGNNAME
 | ||
|                                 from AGNLIST T
 | ||
|                                where T.VERSION = NVERSION
 | ||
|                                  and exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */
 | ||
|                                        null
 | ||
|                                         from USERPRIV UP
 | ||
|                                        where UP.CATALOG = T.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 = T.CRN
 | ||
|                                          and UP.AUTHID = UTILIZER)
 | ||
|                                order by T.RN desc) D) TMP
 | ||
|                where TMP.NROWNUM <= 10)
 | ||
|     loop
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'AGENTS');
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => C.NRN);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SAGNABBR', SVALUE => C.SAGNABBR);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SAGNNAME', SVALUE => C.SAGNNAME);
 | ||
|       PKG_XFAST.UP();
 | ||
|     end loop;
 | ||
|     PKG_XFAST.UP();
 | ||
|     COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
 | ||
|     PKG_XFAST.EPILOGUE();
 | ||
|   end AGNLIST_GET;
 | ||
| 
 | ||
|   /* Добавление контрагента */
 | ||
|   procedure AGNLIST_INSERT
 | ||
|   (
 | ||
|     SAGNABBR                in varchar2,                           -- Мнемокод
 | ||
|     SAGNNAME                in varchar2,                           -- Наименование
 | ||
|     NRN                     out number                             -- Рег. номер добавленного
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Текущая организация
 | ||
|     NCRN                    PKG_STD.TREF;                          -- Каталог размещения контрагента
 | ||
|   begin
 | ||
|     if (SAGNABBR is null) then
 | ||
|       P_EXCEPTION(0, 'Не указан мнемокод.');
 | ||
|     end if;
 | ||
|     if (SAGNABBR is null) then
 | ||
|       P_EXCEPTION(0, 'Не указано наименование.');
 | ||
|     end if;
 | ||
|     FIND_ROOT_CATALOG(NCOMPANY => NCOMPANY, SCODE => 'AGNLIST', NCRN => NCRN);
 | ||
|     P_AGNLIST_INSERT(NCOMPANY          => NCOMPANY,
 | ||
|                      CRN               => NCRN,
 | ||
|                      AGNABBR           => SAGNABBR,
 | ||
|                      AGNTYPE           => 0,
 | ||
|                      AGNNAME           => SAGNNAME,
 | ||
|                      AGNIDNUMB         => null,
 | ||
|                      ECONCODE          => null,
 | ||
|                      ORGCODE           => null,
 | ||
|                      AGNFAMILYNAME     => null,
 | ||
|                      AGNFIRSTNAME      => null,
 | ||
|                      AGNLASTNAME       => null,
 | ||
|                      AGNFAMILYNAME_TO  => null,
 | ||
|                      AGNFIRSTNAME_TO   => null,
 | ||
|                      AGNLASTNAME_TO    => null,
 | ||
|                      AGNFAMILYNAME_FR  => null,
 | ||
|                      AGNFIRSTNAME_FR   => null,
 | ||
|                      AGNLASTNAME_FR    => null,
 | ||
|                      AGNFAMILYNAME_AC  => null,
 | ||
|                      AGNFIRSTNAME_AC   => null,
 | ||
|                      AGNLASTNAME_AC    => null,
 | ||
|                      AGNFAMILYNAME_ABL => null,
 | ||
|                      AGNFIRSTNAME_ABL  => null,
 | ||
|                      AGNLASTNAME_ABL   => null,
 | ||
|                      EMP               => 0,
 | ||
|                      EMPPOST           => null,
 | ||
|                      EMPPOST_FROM      => null,
 | ||
|                      EMPPOST_TO        => null,
 | ||
|                      EMPPOST_AC        => null,
 | ||
|                      EMPPOST_ABL       => null,
 | ||
|                      AGNBURN           => null,
 | ||
|                      PHONE             => null,
 | ||
|                      PHONE2            => null,
 | ||
|                      FAX               => null,
 | ||
|                      TELEX             => null,
 | ||
|                      MAIL              => null,
 | ||
|                      IMAGE             => null,
 | ||
|                      DDISCDATE         => null,
 | ||
|                      AGN_COMMENT       => null,
 | ||
|                      NSEX              => 0,
 | ||
|                      SPENSION_NBR      => null,
 | ||
|                      SMEDPOLICY_SER    => null,
 | ||
|                      SMEDPOLICY_NUMB   => null,
 | ||
|                      SPROPFORM         => null,
 | ||
|                      SREASON_CODE      => null,
 | ||
|                      NRESIDENT_SIGN    => 0,
 | ||
|                      STAXPSTATUS       => null,
 | ||
|                      SOGRN             => null,
 | ||
|                      SPRFMLSTS         => null,
 | ||
|                      SPRNATION         => null,
 | ||
|                      SCITIZENSHIP      => null,
 | ||
|                      ADDR_BURN         => null,
 | ||
|                      SPRMLREL          => null,
 | ||
|                      SOKATO            => null,
 | ||
|                      SPFR_NAME         => null,
 | ||
|                      DPFR_FILL_DATE    => null,
 | ||
|                      DPFR_REG_DATE     => null,
 | ||
|                      SPFR_REG_NUMB     => null,
 | ||
|                      SSFR_REG_NUMB     => null,
 | ||
|                      SFULLNAME         => null,
 | ||
|                      SOKFS             => null,
 | ||
|                      SOKOPF            => null,
 | ||
|                      STFOMS            => null,
 | ||
|                      SFSS_REG_NUMB     => null,
 | ||
|                      SFSS_SUBCODE      => null,
 | ||
|                      NCOEFFIC          => 0,
 | ||
|                      DAGNDEATH         => null,
 | ||
|                      NOLD_RN           => null,
 | ||
|                      SOKTMO            => null,
 | ||
|                      SINN_CITIZENSHIP  => null,
 | ||
|                      DTAX_REG_DATE     => null,
 | ||
|                      SORIGINAL_NAME    => null,
 | ||
|                      NIND_BUSINESSMAN  => 0,
 | ||
|                      SFNS_CODE         => null,
 | ||
|                      SCTZNSHP_TYPE     => null,
 | ||
|                      NCONTACT_METHOD   => null,
 | ||
|                      SMF_ID            => null,
 | ||
|                      SOKOGU            => null,
 | ||
|                      NRN               => NRN);
 | ||
|   end AGNLIST_INSERT;
 | ||
| 
 | ||
|   /* Удаление контрагента */
 | ||
|   procedure AGNLIST_DELETE
 | ||
|   (
 | ||
|     NRN                     in number   -- Рег. номер удаляемого
 | ||
|   )
 | ||
|   is
 | ||
|   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;                               -- Курсор для исполнения запроса
 | ||
|     SGROUP                  PKG_STD.TSTRING;                       -- Буфер для группы
 | ||
|     SAGNINFO                PKG_STD.TSTRING;                       -- Буфер для "Сведений"
 | ||
|     SAGNNAME                PKG_STD.TSTRING;                       -- Буфер для "Наименования"
 | ||
|     NAGNTYPE                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      => '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       => 'SAGNINFO',
 | ||
|                                                SCAPTION    => 'Сведения',
 | ||
|                                                SDATA_TYPE  => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE    => true,
 | ||
|                                                BORDER      => false,
 | ||
|                                                BFILTER     => false,
 | ||
|                                                BEXPANDABLE => 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,
 | ||
|                                                SPARENT    => 'SAGNINFO');
 | ||
|     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,
 | ||
|                                                SPARENT    => 'SAGNINFO',
 | ||
|                                                RCOL_VALS  => RAGN_TYPES,
 | ||
|                                                SHINT      => 'В Системе бывают контрагенты двух типов:<br>' ||
 | ||
|                                                              '<b style="color:blue">Юридическое лицо</b> - организация, которая имеет в собственности, хозяйственном ведении ' ||
 | ||
|                                                              'или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' ||
 | ||
|                                                              'имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям.<br>' ||
 | ||
|                                                              '<b style="color:green">Физическое лицо</b> - субъект правовых отношений, представляющий собой одного человека.');
 | ||
|     /* Обходим данные */
 | ||
|     begin
 | ||
|       /* Добавляем подсказку совместимости */
 | ||
|       CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
 | ||
|       /* Формируем запрос */
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '  from (select D.*,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '          from (select AG.AGNABBR SAGNABBR,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       AG.AGNNAME SAGNNAME,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       AG.AGNTYPE NAGNTYPE');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from AGNLIST AG');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                where exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               where UP."CATALOG" = AG.CRN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                     from USERROLES UR where UR.AUTHID = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                    union all');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                   select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                     from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.AUTHID = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' 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);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|       /* Делаем выборку */
 | ||
|       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_STR(ICURSOR => ICURSOR, IPOSITION => 2, SVALUE => SAGNNAME);
 | ||
|         PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 3, NVALUE => NAGNTYPE);
 | ||
|         if (NAGNTYPE = 0) then
 | ||
|           SGROUP   := 'JUR';
 | ||
|           SAGNINFO := SAGNNAME || ', ЮЛ';
 | ||
|           PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID  => RDG,
 | ||
|                                                    SNAME       => SGROUP,
 | ||
|                                                    SCAPTION    => 'Юридические лица',
 | ||
|                                                    BEXPANDABLE => true,
 | ||
|                                                    BEXPANDED   => false);
 | ||
|         else
 | ||
|           SGROUP   := 'PERS';
 | ||
|           SAGNINFO := SAGNNAME || ', ФЛ';
 | ||
|           PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID  => RDG,
 | ||
|                                                    SNAME       => SGROUP,
 | ||
|                                                    SCAPTION    => 'Физические лица',
 | ||
|                                                    BEXPANDABLE => true,
 | ||
|                                                    BEXPANDED   => false);
 | ||
|         end if;
 | ||
|         RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SGROUP);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGNABBR', ICURSOR => ICURSOR, NPOSITION => 1);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNINFO', SVALUE => SAGNINFO);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNNAME', SVALUE => SAGNNAME);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NAGNTYPE', NVALUE => NAGNTYPE);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         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 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;
 | ||
|   
 | ||
|   /* Очистка буфера данных для диаграммы Ганта */
 | ||
|   procedure GANTT_BASE_CLEAN
 | ||
|   (
 | ||
|     NIDENT                  in number   -- Идентификатор буфера
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Удалим из буфера всё с указанным идентификатором */
 | ||
|     delete from P8PNL_SMPL_GANTT T where T.IDENT = NIDENT;
 | ||
|   end GANTT_BASE_CLEAN;
 | ||
| 
 | ||
|   /* Добавление данных в буфер диаграммы Ганта */
 | ||
|   procedure GANTT_BASE_INSERT
 | ||
|   (
 | ||
|     NIDENT                  in number,   -- Идентификатор буфера
 | ||
|     NTYPE                   in number,   -- Тип задачи (0 - этап/веха, 1 - работа)
 | ||
|     SNUMB                   in varchar2, -- Номер задачи
 | ||
|     SNAME                   in varchar2, -- Наименование задачи
 | ||
|     DDATE_FROM              in date,     -- Дата начала задачи
 | ||
|     DDATE_TO                in date,     -- Дата окончания задачи
 | ||
|     NSTATE                  in number    -- Состояние (0 - не выполняется, 1 - выполняется)
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Добавим запись */
 | ||
|     insert into P8PNL_SMPL_GANTT
 | ||
|       (RN, IDENT, type, NUMB, name, DATE_FROM, DATE_TO, STATE)
 | ||
|     values
 | ||
|       (GEN_ID(), NIDENT, NTYPE, SNUMB, SNAME, DDATE_FROM, DDATE_TO, NSTATE);
 | ||
|   end GANTT_BASE_INSERT;
 | ||
|   
 | ||
|   /* Исправление данных в буфере диаграммы Ганта */
 | ||
|   procedure GANTT_BASE_UPDATE
 | ||
|   (
 | ||
|     NIDENT                  in number,   -- Идентификатор буфера
 | ||
|     NRN                     in number,   -- Рег. номер записи
 | ||
|     NTYPE                   in number,   -- Тип задачи (0 - этап/веха, 1 - работа)
 | ||
|     SNUMB                   in varchar2, -- Номер задачи
 | ||
|     SNAME                   in varchar2, -- Наименование задачи
 | ||
|     DDATE_FROM              in date,     -- Дата начала задачи
 | ||
|     DDATE_TO                in date      -- Дата окончания задачи
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Изменим запись */
 | ||
|     update P8PNL_SMPL_GANTT T
 | ||
|        set T.TYPE      = NTYPE,
 | ||
|            T.NUMB      = SNUMB,
 | ||
|            T.NAME      = SNAME,
 | ||
|            T.DATE_FROM = DDATE_FROM,
 | ||
|            T.DATE_TO   = DDATE_TO
 | ||
|      where T.RN = NRN
 | ||
|        and T.IDENT = NIDENT;
 | ||
|   end GANTT_BASE_UPDATE;
 | ||
|  
 | ||
|   /* Инициализация буфера данных для диаграммы Ганта */
 | ||
|   procedure GANTT_INIT
 | ||
|   (
 | ||
|     NIDENT                  in out number                  -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
 | ||
|   )
 | ||
|   is
 | ||
|     /* Константы */
 | ||
|     NSTAGE_LEN              constant PKG_STD.TNUMBER := 3; -- Длительность этапа (в месяцах)
 | ||
|     /* Переменные */
 | ||
|     NYEAR                   PKG_STD.TNUMBER;               -- Текущий год
 | ||
|     NMONTH                  PKG_STD.TNUMBER;               -- Месяц начала этапа
 | ||
|     DDATE_FROM              PKG_STD.TLDATE;                -- Дата начала этапа
 | ||
|     DDATE_TO                PKG_STD.TLDATE;                -- Дата окончания этапа
 | ||
|     DDATE_FROM_J            PKG_STD.TLDATE;                -- Дата начала работы
 | ||
|     DDATE_TO_J              PKG_STD.TLDATE;                -- Дата окончания работы
 | ||
|     NSTATE                  PKG_STD.TNUMBER;               -- Состояние задачи
 | ||
|   begin
 | ||
|     /* Удаляем старые данные из буфера */
 | ||
|     if (NIDENT is not null) then
 | ||
|       GANTT_BASE_CLEAN(NIDENT => NIDENT);
 | ||
|     else
 | ||
|       /* Илиформируем новый идентификатор, если не задан */
 | ||
|       NIDENT := GEN_IDENT();
 | ||
|     end if;
 | ||
|     /* Фиксируем текущий год */
 | ||
|     NYEAR := EXTRACT(year from sysdate);
 | ||
|     /* Этапы */
 | ||
|     for ST in 1 .. 12 / NSTAGE_LEN
 | ||
|     loop
 | ||
|       /* Сформируем период этапа */
 | ||
|       NMONTH     := ST * NSTAGE_LEN - NSTAGE_LEN + 1;
 | ||
|       DDATE_FROM := TO_DATE('01.' || NMONTH || '.' || TO_CHAR(NYEAR), 'dd.mm.yyyy');
 | ||
|       DDATE_TO   := LAST_DAY(ADD_MONTHS(DDATE_FROM, NSTAGE_LEN) - 1);
 | ||
|       /* Сформируем значение для атриуба "состояние" этапа */
 | ||
|       if (TRUNC(sysdate) between TRUNC(DDATE_FROM) and TRUNC(DDATE_TO)) then
 | ||
|         NSTATE := 1;
 | ||
|       else
 | ||
|         NSTATE := 0;
 | ||
|       end if;
 | ||
|       /* Добавим его в буфер */
 | ||
|       GANTT_BASE_INSERT(NIDENT     => NIDENT,
 | ||
|                         NTYPE      => 0,
 | ||
|                         SNUMB      => TO_CHAR(ST),
 | ||
|                         SNAME      => 'Этап ' || TO_CHAR(ST),
 | ||
|                         DDATE_FROM => DDATE_FROM,
 | ||
|                         DDATE_TO   => DDATE_TO,
 | ||
|                         NSTATE     => NSTATE);
 | ||
|       /* Работы */
 | ||
|       for J in 0 .. NSTAGE_LEN - 1
 | ||
|       loop
 | ||
|         /* Сформируем период работы */
 | ||
|         DDATE_FROM_J := ADD_MONTHS(DDATE_FROM, J);
 | ||
|         DDATE_TO_J   := LAST_DAY(ADD_MONTHS(DDATE_FROM, J + 1) - 1);
 | ||
|         /* Сформируем значение для атриуба "состояние" работы */
 | ||
|         if (TRUNC(sysdate) between TRUNC(DDATE_FROM_J) and TRUNC(DDATE_TO_J)) then
 | ||
|           NSTATE := 1;
 | ||
|         else
 | ||
|           NSTATE := 0;
 | ||
|         end if;
 | ||
|         /* Добавим в буфер */
 | ||
|         GANTT_BASE_INSERT(NIDENT     => NIDENT,
 | ||
|                           NTYPE      => 1,
 | ||
|                           SNUMB      => TO_CHAR(ST) || '.' || TO_CHAR(J + 1),
 | ||
|                           SNAME      => 'Работа ' || TO_CHAR(J + 1) || ' этапа ' || TO_CHAR(ST),
 | ||
|                           DDATE_FROM => DDATE_FROM_J,
 | ||
|                           DDATE_TO   => DDATE_TO_J,
 | ||
|                           NSTATE     => NSTATE);
 | ||
|       end loop;
 | ||
|     end loop;
 | ||
|   end GANTT_INIT;
 | ||
|   
 | ||
|   /* Сбор данных для отображения диаграммы Ганта */
 | ||
|   procedure GANTT
 | ||
|   (
 | ||
|     NIDENT                  in number,                                -- Идентификатор процесса
 | ||
|     COUT                    out clob                                  -- Сериализованные данные для диаграммы Ганта
 | ||
|   )
 | ||
|   is
 | ||
|     /* Константы */
 | ||
|     SBG_COLOR_STAGE         constant PKG_STD.TSTRING := 'cadetblue';  -- Цвет заливки этапов
 | ||
|     SBG_COLOR_JOB           constant PKG_STD.TSTRING := 'lightgreen'; -- Цвет заливки работ
 | ||
|     /* Переменные */
 | ||
|     RG                      PKG_P8PANELS_VISUAL.TGANTT;               -- Описание диаграммы Ганта
 | ||
|     RGT                     PKG_P8PANELS_VISUAL.TGANTT_TASK;          -- Описание задачи для диаграммы    
 | ||
|     STASK_BG_COLOR          PKG_STD.TSTRING;                          -- Цвет фона задачи
 | ||
|   begin
 | ||
|     /* Инициализируем диаграмму Ганта */
 | ||
|     RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => 'Задачи на ' || TO_CHAR(EXTRACT(year from sysdate)) || ' год',
 | ||
|                                           NZOOM  => PKG_P8PANELS_VISUAL.NGANTT_ZOOM_MONTH);
 | ||
|     /* Добавим динамические атрибуты к задачам */
 | ||
|     PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => 'type', SCAPTION => 'Тип', BVISIBLE => true);
 | ||
|     PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT   => RG,
 | ||
|                                              SNAME    => 'state',
 | ||
|                                              SCAPTION => 'Состояние',
 | ||
|                                              BVISIBLE => false);
 | ||
|     /* Добавим описание цветов задач */
 | ||
|     PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT    => RG,
 | ||
|                                               SBG_COLOR => SBG_COLOR_JOB,
 | ||
|                                               SDESC     => 'Этот цвет для задач.');
 | ||
|     PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT    => RG,
 | ||
|                                               SBG_COLOR => SBG_COLOR_STAGE,
 | ||
|                                               SDESC     => 'Этим цветом выделены этапы.');
 | ||
|     /* Обходим буфер */
 | ||
|     for C in (select T.* from P8PNL_SMPL_GANTT T where T.IDENT = NIDENT order by T.RN)
 | ||
|     loop
 | ||
|       /* Определимся с форматированием */
 | ||
|       if (C.TYPE = 0) then
 | ||
|         STASK_BG_COLOR := SBG_COLOR_STAGE;
 | ||
|       else
 | ||
|         STASK_BG_COLOR := SBG_COLOR_JOB;
 | ||
|       end if;
 | ||
|       /* Сформируем задачу */
 | ||
|       RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN       => C.RN,
 | ||
|                                                   SNUMB     => C.NUMB,
 | ||
|                                                   SCAPTION  => C.NUMB || ' - ' || C.NAME,
 | ||
|                                                   SNAME     => C.NAME,
 | ||
|                                                   DSTART    => C.DATE_FROM,
 | ||
|                                                   DEND      => C.DATE_TO,
 | ||
|                                                   SBG_COLOR => STASK_BG_COLOR);
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => 'type',
 | ||
|                                                    SVALUE => C.TYPE,
 | ||
|                                                    BCLEAR => true);
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG, RTASK => RGT, SNAME => 'state', SVALUE => C.STATE);
 | ||
|       /* Добавляем задачу в диаграмму */
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT);
 | ||
|     end loop;
 | ||
|     /* Сериализуем собранные данные */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG);
 | ||
|   end GANTT;
 | ||
|   
 | ||
|   /* Исправление задачи в диаграмме Ганта */
 | ||
|   procedure GANTT_MODIFY
 | ||
|   (
 | ||
|     NIDENT                  in number,  -- Идентификатор буфера
 | ||
|     NRN                     in number,  -- Рег. номер записи
 | ||
|     DDATE_FROM              in date,    -- Дата начала задачи
 | ||
|     DDATE_TO                in date     -- Дата окончания задачи 
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     for C in (select T.*
 | ||
|                 from P8PNL_SMPL_GANTT T
 | ||
|                where T.RN = NRN
 | ||
|                  and T.IDENT = NIDENT)
 | ||
|     loop
 | ||
|       GANTT_BASE_UPDATE(NIDENT     => C.IDENT,
 | ||
|                         NRN        => C.RN,
 | ||
|                         NTYPE      => C.TYPE,
 | ||
|                         SNUMB      => C.NUMB,
 | ||
|                         SNAME      => C.NAME,
 | ||
|                         DDATE_FROM => TRUNC(DDATE_FROM),
 | ||
|                         DDATE_TO   => TRUNC(DDATE_TO));
 | ||
|     end loop;
 | ||
|   end GANTT_MODIFY;
 | ||
| 
 | ||
| end PKG_P8PANELS_SAMPLES;
 | ||
| /
 |