forked from CITKParus/P8-Panels
		
	
		
			
				
	
	
		
			2179 lines
		
	
	
		
			154 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
			
		
		
	
	
			2179 lines
		
	
	
		
			154 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
| create or replace package PKG_P8PANELS_MECHREC as
 | ||
|   
 | ||
|   /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
 | ||
|   procedure INCOMEFROMDEPS_DG_GET
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,  -- Рег. номер связанной спецификации плана
 | ||
|     NTYPE                   in number,  -- Тип спецификации плана (2 - Не включать "Состояние", 3 - включать)
 | ||
|     NPAGE_NUMBER            in number,  -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,  -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,    -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,  -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob    -- Сериализованная таблица данных
 | ||
|   );
 | ||
| 
 | ||
|   /* Получение строк комплектации на основании маршрутного листа */
 | ||
|   procedure FCDELIVERYLISTSP_DG_GET
 | ||
|   (
 | ||
|     NFCROUTLST              in number,  -- Рег. номер маршрутного листа
 | ||
|     NPAGE_NUMBER            in number,  -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,  -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,    -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,  -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob    -- Сериализованная таблица данных
 | ||
|   );
 | ||
| 
 | ||
|   /* Получение товарных запасов на основании маршрутного листа */
 | ||
|   procedure GOODSPARTIES_DG_GET
 | ||
|   (
 | ||
|     NFCROUTLST              in number, -- Рег. номер маршрутного листа
 | ||
|     NPAGE_NUMBER            in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number, -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,   -- Сортировки
 | ||
|     NINCLUDE_DEF            in number, -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob   -- Сериализованная таблица данных
 | ||
|   );
 | ||
| 
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
 | ||
|   procedure FCROUTLST_DG_GET
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,  -- Рег. номер связанной спецификации плана
 | ||
|     NTYPE                   in number,  -- Тип спецификации плана (0 - Деталь, 1 - Изделие/сборочная единица, 3/4 - ПиП)
 | ||
|     NPAGE_NUMBER            in number,  -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,  -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,    -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,  -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob    -- Сериализованная таблица данных
 | ||
|   );
 | ||
| 
 | ||
|   /* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
 | ||
|   procedure FCPRODPLANSP_GET
 | ||
|   (
 | ||
|     NCRN                    in number,                     -- Рег. номер каталога
 | ||
|     NLEVEL                  in number := null,             -- Уровень отбора
 | ||
|     SSORT_FIELD             in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
 | ||
|     COUT                    out clob,                      -- Список задач
 | ||
|     NMAX_LEVEL              out number                     -- Максимальный уровень иерархии
 | ||
|   );
 | ||
| 
 | ||
|   /* Инициализация каталогов раздела "Планы и отчеты производства изделий"  */
 | ||
|   procedure ACATALOG_INIT
 | ||
|   (
 | ||
|     COUT                    out clob    -- Список каталогов раздела "Планы и отчеты производства изделий"
 | ||
|   );
 | ||
| 
 | ||
| end PKG_P8PANELS_MECHREC;
 | ||
| /
 | ||
| create or replace package body PKG_P8PANELS_MECHREC as
 | ||
| 
 | ||
|   /* Константы - цвета отображения */
 | ||
|   SBG_COLOR_RED             constant PKG_STD.TSTRING := '#ff000080'; -- Цвет заливки красный
 | ||
|   SBG_COLOR_YELLOW          constant PKG_STD.TSTRING := '#e0db4480'; -- Цвет заливки желтый
 | ||
|   SBG_COLOR_GREEN           constant PKG_STD.TSTRING := '#90ee9080'; -- Цвет заливки зеленый
 | ||
|   SBG_COLOR_GREY            constant PKG_STD.TSTRING := '#d3d3d380'; -- Цвет заливки серый
 | ||
|   SBG_COLOR_BLACK           constant PKG_STD.TSTRING := '#00000080'; -- Цвет заливки черный
 | ||
|   STEXT_COLOR_ORANGE        constant PKG_STD.TSTRING := '#FF8C00';   -- Цвет текста оранжевый
 | ||
|   STEXT_COLOR_GREY          constant PKG_STD.TSTRING := '#555';      -- Цвет текста серый
 | ||
| 
 | ||
|   /* Константы - параметры отборов планов */
 | ||
|   NFCPRODPLAN_CATEGORY      constant PKG_STD.TNUMBER := 1;      -- Категория планов "Производственная программа"
 | ||
|   NFCPRODPLAN_STATUS        constant PKG_STD.TNUMBER := 2;      -- Статус планов "Утвержден"
 | ||
|   SFCPRODPLAN_TYPE          constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния)
 | ||
| 
 | ||
|   /* Константы - дополнительные атрибуты */
 | ||
|   STASK_ATTR_START_FACT     constant PKG_STD.TSTRING := 'start_fact';  -- Запущено
 | ||
|   STASK_ATTR_MAIN_QUANT     constant PKG_STD.TSTRING := 'main_quant';  -- Количество план
 | ||
|   STASK_ATTR_REL_FACT       constant PKG_STD.TSTRING := 'rel_fact';    -- Количество сдано
 | ||
|   STASK_ATTR_REP_DATE_TO    constant PKG_STD.TSTRING := 'rep_date_to'; -- Дата выпуска план
 | ||
|   STASK_ATTR_DL             constant PKG_STD.TSTRING := 'detail_list'; -- Связанные документы
 | ||
|   STASK_ATTR_TYPE           constant PKG_STD.TSTRING := 'type';        -- Тип (0 - Деталь, 1 - Изделие/сборочная единица)
 | ||
|   STASK_ATTR_MEAS           constant PKG_STD.TSTRING := 'meas';        -- Единица измнения
 | ||
|     
 | ||
|   /* Инциализация списка маршрутных листов (с иерархией) */
 | ||
|   procedure UTL_FCROUTLST_IDENT_INIT
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number, -- Рег. номер связанной спецификации плана
 | ||
|     NIDENT                  out number -- Идентификатор отмеченных записей
 | ||
|   )
 | ||
|   is
 | ||
|     /* Рекурсивная процедура формирования списка маршрутных листов */
 | ||
|     procedure PUT_FCROUTLST
 | ||
|     (
 | ||
|       NIDENT          in number,       -- Идентификатор отмеченных записей
 | ||
|       NFCROUTLST      in number        -- Рег. номер маршрутного листа
 | ||
|     )
 | ||
|     is
 | ||
|       NTMP            PKG_STD.TNUMBER; -- Буфер
 | ||
|     begin
 | ||
|       /* Добавление в список */
 | ||
|       begin
 | ||
|         P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => NFCROUTLST, SUNITCODE => 'CostRouteLists', NRN => NTMP);
 | ||
|       exception
 | ||
|         when others then
 | ||
|           return;
 | ||
|       end;
 | ||
|       /* Маршрутные листы, связанные со строками добавленного */
 | ||
|       for RLST in (select distinct L.OUT_DOCUMENT as RN
 | ||
|                      from FCROUTLSTSP LS,
 | ||
|                           DOCLINKS    L
 | ||
|                     where LS.PRN = NFCROUTLST
 | ||
|                       and L.IN_DOCUMENT = LS.RN
 | ||
|                       and L.IN_UNITCODE = 'CostRouteListsSpecs'
 | ||
|                       and L.OUT_UNITCODE = 'CostRouteLists')
 | ||
|       loop
 | ||
|         /* Добавляем по данному листу */
 | ||
|         PUT_FCROUTLST(NIDENT => NIDENT, NFCROUTLST => RLST.RN);
 | ||
|       end loop;
 | ||
|     end PUT_FCROUTLST;
 | ||
|   begin
 | ||
|     /* Генерируем идентификатор */
 | ||
|     NIDENT := GEN_IDENT();
 | ||
|     /* Цикл по связанным напрямую маршрутным листам */
 | ||
|     for RLST in (select D.RN
 | ||
|                    from FCROUTLST D
 | ||
|                   where D.RN in (select L.OUT_DOCUMENT
 | ||
|                                    from DOCLINKS L
 | ||
|                                   where L.IN_DOCUMENT = NFCPRODPLANSP
 | ||
|                                     and L.IN_UNITCODE = 'CostProductPlansSpecs'
 | ||
|                                     and L.OUT_UNITCODE = 'CostRouteLists'))
 | ||
|     loop
 | ||
|       /* Рекурсивная процедура формирования списка маршрутных листов */
 | ||
|       PUT_FCROUTLST(NIDENT => NIDENT, NFCROUTLST => RLST.RN);
 | ||
|     end loop;
 | ||
|   end UTL_FCROUTLST_IDENT_INIT;
 | ||
|   
 | ||
|   /* Проверка наличия связанных маршрутных листов */
 | ||
|   function LINK_FCROUTLST_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,        -- Рег. номер организации
 | ||
|     NFCPRODPLANSP           in number,        -- Рег. номер спецификации плана
 | ||
|     NSTATE                  in number := null -- Состояние маршрутного листа
 | ||
|   ) return                  number            -- Наличие связанного МЛ (0 - нет, 1 - есть)
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TNUMBER;  -- Наличие связанного МЛ (0 - нет, 1 - есть)
 | ||
|   begin
 | ||
|     begin
 | ||
|       select 1
 | ||
|         into NRESULT
 | ||
|         from DUAL
 | ||
|        where exists (select null
 | ||
|                 from DOCLINKS  L,
 | ||
|                      FCROUTLST F
 | ||
|                where L.IN_DOCUMENT = NFCPRODPLANSP
 | ||
|                  and L.IN_UNITCODE = 'CostProductPlansSpecs'
 | ||
|                  and L.IN_COMPANY = NCOMPANY
 | ||
|                  and L.OUT_UNITCODE = 'CostRouteLists'
 | ||
|                  and L.OUT_COMPANY = NCOMPANY
 | ||
|                  and F.RN = L.OUT_DOCUMENT
 | ||
|                  and ((NSTATE is null) or ((NSTATE is not null) and (F.STATE = NSTATE)))
 | ||
|                  and ROWNUM = 1);
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := 0;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end LINK_FCROUTLST_CHECK;
 | ||
|   
 | ||
|   /* Проверка наличия связанных приходов из подразделений */
 | ||
|   function LINK_INCOMEFROMDEPS_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,        -- Рег. номер организации
 | ||
|     NFCPRODPLANSP           in number,        -- Рег. номер спецификации плана
 | ||
|     NSTATE                  in number := null -- Состояние ПиП
 | ||
|   ) return                  number            -- Наличие связанного ПиП (0 - нет, 1 - есть)
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TNUMBER;  -- Наличие связанного ПиП (0 - нет, 1 - есть)
 | ||
|     NFCROUTLST_IDENT        PKG_STD.TREF;     -- Рег. номер идентификатора отмеченных записей маршрутных листов
 | ||
|   begin
 | ||
|     /* Инициализируем список маршрутных листов */
 | ||
|     UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP, NIDENT => NFCROUTLST_IDENT);
 | ||
|     /* Проверяем наличие */
 | ||
|     begin
 | ||
|       select 1
 | ||
|         into NRESULT
 | ||
|         from DUAL
 | ||
|        where exists (select null
 | ||
|                 from DOCLINKS       L,
 | ||
|                      INCOMEFROMDEPS F
 | ||
|                where L.IN_DOCUMENT = NFCPRODPLANSP
 | ||
|                  and L.IN_UNITCODE = 'CostProductPlansSpecs'
 | ||
|                  and L.OUT_UNITCODE = 'IncomFromDeps'
 | ||
|                  and L.OUT_COMPANY = NCOMPANY
 | ||
|                  and F.RN = L.OUT_DOCUMENT
 | ||
|                  and F.COMPANY = NCOMPANY
 | ||
|                  and ((NSTATE is null) or ((NSTATE is not null) and (F.DOC_STATE = NSTATE)))
 | ||
|                  and ROWNUM = 1)
 | ||
|           or exists (select null
 | ||
|                 from INCOMEFROMDEPS F
 | ||
|                where F.RN in (select L.OUT_DOCUMENT
 | ||
|                                 from SELECTLIST SL,
 | ||
|                                      DOCLINKS   L
 | ||
|                                where SL.IDENT = NFCROUTLST_IDENT
 | ||
|                                  and SL.UNITCODE = 'CostRouteLists'
 | ||
|                                  and L.IN_DOCUMENT = SL.DOCUMENT
 | ||
|                                  and L.IN_UNITCODE = 'CostRouteLists'
 | ||
|                                  and L.OUT_UNITCODE = 'IncomFromDeps'));
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := 0;
 | ||
|     end;
 | ||
|     /* Очищаем отмеченные маршрутные листы */
 | ||
|     P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   exception
 | ||
|     when others then
 | ||
|       /* Очищаем отмеченные маршрутные листы */
 | ||
|       P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|       raise;
 | ||
|   end LINK_INCOMEFROMDEPS_CHECK;
 | ||
|   
 | ||
|   /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
 | ||
|   procedure INCOMEFROMDEPS_DG_GET
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,                             -- Рег. номер связанной спецификации плана
 | ||
|     NTYPE                   in number,                             -- Тип спецификации плана (2 - Не включать "Состояние", 3 - включать)
 | ||
|     NPAGE_NUMBER            in number,                             -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,                             -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,                               -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,                             -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     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;                               -- Курсор для исполнения запроса
 | ||
|     NFCROUTLST_IDENT        PKG_STD.TREF;                          -- Рег. номер идентификатора отмеченных записей маршрутных листов
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     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   => 'Рег. номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOC_INFO',
 | ||
|                                                SCAPTION   => 'Накладная',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     /* Если тип = 3, то необходимо включать состояние */
 | ||
|     if (NTYPE = 3) then
 | ||
|       PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                  SNAME      => 'SDOC_STATE',
 | ||
|                                                  SCAPTION   => 'Состояние',
 | ||
|                                                  SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                  BVISIBLE   => true);
 | ||
|     end if;
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'DWORK_DATE',
 | ||
|                                                SCAPTION   => 'Дата сдачи',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOC_VALID_INFO',
 | ||
|                                                SCAPTION   => 'Маршрутный лист',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SOUT_DEPARTMENT',
 | ||
|                                                SCAPTION   => 'Сдающий цех',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SSTORE',
 | ||
|                                                SCAPTION   => 'Склад цеха потребителя',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT_FACT',
 | ||
|                                                SCAPTION   => 'Количество сдано',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     /* Инициализируем список маршрутных листов */
 | ||
|     UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP, NIDENT => NFCROUTLST_IDENT);
 | ||
|     /* Обходим данные */
 | ||
|     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 T.RN NRN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DT.DOCCODE ||');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       '', '' || TRIM(T.DOC_PREF) ||');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       ''-'' || TRIM(T.DOC_NUMB) ||');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       '', '' || TO_CHAR(T.DOC_DATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_INFO,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       case T.DOC_STATE');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         when 0 then');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Не отработан'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         when 1 then');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как план'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         when 2 then');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как факт'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         else');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       end SDOC_STATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.WORK_DATE DWORK_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DTV.DOCCODE ||');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       '', '' || T.VALID_DOCNUMB || ');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       '', '' || TO_CHAR(T.VALID_DOCDATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_VALID_INFO,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       D.CODE SOUT_DEPARTMENT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       S.AZS_NUMBER SSTORE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select SUM(SP.QUANT_FACT)');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from INCOMEFROMDEPSSPEC SP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where SP.PRN = T.RN) NQUANT_FACT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from INCOMEFROMDEPS T left outer join DOCTYPES DTV on T.VALID_DOCTYPE = DTV.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       left outer join INS_DEPARTMENT D on T.OUT_DEPARTMENT = D.RN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DOCTYPES DT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       AZSAZSLISTMT S');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where ((T.RN in (select L.OUT_DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                    from DOCLINKS L');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                   where L.IN_DOCUMENT = :NFCPRODPLANSP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                     and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                     and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps') || '))');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                        or (T.RN in (select L.OUT_DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                       from SELECTLIST SL,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            DOCLINKS   L');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                      where SL.IDENT       = :NFCROUTLST_IDENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                        and SL.UNITCODE    = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                        and L.IN_DOCUMENT  = SL.DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                        and L.IN_UNITCODE  = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                        and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps') || ')))');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.DOC_TYPE = DT.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.STORE = S.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                %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);
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NCOMPANY', NVALUE => NCOMPANY);
 | ||
|       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 => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
 | ||
|       PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST_IDENT', NVALUE => NFCROUTLST_IDENT);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       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_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 7);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
 | ||
|       /* Делаем выборку */
 | ||
|       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     => 'SDOC_INFO',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 2);
 | ||
|         /* Если тип = 3, то необходимо включать состояние */
 | ||
|         if (NTYPE = 3) then
 | ||
|           PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                 SNAME     => 'SDOC_STATE',
 | ||
|                                                 ICURSOR   => ICURSOR,
 | ||
|                                                 NPOSITION => 3);
 | ||
|         end if;
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'DWORK_DATE',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SDOC_VALID_INFO',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SOUT_DEPARTMENT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTORE', ICURSOR => ICURSOR, NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NQUANT_FACT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 8);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|       end loop;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|         raise;
 | ||
|     end;
 | ||
|     /* Очищаем отмеченные маршрутные листы */
 | ||
|     P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   exception
 | ||
|     when others then
 | ||
|       /* Очищаем отмеченные маршрутные листы */
 | ||
|       P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|       raise;
 | ||
|   end INCOMEFROMDEPS_DG_GET;
 | ||
|   
 | ||
|   /* Получение таблицы строк комплектации на основании маршрутного листа */
 | ||
|   procedure FCDELIVERYLISTSP_DG_GET
 | ||
|   (
 | ||
|     NFCROUTLST              in number,                             -- Рег. номер маршрутного листа
 | ||
|     NPAGE_NUMBER            in number,                             -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,                             -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,                               -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,                             -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     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
 | ||
|     /* Читем сортировки */
 | ||
|     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   => 'Рег. номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SMATRESPL_CODE',
 | ||
|                                                SCAPTION   => 'Обозначение',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SMATRESPL_NAME',
 | ||
|                                                SCAPTION   => 'Наименование',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NPROD_QUANT',
 | ||
|                                                SCAPTION   => 'Применяемость',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT_PLAN',
 | ||
|                                                SCAPTION   => 'Количество план',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NREST',
 | ||
|                                                SCAPTION   => 'Остаток',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT_FACT',
 | ||
|                                                SCAPTION   => 'Скомплектовано',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'DRES_DATE_TO',
 | ||
|                                                SCAPTION   => 'Зарезервировано',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SMATRESPL_NOMEN',
 | ||
|                                                SCAPTION   => 'Номенклатура',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true);
 | ||
|     /* Обходим данные */
 | ||
|     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 min(T.RN) NRN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.RES_DATE_TO DRES_DATE_TO,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       NP.NOMEN_CODE SMATRESPL_NOMEN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       CP.CODE SMATRESPL_CODE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       CP."NAME" SMATRESPL_NAME,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.PROD_QUANT NPROD_QUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       sum(T.QUANT_PLAN) NQUANT_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.REST NREST,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       sum(T.QUANT_FACT) NQUANT_FACT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from DOCLINKS DL,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCDELIVERYLIST TL,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCDELIVERYLISTSP T,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCMATRESOURCE CP left outer join DICNOMNS NP on CP.NOMENCLATURE = NP.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where DL.IN_DOCUMENT = :NFCROUTLST');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostDeliveryLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and TL.RN = DL.OUT_DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and TL.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.PRN = TL.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.MATRESPL = CP.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and exists (select null from V_USERPRIV UP where (UP."CATALOG" = T.CRN))');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and exists (select null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from V_USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP.JUR_PERS = T.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostDeliveryLists') || ')');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 group by T.RES_DATE_TO, NP.NOMEN_CODE, CP.CODE, CP."NAME", T.PROD_QUANT, T.REST');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 %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);
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NCOMPANY', NVALUE => NCOMPANY);
 | ||
|       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 => 'NFCROUTLST', NVALUE => NFCROUTLST);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 2);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
 | ||
|       /* Делаем выборку */
 | ||
|       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_COLD(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'DRES_DATE_TO',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SMATRESPL_NOMEN',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SMATRESPL_CODE',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SMATRESPL_NAME',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NPROD_QUANT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NQUANT_PLAN',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NREST', ICURSOR => ICURSOR, NPOSITION => 8);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NQUANT_FACT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 9);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|       end loop;
 | ||
|     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 FCDELIVERYLISTSP_DG_GET;
 | ||
|   
 | ||
|   /* Получение таблицы товарных запасов на основании маршрутного листа */
 | ||
|   procedure GOODSPARTIES_DG_GET
 | ||
|   (
 | ||
|     NFCROUTLST              in number,                             -- Рег. номер маршрутного листа
 | ||
|     NPAGE_NUMBER            in number,                             -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,                             -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,                               -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,                             -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NSTORAGE                PKG_STD.TREF;                          -- Рег. номер склада списания
 | ||
|     NSTORAGE_IN             PKG_STD.TREF;                          -- Рег. номер склада получения
 | ||
|     NNOMENCLATURE           PKG_STD.TREF;                          -- Рег. номер номенклатуры основного материала
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     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;                               -- Курсор для исполнения запроса
 | ||
|     DDATE                   PKG_STD.TLDATE;                        -- Дата с/по
 | ||
|   begin
 | ||
|     /* Считываем информацию из маршрутного листа */
 | ||
|     begin
 | ||
|       select T.STORAGE,
 | ||
|              T.STORAGE_IN,
 | ||
|              F.NOMENCLATURE
 | ||
|         into NSTORAGE,
 | ||
|              NSTORAGE_IN,
 | ||
|              NNOMENCLATURE
 | ||
|         from FCROUTLST     T,
 | ||
|              FCMATRESOURCE F
 | ||
|        where T.MATRES_PLAN = F.RN(+)
 | ||
|          and T.RN = NFCROUTLST;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NSTORAGE      := null;
 | ||
|         NSTORAGE_IN   := null;
 | ||
|         NNOMENCLATURE := null;
 | ||
|     end;
 | ||
|     /* Если номенклатура не указана */
 | ||
|     if ((NNOMENCLATURE is null) or ((NSTORAGE is null) and (NSTORAGE_IN is null))) then
 | ||
|       /* Не идем дальше */
 | ||
|       return;
 | ||
|     end if;
 | ||
|     /* Инициализируем даты */
 | ||
|     DDATE := TRUNC(sysdate);
 | ||
|     /* Читем сортировки */
 | ||
|     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);
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SINDOC',
 | ||
|                                                SCAPTION   => 'Партия',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SSTORE',
 | ||
|                                                SCAPTION   => 'Склад',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NSALE',
 | ||
|                                                SCAPTION   => 'К продаже',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NRESTFACT',
 | ||
|                                                SCAPTION   => 'Фактический остаток',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NRESERV',
 | ||
|                                                SCAPTION   => 'Резерв',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true,
 | ||
|                                                BFILTER    => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SPRICEMEAS',
 | ||
|                                                SCAPTION   => 'Единица измерения',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     /* Обходим данные */
 | ||
|     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 I.CODE SINDOC,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       AZ.AZS_NUMBER SSTORE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       least(H.MIN_RESTPLAN,H.MIN_RESTFACT) NSALE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       H.RESTFACT NRESTFACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       H.RESERV NRESERV,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       case coalesce(GRP.NMEASTYPE, 0)');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         when 0 then MU1.MEAS_MNEMO');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         when 1 then MU2.MEAS_MNEMO');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         when 2 then MU3.MEAS_MNEMO');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       end SPRICEMEAS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from GOODSPARTIES G,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       NOMMODIF MF,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DICNOMNS NOM left outer join DICMUNTS MU2 on NOM.UMEAS_ALT = MU2.RN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       GOODSSUPPLYHIST H left outer join NOMNMODIFPACK PAC on H.NOMNMODIFPACK = PAC.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       left outer join NOMNPACK NPAC on PAC.NOMENPACK = NPAC.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       left outer join DICMUNTS MU3 on NPAC.UMEAS = MU3.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       left outer join V_GOODSSUPPLY_REGPRICE GRP on H.RN = GRP.NGOODSSUPPLYHIST,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       INCOMDOC I,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       GOODSSUPPLY S,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DICMUNTS MU1,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       AZSAZSLISTMT AZ');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where G.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and G.NOMMODIF = MF.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and NOM.RN = MF.PRN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and NOM.RN = :NNOMENCLATURE');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and I.RN = G.INDOC');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and S.PRN = G.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and (((:NSTORAGE is not null) and (S.STORE = :NSTORAGE)) or ((:NSTORAGE_IN is not null) and (S.STORE = :NSTORAGE_IN)))');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and H.PRN = S.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and AZ.RN = S.STORE');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and H.DATE_FROM <= :DDATE');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and (H.DATE_TO >= :DDATE or H.DATE_TO is null)');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and NOM.UMEAS_MAIN = MU1.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and H.RESTFACT <> ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP.JUR_PERS = G.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'GoodsParties'));
 | ||
|       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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                     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_JUR_PERS_AUTHID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP.JUR_PERS = G.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'GoodsParties'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.AUTHID   = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                %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);
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NCOMPANY', NVALUE => NCOMPANY);
 | ||
|       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 => 'NNOMENCLATURE', NVALUE => NNOMENCLATURE);
 | ||
|       PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NSTORAGE', NVALUE => NSTORAGE);
 | ||
|       PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NSTORAGE_IN', NVALUE => NSTORAGE_IN);
 | ||
|       PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE', DVALUE => DDATE);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       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);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
 | ||
|       /* Делаем выборку */
 | ||
|       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     => 'SINDOC',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 1,
 | ||
|                                               BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTORE', ICURSOR => ICURSOR, NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSALE', ICURSOR => ICURSOR, NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NRESTFACT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRESERV', ICURSOR => ICURSOR, NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SPRICEMEAS',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 6);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|       end loop;
 | ||
|     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 GOODSPARTIES_DG_GET;
 | ||
|   
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по детали) */
 | ||
|   procedure FCROUTLST_DG_BY_DTL
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,                             -- Рег. номер связанной спецификации плана
 | ||
|     NPAGE_NUMBER            in number,                             -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,                             -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,                               -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,                             -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     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
 | ||
|     /* Читем сортировки */
 | ||
|     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   => 'Рег. номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOCPREF',
 | ||
|                                                SCAPTION   => 'Префикс',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOCNUMB',
 | ||
|                                                SCAPTION   => 'Номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'DEXEC_DATE',
 | ||
|                                                SCAPTION   => 'Дата запуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SMATRES_PLAN_NOMEN',
 | ||
|                                                SCAPTION   => 'Номенклатура основного материала',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SMATRES_PLAN_NAME',
 | ||
|                                                SCAPTION   => 'Наименование основного материала',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT',
 | ||
|                                                SCAPTION   => 'Количество запуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT_PLAN',
 | ||
|                                                SCAPTION   => 'Выдать по норме',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     /* Обходим данные */
 | ||
|     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 T.RN NRN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.DOCPREF SDOCPREF,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.DOCNUMB SDOCNUMB,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.EXEC_DATE DEXEC_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select NM2.NOMEN_CODE from DICNOMNS NM2 where F3.NOMENCLATURE = NM2.RN) SMATRES_PLAN_NOMEN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       F3."NAME" SMATRES_PLAN_NAME,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT NQUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT_PLAN NQUANT_PLAN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from FCROUTLST T');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       left outer join FCMATRESOURCE F3 on T.MATRES_PLAN = F3.RN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DOCLINKS DL');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where DL.IN_DOCUMENT = :NFCPRODPLANSP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.RN = DL.OUT_DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and 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" = T.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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                     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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP."CATALOG" = T.CRN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.AUTHID  = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP.JUR_PERS = T.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                     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_JUR_PERS_AUTHID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP.JUR_PERS = T.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.AUTHID = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                %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);
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NCOMPANY', NVALUE => NCOMPANY);
 | ||
|       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 => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       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_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
 | ||
|       /* Делаем выборку */
 | ||
|       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     => 'SDOCPREF',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'DEXEC_DATE',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SMATRES_PLAN_NOMEN',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'SMATRES_PLAN_NAME',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NQUANT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NQUANT_PLAN',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 8);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|       end loop;
 | ||
|     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 FCROUTLST_DG_BY_DTL;
 | ||
|   
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по изделию) */
 | ||
|   procedure FCROUTLST_DG_BY_PRDCT
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,                             -- Рег. номер связанной спецификации плана
 | ||
|     NPAGE_NUMBER            in number,                             -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,                             -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,                               -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,                             -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     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
 | ||
|     /* Читем сортировки */
 | ||
|     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   => 'Рег. номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOCPREF',
 | ||
|                                                SCAPTION   => 'Префикс',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOCNUMB',
 | ||
|                                                SCAPTION   => 'Номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'DEXEC_DATE',
 | ||
|                                                SCAPTION   => 'Дата запуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT',
 | ||
|                                                SCAPTION   => 'Количество запуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'DREL_DATE',
 | ||
|                                                SCAPTION   => 'Дата выпуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NREL_QUANT',
 | ||
|                                                SCAPTION   => 'Количество выпуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     /* Обходим данные */
 | ||
|     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 T.RN        NRN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.DOCPREF   SDOCPREF,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.DOCNUMB   SDOCNUMB,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.EXEC_DATE DEXEC_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT     NQUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.REL_DATE  DREL_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.REL_QUANT NREL_QUANT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from FCROUTLST T,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DOCLINKS DL');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where DL.IN_DOCUMENT = :NFCPRODPLANSP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.RN = DL.OUT_DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and 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" = T.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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                     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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP."CATALOG" = T.CRN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.AUTHID  = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP.JUR_PERS = T.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                     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_JUR_PERS_AUTHID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where UP.JUR_PERS = T.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and UP.AUTHID = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                %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);
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NCOMPANY', NVALUE => NCOMPANY);
 | ||
|       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 => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       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_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
 | ||
|       /* Делаем выборку */
 | ||
|       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     => 'SDOCPREF',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'DEXEC_DATE',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NQUANT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'DREL_DATE',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NREL_QUANT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 7);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|       end loop;
 | ||
|     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 FCROUTLST_DG_BY_PRDCT;
 | ||
|   
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана (для приходов) */
 | ||
|   procedure FCROUTLST_DG_BY_DEPS
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,                             -- Рег. номер связанной спецификации плана
 | ||
|     NPAGE_NUMBER            in number,                             -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,                             -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,                               -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,                             -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     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
 | ||
|     /* Читем сортировки */
 | ||
|     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   => 'Рег. номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOCPREF',
 | ||
|                                                SCAPTION   => 'Префикс',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'SDOCNUMB',
 | ||
|                                                SCAPTION   => 'Номер',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'DEXEC_DATE',
 | ||
|                                                SCAPTION   => 'Дата запуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT',
 | ||
|                                                SCAPTION   => 'Количество запуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'DREL_DATE',
 | ||
|                                                SCAPTION   => 'Дата выпуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NREL_QUANT',
 | ||
|                                                SCAPTION   => 'Количество выпуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NREL_QUANT',
 | ||
|                                                SCAPTION   => 'Количество выпуска',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NQUANT_FACT',
 | ||
|                                                SCAPTION   => 'Сдано',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                                SNAME      => 'NPROCENT',
 | ||
|                                                SCAPTION   => '% готовности',
 | ||
|                                                SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                                BVISIBLE   => true,
 | ||
|                                                BORDER     => true);
 | ||
|     /* Обходим данные */
 | ||
|     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 P.NRN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.SDOCPREF,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.SDOCNUMB,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.DEXEC_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.NQUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.DREL_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.NREL_QUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.NQUANT_FACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       case when (P.NT_SHT_PLAN <> 0) then P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 else 0 end NPROCENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from (select T.RN        NRN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               T.DOCPREF   SDOCPREF,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               T.DOCNUMB   SDOCNUMB,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               T.EXEC_DATE DEXEC_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               T.QUANT     NQUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               T.REL_DATE  DREL_DATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               T.REL_QUANT NREL_QUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               (select SUM(SP.QUANT_FACT)');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  from DOCLINKS           D,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                       INCOMEFROMDEPSSPEC SP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 where D.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                       and D.IN_DOCUMENT = T.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                       and D.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                       and SP.PRN = D.OUT_DOCUMENT) NQUANT_FACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               (select SUM(SP.LABOUR_FACT)');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  from FCROUTLSTSP SP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 where SP.PRN = T.RN) NLABOUR_FACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               (select SUM(SP.T_SHT_PLAN)');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  from FCROUTLSTSP SP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 where SP.PRN = T.RN) NT_SHT_PLAN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from FCROUTLST T,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               DOCLINKS DL');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where DL.IN_DOCUMENT = :NFCPRODPLANSP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and T.RN = DL.OUT_DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and T.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and T."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and 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" = T.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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                             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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                        where UP."CATALOG" = T.CRN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                          and UP.AUTHID  = UTILIZER())');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT =>  'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                         from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                        where UP.JUR_PERS = T.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                          and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       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');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                             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_JUR_PERS_AUTHID)') || ' null');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                         from USERPRIV UP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                        where UP.JUR_PERS = T.JUR_PERS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                          and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                          and UP.AUTHID = UTILIZER())) P');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                %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);
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NCOMPANY', NVALUE => NCOMPANY);
 | ||
|       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 => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       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_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
 | ||
|       /* Делаем выборку */
 | ||
|       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 => 'SDOCPREF', ICURSOR => ICURSOR, NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'DEXEC_DATE',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NQUANT', ICURSOR => ICURSOR, NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'DREL_DATE',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NREL_QUANT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                               SNAME     => 'NQUANT_FACT',
 | ||
|                                               ICURSOR   => ICURSOR,
 | ||
|                                               NPOSITION => 8);
 | ||
|         PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROCENT', ICURSOR => ICURSOR, NPOSITION => 9);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|       end loop;
 | ||
|     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 FCROUTLST_DG_BY_DEPS;
 | ||
|   
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
 | ||
|   procedure FCROUTLST_DG_GET
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,  -- Рег. номер связанной спецификации плана
 | ||
|     NTYPE                   in number,  -- Тип спецификации плана (0 - Деталь, 1 - Изделие/сборочная единица, 3/4 - ПиП)
 | ||
|     NPAGE_NUMBER            in number,  -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,  -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,    -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,  -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob    -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Выбираем сборку таблицы, исходя из типа спецификации плана */
 | ||
|     case
 | ||
|       /* Деталь */
 | ||
|       when (NTYPE = 0) then
 | ||
|         /* Получаем таблицу по детали */
 | ||
|         FCROUTLST_DG_BY_DTL(NFCPRODPLANSP => NFCPRODPLANSP,
 | ||
|                             NPAGE_NUMBER  => NPAGE_NUMBER,
 | ||
|                             NPAGE_SIZE    => NPAGE_SIZE,
 | ||
|                             CORDERS       => CORDERS,
 | ||
|                             NINCLUDE_DEF  => NINCLUDE_DEF,
 | ||
|                             COUT          => COUT);
 | ||
|       /* Изделие/сборочная единица */
 | ||
|       when (NTYPE = 1) then
 | ||
|         /* Получаем таблицу по изделию */
 | ||
|         FCROUTLST_DG_BY_PRDCT(NFCPRODPLANSP => NFCPRODPLANSP,
 | ||
|                               NPAGE_NUMBER  => NPAGE_NUMBER,
 | ||
|                               NPAGE_SIZE    => NPAGE_SIZE,
 | ||
|                               CORDERS       => CORDERS,
 | ||
|                               NINCLUDE_DEF  => NINCLUDE_DEF,
 | ||
|                               COUT          => COUT);
 | ||
|       /* Для приходов из подразделений */
 | ||
|       when ((NTYPE = 3) or (NTYPE = 4)) then
 | ||
|         /* Получаем таблицу по приходу */
 | ||
|         FCROUTLST_DG_BY_DEPS(NFCPRODPLANSP => NFCPRODPLANSP,
 | ||
|                              NPAGE_NUMBER  => NPAGE_NUMBER,
 | ||
|                              NPAGE_SIZE    => NPAGE_SIZE,
 | ||
|                              CORDERS       => CORDERS,
 | ||
|                              NINCLUDE_DEF  => NINCLUDE_DEF,
 | ||
|                              COUT          => COUT);
 | ||
|       else
 | ||
|         P_EXCEPTION(0,
 | ||
|                     'Не определен тип получения таблицы маршрутных листов.');
 | ||
|     end case;
 | ||
|   end FCROUTLST_DG_GET;
 | ||
| 
 | ||
|   /* Формирование характеристик спецификации в Ганте */
 | ||
|   procedure MAKE_GANT_ITEM
 | ||
|   (
 | ||
|     NDEFRESLIZ              in number,       -- Дефицит запуска
 | ||
|     NREL_FACT               in number,       -- Выпуск факт
 | ||
|     NDEFSTART               in number,       -- Дефицит выпуска
 | ||
|     NMAIN_QUANT             in number,       -- Выпуск
 | ||
|     STASK_BG_COLOR          out varchar2,    -- Цвет заливки спецификации
 | ||
|     STASK_BG_PROGRESS_COLOR out varchar2,    -- Цвет заливки прогресса спецификации
 | ||
|     STASK_TEXT_COLOR        in out varchar2, -- Цвет текста
 | ||
|     NTASK_PROGRESS          out number       -- Прогресс спецификации
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Если дефицит запуска <> 0 */
 | ||
|     if (NDEFRESLIZ <> 0) then
 | ||
|       /* Если дефицит выпуска = 0 */
 | ||
|       if (NDEFSTART = 0) then
 | ||
|         /* Полностью зеленый */
 | ||
|         STASK_BG_COLOR          := SBG_COLOR_GREEN;
 | ||
|         STASK_TEXT_COLOR        := STEXT_COLOR_GREY;
 | ||
|         STASK_BG_PROGRESS_COLOR := null;
 | ||
|         NTASK_PROGRESS          := null;
 | ||
|       else
 | ||
|         /* Полностью красный */
 | ||
|         STASK_BG_COLOR          := SBG_COLOR_RED;
 | ||
|         STASK_BG_PROGRESS_COLOR := null;
 | ||
|         NTASK_PROGRESS          := null;
 | ||
|       end if;
 | ||
|     else
 | ||
|       /* Если дефицит выпуска = 0 */
 | ||
|       if (NDEFSTART = 0) then
 | ||
|         /* Полностью зеленый */
 | ||
|         STASK_BG_COLOR          := SBG_COLOR_GREEN;
 | ||
|         STASK_TEXT_COLOR        := STEXT_COLOR_GREY;
 | ||
|         STASK_BG_PROGRESS_COLOR := null;
 | ||
|         NTASK_PROGRESS          := null;
 | ||
|       else
 | ||
|         /* Если дефицит запуска = 0 и выпуск факт = 0 */
 | ||
|         if ((NDEFRESLIZ = 0) and (NREL_FACT = 0)) then
 | ||
|           /* Полностью жёлтый */
 | ||
|           STASK_BG_COLOR          := SBG_COLOR_YELLOW;
 | ||
|           STASK_BG_PROGRESS_COLOR := null;
 | ||
|           NTASK_PROGRESS          := null;
 | ||
|         end if;
 | ||
|         /* Если дефицит запуска = 0 и выпуск факт <> 0 */
 | ||
|         if ((NDEFRESLIZ = 0) and (NREL_FACT <> 0)) then
 | ||
|           /* Частично зелёный, прогресс жёлтый */
 | ||
|           STASK_BG_COLOR          := SBG_COLOR_GREEN;
 | ||
|           STASK_BG_PROGRESS_COLOR := SBG_COLOR_YELLOW;
 | ||
|           STASK_TEXT_COLOR        := STEXT_COLOR_GREY;
 | ||
|           NTASK_PROGRESS          := ROUND(NREL_FACT / NMAIN_QUANT * 100);
 | ||
|         end if;
 | ||
|       end if;
 | ||
|     end if;
 | ||
|   end MAKE_GANT_ITEM;
 | ||
| 
 | ||
|   /* Считывание максимального уровня иерархии плана по каталогу */
 | ||
|   function PRODPLAN_MAX_LEVEL_GET
 | ||
|   (
 | ||
|     NCRN                    in number        -- Рег. номер каталога планов
 | ||
|   ) return                  number           -- Максимальный уровень иерархии
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TNUMBER; -- Максимальный уровень иерархии
 | ||
|   begin
 | ||
|     /* Считываем максимальный уровень */
 | ||
|     begin
 | ||
|       select max(level)
 | ||
|         into NRESULT
 | ||
|         from (select T.RN,
 | ||
|                      T.UP_LEVEL
 | ||
|                 from FCPRODPLAN   P,
 | ||
|                      FCPRODPLANSP T,
 | ||
|                      FINSTATE     FS
 | ||
|                where P.CRN = NCRN
 | ||
|                  and P.CATEGORY = NFCPRODPLAN_CATEGORY
 | ||
|                  and P.STATUS = NFCPRODPLAN_STATUS
 | ||
|                  and FS.RN = P.TYPE
 | ||
|                  and FS.CODE = SFCPRODPLAN_TYPE
 | ||
|                  and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
 | ||
|                        null
 | ||
|                         from USERPRIV UP
 | ||
|                        where UP.JUR_PERS = P.JUR_PERS
 | ||
|                          and UP.UNITCODE = 'CostProductPlans'
 | ||
|                          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_JUR_PERS_AUTHID) */
 | ||
|                        null
 | ||
|                         from USERPRIV UP
 | ||
|                        where UP.JUR_PERS = P.JUR_PERS
 | ||
|                          and UP.UNITCODE = 'CostProductPlans'
 | ||
|                          and UP.AUTHID = UTILIZER())
 | ||
|                  and T.PRN = P.RN
 | ||
|                  and T.MAIN_QUANT > 0) TMP
 | ||
|       connect by prior TMP.RN = TMP.UP_LEVEL
 | ||
|        start with TMP.UP_LEVEL is null;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := null;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end PRODPLAN_MAX_LEVEL_GET;
 | ||
| 
 | ||
|   /* Определение дат спецификации плана */
 | ||
|   procedure FCPRODPLANSP_DATES_GET
 | ||
|   (
 | ||
|     DREP_DATE               in date,        -- Дата запуска спецификации
 | ||
|     DREP_DATE_TO            in date,        -- Дата выпуска спецификации
 | ||
|     DINCL_DATE              in date,        -- Дата включения в план спецификации
 | ||
|     NHAVE_LINK              in number := 0, -- Наличие связей с "Маршрутный лист" или "Приход из подразделения"
 | ||
|     DDATE_FROM              out date,       -- Итоговая дата запуска спецификации
 | ||
|     DDATE_TO                out date,       -- Итоговая дата выпуска спецификации
 | ||
|     STASK_BG_COLOR          out varchar2,   -- Цвет элемента
 | ||
|     STASK_BG_PROGRESS_COLOR out varchar2,   -- Цвет прогресса элемента
 | ||
|     STASK_TEXT_COLOR        out varchar2,   -- Цвет текста элемента
 | ||
|     NTASK_PROGRESS          out number      -- Прогресс элемента
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Проициниализируем цвет и прогресс */
 | ||
|     STASK_BG_COLOR          := null;
 | ||
|     STASK_TEXT_COLOR        := null;
 | ||
|     STASK_BG_PROGRESS_COLOR := null;
 | ||
|     NTASK_PROGRESS          := null;
 | ||
|     /* Если даты запуска и выпуска пусты */
 | ||
|     if ((DREP_DATE is null) and (DREP_DATE_TO is null)) then
 | ||
|       /* Указываем дату включения в план */
 | ||
|       DDATE_FROM := DINCL_DATE;
 | ||
|       DDATE_TO   := DINCL_DATE;
 | ||
|     else
 | ||
|       /* Указываем даты исходя из дат запуска/выпуска */
 | ||
|       DDATE_FROM := COALESCE(DREP_DATE, DREP_DATE_TO);
 | ||
|       DDATE_TO   := COALESCE(DREP_DATE_TO, DREP_DATE);
 | ||
|     end if;
 | ||
|     /* Если одна из дат не указана */
 | ||
|     if ((DREP_DATE is null) or (DREP_DATE_TO is null)) then
 | ||
|       /* Если спецификация также не имеет связей */
 | ||
|       if (NHAVE_LINK = 0) then
 | ||
|         /* Закрашиваем в черный */
 | ||
|         STASK_BG_COLOR   := SBG_COLOR_BLACK;
 | ||
|         STASK_TEXT_COLOR := STEXT_COLOR_ORANGE;
 | ||
|         NTASK_PROGRESS   := null;
 | ||
|       end if;
 | ||
|     end if;
 | ||
|     /* Если нет связанных документов */
 | ||
|     if (NHAVE_LINK = 0) then
 | ||
|       /* Если дата запуска меньше текущей даты */
 | ||
|       if (DREP_DATE <= sysdate) then
 | ||
|         /* Закрашиваем в красный */
 | ||
|         STASK_BG_COLOR   := SBG_COLOR_RED;
 | ||
|         STASK_TEXT_COLOR := null;
 | ||
|         NTASK_PROGRESS   := null;
 | ||
|       end if;
 | ||
|       /* Если дата больше текущей даты */
 | ||
|       if (DREP_DATE > sysdate) then
 | ||
|         /* Закрашиваем в серый */
 | ||
|         STASK_BG_COLOR   := SBG_COLOR_GREY;
 | ||
|         STASK_TEXT_COLOR := null;
 | ||
|         NTASK_PROGRESS   := null;
 | ||
|       end if;
 | ||
|     end if;
 | ||
|   end FCPRODPLANSP_DATES_GET;
 | ||
| 
 | ||
|   /* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
 | ||
|   procedure FCPRODPLANSP_GET
 | ||
|   (
 | ||
|     NCRN                    in number,                             -- Рег. номер каталога
 | ||
|     NLEVEL                  in number := null,                     -- Уровень отбора
 | ||
|     SSORT_FIELD             in varchar2 := 'DREP_DATE_TO',         -- Поле сортировки
 | ||
|     COUT                    out clob,                              -- Список задач
 | ||
|     NMAX_LEVEL              out number                             -- Максимальный уровень иерархии
 | ||
|   )
 | ||
|   is
 | ||
|     /* Переменные */
 | ||
|     RG                      PKG_P8PANELS_VISUAL.TGANTT;            -- Описание диаграммы Ганта
 | ||
|     RGT                     PKG_P8PANELS_VISUAL.TGANTT_TASK;       -- Описание задачи для диаграммы
 | ||
|     BREAD_ONLY_DATES        boolean := false;                      -- Флаг доступности дат проекта только для чтения
 | ||
|     STASK_BG_COLOR          PKG_STD.TSTRING;                       -- Цвет заливки задачи
 | ||
|     STASK_TEXT_COLOR        PKG_STD.TSTRING;                       -- Цвет текста задачи
 | ||
|     STASK_BG_PROGRESS_COLOR PKG_STD.TSTRING;                       -- Цвет заливки прогресса задачи
 | ||
|     NTASK_PROGRESS          PKG_STD.TNUMBER;                       -- Прогресс выполнения задачи
 | ||
|     DDATE_FROM              PKG_STD.TLDATE;                        -- Дата запуска спецификации
 | ||
|     DDATE_TO                PKG_STD.TLDATE;                        -- Дата выпуска спецификации
 | ||
|     STASK_CAPTION           PKG_STD.TSTRING;                       -- Описание задачи в Ганте
 | ||
|     NTYPE                   PKG_STD.TNUMBER;                       -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска")
 | ||
|     SDETAIL_LIST            PKG_STD.TSTRING;                       -- Ссылки на детализацию
 | ||
|     SPLAN_TITLE             PKG_STD.TSTRING;                       -- Заголовок плана
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
| 
 | ||
|     /* Объединение значений в строковое представление */
 | ||
|     function MAKE_INFO
 | ||
|     (
 | ||
|       SPROD_ORDER           in varchar2,     -- Заказ
 | ||
|       SNOMEN_NAME           in varchar2,     -- Наименование номенклатуры
 | ||
|       SSUBDIV_DLVR          in varchar2,     -- Сдающее подразделение
 | ||
|       NMAIN_QUANT           in number        -- Выпуск
 | ||
|     ) return                varchar2         -- Описание задачи в Ганте
 | ||
|     is
 | ||
|       SRESULT               PKG_STD.TSTRING; -- Описание задачи в Ганте
 | ||
|     begin
 | ||
|       /* Соединяем информацию */
 | ||
|       SRESULT := STRCOMBINE(SPROD_ORDER, SNOMEN_NAME, ', ');
 | ||
|       SRESULT := STRCOMBINE(SRESULT, SSUBDIV_DLVR, ', ');
 | ||
|       SRESULT := STRCOMBINE(SRESULT, TO_CHAR(NMAIN_QUANT), ', ');
 | ||
|       /* Возвращаем результат */
 | ||
|       return SRESULT;
 | ||
|     end MAKE_INFO;
 | ||
| 
 | ||
|     /* Инициализация динамических атрибутов */
 | ||
|     procedure TASK_ATTRS_INIT
 | ||
|     (
 | ||
|       RG                    in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Добавим динамические атрибуты к спецификациям */
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT   => RG,
 | ||
|                                                SNAME    => STASK_ATTR_START_FACT,
 | ||
|                                                SCAPTION => 'Запущено');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT   => RG,
 | ||
|                                                SNAME    => STASK_ATTR_MAIN_QUANT,
 | ||
|                                                SCAPTION => 'Количество план');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT   => RG,
 | ||
|                                                SNAME    => STASK_ATTR_REL_FACT,
 | ||
|                                                SCAPTION => 'Количество сдано');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT   => RG,
 | ||
|                                                SNAME    => STASK_ATTR_REP_DATE_TO,
 | ||
|                                                SCAPTION => 'Дата выпуска план');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT   => RG,
 | ||
|                                                SNAME    => STASK_ATTR_DL,
 | ||
|                                                SCAPTION => 'Анализ отклонений');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_TYPE, SCAPTION => 'Тип');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT   => RG,
 | ||
|                                                SNAME    => STASK_ATTR_MEAS,
 | ||
|                                                SCAPTION => 'Единица измерения');
 | ||
|     end TASK_ATTRS_INIT;
 | ||
| 
 | ||
|     /* Инициализация цветов */
 | ||
|     procedure TASK_COLORS_INIT
 | ||
|     (
 | ||
|       RG                    in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Добавим описание цветов */
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT    => RG,
 | ||
|                                                 SBG_COLOR => SBG_COLOR_RED,
 | ||
|                                                 SDESC     => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0 или ' ||
 | ||
|                                                              'не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» меньше текущей.');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT    => RG,
 | ||
|                                                 SBG_COLOR => SBG_COLOR_YELLOW,
 | ||
|                                                 SDESC     => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» = 0.');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT      => RG,
 | ||
|                                                 SBG_COLOR   => SBG_COLOR_GREEN,
 | ||
|                                                 STEXT_COLOR => STEXT_COLOR_GREY,
 | ||
|                                                 SDESC       => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT             => RG,
 | ||
|                                                 SBG_COLOR          => SBG_COLOR_GREEN,
 | ||
|                                                 SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW,
 | ||
|                                                 STEXT_COLOR        => STEXT_COLOR_GREY,
 | ||
|                                                 SDESC              => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. ');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT      => RG,
 | ||
|                                                 SBG_COLOR   => SBG_COLOR_BLACK,
 | ||
|                                                 STEXT_COLOR => STEXT_COLOR_ORANGE,
 | ||
|                                                 SDESC       => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT    => RG,
 | ||
|                                                 SBG_COLOR => SBG_COLOR_GREY,
 | ||
|                                                 SDESC     => 'Для спецификаций планов и отчетов производства изделий не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» больше текущей.');
 | ||
|     end TASK_COLORS_INIT;
 | ||
| 
 | ||
|     /* Заполнение значений динамических атрибутов */
 | ||
|     procedure FILL_TASK_ATTRS
 | ||
|     (
 | ||
|       RG                    in PKG_P8PANELS_VISUAL.TGANTT,                 -- Описание диаграммы Ганта
 | ||
|       RGT                   in out nocopy PKG_P8PANELS_VISUAL.TGANTT_TASK, -- Описание задачи для диаграммы
 | ||
|       NSTART_FACT           in number,                                     -- Запуск факт
 | ||
|       NMAIN_QUANT           in number,                                     -- Выпуск
 | ||
|       NREL_FACT             in number,                                     -- Выпуск факт
 | ||
|       DREP_DATE_TO          in date,                                       -- Дата выпуска
 | ||
|       NTYPE                 in number,                                     -- Тип (0 - Деталь, 1 - Изделие/сборочная единица)
 | ||
|       SDETAIL_LIST          in varchar2,                                   -- Ссылки на детализацию
 | ||
|       SMEAS                 in varchar2                                    -- Единица измерения
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Добавим доп. атрибуты */
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => STASK_ATTR_START_FACT,
 | ||
|                                                    SVALUE => TO_CHAR(NSTART_FACT),
 | ||
|                                                    BCLEAR => true);
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => STASK_ATTR_MAIN_QUANT,
 | ||
|                                                    SVALUE => TO_CHAR(NMAIN_QUANT));
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => STASK_ATTR_REL_FACT,
 | ||
|                                                    SVALUE => TO_CHAR(NREL_FACT));
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => STASK_ATTR_REP_DATE_TO,
 | ||
|                                                    SVALUE => TO_CHAR(DREP_DATE_TO, 'dd.mm.yyyy hh24:mi'));
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => STASK_ATTR_TYPE,
 | ||
|                                                    SVALUE => TO_CHAR(NTYPE));
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => STASK_ATTR_DL,
 | ||
|                                                    SVALUE => SDETAIL_LIST);
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
 | ||
|                                                    RTASK  => RGT,
 | ||
|                                                    SNAME  => STASK_ATTR_MEAS,
 | ||
|                                                    SVALUE => SMEAS);
 | ||
|     end FILL_TASK_ATTRS;
 | ||
|     
 | ||
|     /* Получение типа задачи */
 | ||
|     procedure GET_TASK_TYPE
 | ||
|     (
 | ||
|       NCOMPANY                in number,   -- Рег. номер организации
 | ||
|       SSORT_FIELD             in varchar2, -- Тип сортировки
 | ||
|       NFCPRODPLAN             in number,   -- Рег. номер плана
 | ||
|       NFCPRODPLANSP           in number,   -- Рег. номер спецификации плана
 | ||
|       STASK_BG_COLOR          in varchar2, -- Цвет заливки задачи
 | ||
|       STASK_BG_PROGRESS_COLOR in varchar2, -- Цвет заливки прогресса
 | ||
|       NTYPE                   out number,  -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска")
 | ||
|       SDETAIL_LIST            out varchar2 -- Ссылки на детализацию
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* 
 | ||
|         Описание типов:
 | ||
|          0 - Маршрутные листы с развертыванием товарных запасов 
 | ||
|          1 - Маршрутные листы с развертыванием комплектаций
 | ||
|          2 - Приход из подразделений
 | ||
|          3 - Приход из подразделений и маршрутные листы
 | ||
|          4 - Маршрутные листы
 | ||
|          null - Нет детализации 
 | ||
|       */
 | ||
|       /* Исходим сортировка по "Дата запуска" */
 | ||
|       if (SSORT_FIELD = 'DREP_DATE') then
 | ||
|         /* Если цвет - красный */
 | ||
|         if (STASK_BG_COLOR = SBG_COLOR_RED) then
 | ||
|           /* Проверяем деталь или изделие */
 | ||
|           begin
 | ||
|             select 1
 | ||
|               into NTYPE
 | ||
|               from DUAL
 | ||
|              where exists (select null
 | ||
|                       from FCPRODPLANSP SP
 | ||
|                      where SP.PRN = NFCPRODPLAN
 | ||
|                        and SP.UP_LEVEL = NFCPRODPLANSP);
 | ||
|           exception
 | ||
|             when others then
 | ||
|               NTYPE := 0;
 | ||
|           end;
 | ||
|           /* Проверяем наличие связей с маршрутными листами */
 | ||
|           if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 0) = 0) then
 | ||
|             /* Указываем, что маршрутных листов нет */
 | ||
|             SDETAIL_LIST := 'Нет маршрутных листов';
 | ||
|             NTYPE        := null;
 | ||
|           else
 | ||
|             /* Указываем, что маршрутные листы есть */
 | ||
|             SDETAIL_LIST := 'Маршрутные листы';
 | ||
|           end if;
 | ||
|         else
 | ||
|           /* Не отображаем информацию о маршрутных листах */
 | ||
|           NTYPE        := null;
 | ||
|           SDETAIL_LIST := null;
 | ||
|         end if;
 | ||
|       else
 | ||
|         /* Если цвет зеленый */
 | ||
|         if (STASK_BG_COLOR = SBG_COLOR_GREEN) then
 | ||
|           /* Если полностью зеленый */
 | ||
|           if (STASK_BG_PROGRESS_COLOR is null) then
 | ||
|             /* Проверяем наличией связей с приходов из подразделений */
 | ||
|             if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 2) = 0) then
 | ||
|               /* Указываем, что приходов из подразделений нет */
 | ||
|               SDETAIL_LIST := 'Нет приходов из подразделений';
 | ||
|               NTYPE        := null;
 | ||
|             else
 | ||
|               /* Указываем, что приходы из подразделений есть */
 | ||
|               SDETAIL_LIST := 'Приход из подразделений';
 | ||
|               NTYPE        := 2;
 | ||
|             end if;
 | ||
|           end if;
 | ||
|           /* Если желтно-зеленый */
 | ||
|           if (STASK_BG_PROGRESS_COLOR = SBG_COLOR_YELLOW) then
 | ||
|             /* Проверяем наличией связей с приходов из подразделений */
 | ||
|             if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP) = 0) then
 | ||
|               /* Указываем, что приходов из подразделений нет */
 | ||
|               SDETAIL_LIST := 'Нет приходов из подразделений';
 | ||
|               NTYPE        := null;
 | ||
|             else
 | ||
|               /* Указываем, что приходы из подразделений есть */
 | ||
|               SDETAIL_LIST := 'Приход из подразделений';
 | ||
|               NTYPE        := 3;
 | ||
|             end if;
 | ||
|           end if;
 | ||
|         else
 | ||
|           /* Если цвет полностью желтый или красный */
 | ||
|           if ((STASK_BG_COLOR = SBG_COLOR_YELLOW) or (STASK_BG_COLOR = SBG_COLOR_RED)) then
 | ||
|             /* Проверяем наличие связей с маршрутными листами */
 | ||
|             if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 1) = 0) then
 | ||
|               /* Указываем, что маршрутных листов нет */
 | ||
|               SDETAIL_LIST := 'Нет маршрутных листов';
 | ||
|               NTYPE        := null;
 | ||
|             else
 | ||
|               /* Указываем, что маршрутные листы есть */
 | ||
|               SDETAIL_LIST := 'Маршрутные листы';
 | ||
|               NTYPE        := 4;
 | ||
|             end if;
 | ||
|           else
 | ||
|             /* Для данных критериев ничего не выводится */
 | ||
|             NTYPE        := null;
 | ||
|             SDETAIL_LIST := null;
 | ||
|           end if;
 | ||
|         end if;
 | ||
|       end if;
 | ||
|     end GET_TASK_TYPE;
 | ||
|   begin
 | ||
|     /* Определяем заголовок плана */
 | ||
|     FIND_ACATALOG_RN(NFLAG_SMART => 0,
 | ||
|                      NCOMPANY    => NCOMPANY,
 | ||
|                      NVERSION    => null,
 | ||
|                      SUNITCODE   => 'CostProductPlans',
 | ||
|                      NRN         => NCRN,
 | ||
|                      SNAME       => SPLAN_TITLE);
 | ||
|     /* Инициализируем диаграмму Ганта */
 | ||
|     RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE              => SPLAN_TITLE,
 | ||
|                                           NZOOM               => PKG_P8PANELS_VISUAL.NGANTT_ZOOM_DAY,
 | ||
|                                           BREAD_ONLY_DATES    => BREAD_ONLY_DATES,
 | ||
|                                           BREAD_ONLY_PROGRESS => true);
 | ||
|     /* Инициализируем динамические атрибуты к спецификациям */
 | ||
|     TASK_ATTRS_INIT(RG => RG);
 | ||
|     /* Инициализируем описания цветов */
 | ||
|     TASK_COLORS_INIT(RG => RG);
 | ||
|     /* Определяем максимальный уровень иерархии */
 | ||
|     NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN);
 | ||
|     /* Обходим данные */
 | ||
|     for C in (select TMP.*,
 | ||
|                      level NTASK_LEVEL
 | ||
|                 from (select T.RN NRN,
 | ||
|                              T.PRN NPRN,
 | ||
|                              (select PORD.NUMB from FACEACC PORD where PORD.RN = T.PROD_ORDER) SPROD_ORDER,
 | ||
|                              T.REP_DATE DREP_DATE,
 | ||
|                              T.REP_DATE_TO DREP_DATE_TO,
 | ||
|                              T.INCL_DATE DINCL_DATE,
 | ||
|                              T.ROUTE SROUTE,
 | ||
|                              (FM.CODE || ', ' || FM.NAME) SNAME,
 | ||
|                              D.NOMEN_NAME SNOMEN_NAME,
 | ||
|                              T.START_FACT NSTART_FACT,
 | ||
|                              (T.QUANT_REST - T.START_FACT) NDEFRESLIZ,
 | ||
|                              T.REL_FACT NREL_FACT,
 | ||
|                              (T.MAIN_QUANT - T.REL_FACT) NDEFSTART,
 | ||
|                              T.MAIN_QUANT NMAIN_QUANT,
 | ||
|                              (select IDD.CODE from INS_DEPARTMENT IDD where IDD.RN = T.SUBDIV_DLVR) SSUBDIV_DLVR,
 | ||
|                              (select 1
 | ||
|                                 from DUAL
 | ||
|                                where exists (select null
 | ||
|                                         from DOCLINKS L
 | ||
|                                        where L.IN_DOCUMENT = T.RN
 | ||
|                                          and L.IN_UNITCODE = 'CostProductPlansSpecs'
 | ||
|                                          and (L.OUT_UNITCODE = 'CostRouteLists' or L.OUT_UNITCODE = 'IncomFromDeps')
 | ||
|                                          and ROWNUM = 1)) NHAVE_LINK,
 | ||
|                              T.UP_LEVEL NUP_LEVEL,
 | ||
|                              case SSORT_FIELD
 | ||
|                                when 'DREP_DATE_TO' then
 | ||
|                                 T.REP_DATE_TO
 | ||
|                                else
 | ||
|                                 T.REP_DATE
 | ||
|                              end DORDER_DATE,
 | ||
|                              DM.MEAS_MNEMO SMEAS
 | ||
|                         from FCPRODPLAN    P,
 | ||
|                              FINSTATE      FS,
 | ||
|                              FCPRODPLANSP  T,
 | ||
|                              FCMATRESOURCE FM,
 | ||
|                              DICNOMNS      D,
 | ||
|                              DICMUNTS      DM
 | ||
|                        where P.CRN = NCRN
 | ||
|                          and P.CATEGORY = NFCPRODPLAN_CATEGORY
 | ||
|                          and P.STATUS = NFCPRODPLAN_STATUS
 | ||
|                          and FS.RN = P.TYPE
 | ||
|                          and FS.CODE = SFCPRODPLAN_TYPE
 | ||
|                          and exists
 | ||
|                        (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
 | ||
|                                null
 | ||
|                                 from USERPRIV UP
 | ||
|                                where UP.JUR_PERS = P.JUR_PERS
 | ||
|                                  and UP.UNITCODE = 'CostProductPlans'
 | ||
|                                  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_JUR_PERS_AUTHID) */
 | ||
|                                null
 | ||
|                                 from USERPRIV UP
 | ||
|                                where UP.JUR_PERS = P.JUR_PERS
 | ||
|                                  and UP.UNITCODE = 'CostProductPlans'
 | ||
|                                  and UP.AUTHID = UTILIZER())
 | ||
|                          and T.PRN = P.RN
 | ||
|                          and T.MAIN_QUANT > 0
 | ||
|                          and ((T.REP_DATE is not null) or (T.REP_DATE_TO is not null) or (T.INCL_DATE is not null))
 | ||
|                          and FM.RN = T.MATRES
 | ||
|                          and D.RN = FM.NOMENCLATURE
 | ||
|                          and D.UMEAS_MAIN = DM.RN) TMP
 | ||
|                where ((NLEVEL is null) or ((NLEVEL is not null) and (level <= NLEVEL)))
 | ||
|               connect by prior TMP.NRN = TMP.NUP_LEVEL
 | ||
|                start with TMP.NUP_LEVEL is null
 | ||
|                order siblings by TMP.DORDER_DATE asc)
 | ||
|     loop
 | ||
|       /* Формируем описание задачи в Ганте */
 | ||
|       STASK_CAPTION := MAKE_INFO(SPROD_ORDER  => C.SPROD_ORDER,
 | ||
|                                  SNOMEN_NAME  => C.SNOMEN_NAME,
 | ||
|                                  SSUBDIV_DLVR => C.SSUBDIV_DLVR,
 | ||
|                                  NMAIN_QUANT  => C.NMAIN_QUANT);
 | ||
|       /* Инициализируем даты и цвет (если необходимо) */
 | ||
|       FCPRODPLANSP_DATES_GET(DREP_DATE               => C.DREP_DATE,
 | ||
|                              DREP_DATE_TO            => C.DREP_DATE_TO,
 | ||
|                              DINCL_DATE              => C.DINCL_DATE,
 | ||
|                              NHAVE_LINK              => COALESCE(C.NHAVE_LINK, 0),
 | ||
|                              DDATE_FROM              => DDATE_FROM,
 | ||
|                              DDATE_TO                => DDATE_TO,
 | ||
|                              STASK_BG_COLOR          => STASK_BG_COLOR,
 | ||
|                              STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
 | ||
|                              STASK_TEXT_COLOR        => STASK_TEXT_COLOR,
 | ||
|                              NTASK_PROGRESS          => NTASK_PROGRESS);
 | ||
|       /* Если цвет изначально не указан и требуется анализирование */
 | ||
|       if (STASK_BG_COLOR is null) then
 | ||
|         /* Формирование характеристик элемента ганта */
 | ||
|         MAKE_GANT_ITEM(NDEFRESLIZ              => C.NDEFRESLIZ,
 | ||
|                        NREL_FACT               => C.NREL_FACT,
 | ||
|                        NDEFSTART               => C.NDEFSTART,
 | ||
|                        NMAIN_QUANT             => C.NMAIN_QUANT,
 | ||
|                        STASK_BG_COLOR          => STASK_BG_COLOR,
 | ||
|                        STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
 | ||
|                        STASK_TEXT_COLOR        => STASK_TEXT_COLOR,
 | ||
|                        NTASK_PROGRESS          => NTASK_PROGRESS);
 | ||
|       end if;
 | ||
|       /* Сформируем основную спецификацию */
 | ||
|       RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN                 => C.NRN,
 | ||
|                                                   SNUMB               => COALESCE(C.SROUTE, 'Отсутствует'),
 | ||
|                                                   SCAPTION            => STASK_CAPTION,
 | ||
|                                                   SNAME               => C.SNAME,
 | ||
|                                                   DSTART              => DDATE_FROM,
 | ||
|                                                   DEND                => DDATE_TO,
 | ||
|                                                   NPROGRESS           => NTASK_PROGRESS,
 | ||
|                                                   SBG_COLOR           => STASK_BG_COLOR,
 | ||
|                                                   STEXT_COLOR         => STASK_TEXT_COLOR,
 | ||
|                                                   SBG_PROGRESS_COLOR  => STASK_BG_PROGRESS_COLOR,
 | ||
|                                                   BREAD_ONLY          => true,
 | ||
|                                                   BREAD_ONLY_DATES    => true,
 | ||
|                                                   BREAD_ONLY_PROGRESS => true);
 | ||
|       /* Определяем тип и ссылки на детализацию */
 | ||
|       GET_TASK_TYPE(NCOMPANY                => NCOMPANY,
 | ||
|                     SSORT_FIELD             => SSORT_FIELD,
 | ||
|                     NFCPRODPLAN             => C.NPRN,
 | ||
|                     NFCPRODPLANSP           => C.NRN,
 | ||
|                     STASK_BG_COLOR          => STASK_BG_COLOR,
 | ||
|                     STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
 | ||
|                     NTYPE                   => NTYPE,
 | ||
|                     SDETAIL_LIST            => SDETAIL_LIST);
 | ||
|       /* Заполним значение динамических атрибутов */
 | ||
|       FILL_TASK_ATTRS(RG           => RG,
 | ||
|                       RGT          => RGT,
 | ||
|                       NSTART_FACT  => C.NSTART_FACT,
 | ||
|                       NMAIN_QUANT  => C.NMAIN_QUANT,
 | ||
|                       NREL_FACT    => C.NREL_FACT,
 | ||
|                       DREP_DATE_TO => C.DREP_DATE_TO,
 | ||
|                       NTYPE        => NTYPE,
 | ||
|                       SDETAIL_LIST => SDETAIL_LIST,
 | ||
|                       SMEAS        => C.SMEAS);
 | ||
|       /* Собираем зависимости */
 | ||
|       for LINK in (select T.RN
 | ||
|                      from FCPRODPLANSP T
 | ||
|                     where T.PRN = C.NPRN
 | ||
|                       and T.UP_LEVEL = C.NRN
 | ||
|                       and T.MAIN_QUANT > 0
 | ||
|                       and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= C.NTASK_LEVEL + 1))))
 | ||
|       loop
 | ||
|         /* Добавляем зависимости */
 | ||
|         PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN);
 | ||
|       end loop;
 | ||
|       /* Добавляем основную спецификацию в диаграмму */
 | ||
|       PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT);
 | ||
|     end loop;
 | ||
|     /* Формируем список */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG);
 | ||
|   end FCPRODPLANSP_GET;
 | ||
| 
 | ||
|   /* Инициализация каталогов раздела "Планы и отчеты производства изделий"  */
 | ||
|   procedure ACATALOG_INIT
 | ||
|   (
 | ||
|     COUT                    out clob    -- Список каталогов раздела "Планы и отчеты производства изделий"
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Начинаем формирование XML */
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     /* Открываем корень */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
 | ||
|     /* Цикл по планам и отчетам производства изделий */
 | ||
|     for REC in (select T.RN as NRN,
 | ||
|                        T.NAME as SNAME,
 | ||
|                        (select count(P.RN)
 | ||
|                           from FCPRODPLAN P,
 | ||
|                                FINSTATE   FS
 | ||
|                          where P.CRN = T.RN
 | ||
|                            and P.CATEGORY = NFCPRODPLAN_CATEGORY
 | ||
|                            and P.STATUS = NFCPRODPLAN_STATUS
 | ||
|                            and FS.RN = P.TYPE
 | ||
|                            and FS.CODE = SFCPRODPLAN_TYPE
 | ||
|                            and exists (select PSP.RN
 | ||
|                                   from FCPRODPLANSP PSP
 | ||
|                                  where PSP.PRN = P.RN
 | ||
|                                    and PSP.MAIN_QUANT > 0)
 | ||
|                            and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
 | ||
|                                  null
 | ||
|                                   from USERPRIV UP
 | ||
|                                  where UP.JUR_PERS = P.JUR_PERS
 | ||
|                                    and UP.UNITCODE = 'CostProductPlans'
 | ||
|                                    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_JUR_PERS_AUTHID) */
 | ||
|                                  null
 | ||
|                                   from USERPRIV UP
 | ||
|                                  where UP.JUR_PERS = P.JUR_PERS
 | ||
|                                    and UP.UNITCODE = 'CostProductPlans'
 | ||
|                                    and UP.AUTHID = UTILIZER())) as NCOUNT_DOCS
 | ||
|                   from ACATALOG T,
 | ||
|                        UNITLIST UL
 | ||
|                  where T.DOCNAME = 'CostProductPlans'
 | ||
|                    and T.SIGNS = 1
 | ||
|                    and T.DOCNAME = UL.UNITCODE
 | ||
|                    and (UL.SHOW_INACCESS_CTLG = 1 or exists
 | ||
|                         (select null from V_USERPRIV UP where UP.CATALOG = T.RN) or exists
 | ||
|                         (select null
 | ||
|                            from ACATALOG T1
 | ||
|                           where exists (select null from V_USERPRIV UP where UP.CATALOG = T1.RN)
 | ||
|                          connect by prior T1.RN = T1.CRN
 | ||
|                           start with T1.CRN = T.RN))
 | ||
|                  order by T.NAME asc)
 | ||
|     loop
 | ||
|       /* Открываем план */
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLAN_CRNS');
 | ||
|       /* Описываем план */
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => REC.SNAME);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NCOUNT_DOCS', NVALUE => REC.NCOUNT_DOCS);
 | ||
|       /* Закрываем план */
 | ||
|       PKG_XFAST.UP();
 | ||
|     end loop;
 | ||
|     /* Закрываем корень */
 | ||
|     PKG_XFAST.UP();
 | ||
|     /* Сериализуем */
 | ||
|     COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
 | ||
|     /* Завершаем формирование XML */
 | ||
|     PKG_XFAST.EPILOGUE();
 | ||
|   exception
 | ||
|     when others then
 | ||
|       /* Завершаем формирование XML */
 | ||
|       PKG_XFAST.EPILOGUE();
 | ||
|       /* Вернем ошибку */
 | ||
|       PKG_STATE.DIAGNOSTICS_STACKED();
 | ||
|       P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
 | ||
|   end ACATALOG_INIT;
 | ||
| 
 | ||
| end PKG_P8PANELS_MECHREC;
 | ||
| /
 |