forked from CITKParus/P8-Panels
		
	
		
			
				
	
	
		
			7944 lines
		
	
	
		
			525 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
			
		
		
	
	
			7944 lines
		
	
	
		
			525 KiB
		
	
	
	
		
			SQL
		
	
	
	
	
	
| create or replace package PKG_P8PANELS_MECHREC as
 | ||
| 
 | ||
|   /* Проверка соответствия подразделения документа подразделению пользователя */
 | ||
|   function UTL_SUBDIV_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,  -- Рег. номер организации
 | ||
|     NSUBDIV                 in number,  -- Рег. номер подразделения
 | ||
|     SUSER                   in varchar2 -- Имя пользователя    
 | ||
|   ) return                  number;     -- Подразделение подходит (0 - нет, 1 - да)
 | ||
|   
 | ||
|   /* Проверка соответствия подразделения документа подразделению пользователя (по иерархии) */
 | ||
|   function UTL_SUBDIV_HIER_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,        -- Рег. номер организации
 | ||
|     NSUBDIV                 in number,        -- Рег. номер подразделения
 | ||
|     SUSER                   in varchar2,      -- Имя пользователя
 | ||
|     NSTART_SUBDIV           in number := null -- Рег. номер родительского подразделения
 | ||
|   ) return                  number;           -- Подразделение подходит (0 - нет, 1 - да)
 | ||
|   
 | ||
|   /* Проверка наличия станка "В эксплуатации" в иерархии цеха */
 | ||
|   function UTL_INS_DEP_HIER_EQ_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,  -- Рег. номер организации
 | ||
|     NINS_DEPARTMENT         in number,  -- Рег. номер подразделения (цеха)
 | ||
|     DDATE_TO                in date     -- Дата по
 | ||
|   ) return                  number;     -- Результат (0 - станка нет, 1 - станок есть)
 | ||
|   
 | ||
|   /* Считывание количества рабочих часов с учетом перерыва */
 | ||
|   function UTL_WORK_TIME_GET
 | ||
|   (
 | ||
|     NTBOPERMODESP           in number   -- Рег. номер смены
 | ||
|   ) return                  number;     -- Количество рабочих часов
 | ||
|   
 | ||
|   /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
 | ||
|   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,                     -- Рег. номер каталога
 | ||
|     CFCPRODPLANS            in clob,                       -- Список отмеченных планов (разделитель - ";")
 | ||
|     NFCPRODPLANSP           in number,                     -- Рег. номер позиции спецификации
 | ||
|     NLEVEL                  in number := null,             -- Уровень отбора
 | ||
|     SSORT_FIELD             in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
 | ||
|     COUT                    out clob,                      -- Список задач
 | ||
|     NMAX_LEVEL              out number,                    -- Максимальный уровень иерархии
 | ||
|     NOUT_OF_LIMIT           out number                     -- Признак превышения лимита (0 - нет, 1 - да)
 | ||
|   );
 | ||
| 
 | ||
|   /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Производственная программа" */
 | ||
|   procedure FCPRODPLAN_PP_CTLG_INIT
 | ||
|   (
 | ||
|     COUT                    out clob    -- Список каталогов раздела "Планы и отчеты производства изделий"
 | ||
|   );
 | ||
| 
 | ||
|   /* Изменение приоритета партии маршрутного листа */
 | ||
|   procedure FCROUTLST_PRIOR_PARTY_UPDATE
 | ||
|   (
 | ||
|     NFCROUTLST              in number,  -- Рег. номер маршрутного листа
 | ||
|     SPRIOR_PARTY            in varchar  -- Новое значение приоритета партии
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана */
 | ||
|   procedure FCROUTLST_DEPT_DG_GET
 | ||
|   (
 | ||
|     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    -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение таблицы строк маршрутного листа */
 | ||
|   procedure FCROUTLSTSP_DEPT_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 INCOMEFROMDEPS_DEPT_DG_GET
 | ||
|   (
 | ||
|     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    -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение таблицы спецификаций планов и отчетов производства изделий */
 | ||
|   procedure FCPRODPLANSP_DEPT_DG_GET
 | ||
|   (
 | ||
|     NFCPRODPLAN             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 FCPRODPLAN_DEPT_INIT
 | ||
|   (
 | ||
|     COUT                    out clob    -- Список записей раздела "Планы и отчеты производства изделий"
 | ||
|   );
 | ||
|   
 | ||
|   /* Выдать задания сменного задания */
 | ||
|   procedure FCJOBSSP_ISSUE
 | ||
|   (
 | ||
|     NFCJOBS                 in number   -- Рег. номер сменного задания
 | ||
|   );
 | ||
|   
 | ||
|   /* Исключение станка из операции сменного задания */
 | ||
|   procedure FCJOBSSP_EXC_EQCONFIG
 | ||
|   (
 | ||
|     NFCJOBSSP               in number   -- Рег. номер строки сменного задания
 | ||
|   );
 | ||
|   
 | ||
|   /* Включение станка в строку сменного задания */
 | ||
|   procedure FCJOBSSP_INC_EQCONFIG
 | ||
|   (
 | ||
|     NEQCONFIG               in number,  -- Рег. номер состава оборудования
 | ||
|     NFCJOBSSP               in number,  -- Рег. номер строки сменного задания
 | ||
|     NQUANT_PLAN             in number   -- Включаемое количество
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение составов оборудования подразделения */
 | ||
|   procedure EQCONFIG_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 in number,      -- Рег. номер сменного задания
 | ||
|     NFROM_ACTION            in number := 0, -- Признак запуска из действия раздела (false - нет, true - да)
 | ||
|     NPAGE_NUMBER            in number,      -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,      -- Количество записей на странице (0 - все)
 | ||
|     CORDERS                 in clob,        -- Сортировки
 | ||
|     NINCLUDE_DEF            in number,      -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob        -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение спецификации сменного задания */
 | ||
|   procedure FCJOBSSP_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 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 FCJOBS_INIT
 | ||
|   (
 | ||
|     NFCJOBS                 in number := null, -- Рег. номер записи (если вызов из действия раздела)
 | ||
|     COUT                    out clob           -- Список записей раздела "Сменные задания"
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение количества рабочих часов в сменах подразделения */
 | ||
|   procedure INS_DEPARTMENT_WORKHOURS_GET
 | ||
|   (
 | ||
|     NSUBDIV                 in number,  -- Рег. номер подразделения
 | ||
|     NWORKHOURS              out number  -- Количество рабочих часов
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение количества рабочих дней месяца */
 | ||
|   procedure ENPERIOD_WORKDAYS_GET
 | ||
|   (
 | ||
|     SMONTH_YEAR             in varchar2, -- Строковое представления месяца и года в формате (mm.yyyy)
 | ||
|     NWORKDAYS               out number   -- Количество рабочих дней
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение таблицы доступных подразделений (цехов) */
 | ||
|   procedure INS_DEPARTMENT_DG_GET
 | ||
|   (
 | ||
|     SMONTH_YEAR             in varchar2, -- Строковое представления месяца и года в формате (mm.yyyy)
 | ||
|     NPAGE_NUMBER            in number,   -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,   -- Количество записей на странице (0 - все)
 | ||
|     NINCLUDE_DEF            in number,   -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob     -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение загрузки цеха */
 | ||
|   procedure FCJOBS_DEP_LOAD_DG_GET
 | ||
|   (
 | ||
|     NSUBDIV                 in number,   -- Рег. номер подразделения (цеха)
 | ||
|     SMONTH_YEAR             in varchar2, -- Строковое представления месяца и года в формате (mm.yyyy)
 | ||
|     NWORKHOURS              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_BY_LINKED_GET
 | ||
|   (
 | ||
|     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    -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение таблицы комплектовочных ведомостей связанной записи "Производственная программа" */
 | ||
|   procedure FCDELIVSH_DG_BY_LINKED_GET
 | ||
|   (
 | ||
|     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    -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение таблицы записей "Планы и отчеты производства изделий" */
 | ||
|   procedure FCPRODPLAN_GET
 | ||
|   (
 | ||
|     NCRN                    in number,  -- Рег. номер каталога
 | ||
|     COUT                    out clob    -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Мониторинг сборки изделий" */
 | ||
|   procedure FCPRODPLAN_AM_CTLG_INIT
 | ||
|   (
 | ||
|     COUT                    out clob    -- Список каталогов раздела "Планы и отчеты производства изделий"
 | ||
|   );
 | ||
| 
 | ||
|   /* Считывание деталей производственного состава */
 | ||
|   procedure FCPRODCMP_DETAILS_GET
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,  -- Рег. номер строки плана
 | ||
|     COUT                    out clob    -- Сериализованная таблица данных
 | ||
|   );
 | ||
|   
 | ||
|   /* Выдать задания сменного задания */
 | ||
|   procedure FCJOBSSP_MP_ISSUE
 | ||
|   (
 | ||
|     NFCJOBS                 in number,       -- Рег. номер сменного задания
 | ||
|     NCOEFF                  in number := 1.1 -- Коэффициент выполнения норм
 | ||
|   );
 | ||
|   
 | ||
|   /* Исключение исполнителя из операции сменного задания */
 | ||
|   procedure FCJOBSSP_MP_EXC_PERFORM
 | ||
|   (
 | ||
|     NFCJOBSSP               in number   -- Рег. номер строки сменного задания
 | ||
|   );
 | ||
|   
 | ||
|   /* Включение исполнителя в строку сменного задания */
 | ||
|   procedure FCJOBSSP_MP_INC_PERFORM
 | ||
|   (
 | ||
|     NFCJOBSSP               in number,  -- Рег. номер строки сменного задания
 | ||
|     SPERFORM_LIST           in clob,    -- Список отмеченных исполнителей (разделитель - ";")
 | ||
|     NQUANT_PLAN             in number   -- Включаемое количество
 | ||
|   );
 | ||
|   
 | ||
|   /* Получение спецификации сменного задания */
 | ||
|   procedure FCJOBSSP_MP_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 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 WORKERS_MP_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 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 FCJOBS_MP_INIT
 | ||
|   (
 | ||
|     NFCJOBS                 in number,  -- Рег. номер записи сменного задания
 | ||
|     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 := 'План'; -- Тип планов (мнемокод состояния)
 | ||
|   NMAX_TASKS                constant PKG_STD.TNUMBER := 10000;  -- Максимальное количество отображаемых задач
 | ||
|   
 | ||
|   /* Константы - классы задач плана ("Производственная программа") */
 | ||
|   NCLASS_WO_DEFICIT         constant PKG_STD.TNUMBER := 0; -- Без дефицита выпуска
 | ||
|   NCLASS_PART_DEFICIT       constant PKG_STD.TNUMBER := 1; -- С частичным дефицитом выпуска
 | ||
|   NCLASS_FULL_DEFICIT       constant PKG_STD.TNUMBER := 2; -- С полным дефицитом выпуска
 | ||
|   NCLASS_WITH_DEFICIT       constant PKG_STD.TNUMBER := 3; -- С дефицитом запуска или датой меньше текущей
 | ||
|   NCLASS_FUTURE_DATE        constant PKG_STD.TNUMBER := 4; -- Дата анализа еще не наступила
 | ||
|   NCLASS_WO_LINKS           constant PKG_STD.TNUMBER := 5; -- Задача без связи
 | ||
|   
 | ||
|   /* Константы - типы задач плана, содержание детализации ("Производственная программа") */
 | ||
|   NTASK_TYPE_RL_WITH_GP     constant PKG_STD.TNUMBER := 0;    -- Маршрутные листы с развертыванием товарных запасов
 | ||
|   NTASK_TYPE_RL_WITH_DL     constant PKG_STD.TNUMBER := 1;    -- Маршрутные листы с развертыванием комплектаций
 | ||
|   NTASK_TYPE_INC_DEPS       constant PKG_STD.TNUMBER := 2;    -- Приход из подразделений
 | ||
|   NTASK_TYPE_INC_DEPS_RL    constant PKG_STD.TNUMBER := 3;    -- Приход из подразделений и маршрутные листы
 | ||
|   NTASK_TYPE_RL             constant PKG_STD.TNUMBER := 4;    -- Маршрутные листы
 | ||
|   NTASK_TYPE_EMPTY          constant PKG_STD.TNUMBER := null; -- Нет детализации
 | ||
|   
 | ||
|   /* Константы - типы дней ("Загрузка цеха") */
 | ||
|   NDAY_TYPE_WORK_AFTER      constant PKG_STD.TNUMBER := 0; -- Рабочий день после текущей даты
 | ||
|   NDAY_TYPE_HOLIDAY_AFTER   constant PKG_STD.TNUMBER := 1; -- Выходной день после текущей даты
 | ||
|   NDAY_TYPE_WORK_BEFORE     constant PKG_STD.TNUMBER := 2; -- Рабочий день до текущей даты
 | ||
|   NDAY_TYPE_HOLIDAY_BEFORE  constant PKG_STD.TNUMBER := 3; -- Выходной день до текущей даты
 | ||
|   NDAY_TYPE_CURRENT_DAY     constant PKG_STD.TNUMBER := 4; -- Текущий день
 | ||
|   
 | ||
|   /* Константы - параметры отборов планов ("Производственный план цеха") */
 | ||
|   NFCPRODPLAN_DEPT_CTGR     constant PKG_STD.TNUMBER := 2; -- Категория планов "Цеховой план"
 | ||
|   
 | ||
|   /* Константы - параметры отборов планов ("Мониторинг сборки изделий") */
 | ||
|   NFCPRODPLAN_CATEGORY_MON  constant PKG_STD.TNUMBER := 0;      -- Категория планов "Первичный документ"
 | ||
|   NFCPRODPLAN_STATUS_MON    constant PKG_STD.TNUMBER := 2;      -- Статус планов "Утвержден"
 | ||
|   SFCPRODPLAN_TYPE_MON      constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния)
 | ||
|   
 | ||
|   /* Константы - мнемокоды ед. измерения */
 | ||
|   SDICMUNTS_WD              constant PKG_STD.TSTRING := 'Ч/Ч'; -- Мнемокод ед. измерения нормочасов
 | ||
|   SDICMUNTS_MIN             constant PKG_STD.TSTRING := 'МИН'; -- Мнемокод ед. измерения минут
 | ||
|   SDICMUNTS_DAY             constant PKG_STD.TSTRING := 'Д';   -- Мнемокод ед. измерения дней
 | ||
|   
 | ||
|   /* Константы - параметры отборов сменных заданий */
 | ||
|   NFCJOBS_STATUS_NOT_WO     constant PKG_STD.TNUMBER := 0; -- Статус сменного задания "Не отработано"
 | ||
| 
 | ||
|   /* Константы - дополнительные атрибуты */
 | ||
|   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';        -- Единица измнения
 | ||
|   
 | ||
|   /* Константы - дополнительные параметры */
 | ||
|   SCOL_PATTERN_DATE         constant PKG_STD.TSTRING := 'dd_mm_yyyy';         -- Паттерн для динамической колонки граф ("день_месяц_год")
 | ||
|   SFCROUTLSTSP_STATE_DOMAIN constant PKG_STD.TSTRING := 'TFCROUTLSTSP_STATE'; -- Мнемокод домена состояния спецификации маршрутного листа
 | ||
|   
 | ||
|   /* Константы - типовые присоединённые документы */
 | ||
|   SFLINKTYPE_PREVIEW        constant PKG_STD.TSTRING := 'Предпросмотр';     -- Тип ПД для изображений предпросмотра
 | ||
|   SFLINKTYPE_SVG_MODEL      constant PKG_STD.TSTRING := 'Векторная модель'; -- Тип ПД для SVG-модели
 | ||
|   
 | ||
|   /* Константы - дополнительные свойства */
 | ||
|   SDP_MODEL_ID              constant PKG_STD.TSTRING := 'ПУДП.MODEL_ID';       -- Идентификатор в SVG-модели
 | ||
|   SDP_MODEL_BG_COLOR        constant PKG_STD.TSTRING := 'ПУДП.MODEL_BG_COLOR'; -- Цвет заливки в SVG-модели
 | ||
|     
 | ||
|   /* Экземпляр дня загрузки цеха */
 | ||
|   type TJOB_DAY is record
 | ||
|   (
 | ||
|     DDATE                   PKG_STD.TLDATE, -- Дата дня загрузки цеха
 | ||
|     NVALUE                  PKG_STD.TQUANT, -- Значение доли трудоемкости смены
 | ||
|     NTYPE                   PKG_STD.TNUMBER -- Тип дня (0 - выполняемый, 1 - выполненный)
 | ||
|   );
 | ||
| 
 | ||
|   /* Коллекция дней загрузки цеха */
 | ||
|   type TJOB_DAYS is table of TJOB_DAY;
 | ||
| 
 | ||
|   /* Добавление дня в коллекцию дней загрузки цеха */
 | ||
|   procedure TJOB_DAYS_ADD
 | ||
|   (
 | ||
|     TDAYS                   in out nocopy TJOB_DAYS, -- Коллекция дней загрузки цеха
 | ||
|     DDATE                   in date,                 -- Дата дня загрузки цеха
 | ||
|     NVALUE                  in number,               -- Значение доли трудоемкости смены
 | ||
|     NTYPE                   in number,               -- Тип дня (0 - выполняемый, 1 - выполненный)
 | ||
|     BCLEAR                  in boolean := false      -- Признак очистки результирующей коллекции перед добавлением таблицы
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Инициализируем коллекцию таблиц документа */
 | ||
|     if ((TDAYS is null) or (BCLEAR)) then
 | ||
|       TDAYS := TJOB_DAYS();
 | ||
|     end if;
 | ||
|     /* Добавляем таблицу к документу */
 | ||
|     TDAYS.EXTEND();
 | ||
|     TDAYS(TDAYS.LAST).DDATE := DDATE;
 | ||
|     TDAYS(TDAYS.LAST).NVALUE := NVALUE;
 | ||
|     TDAYS(TDAYS.LAST).NTYPE := NTYPE;
 | ||
|   end TJOB_DAYS_ADD;
 | ||
|   
 | ||
|   /* Инциализация списка маршрутных листов (с иерархией) */
 | ||
|   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;
 | ||
|   
 | ||
|   /* Считывание записи маршрутного листа */
 | ||
|   procedure UTL_FCROUTLST_GET
 | ||
|   (
 | ||
|     NFCROUTLST              in number,            -- Рег. номер маршрутного листа
 | ||
|     RFCROUTLST              out FCROUTLST%rowtype -- Запись маршрутного листа
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Считываем запись маршрутного листа */
 | ||
|     begin
 | ||
|       select T.* into RFCROUTLST from FCROUTLST T where T.RN = NFCROUTLST;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NFCROUTLST, SUNIT_TABLE => 'FCROUTLST');
 | ||
|     end;
 | ||
|   end UTL_FCROUTLST_GET;
 | ||
|   
 | ||
|   /* Иницализация выбранных планов */
 | ||
|   procedure UTL_FCPRODPLAN_IDENT_INIT
 | ||
|   (
 | ||
|     CFCPRODPLANS            in clob,    -- Список отмеченных планов (разделитель - ";")
 | ||
|     NIDENT                  out number  -- Идентификатор отмеченных записей
 | ||
|   )
 | ||
|   is
 | ||
|     NFCPRODPLAN             PKG_STD.TREF; -- Рег. номер плана
 | ||
|     NTMP                    PKG_STD.TREF; -- Буфер
 | ||
|   begin
 | ||
|     /* Генерируем идентификатор */
 | ||
|     NIDENT := GEN_IDENT();
 | ||
|     /* Обходим исполнителей */
 | ||
|     for I in 1 .. STRCNT(source => CFCPRODPLANS, DELIMETER => ';')
 | ||
|     loop
 | ||
|       /* Считываем рег. номер плана */
 | ||
|       NFCPRODPLAN := TO_NUMBER(STRTOK(source => CFCPRODPLANS, DELIMETER => ';', ITEM => I));
 | ||
|       /* Добавляем в селектлист */
 | ||
|       P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => NFCPRODPLAN, SUNITCODE => 'CostProductPlans', NRN => NTMP);
 | ||
|     end loop;
 | ||
|   end UTL_FCPRODPLAN_IDENT_INIT;
 | ||
|   
 | ||
|   /* Считывания рег. номера подразделения пользователя */
 | ||
|   function UTL_SUBDIV_RN_GET
 | ||
|   (
 | ||
|     NCOMPANY                in number,       -- Рег. номер организации
 | ||
|     SUSER                   in varchar2      -- Имя пользователя
 | ||
|   ) return                  number           -- Рег. номер подразделения
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TNUMBER; -- Рег. номер подразделения
 | ||
|     NVERSION                PKG_STD.TREF;    -- Версия контрагентов
 | ||
|   begin
 | ||
|     /* Считываем версию контрагентов */
 | ||
|     FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|     /* Проверяем подразделение по исполнению сотрудника пользователя */
 | ||
|     begin
 | ||
|       select C.DEPTRN
 | ||
|         into NRESULT
 | ||
|         from CLNPSPFM      C,
 | ||
|              CLNPSPFMTYPES CT
 | ||
|        where exists (select null
 | ||
|                 from CLNPERSONS CP
 | ||
|                where exists (select null
 | ||
|                         from AGNLIST T
 | ||
|                        where T.PERS_AUTHID = SUSER
 | ||
|                          and CP.PERS_AGENT = T.RN
 | ||
|                          and T.VERSION = NVERSION)
 | ||
|                  and C.PERSRN = CP.RN
 | ||
|                  and CP.COMPANY = NCOMPANY)
 | ||
|          and C.COMPANY = NCOMPANY
 | ||
|          and C.BEGENG <= sysdate
 | ||
|          and (C.ENDENG >= sysdate or C.ENDENG is null)
 | ||
|          and C.CLNPSPFMTYPES = CT.RN
 | ||
|          and CT.IS_PRIMARY = 1
 | ||
|          and ROWNUM = 1;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := 0;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end UTL_SUBDIV_RN_GET;
 | ||
|   
 | ||
|   /* Проверка соответствия подразделения документа подразделению пользователя */
 | ||
|   function UTL_SUBDIV_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,       -- Рег. номер организации
 | ||
|     NSUBDIV                 in number,       -- Рег. номер подразделения
 | ||
|     SUSER                   in varchar2      -- Имя пользователя
 | ||
|   ) return                  number           -- Подразделение подходит (0 - нет, 1 - да)
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TNUMBER; -- Подразделение подходит (0 - нет, 1 - да)
 | ||
|     NVERSION                PKG_STD.TREF;    -- Версия контрагентов
 | ||
|   begin
 | ||
|     /* Если рег. номер подразделения пустой */
 | ||
|     if (NSUBDIV is null) then
 | ||
|       /* Возвращаем 0 */
 | ||
|       return 0;
 | ||
|     end if;
 | ||
|     /* Считываем версию контрагентов */
 | ||
|     FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|     /* Проверяем подразделение по исполнению сотрудника пользователя */
 | ||
|     begin
 | ||
|       select 1
 | ||
|         into NRESULT
 | ||
|         from DUAL
 | ||
|        where NSUBDIV in (select C.DEPTRN
 | ||
|                            from CLNPSPFM      C,
 | ||
|                                 CLNPSPFMTYPES CT
 | ||
|                           where exists (select null
 | ||
|                                    from CLNPERSONS CP
 | ||
|                                   where exists (select null
 | ||
|                                            from AGNLIST T
 | ||
|                                           where T.PERS_AUTHID = SUSER
 | ||
|                                             and CP.PERS_AGENT = T.RN
 | ||
|                                             and T.VERSION = NVERSION)
 | ||
|                                     and C.PERSRN = CP.RN
 | ||
|                                     and CP.COMPANY = NCOMPANY)
 | ||
|                             and C.COMPANY = NCOMPANY
 | ||
|                             and C.BEGENG <= sysdate
 | ||
|                             and (C.ENDENG >= sysdate or C.ENDENG is null)
 | ||
|                             and C.CLNPSPFMTYPES = CT.RN
 | ||
|                             and CT.IS_PRIMARY = 1);
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := 0;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end UTL_SUBDIV_CHECK;
 | ||
|   
 | ||
|   /* Проверка соответствия подразделения документа подразделению пользователя (по иерархии) */
 | ||
|   function UTL_SUBDIV_HIER_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,        -- Рег. номер организации
 | ||
|     NSUBDIV                 in number,        -- Рег. номер подразделения
 | ||
|     SUSER                   in varchar2,      -- Имя пользователя
 | ||
|     NSTART_SUBDIV           in number := null -- Рег. номер родительского подразделения
 | ||
|   ) return                  number            -- Подразделение подходит (0 - нет, 1 - да)
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TNUMBER;  -- Подразделение подходит (0 - нет, 1 - да)
 | ||
|     NVERSION                PKG_STD.TREF;     -- Версия контрагентов
 | ||
|   begin
 | ||
|     /* Если рег. номер подразделения пустой */
 | ||
|     if (NSUBDIV is null) then
 | ||
|       /* Возвращаем 0 */
 | ||
|       return 0;
 | ||
|     end if;
 | ||
|     /* Если родительское подразделение не задано */
 | ||
|     if (NSTART_SUBDIV is null) then
 | ||
|       /* Считываем версию контрагентов */
 | ||
|       FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|       /* Проверяем подразделение по исполнению сотрудника пользователя */
 | ||
|       begin
 | ||
|         select 1
 | ||
|           into NRESULT
 | ||
|           from DUAL
 | ||
|          where exists (select null
 | ||
|                   from INS_DEPARTMENT T,
 | ||
|                        (select C.DEPTRN
 | ||
|                           from CLNPSPFM      C,
 | ||
|                                CLNPSPFMTYPES CT
 | ||
|                          where exists (select null
 | ||
|                                   from CLNPERSONS CP
 | ||
|                                  where exists (select null
 | ||
|                                           from AGNLIST T
 | ||
|                                          where T.PERS_AUTHID = SUSER
 | ||
|                                            and CP.PERS_AGENT = T.RN
 | ||
|                                            and T.VERSION = NVERSION)
 | ||
|                                    and C.PERSRN = CP.RN
 | ||
|                                    and CP.COMPANY = NCOMPANY)
 | ||
|                            and C.COMPANY = NCOMPANY
 | ||
|                            and C.BEGENG <= sysdate
 | ||
|                            and (C.ENDENG >= sysdate or C.ENDENG is null)
 | ||
|                            and C.CLNPSPFMTYPES = CT.RN
 | ||
|                            and CT.IS_PRIMARY = 1) TMP
 | ||
|                  where T.RN = NSUBDIV
 | ||
|                    and ROWNUM = 1
 | ||
|                  start with T.RN = TMP.DEPTRN
 | ||
|                 connect by prior T.RN = T.PRN);
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := 0;
 | ||
|       end;
 | ||
|     else
 | ||
|       /* Проверяем подразделение по исполнению сотрудника пользователя */
 | ||
|       begin
 | ||
|         select 1
 | ||
|           into NRESULT
 | ||
|           from DUAL
 | ||
|          where exists (select null
 | ||
|                   from INS_DEPARTMENT T
 | ||
|                  where T.RN = NSUBDIV
 | ||
|                    and ROWNUM = 1
 | ||
|                  start with T.RN = NSTART_SUBDIV
 | ||
|                 connect by prior T.RN = T.PRN);
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := 0;
 | ||
|       end;
 | ||
|     end if;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end UTL_SUBDIV_HIER_CHECK;
 | ||
|   
 | ||
|   /* Проверка наличия станка "В эксплуатации" в иерархии цеха */
 | ||
|   function UTL_INS_DEP_HIER_EQ_CHECK
 | ||
|   (
 | ||
|     NCOMPANY                in number,       -- Рег. номер организации
 | ||
|     NINS_DEPARTMENT         in number,       -- Рег. номер подразделения (цеха)
 | ||
|     DDATE_TO                in date          -- Дата по
 | ||
|   ) return                  number           -- Результат (0 - станка нет, 1 - станок есть)
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TNUMBER; -- Результат (0 - станка нет, 1 - станок есть)
 | ||
|   begin
 | ||
|     /* Проверяем наличие станка "В эксплуатации" в иерархии цеха */
 | ||
|     begin
 | ||
|       select 1
 | ||
|         into NRESULT
 | ||
|         from INS_DEPARTMENT H
 | ||
|        where H.COMPANY = NCOMPANY
 | ||
|          and exists (select null
 | ||
|                 from SUBDIVSEQ EQ,
 | ||
|                      EQCONFIG  EQC
 | ||
|                where EQ.PRN = H.RN
 | ||
|                  and EQC.RN = EQ.EQCONFIG
 | ||
|                  and EQC.OPER_DATE is not null
 | ||
|                  and EQC.OPER_DATE <= DDATE_TO
 | ||
|                  and ROWNUM = 1)
 | ||
|          and ROWNUM = 1
 | ||
|        start with H.RN = NINS_DEPARTMENT
 | ||
|       connect by prior H.RN = H.PRN;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := 0;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end UTL_INS_DEP_HIER_EQ_CHECK;
 | ||
|     
 | ||
|   /* Проверка наличия состава оборудования */
 | ||
|   procedure UTL_EQCONFIG_EXISTS
 | ||
|   (
 | ||
|     NEQCONFIG               in number,       -- Рег. номер состава оборудования
 | ||
|     NCOMPANY                in number        -- Рег. номер организации
 | ||
|   )
 | ||
|   is
 | ||
|     NEXISTS                 PKG_STD.TNUMBER; -- Буфер
 | ||
|   begin
 | ||
|     /* Проверяем наличие оборудования */
 | ||
|     begin
 | ||
|       select T.RN
 | ||
|         into NEXISTS
 | ||
|         from EQCONFIG T
 | ||
|        where T.RN = NEQCONFIG
 | ||
|          and T.COMPANY = NCOMPANY;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         P_EXCEPTION(0, 'Рабочее место не найдено.');
 | ||
|     end;
 | ||
|   end UTL_EQCONFIG_EXISTS;
 | ||
|   
 | ||
|   /* Считывание рег. номера основной спецификации плана из "Производственная программа" */
 | ||
|   function UTL_FCPRODPLANSP_MAIN_GET
 | ||
|   (
 | ||
|     NCOMPANY                in number,    -- Рег. номер организации
 | ||
|     NFCPRODPLANSP           in number     -- Рег. номер связанной спецификации плана
 | ||
|   ) return                  number        -- Рег. номер основной спецификации плана из "Производственная программа"
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TREF; -- Рег. номер основной спецификации плана из "Производственная программа"
 | ||
|   begin
 | ||
|     /* Поиск связанной спецификации из "Производственная программа" */
 | ||
|     begin
 | ||
|       select S.RN
 | ||
|         into NRESULT
 | ||
|         from DOCLINKS     T,
 | ||
|              FCPRODPLANSP S,
 | ||
|              FCPRODPLAN   P
 | ||
|        where T.OUT_DOCUMENT = NFCPRODPLANSP
 | ||
|          and T.IN_UNITCODE = 'CostProductPlansSpecs'
 | ||
|          and T.OUT_UNITCODE = 'CostProductPlansSpecs'
 | ||
|          and S.RN = T.IN_DOCUMENT
 | ||
|          and P.RN = S.PRN
 | ||
|          and P.CATEGORY = NFCPRODPLAN_CATEGORY
 | ||
|          and P.COMPANY = NCOMPANY
 | ||
|          and ROWNUM = 1;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := null;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end UTL_FCPRODPLANSP_MAIN_GET;
 | ||
|     
 | ||
|   /* Считывание цеха из заголовка сменного задания */
 | ||
|   function UTL_FCJOBS_SUBDIV_GET
 | ||
|   (
 | ||
|     NFCJOBS               in number     -- Рег. номер сменного задания
 | ||
|   ) return                number        -- Рег. номер подразделения
 | ||
|   is
 | ||
|     NRESULT               PKG_STD.TREF; -- Рег. номер подразделения
 | ||
|   begin
 | ||
|     /* Считываем цех сменного задания */
 | ||
|     begin
 | ||
|       select T.SUBDIV into NRESULT from FCJOBS T where T.RN = NFCJOBS;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := null;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end UTL_FCJOBS_SUBDIV_GET;
 | ||
|   
 | ||
|   /* Считывание записи строки сменного задания */
 | ||
|   function UTL_FCJOBSSP_GET
 | ||
|   (
 | ||
|     NCOMPANY                in number,        -- Рег. номер организации
 | ||
|     NFCJOBSSP               in number         -- Рег. номер строки сменного задания
 | ||
|   ) return                  FCJOBSSP%rowtype  -- Запись строки сменного задания
 | ||
|   is
 | ||
|     RFCJOBSSP               FCJOBSSP%rowtype; -- Запись строки сменного задания
 | ||
|   begin
 | ||
|     /* Считываем запись строки сменного задания */
 | ||
|     begin
 | ||
|       select T.*
 | ||
|         into RFCJOBSSP
 | ||
|         from FCJOBSSP T
 | ||
|        where T.RN = NFCJOBSSP
 | ||
|          and T.COMPANY = NCOMPANY;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         P_EXCEPTION(0, 'Ошибка считывания строки сменного задания.');
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return RFCJOBSSP;
 | ||
|   end UTL_FCJOBSSP_GET;
 | ||
|     
 | ||
|   /* Считывание количества рабочих часов с учетом перерыва */
 | ||
|   function UTL_WORK_TIME_GET
 | ||
|   (
 | ||
|     NTBOPERMODESP           in number         -- Рег. номер смены
 | ||
|   ) return                  number            -- Количество рабочих часов
 | ||
|   is
 | ||
|     NRESULT                 PKG_STD.TLNUMBER; -- Количество рабочих часов
 | ||
|   begin
 | ||
|     /* Определяем количество рабочих часов с учетом перерывов */
 | ||
|     begin
 | ||
|       select ROUND((TMP.WORK_MINUTS - COALESCE(TMP.BREAK_MINUTS, 0)) * 24 * 60, 3)
 | ||
|         into NRESULT
 | ||
|         from (select case BOS.SIGN_SHIFT
 | ||
|                        when 0 then
 | ||
|                         (BOS.END_TIME - BOS.BEG_TIME)
 | ||
|                        else
 | ||
|                         (BOS.END_TIME + 1 - BOS.BEG_TIME)
 | ||
|                      end WORK_MINUTS,
 | ||
|                      (select sum(case
 | ||
|                                    /* В один день */
 | ||
|                                    when BOS.SIGN_SHIFT = 0 then
 | ||
|                                     LEAST(BOS.END_TIME, BMS.END_TIME) - BMS.START_TIME
 | ||
|                                    /* Перерыв с переходом дня */
 | ||
|                                    when ((BOS.SIGN_SHIFT = 1) and (BMS.START_TIME >= BMS.END_TIME)) then
 | ||
|                                     (LEAST(BOS.END_TIME, BMS.END_TIME) + 1) - BMS.START_TIME
 | ||
|                                    /* Первый день */
 | ||
|                                    when ((BOS.SIGN_SHIFT = 1) and (BMS.START_TIME >= BOS.BEG_TIME)) then
 | ||
|                                     BMS.END_TIME - BMS.START_TIME
 | ||
|                                    /* Второй день */
 | ||
|                                    else
 | ||
|                                     LEAST(BOS.END_TIME, BMS.END_TIME) - BMS.START_TIME
 | ||
|                                  end) BREAK_MIN
 | ||
|                         from TBBREAKMODESP BMS
 | ||
|                        where BMS.PRN = BO.BREAKMODE
 | ||
|                          and (((BOS.SIGN_SHIFT = 0) and
 | ||
|                              ((BMS.START_TIME >= BOS.BEG_TIME) and (BMS.START_TIME < BOS.END_TIME))) or
 | ||
|                              ((BOS.SIGN_SHIFT = 1) and
 | ||
|                              ((BMS.START_TIME >= BOS.BEG_TIME) or (BMS.START_TIME < BOS.END_TIME))))) BREAK_MINUTS
 | ||
|                 from TBOPERMODESP BOS,
 | ||
|                      TBOPERMODE   BO
 | ||
|                where BOS.RN = NTBOPERMODESP
 | ||
|                  and BO.RN = BOS.PRN) TMP;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NRESULT := null;
 | ||
|     end;
 | ||
|     /* Возвращаем результат */
 | ||
|     return NRESULT;
 | ||
|   end UTL_WORK_TIME_GET;
 | ||
|   
 | ||
|   /* Проверка наличия связанных маршрутных листов */
 | ||
|   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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NFCROUTLST_IDENT        PKG_STD.TREF;                          -- Рег. номер идентификатора отмеченных записей маршрутных листов
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOC_INFO',
 | ||
|                                         SCAPTION   => 'Накладная',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */
 | ||
|     if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
 | ||
|       PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOC_VALID_INFO',
 | ||
|                                         SCAPTION   => 'Маршрутный лист',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSTORE',
 | ||
|                                         SCAPTION   => 'Склад цеха потребителя',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ORDERS_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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOC_INFO',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */
 | ||
|         if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SDOC_STATE',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 3);
 | ||
|         end if;
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DWORK_DATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOC_VALID_INFO',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SOUT_DEPARTMENT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SSTORE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 8);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SMATRESPL_CODE',
 | ||
|                                         SCAPTION   => 'Обозначение',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NPROD_QUANT',
 | ||
|                                         SCAPTION   => 'Применяемость',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT_PLAN',
 | ||
|                                         SCAPTION   => 'Количество план',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NREST',
 | ||
|                                         SCAPTION   => 'Остаток',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'DRES_DATE_TO',
 | ||
|                                         SCAPTION   => 'Зарезервировано',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ORDERS_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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DRES_DATE_TO',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRESPL_NOMEN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRESPL_CODE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRESPL_NAME',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NPROD_QUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NREST', ICURSOR => ICURSOR, NPOSITION => 8);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 9);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     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;
 | ||
|     /* Инициализируем даты */
 | ||
|     DDATE := TRUNC(sysdate);
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SINDOC',
 | ||
|                                         SCAPTION   => 'Партия',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSTORE',
 | ||
|                                         SCAPTION   => 'Склад',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSALE',
 | ||
|                                         SCAPTION   => 'К продаже',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRESTFACT',
 | ||
|                                         SCAPTION   => 'Фактический остаток',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SPRICEMEAS',
 | ||
|                                         SCAPTION   => 'Единица измерения',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     /* Если номенклатура или хранилища указаны */
 | ||
|     if ((NNOMENCLATURE is not null) or ((NSTORAGE is not null) and (NSTORAGE_IN is not null))) then
 | ||
|       /* Обходим данные */
 | ||
|       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.TDG_ORDERS_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.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SINDOC',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 1,
 | ||
|                                                    BCLEAR    => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SSTORE',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSALE', ICURSOR => ICURSOR, NPOSITION => 3);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NRESTFACT',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 4);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NRESERV',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 5);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SPRICEMEAS',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 6);
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|         end loop;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|           raise;
 | ||
|       end;
 | ||
|     end if;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOCPREF',
 | ||
|                                         SCAPTION   => 'Префикс',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOCNUMB',
 | ||
|                                         SCAPTION   => 'Номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT',
 | ||
|                                         SCAPTION   => 'Количество запуска',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ORDERS_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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOCPREF',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOCNUMB',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DEXEC_DATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRES_PLAN_NOMEN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRES_PLAN_NAME',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 8);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOCPREF',
 | ||
|                                         SCAPTION   => 'Префикс',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOCNUMB',
 | ||
|                                         SCAPTION   => 'Номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT',
 | ||
|                                         SCAPTION   => 'Количество запуска',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_ORDERS_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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOCPREF',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOCNUMB',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DEXEC_DATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DREL_DATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NREL_QUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOCPREF',
 | ||
|                                         SCAPTION   => 'Префикс',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOCNUMB',
 | ||
|                                         SCAPTION   => 'Номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT',
 | ||
|                                         SCAPTION   => 'Количество запуска',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_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.TDG_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.TDG_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 ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 3) 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.TDG_ORDERS_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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOCPREF',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SDOCNUMB',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DEXEC_DATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DREL_DATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NREL_QUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 8);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NPROCENT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 9);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end FCROUTLST_DG_BY_DEPS;
 | ||
| 
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
 | ||
|   procedure FCROUTLST_DG_GET
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,  -- Рег. номер связанной спецификации плана
 | ||
|     NTYPE                   in number,  -- Тип спецификации плана (см. константы NTASK_TYPE_*)
 | ||
|     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 = NTASK_TYPE_RL_WITH_GP) 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 = NTASK_TYPE_RL_WITH_DL) 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 = NTASK_TYPE_INC_DEPS_RL) or (NTYPE = NTASK_TYPE_RL)) 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 FCPRODPLANSP_GET
 | ||
|   (
 | ||
|     NCRN                    in number,                             -- Рег. номер каталога
 | ||
|     CFCPRODPLANS            in clob,                               -- Список отмеченных планов (разделитель - ";")
 | ||
|     NFCPRODPLANSP           in number,                             -- Рег. номер позиции спецификации
 | ||
|     NLEVEL                  in number := null,                     -- Уровень отбора
 | ||
|     SSORT_FIELD             in varchar2 := 'DREP_DATE_TO',         -- Поле сортировки
 | ||
|     COUT                    out clob,                              -- Список задач
 | ||
|     NMAX_LEVEL              out number,                            -- Максимальный уровень иерархии
 | ||
|     NOUT_OF_LIMIT           out number                             -- Признак превышения лимита (0 - нет, 1 - да)
 | ||
|   )
 | ||
|   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;                       -- Тип задачи (см. константы NTASK_TYPE_*)
 | ||
|     SDETAIL_LIST            PKG_STD.TSTRING;                       -- Ссылки на детализацию
 | ||
|     SPLAN_TITLE             PKG_STD.TSTRING;                       -- Заголовок плана
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NTASK_CLASS             PKG_STD.TNUMBER;                       -- Класс задачи (см. константы NCLASS_*)
 | ||
|     NLEVEL_FILTER           PKG_STD.TNUMBER;                       -- Уровень для фильтра
 | ||
|     NPLANS_IDENT            PKG_STD.TREF;                          -- Идентификатор отмеченных планов
 | ||
| 
 | ||
|     /* Объединение значений в строковое представление */
 | ||
|     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 PRODPLAN_MAX_LEVEL_GET
 | ||
|     (
 | ||
|       NCRN                  in number,            -- Рег. номер каталога планов
 | ||
|       NPLANS_IDENT          in number,            -- Идентификатор отмеченных планов
 | ||
|       NFCPRODPLANSP         in number,            -- Рег. номер позиции спецификации
 | ||
|       NMAX_LEVEL            out number,           -- Максимальный уровень иерархии
 | ||
|       NOUT_OF_LIMIT         out number            -- Признак превышения лимита (0 - нет, 1 - да)
 | ||
|     )
 | ||
|     is
 | ||
|       NTOTAL                PKG_STD.TNUMBER := 0; -- Сумма документов по проверяемому уровню
 | ||
|     begin
 | ||
|       /* Обнуляем признак привышения лимита */
 | ||
|       NOUT_OF_LIMIT := 0;
 | ||
|       /* Инициализируем максимальный уровень иерархии */
 | ||
|       NMAX_LEVEL := 1;
 | ||
|       /* Цикл по уровням каталога планов */
 | ||
|       for REC in (select level,
 | ||
|                          count(TMP.RN) COUNT_DOCS
 | ||
|                     from (select T.RN,
 | ||
|                                  T.UP_LEVEL
 | ||
|                             from FCPRODPLAN   P,
 | ||
|                                  FCPRODPLANSP T,
 | ||
|                                  FINSTATE     FS
 | ||
|                            where ((NCRN is null) or ((NCRN is not null) and (P.CRN = NCRN)))
 | ||
|                              and ((NPLANS_IDENT is null) or
 | ||
|                                  ((NPLANS_IDENT is not null) and
 | ||
|                                  (P.RN in (select SL.DOCUMENT
 | ||
|                                              from SELECTLIST SL
 | ||
|                                             where SL.IDENT = NPLANS_IDENT
 | ||
|                                               and SL.UNITCODE = 'CostProductPlans'))))
 | ||
|                              and ((NFCPRODPLANSP is null) or
 | ||
|                                  ((NFCPRODPLANSP is not null) and
 | ||
|                                  (P.RN = (select PRN from FCPRODPLANSP where RN = NFCPRODPLANSP))))
 | ||
|                              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 (((NCRN is not null) and (TMP.UP_LEVEL is null)) or
 | ||
|                               ((NCRN is null) and (TMP.RN = NFCPRODPLANSP)))
 | ||
|                    group by level
 | ||
|                    order by level)
 | ||
|       loop
 | ||
|         /* Получаем количество задач с учетом текущего уровня */
 | ||
|         NTOTAL := NTOTAL + REC.COUNT_DOCS;
 | ||
|         /* Если сумма документов по текущему уровню превышает максимальное количество задач */
 | ||
|         if (NTOTAL >= NMAX_TASKS) then
 | ||
|           /* Устанавливаем признак превышения лимита */
 | ||
|           NOUT_OF_LIMIT := 1;
 | ||
|           /* Выходим из цикла */
 | ||
|           exit;
 | ||
|         end if;
 | ||
|         /* Указываем текущий уровень */
 | ||
|         NMAX_LEVEL := REC.LEVEL;
 | ||
|       end loop;
 | ||
|     end PRODPLAN_MAX_LEVEL_GET;
 | ||
|   
 | ||
|     /* Определение дат спецификации плана */
 | ||
|     procedure FCPRODPLANSP_DATES_GET
 | ||
|     (
 | ||
|       DREP_DATE             in date,    -- Дата запуска спецификации
 | ||
|       DREP_DATE_TO          in date,    -- Дата выпуска спецификации
 | ||
|       DINCL_DATE            in date,    -- Дата включения в план спецификации
 | ||
|       DDATE_FROM            out date,   -- Итоговая дата запуска спецификации
 | ||
|       DDATE_TO              out date    -- Итоговая дата выпуска спецификации
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Если даты запуска и выпуска пусты */
 | ||
|       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;
 | ||
|     end FCPRODPLANSP_DATES_GET;
 | ||
| 
 | ||
|     /* Инициализация динамических атрибутов */
 | ||
|     procedure TASK_ATTRS_INIT
 | ||
|     (
 | ||
|       RG                    in out nocopy 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_ATTRS_FILL
 | ||
|     (
 | ||
|       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,                                     -- Тип (см. константы NTASK_TYPE_*)
 | ||
|       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 TASK_ATTRS_FILL;
 | ||
| 
 | ||
|     /* Инициализация цветов */
 | ||
|     procedure TASK_COLORS_INIT
 | ||
|     (
 | ||
|       RG                    in out nocopy 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;
 | ||
| 
 | ||
|     /* Опеределение класса задачи */
 | ||
|     function GET_TASK_CLASS
 | ||
|     (
 | ||
|       NDEFRESLIZ            in number,       -- Дефицит запуска
 | ||
|       NREL_FACT             in number,       -- Выпуск факт
 | ||
|       NDEFSTART             in number,       -- Дефицит выпуска
 | ||
|       DREP_DATE             in date,         -- Дата запуска спецификации
 | ||
|       DREP_DATE_TO          in date,         -- Дата выпуска спецификации
 | ||
|       NHAVE_LINK            in number := 0   -- Наличие связей с "Маршрутный лист" или "Приход из подразделения"
 | ||
|     ) return                number           -- Класс задачи
 | ||
|     is
 | ||
|       NTASK_CLASS           PKG_STD.TNUMBER; -- Класс задачи (см. константы NCLASS*)
 | ||
|     begin
 | ||
|       /* Если одна из дат не указана */
 | ||
|       if ((DREP_DATE is null) or (DREP_DATE_TO is null)) then
 | ||
|         /* Если спецификация также не имеет связей */
 | ||
|         if (NHAVE_LINK = 0) then
 | ||
|           NTASK_CLASS := NCLASS_WO_LINKS;
 | ||
|         end if;
 | ||
|       else
 | ||
|         /* Если нет связанных документов */
 | ||
|         if (NHAVE_LINK = 0) then
 | ||
|           /* Если дата запуска меньше текущей даты */
 | ||
|           if (DREP_DATE <= sysdate) then
 | ||
|             NTASK_CLASS := NCLASS_WITH_DEFICIT;
 | ||
|           end if;
 | ||
|           /* Если дата больше текущей даты */
 | ||
|           if (DREP_DATE > sysdate) then
 | ||
|             NTASK_CLASS := NCLASS_FUTURE_DATE;
 | ||
|           end if;
 | ||
|         end if;
 | ||
|       end if;
 | ||
|       /* Если класс не определен */
 | ||
|       if (NTASK_CLASS is null) then
 | ||
|         /* Если дефицит запуска <> 0 */
 | ||
|         if (NDEFRESLIZ <> 0) then
 | ||
|           /* Если дефицит выпуска = 0 */
 | ||
|           if (NDEFSTART = 0) then
 | ||
|             NTASK_CLASS := NCLASS_WO_DEFICIT;
 | ||
|           else
 | ||
|             NTASK_CLASS := NCLASS_WITH_DEFICIT;
 | ||
|           end if;
 | ||
|         else
 | ||
|           /* Если дефицит выпуска = 0 */
 | ||
|           if (NDEFSTART = 0) then
 | ||
|             NTASK_CLASS := NCLASS_WO_DEFICIT;
 | ||
|           else
 | ||
|             /* Если дефицит запуска = 0 и выпуск факт = 0 */
 | ||
|             if ((NDEFRESLIZ = 0) and (NREL_FACT = 0)) then
 | ||
|               NTASK_CLASS := NCLASS_FULL_DEFICIT;
 | ||
|             end if;
 | ||
|             /* Если дефицит запуска = 0 и выпуск факт <> 0 */
 | ||
|             if ((NDEFRESLIZ = 0) and (NREL_FACT <> 0)) then
 | ||
|               NTASK_CLASS := NCLASS_PART_DEFICIT;
 | ||
|             end if;
 | ||
|           end if;
 | ||
|         end if;
 | ||
|       end if;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NTASK_CLASS;
 | ||
|     end GET_TASK_CLASS;
 | ||
| 
 | ||
|     /* Получение типа задачи */
 | ||
|     procedure GET_TASK_TYPE
 | ||
|     (
 | ||
|       NCOMPANY              in number,   -- Рег. номер организации
 | ||
|       SSORT_FIELD           in varchar2, -- Тип сортировки
 | ||
|       NFCPRODPLAN           in number,   -- Рег. номер плана
 | ||
|       NFCPRODPLANSP         in number,   -- Рег. номер спецификации плана
 | ||
|       NTASK_CLASS           in number,   -- Класс задачи (см. константы NCLASS_*)
 | ||
|       NTYPE                 out number,  -- Тип задачи (см. константы NTASK_TYPE_*)
 | ||
|       SDETAIL_LIST          out varchar2 -- Ссылки на детализацию
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Исходим сортировка по "Дата запуска" */
 | ||
|       if (SSORT_FIELD = 'DREP_DATE') then
 | ||
|         /* Если класс "С дефицитом запуска или датой меньше текущей" */
 | ||
|         if (NTASK_CLASS = NCLASS_WITH_DEFICIT) then
 | ||
|           /* Проверяем деталь или изделие */
 | ||
|           begin
 | ||
|             select NTASK_TYPE_RL_WITH_DL
 | ||
|               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 := NTASK_TYPE_RL_WITH_GP;
 | ||
|           end;
 | ||
|           /* Проверяем наличие связей с маршрутными листами */
 | ||
|           if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 0) = 0) then
 | ||
|             /* Указываем, что маршрутных листов нет */
 | ||
|             SDETAIL_LIST := 'Нет маршрутных листов';
 | ||
|             NTYPE        := NTASK_TYPE_EMPTY;
 | ||
|           else
 | ||
|             /* Указываем, что маршрутные листы есть */
 | ||
|             SDETAIL_LIST := 'Маршрутные листы';
 | ||
|           end if;
 | ||
|         else
 | ||
|           /* Не отображаем информацию о маршрутных листах */
 | ||
|           NTYPE        := NTASK_TYPE_EMPTY;
 | ||
|           SDETAIL_LIST := null;
 | ||
|         end if;
 | ||
|       else
 | ||
|         /* Исходим от класса */
 | ||
|         case
 | ||
|           /* Если класс "Без дефицита выпуска" */
 | ||
|           when (NTASK_CLASS = NCLASS_WO_DEFICIT) then
 | ||
|             /* Проверяем наличией связей с приходов из подразделений */
 | ||
|             if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 2) = 0) then
 | ||
|               /* Указываем, что приходов из подразделений нет */
 | ||
|               SDETAIL_LIST := 'Нет приходов из подразделений';
 | ||
|               NTYPE        := NTASK_TYPE_EMPTY;
 | ||
|             else
 | ||
|               /* Указываем, что приходы из подразделений есть */
 | ||
|               SDETAIL_LIST := 'Приход из подразделений';
 | ||
|               NTYPE        := NTASK_TYPE_INC_DEPS;
 | ||
|             end if;
 | ||
|           /* Если класс "С частичным дефицитом выпуска" */
 | ||
|           when (NTASK_CLASS = NCLASS_PART_DEFICIT) then
 | ||
|             /* Проверяем наличией связей с приходов из подразделений */
 | ||
|             if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP) = 0) then
 | ||
|               /* Указываем, что приходов из подразделений нет */
 | ||
|               SDETAIL_LIST := 'Нет приходов из подразделений';
 | ||
|               NTYPE        := NTASK_TYPE_EMPTY;
 | ||
|             else
 | ||
|               /* Указываем, что приходы из подразделений есть */
 | ||
|               SDETAIL_LIST := 'Приход из подразделений';
 | ||
|               NTYPE        := NTASK_TYPE_INC_DEPS_RL;
 | ||
|             end if;
 | ||
|           /* Если класс "С дефицитом запуска или датой меньше текущей" или "С полным дефицитом выпуска" */
 | ||
|           when ((NTASK_CLASS = NCLASS_FULL_DEFICIT) or (NTASK_CLASS = NCLASS_WITH_DEFICIT)) then
 | ||
|             /* Проверяем наличие связей с маршрутными листами */
 | ||
|             if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 1) = 0) then
 | ||
|               /* Указываем, что маршрутных листов нет */
 | ||
|               SDETAIL_LIST := 'Нет маршрутных листов';
 | ||
|               NTYPE        := NTASK_TYPE_EMPTY;
 | ||
|             else
 | ||
|               /* Указываем, что маршрутные листы есть */
 | ||
|               SDETAIL_LIST := 'Маршрутные листы';
 | ||
|               NTYPE        := NTASK_TYPE_RL;
 | ||
|             end if;
 | ||
|           /* Класс не поддерживается */
 | ||
|           else
 | ||
|             /* Для данных классов ничего не выводится */
 | ||
|             NTYPE        := NTASK_TYPE_EMPTY;
 | ||
|             SDETAIL_LIST := null;
 | ||
|         end case;
 | ||
|       end if;
 | ||
|     end GET_TASK_TYPE;
 | ||
| 
 | ||
|     /* Формирование цветовых характеристик для задачи */
 | ||
|     procedure GET_TASK_COLORS
 | ||
|     (
 | ||
|       NTASK_CLASS             in number,      -- Класс задачи (см. константы NCLASS_*)
 | ||
|       STASK_BG_COLOR          out varchar2,   -- Цвет заливки спецификации
 | ||
|       STASK_BG_PROGRESS_COLOR out varchar2,   -- Цвет заливки прогресса спецификации
 | ||
|       STASK_TEXT_COLOR        in out varchar2 -- Цвет текста
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Исходим от класса задачи */
 | ||
|       case NTASK_CLASS
 | ||
|         /* Без дефицита выпуска */
 | ||
|         when NCLASS_WO_DEFICIT then
 | ||
|           STASK_BG_COLOR          := SBG_COLOR_GREEN;
 | ||
|           STASK_TEXT_COLOR        := STEXT_COLOR_GREY;
 | ||
|           STASK_BG_PROGRESS_COLOR := null;
 | ||
|         /* С частичным дефицитом выпуска */
 | ||
|         when NCLASS_PART_DEFICIT then
 | ||
|           STASK_BG_COLOR          := SBG_COLOR_GREEN;
 | ||
|           STASK_BG_PROGRESS_COLOR := SBG_COLOR_YELLOW;
 | ||
|           STASK_TEXT_COLOR        := STEXT_COLOR_GREY;
 | ||
|         /* С полным дефицитом выпуска */
 | ||
|         when NCLASS_FULL_DEFICIT then
 | ||
|           STASK_BG_COLOR          := SBG_COLOR_YELLOW;
 | ||
|           STASK_TEXT_COLOR        := null;
 | ||
|           STASK_BG_PROGRESS_COLOR := null;
 | ||
|         /* С дефицитом запуска или датой меньше текущей */
 | ||
|         when NCLASS_WITH_DEFICIT then
 | ||
|           STASK_BG_COLOR          := SBG_COLOR_RED;
 | ||
|           STASK_TEXT_COLOR        := null;
 | ||
|           STASK_BG_PROGRESS_COLOR := null;
 | ||
|         /* Дата анализа еще не наступила */
 | ||
|         when NCLASS_FUTURE_DATE then
 | ||
|           STASK_BG_COLOR   := SBG_COLOR_GREY;
 | ||
|           STASK_TEXT_COLOR := null;
 | ||
|           STASK_BG_PROGRESS_COLOR := null;
 | ||
|         /* Задача без связи */
 | ||
|         when NCLASS_WO_LINKS then
 | ||
|           STASK_BG_COLOR   := SBG_COLOR_BLACK;
 | ||
|           STASK_TEXT_COLOR := STEXT_COLOR_ORANGE;
 | ||
|           STASK_BG_PROGRESS_COLOR := null;
 | ||
|         else
 | ||
|           /* Не определено */
 | ||
|           STASK_BG_COLOR   := null;
 | ||
|           STASK_TEXT_COLOR := null;
 | ||
|           STASK_BG_PROGRESS_COLOR := null;
 | ||
|       end case;
 | ||
|     end GET_TASK_COLORS;
 | ||
|   begin
 | ||
|     /* Определяем заголовок плана */
 | ||
|     if (NCRN is not null) then
 | ||
|       /* Считываем каталог */
 | ||
|       FIND_ACATALOG_RN(NFLAG_SMART => 0,
 | ||
|                        NCOMPANY    => NCOMPANY,
 | ||
|                        NVERSION    => null,
 | ||
|                        SUNITCODE   => 'CostProductPlans',
 | ||
|                        NRN         => NCRN,
 | ||
|                        SNAME       => SPLAN_TITLE);
 | ||
|       /* Если есть выбранные планы */
 | ||
|       if (CFCPRODPLANS is not null) then
 | ||
|         /* Инициализируем отмеченные планы в селектлисте */
 | ||
|         UTL_FCPRODPLAN_IDENT_INIT(CFCPRODPLANS => CFCPRODPLANS, NIDENT => NPLANS_IDENT);
 | ||
|       end if;
 | ||
|     else
 | ||
|       if (NFCPRODPLANSP is not null) then
 | ||
|         begin
 | ||
|           select MR.CODE || ' - ' || MR.NAME || ', ' || T.REL_FACT || ' ' || DM.MEAS_MNEMO || ', ' ||
 | ||
|                  COALESCE(TO_CHAR(T.REP_DATE_TO, 'dd.mm.yyyy'), '<ДАТА ВЫПУСКА НЕ УКАЗА>')
 | ||
|             into SPLAN_TITLE
 | ||
|             from FCPRODPLANSP  T,
 | ||
|                  FCMATRESOURCE MR,
 | ||
|                  DICNOMNS      DN,
 | ||
|                  DICMUNTS      DM
 | ||
|            where T.RN = NFCPRODPLANSP
 | ||
|              and T.MATRES = MR.RN
 | ||
|              and MR.NOMENCLATURE = DN.RN
 | ||
|              and DN.UMEAS_MAIN = DM.RN;
 | ||
|         exception
 | ||
|           when NO_DATA_FOUND then
 | ||
|             PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NFCPRODPLANSP, SUNIT_TABLE => 'FCPRODPLANSP');
 | ||
|         end;
 | ||
|       else
 | ||
|         P_EXCEPTION(0,
 | ||
|                     'Не указан каталог размещения или позиция спецификации плана.');
 | ||
|       end if;
 | ||
|     end if;
 | ||
|     /* Инициализируем диаграмму Ганта */
 | ||
|     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);
 | ||
|     /* Определяем максимальный уровень иерархии */
 | ||
|     PRODPLAN_MAX_LEVEL_GET(NCRN          => NCRN,
 | ||
|                            NPLANS_IDENT  => NPLANS_IDENT,
 | ||
|                            NFCPRODPLANSP => NFCPRODPLANSP,
 | ||
|                            NMAX_LEVEL    => NMAX_LEVEL,
 | ||
|                            NOUT_OF_LIMIT => NOUT_OF_LIMIT);
 | ||
|     /* Определяем уровень фильтра */
 | ||
|     NLEVEL_FILTER := COALESCE(NLEVEL, NMAX_LEVEL);
 | ||
|     /* Обходим данные */
 | ||
|     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 ((NCRN is null) or ((NCRN is not null) and (P.CRN = NCRN)))
 | ||
|                          and ((NPLANS_IDENT is null) or
 | ||
|                              ((NPLANS_IDENT is not null) and
 | ||
|                              (P.RN in (select SL.DOCUMENT
 | ||
|                                          from SELECTLIST SL
 | ||
|                                         where SL.IDENT = NPLANS_IDENT
 | ||
|                                           and SL.UNITCODE = 'CostProductPlans'))))
 | ||
|                          and ((NFCPRODPLANSP is null) or
 | ||
|                              ((NFCPRODPLANSP is not null) and
 | ||
|                              (P.RN = (select PRN from FCPRODPLANSP where RN = NFCPRODPLANSP))))
 | ||
|                          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 level <= NLEVEL_FILTER
 | ||
|               connect by prior TMP.NRN = TMP.NUP_LEVEL
 | ||
|                start with (((NCRN is not null) and (TMP.NUP_LEVEL is null)) or
 | ||
|                           ((NCRN is null) and (TMP.NRN = NFCPRODPLANSP)))
 | ||
|                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);
 | ||
|       /* Определяем класс задачи */
 | ||
|       NTASK_CLASS := GET_TASK_CLASS(NDEFRESLIZ   => C.NDEFRESLIZ,
 | ||
|                                     NREL_FACT    => C.NREL_FACT,
 | ||
|                                     NDEFSTART    => C.NDEFSTART,
 | ||
|                                     DREP_DATE    => C.DREP_DATE,
 | ||
|                                     DREP_DATE_TO => C.DREP_DATE_TO,
 | ||
|                                     NHAVE_LINK   => COALESCE(C.NHAVE_LINK, 0));
 | ||
|       /* Инициализируем даты и цвет (если необходимо) */
 | ||
|       FCPRODPLANSP_DATES_GET(DREP_DATE    => C.DREP_DATE,
 | ||
|                              DREP_DATE_TO => C.DREP_DATE_TO,
 | ||
|                              DINCL_DATE   => C.DINCL_DATE,
 | ||
|                              DDATE_FROM   => DDATE_FROM,
 | ||
|                              DDATE_TO     => DDATE_TO);
 | ||
|       /* Формирование характеристик элемента ганта */
 | ||
|       GET_TASK_COLORS(NTASK_CLASS             => NTASK_CLASS,
 | ||
|                       STASK_BG_COLOR          => STASK_BG_COLOR,
 | ||
|                       STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
 | ||
|                       STASK_TEXT_COLOR        => STASK_TEXT_COLOR);
 | ||
|       /* Если класс задачи "С частичным дефицитом выпуска" */
 | ||
|       if (NTASK_CLASS = NCLASS_PART_DEFICIT) then
 | ||
|         /* Определяем пропорции прогресса */
 | ||
|         NTASK_PROGRESS := ROUND(C.NREL_FACT / C.NMAIN_QUANT * 100);
 | ||
|         /* Если значение прогресса задачи больше 100 */
 | ||
|         if (NTASK_PROGRESS > 100) then
 | ||
|           /* Устанавливаем максимальное допустимое значение - 100 */
 | ||
|           NTASK_PROGRESS := 100;
 | ||
|         end if;
 | ||
|       else
 | ||
|         /* Не требуется */
 | ||
|         NTASK_PROGRESS := null;
 | ||
|       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,
 | ||
|                     NTASK_CLASS   => NTASK_CLASS,
 | ||
|                     NTYPE         => NTYPE,
 | ||
|                     SDETAIL_LIST  => SDETAIL_LIST);
 | ||
|       /* Заполним значение динамических атрибутов */
 | ||
|       TASK_ATTRS_FILL(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_FILTER >= 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);
 | ||
|     /* Очищаем отмеченные планы */
 | ||
|     P_SELECTLIST_CLEAR(NIDENT => NPLANS_IDENT);
 | ||
|   exception
 | ||
|     when others then
 | ||
|       /* Очищаем отмеченные планы */
 | ||
|       P_SELECTLIST_CLEAR(NIDENT => NPLANS_IDENT);
 | ||
|       raise;
 | ||
|   end FCPRODPLANSP_GET;
 | ||
| 
 | ||
|   /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Производственная программа" */
 | ||
|   procedure FCPRODPLAN_PP_CTLG_INIT
 | ||
|   (
 | ||
|     COUT                    out clob                               -- Список каталогов раздела "Планы и отчеты производства изделий"
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|   
 | ||
|     /* Считывание количества спецификаций плана */
 | ||
|     function FCPRODPLANSP_COUNT_GET
 | ||
|     (
 | ||
|       NFCPRODPLAN             in number        -- Рег. номер плана
 | ||
|     ) return                  number           -- Количество документов спецификации плана
 | ||
|     is
 | ||
|       NRESULT                 PKG_STD.TNUMBER; -- Количество документов спецификации плана
 | ||
|     begin
 | ||
|       /* Считываем количество спецификаций */
 | ||
|       begin
 | ||
|         select count(T.RN)
 | ||
|           into NRESULT
 | ||
|           from FCPRODPLAN   P,
 | ||
|                FCPRODPLANSP T,
 | ||
|                FINSTATE     FS
 | ||
|          where P.RN = NFCPRODPLAN
 | ||
|            and T.PRN = P.RN
 | ||
|            and T.MAIN_QUANT > 0;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := 0;
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end FCPRODPLANSP_COUNT_GET;
 | ||
|   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 P.COMPANY = NCOMPANY
 | ||
|                            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 T.COMPANY = NCOMPANY
 | ||
|                    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);
 | ||
|       /* Если содержит планы */
 | ||
|       if (REC.NCOUNT_DOCS <> 0) then
 | ||
|         /* Цикл по планам каталога */
 | ||
|         for PLN in (select T.RN NRN,
 | ||
|                            trim(T.PREFIX) || '-' || trim(T.NUMB) SNAME
 | ||
|                       from FCPRODPLAN T,
 | ||
|                            FINSTATE   FS
 | ||
|                      where T.CRN = REC.NRN
 | ||
|                        and T.CATEGORY = NFCPRODPLAN_CATEGORY
 | ||
|                        and T.STATUS = NFCPRODPLAN_STATUS
 | ||
|                        and T.COMPANY = NCOMPANY
 | ||
|                        and FS.RN = T.TYPE
 | ||
|                        and FS.CODE = SFCPRODPLAN_TYPE
 | ||
|                        and exists (select PSP.RN
 | ||
|                               from FCPRODPLANSP PSP
 | ||
|                              where PSP.PRN = T.RN
 | ||
|                                and PSP.MAIN_QUANT > 0)
 | ||
|                        and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
 | ||
|                              null
 | ||
|                               from USERPRIV UP
 | ||
|                              where UP.JUR_PERS = T.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 = T.JUR_PERS
 | ||
|                                and UP.UNITCODE = 'CostProductPlans'
 | ||
|                                and UP.AUTHID = UTILIZER()))
 | ||
|         loop
 | ||
|           /* Открываем описание документов каталога */
 | ||
|           PKG_XFAST.DOWN_NODE(SNAME => 'XCRN_PLANS');
 | ||
|           /* Описываем план */
 | ||
|           PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => PLN.NRN);
 | ||
|           PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => PLN.SNAME);
 | ||
|           PKG_XFAST.ATTR(SNAME => 'NCOUNT_DOCS', NVALUE => FCPRODPLANSP_COUNT_GET(NFCPRODPLAN => PLN.NRN));
 | ||
|           /* Закрываем документы каталога */
 | ||
|           PKG_XFAST.UP();
 | ||
|         end loop;
 | ||
|       end if;
 | ||
|       /* Закрываем план */
 | ||
|       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 FCPRODPLAN_PP_CTLG_INIT;
 | ||
|   
 | ||
|   /*
 | ||
|     Процедуры панели "Производственный план цеха"
 | ||
|   */
 | ||
|   
 | ||
|   /* Изменение приоритета партии маршрутного листа */
 | ||
|   procedure FCROUTLST_PRIOR_PARTY_UPDATE
 | ||
|   (
 | ||
|     NFCROUTLST              in number,         -- Рег. номер маршрутного листа
 | ||
|     SPRIOR_PARTY            in varchar         -- Новое значение приоритета партии
 | ||
|   )
 | ||
|   is
 | ||
|     RFCROUTLST              FCROUTLST%rowtype; -- Запись маршрутного листа
 | ||
|   begin
 | ||
|     /* Проверяем нет ли лишних символов */
 | ||
|     if ((SPRIOR_PARTY is not null) and (REGEXP_COUNT(SPRIOR_PARTY, '[^0123456789]+') > 0)) then
 | ||
|       P_EXCEPTION(0, 'Значение приоритета должно быть целым числом.');
 | ||
|     end if;
 | ||
|     /* Считываем запись маршрутного листа */
 | ||
|     UTL_FCROUTLST_GET(NFCROUTLST => NFCROUTLST, RFCROUTLST => RFCROUTLST);
 | ||
|     /* Исправляем приоритет партии */
 | ||
|     RFCROUTLST.PRIOR_PARTY := TO_NUMBER(SPRIOR_PARTY);
 | ||
|     /* Базовое исправление маршрутного листа */
 | ||
|     P_FCROUTLST_BASE_UPDATE(NRN            => RFCROUTLST.RN,
 | ||
|                             NCOMPANY       => RFCROUTLST.COMPANY,
 | ||
|                             NDOCTYPE       => RFCROUTLST.DOCTYPE,
 | ||
|                             SDOCPREF       => RFCROUTLST.DOCPREF,
 | ||
|                             SDOCNUMB       => RFCROUTLST.DOCNUMB,
 | ||
|                             DDOCDATE       => RFCROUTLST.DOCDATE,
 | ||
|                             SBARCODE       => RFCROUTLST.BARCODE,
 | ||
|                             NJUR_PERS      => RFCROUTLST.JUR_PERS,
 | ||
|                             NSTATE         => RFCROUTLST.STATE,
 | ||
|                             DCHANGE_DATE   => RFCROUTLST.CHANGE_DATE,
 | ||
|                             NFACEACC       => RFCROUTLST.FACEACC,
 | ||
|                             NPR_COND       => RFCROUTLST.PR_COND,
 | ||
|                             NMATRES        => RFCROUTLST.MATRES,
 | ||
|                             NNOMCLASSIF    => RFCROUTLST.NOMCLASSIF,
 | ||
|                             NARTICLE       => RFCROUTLST.ARTICLE,
 | ||
|                             NQUANT         => RFCROUTLST.QUANT,
 | ||
|                             NMATRES_PLAN   => RFCROUTLST.MATRES_PLAN,
 | ||
|                             NMEASURE_TYPE  => RFCROUTLST.MEASURE_TYPE,
 | ||
|                             NQUANT_PLAN    => RFCROUTLST.QUANT_PLAN,
 | ||
|                             NMATRES_FACT   => RFCROUTLST.MATRES_FACT,
 | ||
|                             NQUANT_FACT    => RFCROUTLST.QUANT_FACT,
 | ||
|                             DOUT_DATE      => RFCROUTLST.OUT_DATE,
 | ||
|                             NBLANK         => RFCROUTLST.BLANK,
 | ||
|                             NDETAILS_COUNT => RFCROUTLST.DETAILS_COUNT,
 | ||
|                             NSUPPLY        => RFCROUTLST.SUPPLY,
 | ||
|                             NSTORAGE       => RFCROUTLST.STORAGE,
 | ||
|                             NSTORAGE_IN    => RFCROUTLST.STORAGE_IN,
 | ||
|                             NPRODCMP       => RFCROUTLST.PRODCMP,
 | ||
|                             NPRODCMPSP     => RFCROUTLST.PRODCMPSP,
 | ||
|                             DREL_DATE      => RFCROUTLST.REL_DATE,
 | ||
|                             NREL_QUANT     => RFCROUTLST.REL_QUANT,
 | ||
|                             NPRIOR_ORDER   => RFCROUTLST.PRIOR_ORDER,
 | ||
|                             NPRIOR_PARTY   => RFCROUTLST.PRIOR_PARTY,
 | ||
|                             NROUTSHT       => RFCROUTLST.ROUTSHT,
 | ||
|                             NROUTE         => RFCROUTLST.ROUTE,
 | ||
|                             NCALC_SCHEME   => RFCROUTLST.CALC_SCHEME,
 | ||
|                             NPER_MATRES    => RFCROUTLST.PER_MATRES,
 | ||
|                             NCOST_ARTICLE  => RFCROUTLST.COST_ARTICLE,
 | ||
|                             NVALID_DOCTYPE => RFCROUTLST.VALID_DOCTYPE,
 | ||
|                             SVALID_DOCNUMB => RFCROUTLST.VALID_DOCNUMB,
 | ||
|                             DVALID_DOCDATE => RFCROUTLST.VALID_DOCDATE,
 | ||
|                             SNOTE          => RFCROUTLST.NOTE,
 | ||
|                             NPARTY         => RFCROUTLST.PARTY,
 | ||
|                             DEXEC_DATE     => RFCROUTLST.EXEC_DATE,
 | ||
|                             SSEP_NUMB      => RFCROUTLST.SEP_NUMB,
 | ||
|                             SINT_NUMB      => RFCROUTLST.INT_NUMB);
 | ||
|   end FCROUTLST_PRIOR_PARTY_UPDATE;
 | ||
|   
 | ||
|   /* Получение таблицы маршрутных листов, связанных со спецификацией плана */
 | ||
|   procedure FCROUTLST_DEPT_DG_GET
 | ||
|   (
 | ||
|     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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NFCROUTLST_IDENT        PKG_STD.TREF;                          -- Рег. номер идентификатора отмеченных записей маршрутных листов
 | ||
|     NFCMATRESOURCE          PKG_STD.TREF;                          -- Рег. номер материального ресурса записи спецификации плана
 | ||
|     NFCROUTLST              PKG_STD.TREF;                          -- Рег. номер связанного маршрутного листа
 | ||
|     NFCPRODPLANSP_MAIN      PKG_STD.TREF;                          -- Рег. номер основного состава из "Производственная программа"
 | ||
|     NFCROUTLSTORD_QUANT     PKG_STD.TLNUMBER;                      -- Сумма "Количество" в спецификации "Заказы" маршрутного листа
 | ||
|     
 | ||
|     /* Считывание материального ресурса спецификации плана */
 | ||
|     function MATRES_RN_GET
 | ||
|     (
 | ||
|       NFCPRODPLANSP         in number     -- Рег. номер спецификации плана
 | ||
|     ) return                number        -- Рег. номер материального ресурса
 | ||
|     is
 | ||
|       NRESULT               PKG_STD.TREF; -- Рег. номер материального ресурса
 | ||
|     begin
 | ||
|       /* Считываем рег. номер материального ресурса */
 | ||
|       begin
 | ||
|         select T.MATRES into NRESULT from FCPRODPLANSP T where T.RN = NFCPRODPLANSP;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           P_EXCEPTION(0,
 | ||
|                       'Ошибка считывания материального ресурса спецификации плана.');
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end MATRES_RN_GET;
 | ||
|     
 | ||
|     /* Проверка прямой связи между МЛ и спецификацией плана "Заказы" */
 | ||
|     function FCROUTLSTORD_QUANT_GET
 | ||
|     (
 | ||
|       NFCROUTLST            in number         -- Рег. номер маршрутного листа
 | ||
|     ) return                number            -- Сумма "Количество" в спецификации "Заказы"
 | ||
|     is
 | ||
|       NRESULT               PKG_STD.TLNUMBER; -- Сумма "Количество" в спецификации "Заказы"
 | ||
|     begin
 | ||
|       /* Считываем сумму "Количество" из спецификации "Заказы" */
 | ||
|       begin
 | ||
|         select COALESCE(sum(T.QUANT), 0) into NRESULT from FCROUTLSTORD T where T.PRN = NFCROUTLST;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := 0;
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end FCROUTLSTORD_QUANT_GET;
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOC_INFO',
 | ||
|                                         SCAPTION   => 'Документ (тип, №, дата)',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT',
 | ||
|                                         SCAPTION   => 'Количество план',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NPROCENT',
 | ||
|                                         SCAPTION   => 'Готовность партии',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NPRIOR_PARTY',
 | ||
|                                         SCAPTION   => 'Приоритет партии',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SPROD_ORDER',
 | ||
|                                         SCAPTION   => 'Заказ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     /*! Пока отключен */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NCHANGE_FACEACC',
 | ||
|                                         SCAPTION   => 'Изменить заказ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false,
 | ||
|                                         BORDER     => true);
 | ||
|     /* Считываем рег. номер связанной спецификации из "Производственная программа" */
 | ||
|     NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP);
 | ||
|     /* Если спецификация производственной программы найдена */
 | ||
|     if (NFCPRODPLANSP_MAIN is not null) then
 | ||
|       /* Считывание материального ресурса спецификации плана */
 | ||
|       NFCMATRESOURCE := MATRES_RN_GET(NFCPRODPLANSP => NFCPRODPLANSP_MAIN);
 | ||
|       /* Инициализируем список маршрутных листов */
 | ||
|       UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP_MAIN, 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 P.NRN,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.SDOC_INFO,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.NQUANT,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       case when (P.NT_SHT_PLAN <> 0) then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 2) else 0 end NPROCENT,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.NPRIOR_PARTY,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       P.SPROD_ORDER');
 | ||
|         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.DOCPREF) ||');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               ''-'' || TRIM(T.DOCNUMB) ||');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               '', '' || TO_CHAR(T.DOCDATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_INFO,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               T.QUANT        NQUANT,');
 | ||
|         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 => '                               T.PRIOR_PARTY  NPRIOR_PARTY,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               (select F.NUMB from FACEACC F where T.FACEACC = F.RN ) SPROD_ORDER');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from FCROUTLST T,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               DOCTYPES DT');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where T.RN in (select SL."DOCUMENT"');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                          from SELECTLIST SL');
 | ||
|         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 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 T.MATRES = :NFCMATRESOURCE');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and DT.RN = T.DOCTYPE');
 | ||
|         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.TDG_ORDERS_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_IDENT', NVALUE => NFCROUTLST_IDENT);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMATRESOURCE', NVALUE => NFCMATRESOURCE);
 | ||
|         /* Описываем структуру записи курсора */
 | ||
|         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_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_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCROUTLST);
 | ||
|           /* Добавляем колонку с рег. номером */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true);
 | ||
|           /* Добавляем колонки с данными */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NRN',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 1,
 | ||
|                                                    BCLEAR    => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SDOC_INFO',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           /* Проверяем наличие прямой связи между МЛ и спецификацией плана */
 | ||
|           if (PKG_DOCLINKS.FIND(NFLAG_SMART       => 1,
 | ||
|                                 SIN_UNITCODE      => 'CostProductPlansSpecs',
 | ||
|                                 NIN_DOCUMENT      => NFCPRODPLANSP_MAIN,
 | ||
|                                 NIN_PRN_DOCUMENT  => null,
 | ||
|                                 SOUT_UNITCODE     => 'CostRouteLists',
 | ||
|                                 NOUT_DOCUMENT     => NFCROUTLST,
 | ||
|                                 NOUT_PRN_DOCUMENT => null) = 1) then
 | ||
|             /* Получаем сумму "Количество" из спецификации "Заказы" */
 | ||
|             NFCROUTLSTORD_QUANT := FCROUTLSTORD_QUANT_GET(NFCROUTLST => NFCROUTLST);
 | ||
|             /* Если сумма "Количество" в "Заказы" больше 0 */
 | ||
|             if (NFCROUTLSTORD_QUANT > 0) then
 | ||
|               /* Указываем её */
 | ||
|               PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NFCROUTLSTORD_QUANT);
 | ||
|             else
 | ||
|               /* Берем из заголовка МЛ */
 | ||
|               PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                        SNAME     => 'NQUANT',
 | ||
|                                                        ICURSOR   => ICURSOR,
 | ||
|                                                        NPOSITION => 3);
 | ||
|             end if;
 | ||
|           else
 | ||
|             /* Указываем 0 */
 | ||
|             PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => 0);
 | ||
|           end if;
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NPROCENT',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 4);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NPRIOR_PARTY',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 5);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SPROD_ORDER',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 6);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCHANGE_FACEACC', SVALUE => null);
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_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);
 | ||
|     end if;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   exception
 | ||
|     when others then
 | ||
|       /* Очищаем отмеченные маршрутные листы */
 | ||
|       P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|       raise;
 | ||
|   end FCROUTLST_DEPT_DG_GET;
 | ||
|   
 | ||
|   /* Получение таблицы строк маршрутного листа */
 | ||
|   procedure FCROUTLSTSP_DEPT_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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NSTATE                  PKG_STD.TNUMBER;                       -- Состояние
 | ||
|     
 | ||
|     /* Считывание текстового представления состояния строки маршрутного листа */
 | ||
|     function FCROUTLSTSP_STATE_NAME_GET
 | ||
|     (
 | ||
|       NSTATE                in number        -- Состояние строки маршрутного листа
 | ||
|     ) return                varchar2         -- Наименование состояния строки маршрутного листа
 | ||
|     is
 | ||
|       SRESULT               PKG_STD.TSTRING; -- Наименование состояния строки маршрутного листа
 | ||
|     begin
 | ||
|       /* Считываем наименование состояния по домену */
 | ||
|       begin
 | ||
|         select V.NAME
 | ||
|           into SRESULT
 | ||
|           from DMSDOMAINS    T,
 | ||
|                DMSENUMVALUES V
 | ||
|          where T.CODE = SFCROUTLSTSP_STATE_DOMAIN
 | ||
|            and V.PRN = T.RN
 | ||
|            and V.VALUE_NUM = NSTATE;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           SRESULT := null;
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return SRESULT;
 | ||
|     end FCROUTLSTSP_STATE_NAME_GET;
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSTATE',
 | ||
|                                         SCAPTION   => 'Состояние',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SOPER_NUMB',
 | ||
|                                         SCAPTION   => 'Номер операции',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SROUTSHTSP_NAME',
 | ||
|                                         SCAPTION   => 'Операция',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSUBDIV',
 | ||
|                                         SCAPTION   => 'Цех, участок',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT_PLAN',
 | ||
|                                         SCAPTION   => 'План',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT_FACT',
 | ||
|                                         SCAPTION   => 'Факт',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NT_SHT_PLAN',
 | ||
|                                         SCAPTION   => 'Трудоемкость план',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NLABOUR_FACT',
 | ||
|                                         SCAPTION   => 'Трудоемкость факт',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SMUNIT',
 | ||
|                                         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 T.RN          NRN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T."STATE"     NSTATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.OPER_NUMB   SOPER_NUMB,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       trim(T.OPER_NUMB) || '', '' || ');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       trim(COALESCE(( select O."NAME" from FCOPERTYPES O where T.OPER_TPS = O.RN ), T.OPER_UK)) SROUTSHTSP_NAME,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       ( select I.CODE from INS_DEPARTMENT I where T.SUBDIV = I.RN ) SSUBDIV,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT_PLAN NQUANT_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT_FACT NQUANT_FACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.T_SHT_PLAN NT_SHT_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.LABOUR_FACT NLABOUR_FACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       ( select D.MEAS_MNEMO from DICMUNTS D where T.MUNIT = D.RN ) SMUNIT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from FCROUTLSTSP T');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where T.PRN = :NFCROUTLST');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.COMPANY = :NCOMPANY');
 | ||
|       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.TDG_ORDERS_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_NUM(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_STR(ICURSOR => ICURSOR, IPOSITION => 10);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11);
 | ||
|       /* Делаем выборку */
 | ||
|       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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         /* Читаем состояние из курсора */
 | ||
|         PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 2, NVALUE => NSTATE);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW   => RDG_ROW,
 | ||
|                                             SNAME  => 'SSTATE',
 | ||
|                                             SVALUE => FCROUTLSTSP_STATE_NAME_GET(NSTATE => NSTATE));
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SOPER_NUMB',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SROUTSHTSP_NAME',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SSUBDIV',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NT_SHT_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 8);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NLABOUR_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 9);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMUNIT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 10);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end FCROUTLSTSP_DEPT_DG_GET;
 | ||
|   
 | ||
|   /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
 | ||
|   procedure INCOMEFROMDEPS_DEPT_DG_GET
 | ||
|   (
 | ||
|     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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NFCPRODPLANSP_MAIN      PKG_STD.TREF;                          -- Рег. номер основного состава из "Производственная программа"
 | ||
|     NFCROUTLST_IDENT        PKG_STD.TREF;                          -- Рег. номер идентификатора отмеченных записей маршрутных листов
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSTATE',
 | ||
|                                         SCAPTION   => 'Состояние',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SDOC_INFO',
 | ||
|                                         SCAPTION   => 'Документ (тип, №, дата)',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_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.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'DDUE_DATE',
 | ||
|                                         SCAPTION   => 'Дата сдачи',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true);
 | ||
|     /* Считываем рег. номер связанной спецификации из "Производственная программа" */
 | ||
|     NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP);
 | ||
|     /* Если спецификация производственной программы найдена */
 | ||
|     if (NFCPRODPLANSP_MAIN is not null) then
 | ||
|       /* Инициализируем список маршрутных листов */
 | ||
|       UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP_MAIN, 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 => '                       SUBSTR(F_DOCSTATE_PLAN_FACT(T.DOC_STATE), 1, 20) SSTATE,');
 | ||
|         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 => '                       (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 => '                        T.WORK_DATE as DDUE_DATE');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from INCOMEFROMDEPS T,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DOCTYPES DT');
 | ||
|         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 => '                %ORDER_BY%) D) F');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
 | ||
|         /* Учтём сортировки */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ORDERS_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_MAIN);
 | ||
|         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_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|         /* Делаем выборку */
 | ||
|         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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NRN',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 1,
 | ||
|                                                    BCLEAR    => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SSTATE',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SDOC_INFO',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 3);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NQUANT_FACT',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 4);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'DDUE_DATE',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 5);
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_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);
 | ||
|     end if;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   exception
 | ||
|     when others then
 | ||
|       /* Очищаем отмеченные маршрутные листы */
 | ||
|       P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|       raise;
 | ||
|   end INCOMEFROMDEPS_DEPT_DG_GET;
 | ||
|   
 | ||
|   /* Получение таблицы спецификаций планов и отчетов производства изделий */
 | ||
|   procedure FCPRODPLANSP_DEPT_DG_GET
 | ||
|   (
 | ||
|     NFCPRODPLAN             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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NFCPRODPLANSP           PKG_STD.TREF;                          -- Рег. номер спецификации плана
 | ||
|     DDATE                   PKG_STD.TLDATE := sysdate;             -- Текущая дата
 | ||
|     NSUM_PLAN               PKG_STD.TLNUMBER;                      -- Сумма плана по строке
 | ||
|     NSUM_FACT               PKG_STD.TLNUMBER;                      -- Сумма факта по строке
 | ||
|     DDATE_FROM              PKG_STD.TLDATE;                        -- Дата начала месяца
 | ||
|     DDATE_TO                PKG_STD.TLDATE;                        -- Дата окончания месяца
 | ||
|     NFCROUTLST_IDENT        PKG_STD.TREF;                          -- Рег. номер идентификатора отмеченных записей маршрутных листов
 | ||
|     NFCPRODPLANSP_MAIN      PKG_STD.TREF;                          -- Рег. номер основного состава из "Производственная программа"
 | ||
|     NMODIF                  PKG_STD.TREF;                          -- Рег. номер модификации
 | ||
|     
 | ||
|     /* Считывание номенклатуры по спецификации плана */
 | ||
|     function FCPRODPLANSP_MODIF_GET
 | ||
|     (
 | ||
|       NFCPRODPLANSP         in number     -- Рег. номер связанной спецификации плана
 | ||
|     ) return                number        -- Рег. номер модификации номенклатуры
 | ||
|     is
 | ||
|       NRESULT               PKG_STD.TREF; -- Рег. номер модификации номенклатуры
 | ||
|     begin
 | ||
|       /* Считываем рег. номер модификации спецификации плана */
 | ||
|       begin
 | ||
|         select F.NOMEN_MODIF
 | ||
|           into NRESULT
 | ||
|           from FCPRODPLANSP  T,
 | ||
|                FCMATRESOURCE F
 | ||
|          where T.RN = NFCPRODPLANSP
 | ||
|            and F.RN = T.MATRES;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := null;
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end FCPRODPLANSP_MODIF_GET;
 | ||
|     
 | ||
|     /* Инициализация дней месяца */
 | ||
|     procedure INIT_DAYS
 | ||
|     (
 | ||
|       RDG                   in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы
 | ||
|       DDATE_FROM            in date,                               -- Дата начала месяца
 | ||
|       DDATE_TO              in date                                -- Дата окончания месяца
 | ||
|     )
 | ||
|     is
 | ||
|       DDATE                 PKG_STD.TLDATE;                        -- Сформированная дата дня
 | ||
|       NMONTH                PKG_STD.TNUMBER;                       -- Текущий месяц
 | ||
|       NYEAR                 PKG_STD.TNUMBER;                       -- Текущий год
 | ||
|       SDATE_NAME            PKG_STD.TSTRING;                       -- Строковое представление даты для наименования колонки
 | ||
|       SPARENT_NAME          PKG_STD.TSTRING;                       -- Наименование родительской строки
 | ||
|     begin
 | ||
|       /* Считываем месяц и год текущей даты */
 | ||
|       NMONTH := D_MONTH(DDATE => sysdate);
 | ||
|       NYEAR  := D_YEAR(DDATE => sysdate);
 | ||
|       /* Цикл по дням месяца */
 | ||
|       for I in D_DAY(DDATE => DDATE_FROM) .. D_DAY(DDATE => DDATE_TO)
 | ||
|       loop
 | ||
|         /* Формируем дату дня */
 | ||
|         DDATE := TO_DATE(TO_CHAR(I) || '.' || TO_CHAR(NMONTH) || '.' || TO_CHAR(NYEAR), 'dd.mm.yyyy');
 | ||
|         /* Строковое представление даты для наименования колонки */
 | ||
|         SDATE_NAME := TO_CHAR(DDATE, SCOL_PATTERN_DATE);
 | ||
|         /* Формируем наименование родительской строки */
 | ||
|         SPARENT_NAME := 'N_' || SDATE_NAME || '_PLAN_FACT';
 | ||
|         /* Описываем родительскую колонку таблицы данных */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                             SNAME      => SPARENT_NAME,
 | ||
|                                             SCAPTION   => LPAD(D_DAY(DDATE), 2, '0'),
 | ||
|                                             SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                             SPARENT    => 'NVALUE_BY_DAYS');
 | ||
|       end loop;
 | ||
|     end INIT_DAYS;
 | ||
|     
 | ||
|     /* Расчет факта выпусков плана */
 | ||
|     procedure FCPRODPLANSP_CALC
 | ||
|     (
 | ||
|       NFCPRODPLAN           in number,    -- Рег. номер планов и отчетов производства изделий
 | ||
|       NCOMPANY              in number     -- Рег. номер организации
 | ||
|     )
 | ||
|     is
 | ||
|       NIDENT                PKG_STD.TREF; -- Идентификатор отмеченных записей
 | ||
|       NTMP                  PKG_STD.TREF; -- Буфер
 | ||
|     begin
 | ||
|       /* Генерируем идентификатор отмеченных записей */
 | ||
|       NIDENT := GEN_IDENT();
 | ||
|       /* Цикл по записям спецификации плана */
 | ||
|       for REC in (select T.RN from FCPRODPLANSP T where T.PRN = NFCPRODPLAN)
 | ||
|       loop
 | ||
|         /* Добавляем запись в отмеченные записи */
 | ||
|         P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => REC.RN, SUNITCODE => 'CostProductPlansSpecs', NRN => NTMP);
 | ||
|       end loop;
 | ||
|       /* Расчет факта */
 | ||
|       P_FCPRODPLANSP_BASE_CALC_FACT(NCOMPANY => NCOMPANY, NIDENT => NIDENT);
 | ||
|       /* Очистка отмеченных записей */
 | ||
|       P_SELECTLIST_CLEAR(NIDENT => NIDENT);
 | ||
|     exception
 | ||
|       when others then
 | ||
|         /* Очистка отмеченных записей */
 | ||
|         P_SELECTLIST_CLEAR(NIDENT => NIDENT);
 | ||
|     end FCPRODPLANSP_CALC;
 | ||
|   begin
 | ||
|     /* Если это выбор плана */
 | ||
|     if (NINCLUDE_DEF = 1) then
 | ||
|       /* Расчет факта выпусков плана */
 | ||
|       FCPRODPLANSP_CALC(NFCPRODPLAN => NFCPRODPLAN, NCOMPANY => NCOMPANY);
 | ||
|     end if;
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 7);
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSTATUS',
 | ||
|                                         SCAPTION   => 'Статус',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SPROD_ORDER',
 | ||
|                                         SCAPTION   => 'Заказ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true,
 | ||
|                                         SHINT      => 'Содержит ссылку на связанные сдаточные накладные.',
 | ||
|                                         NWIDTH     => 100);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SMATRES_CODE',
 | ||
|                                         SCAPTION   => 'Обозначение',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true,
 | ||
|                                         SHINT      => 'Содержит ссылку на связанные маршрутные листы.<br><br>' ||
 | ||
|                                                       'Цвет залики отражает следующие статусы:<br>' ||
 | ||
|                                                       '<b style="color:lightgreen">Зеленый</b> - "Факт" равен "План";<br>' ||
 | ||
|                                                       '<b style="color:lightblue">Голубой</b> - "План" меньше или равно "Факт" + "Запущено";<br>' ||
 | ||
|                                                       '<b style="color:#F0E68C">Желтый</b> - предыдущие условия не выполнены и на текущую дату сумма "Количество план" = 0 или меньше "План", то "Факт" больше или равно "План". ' ||
 | ||
|                                                       'Иначе сумма "Количество факт" больше или равно сумме "Количество план";<br>' ||
 | ||
|                                                       '<b style="color:lightcoral">Красный</b> - ни одно из предыдущих условий не выполнено.<br>',
 | ||
|                                         NWIDTH     => 120);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SMATRES_NAME',
 | ||
|                                         SCAPTION   => 'Наименование',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true,
 | ||
|                                         NWIDTH     => 200);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSUBDIV',
 | ||
|                                         SCAPTION   => 'Цех-получатель',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         BORDER     => true,
 | ||
|                                         NWIDTH     => 180);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NMAIN_QUANT',
 | ||
|                                         SCAPTION   => 'План',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         NWIDTH     => 80);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NREL_FACT',
 | ||
|                                         SCAPTION   => 'Факт',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         NWIDTH     => 80);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NFCROUTLST_QUANT',
 | ||
|                                         SCAPTION   => 'Запущено',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         NWIDTH     => 90);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NVALUE_BY_DAYS',
 | ||
|                                         SCAPTION   => 'План/факт по дням',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true,
 | ||
|                                         SHINT      => 'Значения по спецификации "График сдачи":<br>' ||
 | ||
|                                                       'Черный - значение "Количество план";<br>' ||
 | ||
|                                                       '<b style="color:blue">Синий</b> - значение "Количество факт".<br><br>' ||
 | ||
|                                                       'Заливка <b style="color:lightgrey">серым</b> определяет текущий день.');
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSUM_PLAN',
 | ||
|                                         SCAPTION   => 'Сумма "Количество план"',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSUM_FACT',
 | ||
|                                         SCAPTION   => 'Сумма "Количество факт"',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     /* Считываем первый и последний день месяца */
 | ||
|     P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
 | ||
|     /* Инициализация дней месяца */
 | ||
|     INIT_DAYS(RDG => RDG, DDATE_FROM => DDATE_FROM, DDATE_TO => DDATE_TO);
 | ||
|     /* Обходим данные */
 | ||
|     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 => '                       (select PORD.NUMB from FACEACC PORD where (PORD.RN = T.PROD_ORDER)) SPROD_ORDER,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       MRES.CODE SMATRES_CODE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       MRES."NAME" SMATRES_NAME,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select INS_D.CODE from INS_DEPARTMENT INS_D where INS_D.RN = T.SUBDIV) SSUBDIV,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.MAIN_QUANT NMAIN_QUANT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.REL_FACT NREL_FACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select COALESCE(sum(F.QUANT), ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ')');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from DOCLINKS  DL,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               DOCLINKS  L,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               FCROUTLST F');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where DL.OUT_DOCUMENT = T.RN');
 | ||
|       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 => 'CostProductPlansSpecs'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and L.IN_DOCUMENT = DL.IN_DOCUMENT');
 | ||
|       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 => 'CostRouteLists'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and F.RN = L.OUT_DOCUMENT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and F."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ') NFCROUTLST_QUANT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from FCPRODPLAN    P,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCPRODPLANSP  T,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCMATRESOURCE MRES');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where P.RN = :NFCPRODPLAN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and P.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.PRN = P.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.MAIN_QUANT <> ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.MATRES = MRES.RN');
 | ||
|       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 => 'CostProductPlans'));
 | ||
|       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 => 'CostProductPlans'));
 | ||
|       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.TDG_ORDERS_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 => 'NFCPRODPLAN', NVALUE => NFCPRODPLAN);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       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_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);
 | ||
|       /* Делаем выборку */
 | ||
|       if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
 | ||
|         null;
 | ||
|       end if;
 | ||
|       /* Обходим выбранные записи */
 | ||
|       while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
 | ||
|       loop
 | ||
|         /* Читаем данные из курсора */
 | ||
|         PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCPRODPLANSP);
 | ||
|         /* Добавляем колонку с рег. номером */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCPRODPLANSP, BCLEAR => true);
 | ||
|         /* Добавляем колонки с данными */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SPROD_ORDER',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRES_CODE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRES_NAME',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SSUBDIV',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NMAIN_QUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NREL_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NFCROUTLST_QUANT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 8);
 | ||
|         /* Считываем рег. номер связанной спецификации из "Производственная программа" */
 | ||
|         NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP);
 | ||
|         /* Если есть связанная спецификация из производственной программы */
 | ||
|         if (NFCPRODPLANSP_MAIN is not null) then
 | ||
|           /* Инициализируем список маршрутных листов */
 | ||
|           UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP_MAIN, NIDENT => NFCROUTLST_IDENT);
 | ||
|           /* Считываем модификацию номенклатуры */
 | ||
|           NMODIF := FCPRODPLANSP_MODIF_GET(NFCPRODPLANSP => NFCPRODPLANSP_MAIN);
 | ||
|         end if;
 | ||
|         /* Обнуляем сумму "Количество план" и "Количество факт" по строке */
 | ||
|         NSUM_PLAN := 0;
 | ||
|         NSUM_FACT := 0;
 | ||
|         /* Добавляем значения по графику сдачи */
 | ||
|         for REC in (select TMP.DOC_DATE,
 | ||
|                            COALESCE(sum(TMP.QUANT_PLAN), 0) QUANT_PLAN,
 | ||
|                            COALESCE(sum(TMP.QUANT_FACT), 0) QUANT_FACT
 | ||
|                       from ( /* Указаны в спецификации */
 | ||
|                             select T.DOC_DATE,
 | ||
|                                     T.QUANT_PLAN,
 | ||
|                                     0 QUANT_FACT
 | ||
|                               from FCPRODPLANDLVSH T
 | ||
|                              where T.PRN = NFCPRODPLANSP
 | ||
|                                and T.DOC_DATE >= DDATE_FROM
 | ||
|                                and T.DOC_DATE <= DDATE_TO
 | ||
|                             union
 | ||
|                             /* Связаны со спецификацией плана или связанной строкой "Производственная программа" */
 | ||
|                             select D.WORK_DATE,
 | ||
|                                     0,
 | ||
|                                     sum(S.QUANT_FACT)
 | ||
|                               from INCOMEFROMDEPS     D,
 | ||
|                                     INCOMEFROMDEPSSPEC S
 | ||
|                              where ( /* Связь по МЛ связанной строки "Производственная программа" */
 | ||
|                                     (D.RN in (select DL.OUT_DOCUMENT
 | ||
|                                                 from SELECTLIST SL,
 | ||
|                                                      FCROUTLST  FL,
 | ||
|                                                      DOCLINKS   DL
 | ||
|                                                where SL.IDENT = NFCROUTLST_IDENT
 | ||
|                                                  and SL.UNITCODE = 'CostRouteLists'
 | ||
|                                                  and FL.RN = SL.DOCUMENT
 | ||
|                                                  and FL.STATE = 1
 | ||
|                                                  and DL.IN_DOCUMENT = FL.RN
 | ||
|                                                  and DL.IN_UNITCODE = 'CostRouteLists'
 | ||
|                                                  and DL.OUT_UNITCODE = 'IncomFromDeps')) or
 | ||
|                                    /* Прямая связь со связанной строкой "Производственная программа" */
 | ||
|                                     (D.RN in (select L.OUT_DOCUMENT
 | ||
|                                                 from DOCLINKS L
 | ||
|                                                where L.IN_DOCUMENT = NFCPRODPLANSP_MAIN
 | ||
|                                                  and L.IN_UNITCODE = 'CostProductPlansSpecs'
 | ||
|                                                  and L.OUT_UNITCODE = 'IncomFromDeps')) or
 | ||
|                                    /* Прямая связь с обрабатываемой строкой */
 | ||
|                                     (D.RN in (select L.OUT_DOCUMENT
 | ||
|                                                 from DOCLINKS L
 | ||
|                                                where L.IN_DOCUMENT = NFCPRODPLANSP
 | ||
|                                                  and L.IN_UNITCODE = 'CostProductPlansSpecs'
 | ||
|                                                  and L.OUT_UNITCODE = 'IncomFromDeps')))
 | ||
|                                and D.DOC_STATE = NFCPRODPLAN_STATUS
 | ||
|                                and D.WORK_DATE >= DDATE_FROM
 | ||
|                                and D.WORK_DATE <= DDATE_TO
 | ||
|                                and S.PRN = D.RN
 | ||
|                                and S.NOMMODIF = NMODIF
 | ||
|                              group by D.WORK_DATE) TMP
 | ||
|                      group by TMP.DOC_DATE)
 | ||
|         loop
 | ||
|           /* Добавляем значение план/факт в соответствующую колонку */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW   => RDG_ROW,
 | ||
|                                               SNAME  => 'N_' || TO_CHAR(REC.DOC_DATE, SCOL_PATTERN_DATE) || '_PLAN_FACT',
 | ||
|                                               SVALUE => TO_CHAR(REC.QUANT_PLAN) || '/' || TO_CHAR(REC.QUANT_FACT));
 | ||
|           /* Если это ранее текущей даты */
 | ||
|           if (REC.DOC_DATE <= DDATE) then
 | ||
|             /* Добавляем к сумме по строке */
 | ||
|             NSUM_PLAN := NSUM_PLAN + REC.QUANT_PLAN;
 | ||
|             NSUM_FACT := NSUM_FACT + REC.QUANT_FACT;
 | ||
|           end if;
 | ||
|         end loop;
 | ||
|         /* Добавляем колонки с суммами */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_PLAN', NVALUE => NSUM_PLAN);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_FACT', NVALUE => NSUM_FACT);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|         /* Очищаем отмеченные маршрутные листы */
 | ||
|         P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|       end loop;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|         /* Очищаем отмеченные маршрутные листы */
 | ||
|         P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|         raise;
 | ||
|     end;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end FCPRODPLANSP_DEPT_DG_GET;
 | ||
|   
 | ||
|   /* Инициализация записей раздела "Планы и отчеты производства изделий" */
 | ||
|   procedure FCPRODPLAN_DEPT_INIT
 | ||
|   (
 | ||
|     COUT                    out clob                               -- Список записей раздела "Планы и отчеты производства изделий"
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NVERSION                PKG_STD.TREF;                          -- Версия контрагентов
 | ||
|     DDATE_FROM              PKG_STD.TLDATE;                        -- Дата с
 | ||
|     DDATE_TO                PKG_STD.TLDATE;                        -- Дата по
 | ||
|   begin
 | ||
|     /* Считываем версию контрагентов */
 | ||
|     FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|     /* Определяем период записей */
 | ||
|     P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
 | ||
|     /* Начинаем формирование XML */
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     /* Открываем корень */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
 | ||
|     /* Цикл по планам и отчетам производства изделий */
 | ||
|     for REC in (select P.RN NRN,
 | ||
|                        DT.DOCCODE || ', ' || trim(P.PREFIX) || '-' || trim(P.NUMB) || ', ' ||
 | ||
|                        TO_CHAR(P.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
 | ||
|                        D.CODE as SSUBDIV,
 | ||
|                        TO_CHAR(E.STARTDATE, 'mm.yyyy') as SPERIOD
 | ||
|                   from FCPRODPLAN     P,
 | ||
|                        FINSTATE       FS,
 | ||
|                        DOCTYPES       DT,
 | ||
|                        INS_DEPARTMENT D,
 | ||
|                        ENPERIOD       E
 | ||
|                  where P.CATEGORY = NFCPRODPLAN_DEPT_CTGR
 | ||
|                    and P.STATUS = NFCPRODPLAN_STATUS
 | ||
|                    and P.COMPANY = NCOMPANY
 | ||
|                    and P.SUBDIV in (select C.DEPTRN
 | ||
|                                       from CLNPSPFM      C,
 | ||
|                                            CLNPSPFMTYPES CT
 | ||
|                                      where exists (select null
 | ||
|                                               from CLNPERSONS CP
 | ||
|                                              where exists (select null
 | ||
|                                                       from AGNLIST T
 | ||
|                                                      where T.PERS_AUTHID = UTILIZER()
 | ||
|                                                        and CP.PERS_AGENT = T.RN
 | ||
|                                                        and T.VERSION = NVERSION)
 | ||
|                                                and C.PERSRN = CP.RN
 | ||
|                                                and CP.COMPANY = NCOMPANY)
 | ||
|                                        and C.COMPANY = NCOMPANY
 | ||
|                                        and C.BEGENG <= sysdate
 | ||
|                                        and (C.ENDENG >= sysdate or C.ENDENG is null)
 | ||
|                                        and C.CLNPSPFMTYPES = CT.RN
 | ||
|                                        and CT.IS_PRIMARY = 1)
 | ||
|                    and FS.RN = P.TYPE
 | ||
|                    and FS.CODE = SFCPRODPLAN_TYPE
 | ||
|                    and D.RN = P.SUBDIV
 | ||
|                    and DT.RN = P.DOCTYPE
 | ||
|                    and E.RN = P.CALC_PERIOD
 | ||
|                    and E.STARTDATE >= DDATE_FROM
 | ||
|                    and E.ENDDATE <= DDATE_TO
 | ||
|                    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())
 | ||
|                  order by SDOC_INFO)
 | ||
|     loop
 | ||
|       /* Открываем план */
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLANS');
 | ||
|       /* Описываем план */
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => REC.SDOC_INFO);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD);
 | ||
|       /* Закрываем план */
 | ||
|       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 FCPRODPLAN_DEPT_INIT;
 | ||
|   
 | ||
|   /*
 | ||
|     Процедуры панели "Выдача сменного задания"
 | ||
|   */
 | ||
|   
 | ||
|   /* Выдать задания сменного задания */
 | ||
|   procedure FCJOBSSP_ISSUE
 | ||
|   (
 | ||
|     NFCJOBS                 in number                              -- Рег. номер сменного задания
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NDICMUNTS               PKG_STD.TREF;                          -- Рег. номер ед. изм. дня
 | ||
|     DSTART_DATE             PKG_STD.TLDATE;                        -- Дата начала строки плана
 | ||
|     DEND_DATE               PKG_STD.TLDATE;                        -- Дата окончания строки плана
 | ||
|   begin
 | ||
|     /* Если сменное задание не указано */
 | ||
|     if (NFCJOBS is null) then
 | ||
|       P_EXCEPTION(0, 'Сменное задание не определено.');
 | ||
|     end if;
 | ||
|     /* Считываем единицу измерения минут */
 | ||
|     FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                        NFLAG_OPTION => 0,
 | ||
|                        NCOMPANY     => NCOMPANY,
 | ||
|                        SMEAS_MNEMO  => SDICMUNTS_DAY,
 | ||
|                        NRN          => NDICMUNTS);
 | ||
|     /* Отбираем строки с пустым "Станок факт" */
 | ||
|     for REC in (select T.RN
 | ||
|                   from FCJOBSSP T
 | ||
|                  where T.PRN = NFCJOBS
 | ||
|                    and T.EQCONFIG is null)
 | ||
|     loop
 | ||
|       /* Удаляем строку */
 | ||
|       P_FCJOBSSP_BASE_DELETE(NRN => REC.RN, NCOMPANY => NCOMPANY);
 | ||
|     end loop;
 | ||
|     /* Цикл по станкам строк */
 | ||
|     for EQ in (select T.EQCONFIG from FCJOBSSP T where T.PRN = NFCJOBS group by T.EQCONFIG)
 | ||
|     loop
 | ||
|       /* Цикл по строкам с текущим станком */
 | ||
|       for REC in (select TMP.*,
 | ||
|                          DECODE(B.RN, null, TMP.DDOC_DATE, TMP.DDOC_DATE + B.BEG_TIME) DSTART,
 | ||
|                          F_DICMUNTS_BASE_RECALC_QUANT(0, TMP.COMPANY, TMP.MUNIT, TMP.LABOUR_PLAN, NDICMUNTS) NLABOUR,
 | ||
|                          ROWNUM RNUM
 | ||
|                     from (select T.*,
 | ||
|                                  J.DOCDATE DDOC_DATE,
 | ||
|                                  COALESCE(T.TBOPERMODESP, J.TBOPERMODESP) NTBOPERMODESP
 | ||
|                             from FCJOBS   J,
 | ||
|                                  FCJOBSSP T
 | ||
|                            where J.RN = NFCJOBS
 | ||
|                              and T.PRN = J.RN
 | ||
|                              and T.EQCONFIG = EQ.EQCONFIG
 | ||
|                            order by T.PRIOR_PARTY asc) TMP,
 | ||
|                          TBOPERMODESP B
 | ||
|                    where B.RN = TMP.NTBOPERMODESP)
 | ||
|       loop
 | ||
|         /* Если это первая строка - устанавливаем по смене */
 | ||
|         if (REC.RNUM = 1) then
 | ||
|           DSTART_DATE := REC.DSTART;
 | ||
|           DEND_DATE   := DSTART_DATE + REC.NLABOUR;
 | ||
|         else
 | ||
|           DSTART_DATE := DEND_DATE;
 | ||
|           DEND_DATE   := DSTART_DATE + REC.NLABOUR;
 | ||
|         end if;
 | ||
|         /* Обновляем запись строки */
 | ||
|         P_FCJOBSSP_BASE_UPDATE(NRN            => REC.RN,
 | ||
|                                NCOMPANY       => REC.COMPANY,
 | ||
|                                SNUMB          => REC.NUMB,
 | ||
|                                NTBOPERMODESP  => REC.TBOPERMODESP,
 | ||
|                                SBARCODE       => REC.BARCODE,
 | ||
|                                NFACEACC       => REC.FACEACC,
 | ||
|                                NMATRES        => REC.MATRES,
 | ||
|                                NNOMCLASSIF    => REC.NOMCLASSIF,
 | ||
|                                NARTICLE       => REC.ARTICLE,
 | ||
|                                NFCROUTSHTSP   => REC.FCROUTSHTSP,
 | ||
|                                SOPER_NUMB     => REC.OPER_NUMB,
 | ||
|                                NOPER_TPS      => REC.OPER_TPS,
 | ||
|                                SOPER_UK       => REC.OPER_UK,
 | ||
|                                NSIGN_CONTRL   => REC.SIGN_CONTRL,
 | ||
|                                NMANPOWER      => REC.MANPOWER,
 | ||
|                                NCATEGORY      => REC.CATEGORY,
 | ||
|                                DBEG_PLAN      => DSTART_DATE,
 | ||
|                                DEND_PLAN      => DEND_DATE,
 | ||
|                                DBEG_FACT      => REC.BEG_FACT,
 | ||
|                                DEND_FACT      => REC.END_FACT,
 | ||
|                                NQUANT_PLAN    => REC.QUANT_PLAN,
 | ||
|                                NQUANT_FACT    => REC.QUANT_FACT,
 | ||
|                                NNORM          => REC.NORM,
 | ||
|                                NT_SHT_FACT    => REC.T_SHT_FACT,
 | ||
|                                NT_PZ_PLAN     => REC.T_PZ_PLAN,
 | ||
|                                NT_PZ_FACT     => REC.T_PZ_FACT,
 | ||
|                                NT_VSP_PLAN    => REC.T_VSP_PLAN,
 | ||
|                                NT_VSP_FACT    => REC.T_VSP_FACT,
 | ||
|                                NT_O_PLAN      => REC.T_O_PLAN,
 | ||
|                                NT_O_FACT      => REC.T_O_FACT,
 | ||
|                                NNORM_TYPE     => REC.NORM_TYPE,
 | ||
|                                NSIGN_P_R      => REC.SIGN_P_R,
 | ||
|                                NLABOUR_PLAN   => REC.LABOUR_PLAN,
 | ||
|                                NLABOUR_FACT   => REC.LABOUR_FACT,
 | ||
|                                NCOST_PLAN     => REC.COST_PLAN,
 | ||
|                                NCOST_FACT     => REC.COST_FACT,
 | ||
|                                NCOST_FOR      => REC.COST_FOR,
 | ||
|                                NCURNAMES      => REC.CURNAMES,
 | ||
|                                NPERFORM_PLAN  => REC.PERFORM_PLAN,
 | ||
|                                NPERFORM_FACT  => REC.PERFORM_FACT,
 | ||
|                                NSTAFFGRP_PLAN => REC.STAFFGRP_PLAN,
 | ||
|                                NSTAFFGRP_FACT => REC.STAFFGRP_FACT,
 | ||
|                                NEQUIP_PLAN    => REC.EQUIP_PLAN,
 | ||
|                                NEQUIP_FACT    => REC.EQUIP_FACT,
 | ||
|                                NLOSTTYPE      => REC.LOSTTYPE,
 | ||
|                                NLOSTDEFL      => REC.LOSTDEFL,
 | ||
|                                NFOREMAN       => REC.FOREMAN,
 | ||
|                                NINSPECTOR     => REC.INSPECTOR,
 | ||
|                                DOTK_DATE      => REC.OTK_DATE,
 | ||
|                                NSUBDIV        => REC.SUBDIV,
 | ||
|                                NEQCONFIG      => REC.EQCONFIG,
 | ||
|                                SNOTE          => 'Задание выдано ' || TO_CHAR(sysdate, 'dd.mm.yyyy hh24:mi:ss'),
 | ||
|                                NMUNIT         => REC.MUNIT);
 | ||
|       end loop;
 | ||
|     end loop;
 | ||
|   end FCJOBSSP_ISSUE;
 | ||
|   
 | ||
|   /* Исключение станка из операции сменного задания */
 | ||
|   procedure FCJOBSSP_EXC_EQCONFIG
 | ||
|   (
 | ||
|     NFCJOBSSP               in number                              -- Рег. номер строки сменного задания
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     RFCJOBSSP               FCJOBSSP%rowtype;                      -- Запись строки сменного задания
 | ||
|   begin
 | ||
|     /* Если рег. номер строки не указан */
 | ||
|     if (NFCJOBSSP is null) then
 | ||
|       P_EXCEPTION(0, 'Строка сменного задания не определена.');
 | ||
|     end if;
 | ||
|     /* Считываем запись строки сменного задания */
 | ||
|     RFCJOBSSP := UTL_FCJOBSSP_GET(NCOMPANY => NCOMPANY, NFCJOBSSP => NFCJOBSSP);
 | ||
|     /* Если дата начала факт указана */
 | ||
|     if (RFCJOBSSP.BEG_FACT is not null) then
 | ||
|       P_EXCEPTION(0, 'Указанная строка сменного задания исполняется.');
 | ||
|     end if;
 | ||
|     /* Исключаем станок */
 | ||
|     P_FCJOBSSP_BASE_UPDATE(NRN            => RFCJOBSSP.RN,
 | ||
|                            NCOMPANY       => RFCJOBSSP.COMPANY,
 | ||
|                            SNUMB          => RFCJOBSSP.NUMB,
 | ||
|                            NTBOPERMODESP  => RFCJOBSSP.TBOPERMODESP,
 | ||
|                            SBARCODE       => RFCJOBSSP.BARCODE,
 | ||
|                            NFACEACC       => RFCJOBSSP.FACEACC,
 | ||
|                            NMATRES        => RFCJOBSSP.MATRES,
 | ||
|                            NNOMCLASSIF    => RFCJOBSSP.NOMCLASSIF,
 | ||
|                            NARTICLE       => RFCJOBSSP.ARTICLE,
 | ||
|                            NFCROUTSHTSP   => RFCJOBSSP.FCROUTSHTSP,
 | ||
|                            SOPER_NUMB     => RFCJOBSSP.OPER_NUMB,
 | ||
|                            NOPER_TPS      => RFCJOBSSP.OPER_TPS,
 | ||
|                            SOPER_UK       => RFCJOBSSP.OPER_UK,
 | ||
|                            NSIGN_CONTRL   => RFCJOBSSP.SIGN_CONTRL,
 | ||
|                            NMANPOWER      => RFCJOBSSP.MANPOWER,
 | ||
|                            NCATEGORY      => RFCJOBSSP.CATEGORY,
 | ||
|                            DBEG_PLAN      => RFCJOBSSP.BEG_PLAN,
 | ||
|                            DEND_PLAN      => RFCJOBSSP.END_PLAN,
 | ||
|                            DBEG_FACT      => RFCJOBSSP.BEG_FACT,
 | ||
|                            DEND_FACT      => RFCJOBSSP.END_FACT,
 | ||
|                            NQUANT_PLAN    => RFCJOBSSP.QUANT_PLAN,
 | ||
|                            NQUANT_FACT    => RFCJOBSSP.QUANT_FACT,
 | ||
|                            NNORM          => RFCJOBSSP.NORM,
 | ||
|                            NT_SHT_FACT    => RFCJOBSSP.T_SHT_FACT,
 | ||
|                            NT_PZ_PLAN     => RFCJOBSSP.T_PZ_PLAN,
 | ||
|                            NT_PZ_FACT     => RFCJOBSSP.T_PZ_FACT,
 | ||
|                            NT_VSP_PLAN    => RFCJOBSSP.T_VSP_PLAN,
 | ||
|                            NT_VSP_FACT    => RFCJOBSSP.T_VSP_FACT,
 | ||
|                            NT_O_PLAN      => RFCJOBSSP.T_O_PLAN,
 | ||
|                            NT_O_FACT      => RFCJOBSSP.T_O_FACT,
 | ||
|                            NNORM_TYPE     => RFCJOBSSP.NORM_TYPE,
 | ||
|                            NSIGN_P_R      => RFCJOBSSP.SIGN_P_R,
 | ||
|                            NLABOUR_PLAN   => RFCJOBSSP.LABOUR_PLAN,
 | ||
|                            NLABOUR_FACT   => RFCJOBSSP.LABOUR_FACT,
 | ||
|                            NCOST_PLAN     => RFCJOBSSP.COST_PLAN,
 | ||
|                            NCOST_FACT     => RFCJOBSSP.COST_FACT,
 | ||
|                            NCOST_FOR      => RFCJOBSSP.COST_FOR,
 | ||
|                            NCURNAMES      => RFCJOBSSP.CURNAMES,
 | ||
|                            NPERFORM_PLAN  => RFCJOBSSP.PERFORM_PLAN,
 | ||
|                            NPERFORM_FACT  => RFCJOBSSP.PERFORM_FACT,
 | ||
|                            NSTAFFGRP_PLAN => RFCJOBSSP.STAFFGRP_PLAN,
 | ||
|                            NSTAFFGRP_FACT => RFCJOBSSP.STAFFGRP_FACT,
 | ||
|                            NEQUIP_PLAN    => RFCJOBSSP.EQUIP_PLAN,
 | ||
|                            NEQUIP_FACT    => RFCJOBSSP.EQUIP_FACT,
 | ||
|                            NLOSTTYPE      => RFCJOBSSP.LOSTTYPE,
 | ||
|                            NLOSTDEFL      => RFCJOBSSP.LOSTDEFL,
 | ||
|                            NFOREMAN       => RFCJOBSSP.FOREMAN,
 | ||
|                            NINSPECTOR     => RFCJOBSSP.INSPECTOR,
 | ||
|                            DOTK_DATE      => RFCJOBSSP.OTK_DATE,
 | ||
|                            NSUBDIV        => RFCJOBSSP.SUBDIV,
 | ||
|                            NEQCONFIG      => null,
 | ||
|                            SNOTE          => RFCJOBSSP.NOTE,
 | ||
|                            NMUNIT         => RFCJOBSSP.MUNIT);
 | ||
|   end FCJOBSSP_EXC_EQCONFIG;
 | ||
|   
 | ||
|   /* Включение станка в строку сменного задания */
 | ||
|   procedure FCJOBSSP_INC_EQCONFIG
 | ||
|   (
 | ||
|     NEQCONFIG               in number,                             -- Рег. номер состава оборудования
 | ||
|     NFCJOBSSP               in number,                             -- Рег. номер строки сменного задания
 | ||
|     NQUANT_PLAN             in number                              -- Включаемое количество
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NQUANT_REMN             PKG_STD.TLNUMBER;                      -- Остаток количества
 | ||
|     RFCJOBSSP               FCJOBSSP%rowtype;                      -- Запись строки сменного задания
 | ||
|     NNEW_FCJOBSSP           PKG_STD.TREF;                          -- Рег. номер новой строки сменного задания
 | ||
|     NROUTLST                PKG_STD.TREF;                          -- Рег. номер связанного МЛ
 | ||
|     NROUTLSTSP              PKG_STD.TREF;                          -- Рег. номер связанной строки МЛ
 | ||
|     
 | ||
|     /* Пересчет "Трудоемкость план" строки сменного задания */
 | ||
|     procedure LABOUR_PLAN_RECALC
 | ||
|     (
 | ||
|       RFCJOBSSP             in out FCJOBSSP%rowtype, -- Запись строки сменного задания
 | ||
|       NQUANT_PLAN           in number                -- Количество план
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Если не установлен признак "То план" */
 | ||
|       if ((RFCJOBSSP.T_O_PLAN is null) or ((RFCJOBSSP.T_O_PLAN is not null) and (RFCJOBSSP.T_O_PLAN = 0))) then
 | ||
|         /* Если установлен признак "На партию выпуска" */
 | ||
|         if (RFCJOBSSP.SIGN_P_R = 1) then
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.NORM;
 | ||
|         else
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.NORM * NQUANT_PLAN;
 | ||
|         end if;
 | ||
|       else
 | ||
|         /* Если установлен признак "На партию выпуска" */
 | ||
|         if (RFCJOBSSP.SIGN_P_R = 1) then
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.T_O_PLAN + COALESCE(RFCJOBSSP.T_PZ_PLAN, 0) +
 | ||
|                                    COALESCE(RFCJOBSSP.T_VSP_PLAN, 0);
 | ||
|         else
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.T_O_PLAN * NQUANT_PLAN + COALESCE(RFCJOBSSP.T_PZ_PLAN, 0) +
 | ||
|                                    COALESCE(RFCJOBSSP.T_VSP_PLAN, 0);
 | ||
|         end if;
 | ||
|       end if;
 | ||
|     end LABOUR_PLAN_RECALC;
 | ||
|   begin
 | ||
|     /* Если включаемое количество меньше 0 или пустое */
 | ||
|     if ((NQUANT_PLAN is null) or ((NQUANT_PLAN is not null) and (NQUANT_PLAN <= 0))) then
 | ||
|       P_EXCEPTION(0, 'Невозможно включить указанное количество.');
 | ||
|     end if;
 | ||
|     /* Если рабочее место выбрано */
 | ||
|     if (NEQCONFIG is not null) then
 | ||
|       /* Проверяем наличие состава оборудования */
 | ||
|       UTL_EQCONFIG_EXISTS(NEQCONFIG => NEQCONFIG, NCOMPANY => NCOMPANY);
 | ||
|     else
 | ||
|       P_EXCEPTION(0, 'Рабочее место не определено.');
 | ||
|     end if;
 | ||
|     /* Если рег. номер строки не указан */
 | ||
|     if (NFCJOBSSP is null) then
 | ||
|       P_EXCEPTION(0, 'Строка сменного задания не определена.');
 | ||
|     end if;
 | ||
|     /* Считываем запись строки сменного задания */
 | ||
|     RFCJOBSSP := UTL_FCJOBSSP_GET(NCOMPANY => NCOMPANY, NFCJOBSSP => NFCJOBSSP);
 | ||
|     /* Если дата начала факт указана */
 | ||
|     if (RFCJOBSSP.BEG_FACT is not null) then
 | ||
|       P_EXCEPTION(0, 'Указанная строка сменного задания исполняется.');
 | ||
|     end if;
 | ||
|     /* Если включаемое количество больше текущего */
 | ||
|     if (NQUANT_PLAN > RFCJOBSSP.QUANT_PLAN) then
 | ||
|       P_EXCEPTION(0,
 | ||
|                   'Указанное количество превышает текущее "Количество план" строки.');
 | ||
|     end if;
 | ||
|     /* Рассчитываем остаточное количество */
 | ||
|     NQUANT_REMN := RFCJOBSSP.QUANT_PLAN - NQUANT_PLAN;
 | ||
|     /* Пересчитываем "Количество план" */
 | ||
|     LABOUR_PLAN_RECALC(RFCJOBSSP => RFCJOBSSP, NQUANT_PLAN => NQUANT_PLAN);
 | ||
|     /* Включаем станок */
 | ||
|     P_FCJOBSSP_BASE_UPDATE(NRN            => RFCJOBSSP.RN,
 | ||
|                            NCOMPANY       => RFCJOBSSP.COMPANY,
 | ||
|                            SNUMB          => RFCJOBSSP.NUMB,
 | ||
|                            NTBOPERMODESP  => RFCJOBSSP.TBOPERMODESP,
 | ||
|                            SBARCODE       => RFCJOBSSP.BARCODE,
 | ||
|                            NFACEACC       => RFCJOBSSP.FACEACC,
 | ||
|                            NMATRES        => RFCJOBSSP.MATRES,
 | ||
|                            NNOMCLASSIF    => RFCJOBSSP.NOMCLASSIF,
 | ||
|                            NARTICLE       => RFCJOBSSP.ARTICLE,
 | ||
|                            NFCROUTSHTSP   => RFCJOBSSP.FCROUTSHTSP,
 | ||
|                            SOPER_NUMB     => RFCJOBSSP.OPER_NUMB,
 | ||
|                            NOPER_TPS      => RFCJOBSSP.OPER_TPS,
 | ||
|                            SOPER_UK       => RFCJOBSSP.OPER_UK,
 | ||
|                            NSIGN_CONTRL   => RFCJOBSSP.SIGN_CONTRL,
 | ||
|                            NMANPOWER      => RFCJOBSSP.MANPOWER,
 | ||
|                            NCATEGORY      => RFCJOBSSP.CATEGORY,
 | ||
|                            DBEG_PLAN      => RFCJOBSSP.BEG_PLAN,
 | ||
|                            DEND_PLAN      => RFCJOBSSP.END_PLAN,
 | ||
|                            DBEG_FACT      => RFCJOBSSP.BEG_FACT,
 | ||
|                            DEND_FACT      => RFCJOBSSP.END_FACT,
 | ||
|                            NQUANT_PLAN    => NQUANT_PLAN,
 | ||
|                            NQUANT_FACT    => RFCJOBSSP.QUANT_FACT,
 | ||
|                            NNORM          => RFCJOBSSP.NORM,
 | ||
|                            NT_SHT_FACT    => RFCJOBSSP.T_SHT_FACT,
 | ||
|                            NT_PZ_PLAN     => RFCJOBSSP.T_PZ_PLAN,
 | ||
|                            NT_PZ_FACT     => RFCJOBSSP.T_PZ_FACT,
 | ||
|                            NT_VSP_PLAN    => RFCJOBSSP.T_VSP_PLAN,
 | ||
|                            NT_VSP_FACT    => RFCJOBSSP.T_VSP_FACT,
 | ||
|                            NT_O_PLAN      => RFCJOBSSP.T_O_PLAN,
 | ||
|                            NT_O_FACT      => RFCJOBSSP.T_O_FACT,
 | ||
|                            NNORM_TYPE     => RFCJOBSSP.NORM_TYPE,
 | ||
|                            NSIGN_P_R      => RFCJOBSSP.SIGN_P_R,
 | ||
|                            NLABOUR_PLAN   => RFCJOBSSP.LABOUR_PLAN,
 | ||
|                            NLABOUR_FACT   => RFCJOBSSP.LABOUR_FACT,
 | ||
|                            NCOST_PLAN     => RFCJOBSSP.COST_PLAN,
 | ||
|                            NCOST_FACT     => RFCJOBSSP.COST_FACT,
 | ||
|                            NCOST_FOR      => RFCJOBSSP.COST_FOR,
 | ||
|                            NCURNAMES      => RFCJOBSSP.CURNAMES,
 | ||
|                            NPERFORM_PLAN  => RFCJOBSSP.PERFORM_PLAN,
 | ||
|                            NPERFORM_FACT  => RFCJOBSSP.PERFORM_FACT,
 | ||
|                            NSTAFFGRP_PLAN => RFCJOBSSP.STAFFGRP_PLAN,
 | ||
|                            NSTAFFGRP_FACT => RFCJOBSSP.STAFFGRP_FACT,
 | ||
|                            NEQUIP_PLAN    => RFCJOBSSP.EQUIP_PLAN,
 | ||
|                            NEQUIP_FACT    => RFCJOBSSP.EQUIP_FACT,
 | ||
|                            NLOSTTYPE      => RFCJOBSSP.LOSTTYPE,
 | ||
|                            NLOSTDEFL      => RFCJOBSSP.LOSTDEFL,
 | ||
|                            NFOREMAN       => RFCJOBSSP.FOREMAN,
 | ||
|                            NINSPECTOR     => RFCJOBSSP.INSPECTOR,
 | ||
|                            DOTK_DATE      => RFCJOBSSP.OTK_DATE,
 | ||
|                            NSUBDIV        => RFCJOBSSP.SUBDIV,
 | ||
|                            NEQCONFIG      => NEQCONFIG,
 | ||
|                            SNOTE          => RFCJOBSSP.NOTE,
 | ||
|                            NMUNIT         => RFCJOBSSP.MUNIT);
 | ||
|     /* Если есть остаток */
 | ||
|     if (NQUANT_REMN <> 0) then
 | ||
|       /* Обнуляем дату отработки */
 | ||
|       RFCJOBSSP.WORK_DATE := null;
 | ||
|       /* Получаем новый номер */
 | ||
|       P_FCJOBSSP_GETNEXTNUMB(NCOMPANY => NCOMPANY, NPRN => RFCJOBSSP.PRN, SNUMB => RFCJOBSSP.NUMB);
 | ||
|       /* Если штрихкод был указан */
 | ||
|       if (RFCJOBSSP.BARCODE is not null) then
 | ||
|         /* Получаем новый штрихкод */
 | ||
|         P_FCJOBSSP_GET_BARCODE(NCOMPANY => NCOMPANY, NRN => RFCJOBSSP.RN, SBARCODE => RFCJOBSSP.BARCODE);
 | ||
|       end if;
 | ||
|       /* Пересчитываем "Количество план" */
 | ||
|       LABOUR_PLAN_RECALC(RFCJOBSSP => RFCJOBSSP, NQUANT_PLAN => NQUANT_REMN);
 | ||
|       /* Размножаем запись */
 | ||
|       P_FCJOBSSP_BASE_INSERT(NCOMPANY       => RFCJOBSSP.COMPANY,
 | ||
|                              NPRN           => RFCJOBSSP.PRN,
 | ||
|                              SNUMB          => RFCJOBSSP.NUMB,
 | ||
|                              NTBOPERMODESP  => RFCJOBSSP.TBOPERMODESP,
 | ||
|                              SBARCODE       => RFCJOBSSP.BARCODE,
 | ||
|                              NFACEACC       => RFCJOBSSP.FACEACC,
 | ||
|                              NMATRES        => RFCJOBSSP.MATRES,
 | ||
|                              NNOMCLASSIF    => RFCJOBSSP.NOMCLASSIF,
 | ||
|                              NARTICLE       => RFCJOBSSP.ARTICLE,
 | ||
|                              NFCROUTSHTSP   => RFCJOBSSP.FCROUTSHTSP,
 | ||
|                              SOPER_NUMB     => RFCJOBSSP.OPER_NUMB,
 | ||
|                              NOPER_TPS      => RFCJOBSSP.OPER_TPS,
 | ||
|                              SOPER_UK       => RFCJOBSSP.OPER_UK,
 | ||
|                              NSIGN_CONTRL   => RFCJOBSSP.SIGN_CONTRL,
 | ||
|                              NMANPOWER      => RFCJOBSSP.MANPOWER,
 | ||
|                              NCATEGORY      => RFCJOBSSP.CATEGORY,
 | ||
|                              DBEG_PLAN      => RFCJOBSSP.BEG_PLAN,
 | ||
|                              DEND_PLAN      => RFCJOBSSP.END_PLAN,
 | ||
|                              DBEG_FACT      => RFCJOBSSP.BEG_FACT,
 | ||
|                              DEND_FACT      => RFCJOBSSP.END_FACT,
 | ||
|                              NQUANT_PLAN    => NQUANT_REMN,
 | ||
|                              NQUANT_FACT    => RFCJOBSSP.QUANT_FACT,
 | ||
|                              NNORM          => RFCJOBSSP.NORM,
 | ||
|                              NT_SHT_FACT    => RFCJOBSSP.T_SHT_FACT,
 | ||
|                              NT_PZ_PLAN     => RFCJOBSSP.T_PZ_PLAN,
 | ||
|                              NT_PZ_FACT     => RFCJOBSSP.T_PZ_FACT,
 | ||
|                              NT_VSP_PLAN    => RFCJOBSSP.T_VSP_PLAN,
 | ||
|                              NT_VSP_FACT    => RFCJOBSSP.T_VSP_FACT,
 | ||
|                              NT_O_PLAN      => RFCJOBSSP.T_O_PLAN,
 | ||
|                              NT_O_FACT      => RFCJOBSSP.T_O_FACT,
 | ||
|                              NNORM_TYPE     => RFCJOBSSP.NORM_TYPE,
 | ||
|                              NSIGN_P_R      => RFCJOBSSP.SIGN_P_R,
 | ||
|                              NLABOUR_PLAN   => RFCJOBSSP.LABOUR_PLAN,
 | ||
|                              NLABOUR_FACT   => RFCJOBSSP.LABOUR_FACT,
 | ||
|                              NCOST_PLAN     => RFCJOBSSP.COST_PLAN,
 | ||
|                              NCOST_FACT     => RFCJOBSSP.COST_FACT,
 | ||
|                              NCOST_FOR      => RFCJOBSSP.COST_FOR,
 | ||
|                              NCURNAMES      => RFCJOBSSP.CURNAMES,
 | ||
|                              NPERFORM_PLAN  => RFCJOBSSP.PERFORM_PLAN,
 | ||
|                              NPERFORM_FACT  => RFCJOBSSP.PERFORM_FACT,
 | ||
|                              NSTAFFGRP_PLAN => RFCJOBSSP.STAFFGRP_PLAN,
 | ||
|                              NSTAFFGRP_FACT => RFCJOBSSP.STAFFGRP_FACT,
 | ||
|                              NEQUIP_PLAN    => RFCJOBSSP.EQUIP_PLAN,
 | ||
|                              NEQUIP_FACT    => RFCJOBSSP.EQUIP_FACT,
 | ||
|                              NLOSTTYPE      => RFCJOBSSP.LOSTTYPE,
 | ||
|                              NLOSTDEFL      => RFCJOBSSP.LOSTDEFL,
 | ||
|                              NFOREMAN       => RFCJOBSSP.FOREMAN,
 | ||
|                              NINSPECTOR     => RFCJOBSSP.INSPECTOR,
 | ||
|                              DOTK_DATE      => RFCJOBSSP.OTK_DATE,
 | ||
|                              NSUBDIV        => RFCJOBSSP.SUBDIV,
 | ||
|                              NEQCONFIG      => null,
 | ||
|                              NSIGN_AR       => 1,
 | ||
|                              SNOTE          => RFCJOBSSP.NOTE,
 | ||
|                              NMUNIT         => RFCJOBSSP.MUNIT,
 | ||
|                              NPRIOR_ORDER   => RFCJOBSSP.PRIOR_ORDER,
 | ||
|                              NPRIOR_PARTY   => RFCJOBSSP.PRIOR_PARTY,
 | ||
|                              DEXEC_DATE     => RFCJOBSSP.EXEC_DATE,
 | ||
|                              DREL_DATE      => RFCJOBSSP.REL_DATE,
 | ||
|                              NRN            => NNEW_FCJOBSSP);
 | ||
|     
 | ||
|       /* связанные маршрутный лист и строка маршрутного листа */
 | ||
|       NROUTLST   := F_DOCLINKS_LINK_IN_DOC(SOUT_UNITCODE => 'CostJobsSpecs',
 | ||
|                                            NOUT_DOCUMENT => RFCJOBSSP.RN,
 | ||
|                                            SIN_UNITCODE  => 'CostRouteLists');
 | ||
|       NROUTLSTSP := F_DOCLINKS_LINK_IN_DOC(SOUT_UNITCODE => 'CostJobsSpecs',
 | ||
|                                            NOUT_DOCUMENT => RFCJOBSSP.RN,
 | ||
|                                            SIN_UNITCODE  => 'CostRouteListsSpecs');
 | ||
|     
 | ||
|       /* связывание с новой строкой сменного задания */
 | ||
|       if (NROUTLST is not null) and (NROUTLSTSP is not null) then
 | ||
|         /* Создаем связь с заголовоком МЛ */
 | ||
|         P_LINKSALL_LINK_DIRECT(NCOMPANY          => NCOMPANY,
 | ||
|                                SIN_UNITCODE      => 'CostRouteLists',
 | ||
|                                NIN_DOCUMENT      => NROUTLST,
 | ||
|                                NIN_PRN_DOCUMENT  => null,
 | ||
|                                DIN_IN_DATE       => sysdate,
 | ||
|                                NIN_STATUS        => 0,
 | ||
|                                SOUT_UNITCODE     => 'CostJobsSpecs',
 | ||
|                                NOUT_DOCUMENT     => NNEW_FCJOBSSP,
 | ||
|                                NOUT_PRN_DOCUMENT => RFCJOBSSP.PRN,
 | ||
|                                DOUT_IN_DATE      => sysdate,
 | ||
|                                NOUT_STATUS       => 0);
 | ||
|         /* Создаем связь со спецификацией МЛ */
 | ||
|         P_LINKSALL_LINK_DIRECT(NCOMPANY          => NCOMPANY,
 | ||
|                                SIN_UNITCODE      => 'CostRouteListsSpecs',
 | ||
|                                NIN_DOCUMENT      => NROUTLSTSP,
 | ||
|                                NIN_PRN_DOCUMENT  => NROUTLST,
 | ||
|                                DIN_IN_DATE       => sysdate,
 | ||
|                                NIN_STATUS        => 0,
 | ||
|                                SOUT_UNITCODE     => 'CostJobsSpecs',
 | ||
|                                NOUT_DOCUMENT     => NNEW_FCJOBSSP,
 | ||
|                                NOUT_PRN_DOCUMENT => RFCJOBSSP.PRN,
 | ||
|                                DOUT_IN_DATE      => sysdate,
 | ||
|                                NOUT_STATUS       => 0);
 | ||
|       end if;
 | ||
|     end if;
 | ||
|   end FCJOBSSP_INC_EQCONFIG;
 | ||
|   
 | ||
|   /* Получение спецификации сменного задания */
 | ||
|   procedure FCJOBSSP_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NVERSION                PKG_STD.TREF;                          -- Версия контрагентов
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS);
 | ||
|     /* Считываем версию контрагентов */
 | ||
|     FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|     /* Преобразуем номер и размер страницы в номер строк с и по */
 | ||
|     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.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 8);
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSELECT',
 | ||
|                                         SCAPTION   => 'Выбран',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NPRIOR_PARTY',
 | ||
|                                         SCAPTION   => 'Приоритет партии',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         NWIDTH     => 80);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SFCROUTLST',
 | ||
|                                         SCAPTION   => 'МЛ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SMATRES',
 | ||
|                                         SCAPTION   => 'ДСЕ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SOPER',
 | ||
|                                         SCAPTION   => 'Операция',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT_PLAN',
 | ||
|                                         SCAPTION   => 'Количество',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NLABOUR_PLAN',
 | ||
|                                         SCAPTION   => 'Трудоемкость',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SEQCONFIG',
 | ||
|                                         SCAPTION   => 'Станок',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NEQCONFIG',
 | ||
|                                         SCAPTION   => 'Рег. номер станка',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NEQUIP_PLAN',
 | ||
|                                         SCAPTION   => 'Рег. номер оборудования',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'DBEG_FACT',
 | ||
|                                         SCAPTION   => 'Дата начала факт',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     /* Обходим данные */
 | ||
|     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.PRIOR_PARTY NPRIOR_PARTY,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(L I_DOCLINKS_OUT_DOCUMENT)'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               TRIM(D.DOCNUMB) || '' '' || to_char(D.DOCDATE, ''dd.mm.yyyy'')');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from DOCLINKS  L,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               FCROUTLST D');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where L.OUT_DOCUMENT = T.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobsSpecs'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and L.IN_DOCUMENT = D.RN');
 | ||
|       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 => '                           ' || PKG_SQL_BUILD.ROWLIMIT(NLIMIT => 1, BAND => true) || ') SFCROUTLST,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       MR.CODE || '' '' || MR."NAME" SMATRES,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       TRIM(T.OPER_NUMB) || '' '' || ( select coalesce(O."NAME", T.OPER_UK) from FCOPERTYPES O where T.OPER_TPS = O.RN ) SOPER,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT_PLAN NQUANT_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.LABOUR_PLAN NLABOUR_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select IQ.CODE from EQCONFIG IQ where T.EQCONFIG = IQ.RN) SEQCONFIG,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.EQCONFIG NEQCONFIG,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.EQUIP_PLAN NEQUIP_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.BEG_FACT DBEG_FACT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from FCJOBSSP T,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCMATRESOURCE MR');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where T.PRN = :NFCJOBS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.SIGN_CONTRL = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and MR.RN = T.MATRES');
 | ||
|       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');
 | ||
|       /* Если сортировки не указаны */
 | ||
|       if (CORDERS is not null) then
 | ||
|         /* Учтём сортировки */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG,
 | ||
|                                                  RORDERS    => RO,
 | ||
|                                                  SPATTERN   => '%ORDER_BY%',
 | ||
|                                                  CSQL       => CSQL);
 | ||
|       else
 | ||
|         /* Устанавливаем стандартную сортировку */
 | ||
|         CSQL := replace(CSQL, '%ORDER_BY%', 'order by T.PRIOR_PARTY asc, T.BEG_PLAN asc');
 | ||
|       end if;
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NFCJOBS', NVALUE => NFCJOBS);
 | ||
|       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.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(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_STR(ICURSOR => ICURSOR, IPOSITION => 8);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 11);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 12);
 | ||
|       /* Делаем выборку */
 | ||
|       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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NPRIOR_PARTY',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SFCROUTLST',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRES',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SOPER', ICURSOR => ICURSOR, NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NLABOUR_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SEQCONFIG',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 8);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NEQCONFIG',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 9);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NEQUIP_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 10);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DBEG_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 11);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end FCJOBSSP_DG_GET;
 | ||
|   
 | ||
|   /* Получение составов оборудования подразделения */
 | ||
|   procedure EQCONFIG_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 in number,                             -- Рег. номер сменного задания
 | ||
|     NFROM_ACTION            in number := 0,                        -- Признак запуска из действия раздела (false - нет, true - да)
 | ||
|     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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NSUBDIV                 PKG_STD.TNUMBER;                       -- Рег. номер подразделения пользователя
 | ||
|     NEQCONFIG               PKG_STD.TNUMBER;                       -- Рег. номер станка
 | ||
|     NSUM_LABOUR             PKG_STD.TLNUMBER;                      -- Сумма трудоемкости
 | ||
|     NSUM_WORK_TIME          PKG_STD.TLNUMBER;                      -- Сумма рабочего времени
 | ||
|     NLOADING                PKG_STD.TLNUMBER;                      -- Загрузка оборудования
 | ||
|     NDICMUNTS_MIN           PKG_STD.TREF;                          -- Рег. номер ед. изм. минут
 | ||
|     NDICMUNTS_WD            PKG_STD.TREF;                          -- Рег. номер ед. изм. нормочасов
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 4);
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSELECT',
 | ||
|                                         SCAPTION   => 'Выбран',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SCODE',
 | ||
|                                         SCAPTION   => 'Станок',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSUM_LABOUR',
 | ||
|                                         SCAPTION   => 'Загрузка в н/ч',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NLOADING',
 | ||
|                                         SCAPTION   => 'Загрузка в %',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NEQUIPMENT',
 | ||
|                                         SCAPTION   => 'Рег. номер оборудования',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     /* Считываем единицу измерения минут */
 | ||
|     FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                        NFLAG_OPTION => 0,
 | ||
|                        NCOMPANY     => NCOMPANY,
 | ||
|                        SMEAS_MNEMO  => SDICMUNTS_MIN,
 | ||
|                        NRN          => NDICMUNTS_MIN);
 | ||
|     /* Считываем единицу измерения минут */
 | ||
|     FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                        NFLAG_OPTION => 0,
 | ||
|                        NCOMPANY     => NCOMPANY,
 | ||
|                        SMEAS_MNEMO  => SDICMUNTS_WD,
 | ||
|                        NRN          => NDICMUNTS_WD);
 | ||
|     /* Если выполняется из заголовка СЗ */
 | ||
|     if (NFROM_ACTION = 1) then
 | ||
|       /* Считываем рег. номер цеха из сменного задания */
 | ||
|       NSUBDIV := UTL_FCJOBS_SUBDIV_GET(NFCJOBS => NFCJOBS);
 | ||
|     else
 | ||
|       /* Считываем рег. номер подразделения пользователя */
 | ||
|       NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => UTILIZER());
 | ||
|     end if;
 | ||
|     /* Если подразделение считано */
 | ||
|     if (NSUBDIV is not null) then
 | ||
|       /* Обходим данные */
 | ||
|       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.CODE SCODE,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       SE.EQUIPMENT NEQUIPMENT');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from SUBDIVSEQ SE,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       EQCONFIG  T');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where SE.PRN = :NSUBDIV');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and SE.COMPANY = :NCOMPANY');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.RN = SE.EQCONFIG');
 | ||
|         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.TDG_ORDERS_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 => 'NSUBDIV', NVALUE => NSUBDIV);
 | ||
|         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.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 3);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|         /* Делаем выборку */
 | ||
|         if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
 | ||
|           null;
 | ||
|         end if;
 | ||
|         /* Обходим выбранные записи */
 | ||
|         while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
 | ||
|         loop
 | ||
|           /* Читаем данные из курсора рег. номер станка */
 | ||
|           PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NEQCONFIG);
 | ||
|           /* Обнуляем сумму рабочего времени и трудоемкости */
 | ||
|           NSUM_LABOUR    := 0;
 | ||
|           NSUM_WORK_TIME := 0;
 | ||
|           /* Цикл по различным сменам данного оборудования */
 | ||
|           for REC in (select TMP.TBOPERMODESP,
 | ||
|                              sum(TMP.NLABOUR) NLABOUR
 | ||
|                         from (select COALESCE(T.TBOPERMODESP, J.TBOPERMODESP) TBOPERMODESP,
 | ||
|                                      F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_PLAN, NDICMUNTS_MIN) NLABOUR
 | ||
|                                 from FCJOBS   J,
 | ||
|                                      FCJOBSSP T
 | ||
|                                where J.RN = NFCJOBS
 | ||
|                                  and T.PRN = J.RN
 | ||
|                                  and T.EQCONFIG = NEQCONFIG) TMP
 | ||
|                        group by TMP.TBOPERMODESP)
 | ||
|           loop
 | ||
|             /* Рассчитываем суммы */
 | ||
|             NSUM_LABOUR    := NSUM_LABOUR + REC.NLABOUR;
 | ||
|             NSUM_WORK_TIME := NSUM_WORK_TIME + UTL_WORK_TIME_GET(NTBOPERMODESP => REC.TBOPERMODESP);
 | ||
|           end loop;
 | ||
|           /* Если оборудование не участвует в сменном задании */
 | ||
|           if (NSUM_WORK_TIME = 0) then
 | ||
|             NLOADING := 0;
 | ||
|           else
 | ||
|             NLOADING := ROUND(NSUM_LABOUR / NSUM_WORK_TIME * 100, 0);
 | ||
|             /* Если трудоемкость не равна 0 */
 | ||
|             if (NSUM_LABOUR <> 0) then
 | ||
|               /* Переводим суммарную трудоемкость в нормочасы */
 | ||
|               NSUM_LABOUR := ROUND(F_DICMUNTS_BASE_RECALC_QUANT(0, NCOMPANY, NDICMUNTS_MIN, NSUM_LABOUR, NDICMUNTS_WD),
 | ||
|                                    2);
 | ||
|             end if;
 | ||
|           end if;
 | ||
|           /* Добавляем колонки с данными */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NEQCONFIG, BCLEAR => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_LABOUR', NVALUE => NSUM_LABOUR);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SCODE',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLOADING', NVALUE => NLOADING);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NEQUIPMENT',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 3);
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|         end loop;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|           raise;
 | ||
|       end;
 | ||
|     end if;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end EQCONFIG_DG_GET;
 | ||
|   
 | ||
|   /* Инициализация записей раздела "Планы и отчеты производства изделий" */
 | ||
|   procedure FCJOBS_INIT
 | ||
|   (
 | ||
|     NFCJOBS                 in number := null,                     -- Рег. номер записи (если вызов из действия раздела)
 | ||
|     COUT                    out clob                               -- Список записей раздела "Сменные задания"
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     SUTILIZER               PKG_STD.TSTRING := UTILIZER();         -- Пользователь сеанса
 | ||
|     NVERSION                PKG_STD.TREF;                          -- Версия контрагентов
 | ||
|     SDOC_INFO               PKG_STD.TSTRING;                       -- Информация о документе
 | ||
|     NSUBDIV                 PKG_STD.TREF;                          -- Рег. номер цеха
 | ||
|   begin
 | ||
|     /* Считываем версию контрагентов */
 | ||
|     FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|     /* Если вызов из действия раздела */
 | ||
|     if (NFCJOBS is not null) then
 | ||
|       /* Считываем рег. номер цеха из сменного задания */
 | ||
|       NSUBDIV := UTL_FCJOBS_SUBDIV_GET(NFCJOBS => NFCJOBS);
 | ||
|     else
 | ||
|       /* Считываем рег. номер подразделения пользователя */
 | ||
|       NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => SUTILIZER);
 | ||
|     end if;
 | ||
|     /* Начинаем формирование XML */
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     /* Открываем корень */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
 | ||
|     /* Цикл по планам и отчетам производства изделий */
 | ||
|     for REC in (select T.RN NRN,
 | ||
|                        trim(T.DOCNUMB) SDOC_NUMB,
 | ||
|                        DT.DOCCODE || ', ' || trim(T.DOCPREF) || '-' || trim(T.DOCNUMB) || ', ' ||
 | ||
|                        TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
 | ||
|                        INS.NAME SSUBDIV,
 | ||
|                        case
 | ||
|                          when PER.RN is not null then
 | ||
|                           TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') || ' ' || TN2S(PER.BEG_TIME) || ' - ' || TN2S(PER.END_TIME)
 | ||
|                          else
 | ||
|                           TO_CHAR(T.DOCDATE, 'dd.mm.yyyy')
 | ||
|                        end SPERIOD,
 | ||
|                        (select trim(T2.NUMB) from TBOPERMODESP T2 where T.TBOPERMODESP = T2.RN) STBOPERMODESP,
 | ||
|                        (select 1
 | ||
|                           from FCJOBSSP S
 | ||
|                          where S.PRN = T.RN
 | ||
|                            and S.NOTE is not null
 | ||
|                            and ROWNUM = 1) NHAVE_NOTE
 | ||
|                   from (select J.*
 | ||
|                           from FCJOBS J
 | ||
|                          where J.COMPANY = NCOMPANY
 | ||
|                            and J.STATE = NFCJOBS_STATUS_NOT_WO
 | ||
|                            and J.DOCDATE >= TRUNC(sysdate)
 | ||
|                            and J.SUBDIV = NSUBDIV
 | ||
|                            and exists (select null from V_USERPRIV UP where UP.CATALOG = J.CRN)
 | ||
|                            and exists (select null
 | ||
|                                   from V_USERPRIV UP
 | ||
|                                  where UP.JUR_PERS = J.JUR_PERS
 | ||
|                                    and UP.UNITCODE = 'CostJobs')
 | ||
|                          union
 | ||
|                         select J_RN.*
 | ||
|                           from FCJOBS J_RN
 | ||
|                          where J_RN.RN = NFCJOBS) T,
 | ||
|                        DOCTYPES       DT,
 | ||
|                        INS_DEPARTMENT INS,
 | ||
|                        TBOPERMODESP   PER
 | ||
|                  where DT.RN = T.DOCTYPE
 | ||
|                    and T.SUBDIV = INS.RN(+)
 | ||
|                    and T.TBOPERMODESP = PER.RN(+)
 | ||
|                  order by SDOC_INFO)
 | ||
|     loop
 | ||
|       /* Если указана смена */
 | ||
|       if (REC.STBOPERMODESP is not null) then
 | ||
|         /* Указываем информацию документа со сменой */
 | ||
|         SDOC_INFO := REC.SDOC_INFO || ', смена ' || REC.STBOPERMODESP;
 | ||
|       else
 | ||
|         /* Указываем информацию документа без смены */
 | ||
|         SDOC_INFO := REC.SDOC_INFO;
 | ||
|       end if;
 | ||
|       /* Открываем план */
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
 | ||
|       /* Описываем план */
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => SDOC_INFO);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SDOC_NUMB', SVALUE => REC.SDOC_NUMB);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NHAVE_NOTE', NVALUE => COALESCE(REC.NHAVE_NOTE, 0));
 | ||
|       /* Закрываем план */
 | ||
|       PKG_XFAST.UP();
 | ||
|       /* Если вызов из действия, то указываем выбранный */
 | ||
|       if (NFCJOBS = REC.NRN) then
 | ||
|         /* Открываем план */
 | ||
|         PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS_SELECTED');
 | ||
|         /* Описываем план */
 | ||
|         PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
 | ||
|         PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => SDOC_INFO);
 | ||
|         PKG_XFAST.ATTR(SNAME => 'SDOC_NUMB', SVALUE => REC.SDOC_NUMB);
 | ||
|         PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
 | ||
|         PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD);
 | ||
|         PKG_XFAST.ATTR(SNAME => 'NHAVE_NOTE', NVALUE => COALESCE(REC.NHAVE_NOTE, 0));
 | ||
|         /* Закрываем план */
 | ||
|         PKG_XFAST.UP();
 | ||
|       end if;
 | ||
|     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 FCJOBS_INIT;
 | ||
|   
 | ||
|   /*
 | ||
|     Процедуры панели "Загрузка цеха"
 | ||
|   */
 | ||
|   
 | ||
|   /* Получение количества рабочих часов в сменах подразделения */
 | ||
|   procedure INS_DEPARTMENT_WORKHOURS_GET
 | ||
|   (
 | ||
|     NSUBDIV                 in number,                             -- Рег. номер подразделения
 | ||
|     NWORKHOURS              out number                             -- Количество рабочих часов
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|   begin
 | ||
|     /* Инициализируем значение */
 | ||
|     NWORKHOURS := 0;
 | ||
|     /* Цикл по сменам подразделения */
 | ||
|     for REC in (select SP.RN
 | ||
|                   from INS_DEPARTMENT T,
 | ||
|                        SLSCHEDULE     S,
 | ||
|                        TBOPERMODE     O,
 | ||
|                        TBOPERMODESP   SP
 | ||
|                  where T.RN = NSUBDIV
 | ||
|                    and T.COMPANY = NCOMPANY
 | ||
|                    and S.RN = T.SCHEDULE
 | ||
|                    and O.RN = S.TBOPERMODE
 | ||
|                    and SP.PRN = O.RN)
 | ||
|     loop
 | ||
|       /* Суммируем количество рабочих часов смены */
 | ||
|       NWORKHOURS := NWORKHOURS + COALESCE(UTL_WORK_TIME_GET(NTBOPERMODESP => REC.RN) / 60, 0);
 | ||
|     end loop;
 | ||
|   end INS_DEPARTMENT_WORKHOURS_GET;
 | ||
|   
 | ||
|   /* Получение количества рабочих дней месяца */
 | ||
|   procedure ENPERIOD_WORKDAYS_GET
 | ||
|   (
 | ||
|     SMONTH_YEAR             in varchar2,                           -- Строковое представления месяца и года в формате (mm.yyyy)
 | ||
|     NWORKDAYS               out number                             -- Количество рабочих дней
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     DDATE_FROM              PKG_STD.TLDATE;                        -- Дата с
 | ||
|     DDATE_TO                PKG_STD.TLDATE;                        -- Дата по
 | ||
|   begin
 | ||
|     /* Считываем первый и последний день месяца */
 | ||
|     P_FIRST_LAST_DAY(DCALCDATE => TO_DATE(SMONTH_YEAR, 'mm.yyyy'), DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
 | ||
|     /* Определяем количество рабочих дней по детализации */
 | ||
|     begin
 | ||
|       select COALESCE(count(TMP.DAYS), 0)
 | ||
|         into NWORKDAYS
 | ||
|         from (select W.DAYS
 | ||
|                 from WORKDAYS   W,
 | ||
|                      WORKDAYSTR S
 | ||
|                where W.PRN = (select T.RN
 | ||
|                                 from ENPERIOD T
 | ||
|                                where T.COMPANY = NCOMPANY
 | ||
|                                  and T.PERTYPE = 0
 | ||
|                                  and T.PER_TYPE = 4
 | ||
|                                  and T.MAIN_SIGN = 1
 | ||
|                                  and T.STARTDATE = DDATE_FROM
 | ||
|                                  and T.ENDDATE = DDATE_TO)
 | ||
|                  and S.PRN = W.RN
 | ||
|                group by W.DAYS
 | ||
|               having sum(S.HOURSNORM) <> 0) TMP;
 | ||
|     exception
 | ||
|       when others then
 | ||
|         NWORKDAYS := 0;
 | ||
|     end;
 | ||
|   end ENPERIOD_WORKDAYS_GET;
 | ||
|   
 | ||
|   /* Получение таблицы доступных подразделений (цехов) */
 | ||
|   procedure INS_DEPARTMENT_DG_GET
 | ||
|   (
 | ||
|     SMONTH_YEAR             in varchar2,                           -- Строковое представления месяца и года в формате (mm.yyyy)
 | ||
|     NPAGE_NUMBER            in number,                             -- Номер страницы (игнорируется при NPAGE_SIZE=0)
 | ||
|     NPAGE_SIZE              in number,                             -- Количество записей на странице (0 - все)
 | ||
|     NINCLUDE_DEF            in number,                             -- Признак включения описания колонок таблицы в ответ
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     DDATE_FROM              PKG_STD.TLDATE;                        -- Дата с
 | ||
|     DDATE_TO                PKG_STD.TLDATE;                        -- Дата по
 | ||
|   begin
 | ||
|     /* Преобразуем номер и размер страницы в номер строк с и по */
 | ||
|     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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SCODE',
 | ||
|                                         SCAPTION   => 'Мнемокод',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SNAME',
 | ||
|                                         SCAPTION   => 'Наименование',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'DBGNDATE',
 | ||
|                                         SCAPTION   => 'Действует с',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'DENDDATE',
 | ||
|                                         SCAPTION   => 'Действует по',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE);
 | ||
|     /* Считываем первый и последний день месяца */
 | ||
|     P_FIRST_LAST_DAY(DCALCDATE => TO_DATE(SMONTH_YEAR, 'mm.yyyy'), DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
 | ||
|     /* Обходим данные */
 | ||
|     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.CODE SCODE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T."NAME" SNAME,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.BGNDATE DBGNDATE,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.ENDDATE DENDDATE');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from INS_DEPARTMENT T,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       SDIVTYPES      S');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where T.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.SDIVTYPE = S.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and S.CODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Цех'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.BGNDATE <= :DDATE_TO');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and ((T.ENDDATE is null) or ((T.ENDDATE is not null) and (T.ENDDATE >= :DDATE_FROM)))');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_MECHREC.UTL_INS_DEP_HIER_EQ_CHECK') || '(T.COMPANY, T.RN, :DDATE_TO) = 1');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                    ) D) F');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
 | ||
|       /* Разбираем его */
 | ||
|       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_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => DDATE_FROM);
 | ||
|       PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => DDATE_TO);
 | ||
|       PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
 | ||
|       PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
 | ||
|       /* Описываем структуру записи курсора */
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|       /* Делаем выборку */
 | ||
|       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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 1,
 | ||
|                                                  BCLEAR    => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DBGNDATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DENDDATE',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end INS_DEPARTMENT_DG_GET;
 | ||
|   
 | ||
|   /* Получение загрузки цеха */
 | ||
|   procedure FCJOBS_DEP_LOAD_DG_GET
 | ||
|   (
 | ||
|     NSUBDIV                 in number,                             -- Рег. номер подразделения (цеха)
 | ||
|     SMONTH_YEAR             in varchar2,                           -- Строковое представления месяца и года в формате (mm.yyyy)
 | ||
|     NWORKHOURS              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(); -- Организация сеанса
 | ||
|     SUTILIZER               PKG_STD.TSTRING := UTILIZER();         -- Пользователь сеанса
 | ||
|     RO                      PKG_P8PANELS_VISUAL.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     DDATE_FROM              PKG_STD.TLDATE;                        -- Дата начала месяца
 | ||
|     DDATE_TO                PKG_STD.TLDATE;                        -- Дата окончания месяца
 | ||
|     DDATE                   PKG_STD.TLDATE;                        -- Дата для расчетов
 | ||
|     NDICMUNTS_WD            PKG_STD.TREF;                          -- Рег. номер единицы измерения нормочасов
 | ||
|     NEQCONFIG               PKG_STD.TREF;                          -- Рег. номер станка
 | ||
|     TDAYS                   TJOB_DAYS;                             -- Коллекция дней месяца
 | ||
|     NINDEX                  PKG_STD.TNUMBER;                       -- Индекс даты в коллекции дат
 | ||
|     NLOAD                   PKG_STD.TLNUMBER;                      -- Загрузка в нормочасах
 | ||
|     NPROCENT_LOAD           PKG_STD.TLNUMBER;                      -- Загрузка в %
 | ||
|     NENPERIOD               PKG_STD.TREF;                          -- Рег. номер рабочего календаря
 | ||
|     DCURRENT_DAY            PKG_STD.TLDATE;                        -- Текущий день
 | ||
|     
 | ||
|     /* Считывание типа дня (см. константы NDAY_TYPE_*) */
 | ||
|     function DAY_TYPE_GET
 | ||
|     (
 | ||
|       NENPERIOD             in number,       -- Рег. номер рабочего календаря
 | ||
|       DDATE                 in date,         -- Дата
 | ||
|       DCURRENT_DAY          in date          -- Текущая дата
 | ||
|     ) return                number           -- Тип дня (см. константы NDAY_TYPE_*)
 | ||
|     is
 | ||
|       NHOLIDAY              PKG_STD.TNUMBER; -- Тип дня (0 - рабочий, 1 - выходной)
 | ||
|       NDAY                  PKG_STD.TNUMBER; -- День
 | ||
|       NRESULT               PKG_STD.TNUMBER; -- Тип дня (см. константы NDAY_TYPE_*)
 | ||
|     begin
 | ||
|       /* Считываем день */
 | ||
|       NDAY := D_DAY(DDATE => DDATE);
 | ||
|       /* Проверяем начиличе записи в календаре, если такого дня нет в календаре или сумма часов = 0 - выходной */
 | ||
|       begin
 | ||
|         select 1
 | ||
|           into NHOLIDAY
 | ||
|           from DUAL
 | ||
|          where not exists (select null
 | ||
|                   from WORKDAYS T
 | ||
|                  where T.PRN = NENPERIOD
 | ||
|                    and T.DAYS = NDAY)
 | ||
|             or ((select COALESCE(sum(S.HOURSNORM), 0)
 | ||
|                    from WORKDAYS   T,
 | ||
|                         WORKDAYSTR S
 | ||
|                   where T.PRN = NENPERIOD
 | ||
|                     and T.DAYS = NDAY
 | ||
|                     and S.PRN = T.RN) = 0);
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NHOLIDAY := 0;
 | ||
|       end;
 | ||
|       /* Исходим от дня */
 | ||
|       case
 | ||
|         /* Если это последующий день */
 | ||
|         when (DDATE > DCURRENT_DAY) then
 | ||
|           /* Если это рабочий день */
 | ||
|           if (NHOLIDAY = 0) then
 | ||
|             NRESULT := NDAY_TYPE_WORK_AFTER;
 | ||
|           else
 | ||
|             NRESULT := NDAY_TYPE_HOLIDAY_AFTER;
 | ||
|           end if;
 | ||
|         /* Если это предыдущий день */
 | ||
|         when (DDATE < DCURRENT_DAY) then
 | ||
|           /* Если это рабочий день */
 | ||
|           if (NHOLIDAY = 0) then
 | ||
|             NRESULT := NDAY_TYPE_WORK_BEFORE;
 | ||
|           else
 | ||
|             NRESULT := NDAY_TYPE_HOLIDAY_BEFORE;
 | ||
|           end if;
 | ||
|         /* Если это текущий день */
 | ||
|         else
 | ||
|           NRESULT := NDAY_TYPE_CURRENT_DAY;
 | ||
|       end case;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end DAY_TYPE_GET;
 | ||
|     
 | ||
|     /* Считывание рег. номера рабочего календаря */
 | ||
|     function ENPERIOD_GET
 | ||
|     (
 | ||
|       NCOMPANY              in number,    -- Рег. номер организации
 | ||
|       DDATE_FROM            in date,      -- Дата начала периода
 | ||
|       DDATE_TO              in date       -- Дата окончания периода
 | ||
|     ) return                number        -- Рег. номер рабочего календаря
 | ||
|     is
 | ||
|       NRESULT               PKG_STD.TREF; -- Рег. номер рабочего календаря
 | ||
|     begin
 | ||
|       /* Считываем рег. номер рабочего календаря */
 | ||
|       begin
 | ||
|         select T.RN
 | ||
|           into NRESULT
 | ||
|           from ENPERIOD T
 | ||
|          where T.COMPANY = NCOMPANY
 | ||
|            and T.STARTDATE = DDATE_FROM
 | ||
|            and T.ENDDATE = DDATE_TO
 | ||
|            and T.PERTYPE = 0
 | ||
|            and T.PER_TYPE = 4
 | ||
|            and T.MAIN_SIGN = 1;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := null;
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end ENPERIOD_GET;
 | ||
|     
 | ||
|     /* Считывание индекса коллекции дней */
 | ||
|     function TDAYS_INDEX_GET
 | ||
|     (
 | ||
|       TDAYS                 in TJOB_DAYS, -- Коллекция дней
 | ||
|       DDATE                 in date       -- Дата дня
 | ||
|     ) return                number        -- Индекс дня в коллекции
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Цикл по дням месяца */
 | ||
|       for I in TDAYS.FIRST .. TDAYS.LAST
 | ||
|       loop
 | ||
|         /* Если это искомый день */
 | ||
|         if (TDAYS(I).DDATE = DDATE) then
 | ||
|           /* Возвращаем индекс */
 | ||
|           return I;
 | ||
|         end if;
 | ||
|       end loop;
 | ||
|       /* Возвращаем null */
 | ||
|       return null;
 | ||
|     end TDAYS_INDEX_GET;
 | ||
|     
 | ||
|     /* Инициализация дней месяца */
 | ||
|     procedure DAYS_INIT
 | ||
|     (
 | ||
|       RDG                   in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы
 | ||
|       TJOB_DAYS             in out nocopy TJOB_DAYS,               -- Коллекция дней месяца
 | ||
|       DDATE_FROM            in date,                               -- Дата начала месяца
 | ||
|       DDATE_TO              in date                                -- Дата окончания месяца
 | ||
|     )
 | ||
|     is
 | ||
|       DDATE                 PKG_STD.TLDATE;                        -- Сформированная дата дня
 | ||
|       NMONTH                PKG_STD.TNUMBER;                       -- Текущий месяц
 | ||
|       NYEAR                 PKG_STD.TNUMBER;                       -- Текущий год
 | ||
|       SDATE_NAME            PKG_STD.TSTRING;                       -- Строковое представление даты для наименования колонки
 | ||
|     begin
 | ||
|       /* Считываем месяц и год текущей даты */
 | ||
|       NMONTH := D_MONTH(DDATE => DDATE_FROM);
 | ||
|       NYEAR  := D_YEAR(DDATE => DDATE_FROM);
 | ||
|       /* Цикл по дням месяца */
 | ||
|       for I in D_DAY(DDATE => DDATE_FROM) .. D_DAY(DDATE => DDATE_TO)
 | ||
|       loop
 | ||
|         /* Формируем дату дня */
 | ||
|         DDATE := TO_DATE(TO_CHAR(I) || '.' || TO_CHAR(NMONTH) || '.' || TO_CHAR(NYEAR), 'dd.mm.yyyy');
 | ||
|         /* Строковое представление даты для наименования колонки */
 | ||
|         SDATE_NAME := TO_CHAR(DDATE, SCOL_PATTERN_DATE);
 | ||
|         /* Описываем родительскую колонку таблицы данных */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                             SNAME      => 'N_' || SDATE_NAME || '_VALUE',
 | ||
|                                             SCAPTION   => LPAD(D_DAY(DDATE), 2, '0'),
 | ||
|                                             SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                             SPARENT    => 'NVALUE_BY_DAYS');
 | ||
|         /* Описываем родительскую колонку таблицы данных */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                             SNAME      => 'N_' || SDATE_NAME || '_TYPE',
 | ||
|                                             SCAPTION   => LPAD(D_DAY(DDATE), 2, '0'),
 | ||
|                                             SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                             BVISIBLE   => false,
 | ||
|                                             SPARENT    => 'NVALUE_BY_DAYS');
 | ||
|         /* Добавляем день в коллекцию */
 | ||
|         TJOB_DAYS_ADD(TDAYS => TJOB_DAYS, DDATE => DDATE, NVALUE => null, NTYPE => 0);
 | ||
|       end loop;
 | ||
|     end DAYS_INIT;
 | ||
|     
 | ||
|     /* Заполнение нормы трудоемкости дней месяца */
 | ||
|     procedure DAYS_FILL
 | ||
|     (
 | ||
|       TDAYS                 in out nocopy TJOB_DAYS, -- Коллекци дней месяца
 | ||
|       DDATE                 in out date,             -- Начальный день строки СЗ
 | ||
|       DBEG_FACT             in date,                 -- Дата начала факт
 | ||
|       DDATE_TO              in date,                 -- Дата окончания месяца
 | ||
|       NLABOUR_FACT_FULL     in number,               -- Норма факт строки СЗ
 | ||
|       NLABOUR_PLAN_FULL     in number,               -- Норма план строки СЗ (с учетом нормы факт)
 | ||
|       NWORK_HOURS           in number                -- Количество рабочих часов смены
 | ||
|     )
 | ||
|     is
 | ||
|       NHOURS_LEFT           PKG_STD.TLNUMBER;        -- Количество оставшихся часов в дне
 | ||
|       NMAX_OF_DAY           PKG_STD.TQUANT;          -- Максимальное количество рабочих часов в дне
 | ||
|       NLABOUR_FACT          PKG_STD.TQUANT;          -- Оставшаяся трудоемкость факт
 | ||
|       NLABOUR_PLAN          PKG_STD.TQUANT;          -- Оставшаяся трудоемкость план
 | ||
|       NLABOUR_BY_DAY        PKG_STD.TQUANT;          -- Суммарная трудоемкость за день (в доли смены)
 | ||
|       NDAY_TYPE             PKG_STD.TNUMBER;         -- Тип дня (0 - выполняемый, 1 - выполненный)
 | ||
|       NINDEX                PKG_STD.TNUMBER;         -- Индекс даты в коллекции дат
 | ||
|     begin
 | ||
|       /* Указываем изначальные план и факт */
 | ||
|       NLABOUR_FACT := NLABOUR_FACT_FULL;
 | ||
|       NLABOUR_PLAN := NLABOUR_PLAN_FULL;
 | ||
|       /* Необходимо погасть факт и план */
 | ||
|       while (((NLABOUR_FACT <> 0) or (NLABOUR_PLAN <> 0)) and (DDATE <= DDATE_TO))
 | ||
|       loop
 | ||
|         /* Обнуляем трудоемкость в доли смены за день */
 | ||
|         NLABOUR_BY_DAY := 0;
 | ||
|         /* Считываем индекс коллеции текущего дня */
 | ||
|         NINDEX := TDAYS_INDEX_GET(TDAYS => TDAYS, DDATE => DDATE);
 | ||
|         /* Изначально всегда "Выполнено" */
 | ||
|         NDAY_TYPE := 1;
 | ||
|         /* Определяем количество оставшихся часов в дне */
 | ||
|         NHOURS_LEFT := (TRUNC(DDATE + 1) - DDATE) * 24;
 | ||
|         /* Если в текущем дне еще есть время */
 | ||
|         if (TDAYS(NINDEX).NVALUE <> 1) then
 | ||
|           /* Если день пустой */
 | ||
|           if (TDAYS(NINDEX).NVALUE = 0) then
 | ||
|             /* Определяем возможное указание часов (относительно оставшегося времени дня или часов в смене) */
 | ||
|             NMAX_OF_DAY := LEAST(NHOURS_LEFT, NWORK_HOURS);
 | ||
|           else
 | ||
|             /* Определяем количество оставшегося времени в дне */
 | ||
|             NMAX_OF_DAY := ((1 - TDAYS(NINDEX).NVALUE) * NWORK_HOURS);
 | ||
|             /* Определяем возможное указание часов (относительно оставшегося времени дня или заполненного времени дня) */
 | ||
|             NMAX_OF_DAY := LEAST(NHOURS_LEFT, NMAX_OF_DAY);
 | ||
|           end if;
 | ||
|           /* Если указана дата начала факт и осталась трудоемкость факт */
 | ||
|           if ((DBEG_FACT is not null) and (NLABOUR_FACT > 0)) then
 | ||
|             /* Если в данный день невозможно отметить весь факт */
 | ||
|             if (NLABOUR_FACT > NMAX_OF_DAY) then
 | ||
|               /* Вычитаем из суммарного факта трудоемкость дня */
 | ||
|               NLABOUR_FACT   := NLABOUR_FACT - NMAX_OF_DAY;
 | ||
|               NLABOUR_BY_DAY := NMAX_OF_DAY;
 | ||
|             else
 | ||
|               /* Добавляем трудоемкость факта и обнуляем суммарный факт */
 | ||
|               NLABOUR_BY_DAY := NLABOUR_BY_DAY + NLABOUR_FACT;
 | ||
|               NLABOUR_FACT   := 0;
 | ||
|             end if;
 | ||
|           end if;
 | ||
|           /* Если осталось время дня и есть план */
 | ||
|           if ((NMAX_OF_DAY > NLABOUR_BY_DAY) and (NLABOUR_PLAN > 0)) then
 | ||
|             /* Это день плана */
 | ||
|             NDAY_TYPE := 0;
 | ||
|             /* Если в данный день невозможно отметить всё */
 | ||
|             if (NLABOUR_PLAN > (NMAX_OF_DAY - NLABOUR_BY_DAY)) then
 | ||
|               /* Вычитаем из суммарного плана оставшуюсь часть дня */
 | ||
|               NLABOUR_PLAN   := NLABOUR_PLAN - (NMAX_OF_DAY - NLABOUR_BY_DAY);
 | ||
|               NLABOUR_BY_DAY := NMAX_OF_DAY;
 | ||
|             else
 | ||
|               /* Добавляем трудоемкость плана и обнуляем суммарный план */
 | ||
|               NLABOUR_BY_DAY := NLABOUR_BY_DAY + NLABOUR_PLAN;
 | ||
|               NLABOUR_PLAN   := 0;
 | ||
|             end if;
 | ||
|           end if;
 | ||
|           /* Если рабочего времени не осталось */
 | ||
|           if (NMAX_OF_DAY = 0) then
 | ||
|             /* Указываем целый день */
 | ||
|             TDAYS(NINDEX).NVALUE := 1;
 | ||
|           else
 | ||
|             /* Добавляем по текущему дню */
 | ||
|             TDAYS(NINDEX).NVALUE := TDAYS(NINDEX).NVALUE + (NLABOUR_BY_DAY / NWORK_HOURS);
 | ||
|           end if;
 | ||
|           /* Указываем тип дня */
 | ||
|           TDAYS(NINDEX).NTYPE := NDAY_TYPE;
 | ||
|         end if;
 | ||
|         /* Указываем следующий день */
 | ||
|         DDATE := TRUNC(DDATE + 1);
 | ||
|       end loop;
 | ||
|     end DAYS_FILL;
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 4);
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SSUBDIV',
 | ||
|                                         SCAPTION   => 'Участок',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true,
 | ||
|                                         NWIDTH     => 120);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SNAME',
 | ||
|                                         SCAPTION   => 'Станок',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         NWIDTH     => 240);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NLOAD',
 | ||
|                                         SCAPTION   => 'Загрузка (н/ч)',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         NWIDTH     => 80);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NPROCENT_LOAD',
 | ||
|                                         SCAPTION   => 'Загрузка (%)',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         NWIDTH     => 80);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NVALUE_BY_DAYS',
 | ||
|                                         SCAPTION   => 'Загрузка в н/ч по дням месяца',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         SHINT      => 'Отображает сумму трудоемкости по дням месяца.<br><br>' ||
 | ||
|                                                       'Цвет значения отражает трудоемкость план/факт.<br>' ||
 | ||
|                                                       'Если дата месяца больше или равна текущей, то отображается трудоемкость "План", иначе "Факт":<br>' ||
 | ||
|                                                       'Черный - сумма трудоемкости "План";<br>' ||
 | ||
|                                                       '<b style="color:#0097ff">Голубой</b> -  сумма трудоемкости "Факт";<br>');
 | ||
|     /* Считываем первый и последний день месяца */
 | ||
|     P_FIRST_LAST_DAY(DCALCDATE => TO_DATE(SMONTH_YEAR, 'mm.yyyy'), DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
 | ||
|     /* Считываем единицу измерения нормочасов */
 | ||
|     FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                        NFLAG_OPTION => 0,
 | ||
|                        NCOMPANY     => NCOMPANY,
 | ||
|                        SMEAS_MNEMO  => SDICMUNTS_WD,
 | ||
|                        NRN          => NDICMUNTS_WD);
 | ||
|     /* Считываем рег. номер рабочего календаря */
 | ||
|     NENPERIOD := ENPERIOD_GET(NCOMPANY => NCOMPANY, DDATE_FROM => DDATE_FROM, DDATE_TO => DDATE_TO);
 | ||
|     /* Инициализируем дни месяца */
 | ||
|     DAYS_INIT(RDG => RDG, TJOB_DAYS => TDAYS, DDATE_FROM => DDATE_FROM, DDATE_TO => DDATE_TO);
 | ||
|     /* Определяем текущий день */
 | ||
|     DCURRENT_DAY := TRUNC(sysdate);
 | ||
|     /* Если параметры указаны */
 | ||
|     if ((NSUBDIV is not null) and (SMONTH_YEAR is not null)) then
 | ||
|       /* Обходим данные */
 | ||
|       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 TMP.*');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from (select IQ.RN NRN,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               IQ."NAME" SNAME,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               I.CODE SSUBDIV,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               COALESCE((select SUM(F_DICMUNTS_BASE_RECALC_QUANT(0,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                 T.COMPANY,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                 JS.MUNIT,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                 case');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                   when (TRUNC(JS.BEG_PLAN) >= :DSYSDATE) then');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                     JS.LABOUR_PLAN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                   when (JS.BEG_FACT < :DSYSDATE) then');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                     JS.LABOUR_FACT');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                   else');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                     0');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                 end,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                                                 :NDICMUNTS))');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                           from FCJOBSSP JS,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                FCJOBS T');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                          where JS.EQCONFIG = IQ.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            and JS.COMPANY = :NCOMPANY');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            and T.RN = JS.PRN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            and T.DOCDATE >= :DDATE_FROM');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            and T.DOCDATE <= :DDATE_TO');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            and (((TRUNC(JS.BEG_PLAN) >= :DSYSDATE) and (TRUNC(JS.BEG_PLAN) <= :DDATE_TO))');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                              or ((JS.BEG_FACT < :DSYSDATE) and (TRUNC(JS.BEG_FACT) between :DDATE_FROM and :DDATE_TO)))');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK') || '(T.COMPANY, T.SUBDIV, :SUTILIZER, :NSUBDIV) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                            and exists (select null from V_USERPRIV UP where UP."CATALOG" = T.CRN)), 0) NLOAD');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from INS_DEPARTMENT I,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               SUBDIVSEQ      HEQ,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               EQCONFIG       IQ');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where I.RN in (' || PKG_SQL_BUILD.CONNECT_BY(STABLE_NAME    => 'INS_DEPARTMENT', 
 | ||
|                                                                                                                                STABLE_ALIAS   => 'H', 
 | ||
|                                                                                                                                SSELECT_CLAUSE => 'RN', 
 | ||
|                                                                                                                                SWHERE_CLAUSE  => 'COMPANY = ' || NCOMPANY, 
 | ||
|                                                                                                                                SSTART_CLAUSE  => 'RN = ' || NSUBDIV, 
 | ||
|                                                                                                                                SPRIOR_COLUMN  => 'RN', 
 | ||
|                                                                                                                                SREF_COLUMN    => 'PRN') || ')');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and HEQ.PRN = I.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and IQ.RN = HEQ.EQCONFIG');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and IQ.OPER_DATE is not null');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and IQ.OPER_DATE <= :DDATE_TO');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         group by IQ.RN,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  IQ."NAME",');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  I.CODE');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         %ORDER_BY%) TMP');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '               ) D) F');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
 | ||
|         /* Учтём сортировки */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ORDERS_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_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => DDATE_FROM);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => DDATE_TO);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NDICMUNTS', NVALUE => NDICMUNTS_WD);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NSUBDIV', NVALUE => NSUBDIV);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DSYSDATE', DVALUE => DCURRENT_DAY);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_STR(ICURSOR => ICURSOR, SNAME => 'SUTILIZER', SVALUE => SUTILIZER);
 | ||
|         /* Описываем структуру записи курсора */
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|         /* Делаем выборку */
 | ||
|         if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
 | ||
|           null;
 | ||
|         end if;
 | ||
|         /* Обходим выбранные записи */
 | ||
|         while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
 | ||
|         loop
 | ||
|           /* Считываем рег. номер станка */
 | ||
|           PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NEQCONFIG);
 | ||
|           /* Добавляем колонки с данными */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NEQCONFIG, BCLEAR => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SNAME',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SSUBDIV',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 3);
 | ||
|           /* Считываем загрузку в нормочасах */
 | ||
|           PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 4, NVALUE => NLOAD);
 | ||
|           /* Округляем загрузку */
 | ||
|           NLOAD := ROUND(NLOAD, 3);
 | ||
|           /* Если количество рабочих часов не 0 */
 | ||
|           if ((NWORKHOURS is not null) and (NWORKHOURS <> 0)) then
 | ||
|             /* Рассчитываем загрузку в % */
 | ||
|             NPROCENT_LOAD := ROUND(NLOAD / NWORKHOURS * 100, 1);
 | ||
|           else
 | ||
|             /* Устанавливаем 0 */
 | ||
|             NPROCENT_LOAD := 0;
 | ||
|           end if;
 | ||
|           /* Устанавливаем загрузку */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLOAD', NVALUE => NLOAD);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPROCENT_LOAD', NVALUE => NPROCENT_LOAD);
 | ||
|           /* Если у оборудования есть загрузка */
 | ||
|           if (NLOAD <> 0) then
 | ||
|             /* Обходим загруженность по дням */
 | ||
|             for REC in (select TMP.BEG_DATE DBEG_DATE,
 | ||
|                                sum(TMP.LABOUR_PLAN) NLABOUR_PLAN,
 | ||
|                                sum(TMP.LABOUR_FACT) NLABOUR_FACT
 | ||
|                           from (select case
 | ||
|                                          when ((T.BEG_FACT is not null) and (TRUNC(T.BEG_FACT) < sysdate)) then
 | ||
|                                           TRUNC(T.BEG_FACT)
 | ||
|                                          else
 | ||
|                                           TRUNC(T.BEG_PLAN)
 | ||
|                                        end BEG_DATE,
 | ||
|                                        F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_PLAN, NDICMUNTS_WD) LABOUR_PLAN,
 | ||
|                                        F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_FACT, NDICMUNTS_WD) LABOUR_FACT
 | ||
|                                   from FCJOBSSP T,
 | ||
|                                        FCJOBS   J
 | ||
|                                  where T.COMPANY = NCOMPANY
 | ||
|                                    and J.RN = T.PRN
 | ||
|                                    and (((T.BEG_FACT < DCURRENT_DAY) and
 | ||
|                                        (TRUNC(T.BEG_FACT) between DDATE_FROM and DDATE_TO)) or
 | ||
|                                        ((TRUNC(T.BEG_PLAN) >= DCURRENT_DAY) and (TRUNC(T.BEG_PLAN) <= DDATE_TO)))
 | ||
|                                    and PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK(J.COMPANY, J.SUBDIV, SUTILIZER, NSUBDIV) = 1
 | ||
|                                    and T.EQCONFIG = NEQCONFIG
 | ||
|                                  order by T.BEG_FACT) TMP
 | ||
|                          where ((TMP.BEG_DATE < DCURRENT_DAY) and (TMP.LABOUR_FACT <> 0))
 | ||
|                             or ((TMP.BEG_DATE >= DCURRENT_DAY) and (TMP.LABOUR_PLAN <> 0))
 | ||
|                          group by TMP.BEG_DATE
 | ||
|                          order by TMP.BEG_DATE)
 | ||
|             loop
 | ||
|               /* Считываем индекс коллеции текущего дня */
 | ||
|               NINDEX := TDAYS_INDEX_GET(TDAYS => TDAYS, DDATE => REC.DBEG_DATE);
 | ||
|               /* Если день до текущего */
 | ||
|               if (REC.DBEG_DATE < DCURRENT_DAY) then
 | ||
|                 /* Отмечаем трудоемкость факт */
 | ||
|                 TDAYS(NINDEX).NVALUE := REC.NLABOUR_FACT;
 | ||
|               else
 | ||
|                 /* Отмечаем трудоемкость план */
 | ||
|                 TDAYS(NINDEX).NVALUE := REC.NLABOUR_PLAN;
 | ||
|               end if;
 | ||
|             end loop;
 | ||
|             /* Обходим все дни */
 | ||
|             for I in TDAYS.FIRST .. TDAYS.LAST
 | ||
|             loop
 | ||
|               /* Отмечаем значение дня */
 | ||
|               PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW   => RDG_ROW,
 | ||
|                                                   SNAME  => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) ||
 | ||
|                                                             '_VALUE',
 | ||
|                                                   NVALUE => ROUND(TDAYS(I).NVALUE, 1));
 | ||
|               /* Если рабочий календарь считан */
 | ||
|               if (NENPERIOD is not null) then
 | ||
|                 /* Отмечаем тип дня */
 | ||
|                 PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW   => RDG_ROW,
 | ||
|                                                     SNAME  => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) ||
 | ||
|                                                               '_TYPE',
 | ||
|                                                     NVALUE => DAY_TYPE_GET(NENPERIOD    => NENPERIOD,
 | ||
|                                                                            DDATE        => TDAYS(I).DDATE,
 | ||
|                                                                            DCURRENT_DAY => DCURRENT_DAY));
 | ||
|               end if;
 | ||
|               /* Обнуляем значение */
 | ||
|               TDAYS(I).NVALUE := null;
 | ||
|             end loop;
 | ||
|           else
 | ||
|             /* Обходим все дни */
 | ||
|             for I in TDAYS.FIRST .. TDAYS.LAST
 | ||
|             loop
 | ||
|               /* Отмечаем значение дня */
 | ||
|               PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW   => RDG_ROW,
 | ||
|                                                   SNAME  => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) ||
 | ||
|                                                             '_VALUE',
 | ||
|                                                   NVALUE => null);
 | ||
|               /* Если рабочий календарь считан */
 | ||
|               if (NENPERIOD is not null) then
 | ||
|                 /* Отмечаем тип дня */
 | ||
|                 PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW   => RDG_ROW,
 | ||
|                                                     SNAME  => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) ||
 | ||
|                                                               '_TYPE',
 | ||
|                                                     NVALUE => DAY_TYPE_GET(NENPERIOD    => NENPERIOD,
 | ||
|                                                                            DDATE        => TDAYS(I).DDATE,
 | ||
|                                                                            DCURRENT_DAY => DCURRENT_DAY));
 | ||
|               end if;
 | ||
|             end loop;
 | ||
|           end if;
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|         end loop;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|           raise;
 | ||
|       end;
 | ||
|     end if;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end FCJOBS_DEP_LOAD_DG_GET;
 | ||
|   
 | ||
|   /*
 | ||
|     Процедуры панели "Мониторинг сборки изделий"
 | ||
|   */
 | ||
|   
 | ||
|   /* Получение таблицы маршрутных листов связанной записи "Производственная программа" */
 | ||
|   procedure FCROUTLST_DG_BY_LINKED_GET
 | ||
|   (
 | ||
|     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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NFCROUTLST_IDENT        PKG_STD.TREF;                          -- Рег. номер идентификатора отмеченных записей маршрутных листов
 | ||
|     NDICMUNTS_WD            PKG_STD.TREF;                          -- Рег. номер ед. измерения нормочасов
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SNUMB',
 | ||
|                                         SCAPTION   => '% п/п',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SOPERATION',
 | ||
|                                         SCAPTION   => 'Содержание работ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SEXECUTOR',
 | ||
|                                         SCAPTION   => 'Исполнитель',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NREMN_LABOUR',
 | ||
|                                         SCAPTION   => 'Остаточная трудоемкость, в н/ч',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     /* Если спецификация считалась */
 | ||
|     if (NFCPRODPLANSP is not null) then
 | ||
|       /* Инициализируем список маршрутных листов */
 | ||
|       UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP, NIDENT => NFCROUTLST_IDENT);
 | ||
|       /* Считываем единицу измерения нормочасов */
 | ||
|       FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                          NFLAG_OPTION => 0,
 | ||
|                          NCOMPANY     => NCOMPANY,
 | ||
|                          SMEAS_MNEMO  => SDICMUNTS_WD,
 | ||
|                          NRN          => NDICMUNTS_WD);
 | ||
|       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 SF.RN NRN,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       TRIM(SH.NUMB) SNUMB,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       COALESCE(SH.OPER_UK, FT."NAME") SOPERATION,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select I.CODE from INS_DEPARTMENT I where SF.SUBDIV = I.RN) SEXECUTOR,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       ROUND(F_DICMUNTS_BASE_RECALC_QUANT(' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ',');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                          :NCOMPANY,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                          SF.MUNIT,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                          SF.T_SHT_PLAN - SF.LABOUR_FACT,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                                          :NDICMUNTS_WD), 3) NREMN_LABOUR'); 
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from FCROUTLST F,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCROUTLSTSP SF,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCROUTSHTSP SH left outer join FCOPERTYPES FT on SH.OPER_TPS = FT.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where F.RN in (select SL."DOCUMENT"');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  from SELECTLIST SL');
 | ||
|         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 SF.PRN = F.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and SH.RN = SF.FCROUTSHTSP');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and F.COMPANY = :NCOMPANY');
 | ||
|         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.TDG_ORDERS_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 => 'NDICMUNTS_WD', NVALUE => NDICMUNTS_WD);
 | ||
|         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_STR(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|         /* Делаем выборку */
 | ||
|         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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NRN',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 1,
 | ||
|                                                    BCLEAR    => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SNUMB',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SOPERATION',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 3);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SEXECUTOR',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 4);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NREMN_LABOUR',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 5);
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|         end loop;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|           raise;
 | ||
|       end;
 | ||
|     end if;
 | ||
|     /* Очищаем отмеченные маршрутные листы */
 | ||
|     P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   exception
 | ||
|     when others then
 | ||
|       /* Очищаем отмеченные маршрутные листы */
 | ||
|       P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
 | ||
|       raise;
 | ||
|   end FCROUTLST_DG_BY_LINKED_GET;
 | ||
|   
 | ||
|   /* Получение таблицы комплектовочных ведомостей связанной записи "Производственная программа" */
 | ||
|   procedure FCDELIVSH_DG_BY_LINKED_GET
 | ||
|   (
 | ||
|     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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE();
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SNOMEN',
 | ||
|                                         SCAPTION   => 'Номенклатура',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT_PLAN',
 | ||
|                                         SCAPTION   => 'Применяемость',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SPROVIDER',
 | ||
|                                         SCAPTION   => 'Поставщик',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NDEFICIT',
 | ||
|                                         SCAPTION   => 'Дефицит',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => true);
 | ||
|     /* Если спецификация считалась */
 | ||
|     if (NFCPRODPLANSP is not null) then
 | ||
|       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 => '                       NM.NOMEN_NAME SNOMEN,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT_PLAN NQUANT_PLAN,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select I2.CODE from INS_DEPARTMENT I2 where T.PR_SUBDIV = I2.RN) SPROVIDER,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.DEFICIT NDEFICIT');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from DOCLINKS D,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCDELIVSHSP T,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCMATRESOURCE F,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       DICNOMNS NM');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where D.IN_DOCUMENT = :NFCPRODPLANSP');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and D.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and D.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostDeliverySheets'));
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.PRN = D.OUT_DOCUMENT');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.COMPANY = :NCOMPANY');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.MATRES = F.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and F.NOMENCLATURE = NM.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.DEFICIT > ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
 | ||
|         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.TDG_ORDERS_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_NUM(ICURSOR => ICURSOR, IPOSITION => 3);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
 | ||
|         /* Делаем выборку */
 | ||
|         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.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NRN',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 1,
 | ||
|                                                    BCLEAR    => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SNOMEN',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NQUANT_PLAN',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 3);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SPROVIDER',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 4);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'NDEFICIT',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 5);
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|         end loop;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|           raise;
 | ||
|       end;
 | ||
|     end if;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end FCDELIVSH_DG_BY_LINKED_GET;
 | ||
|   
 | ||
|   /* Получение изображения для записи "Планы и отчеты производства изделий" по мат. ресурсу */
 | ||
|   function FCMATRESOURCE_IMAGE_GET
 | ||
|   (
 | ||
|     NRN                     in number,  -- Рег. номер записи материального ресурса
 | ||
|     SFLINKTYPE              in varchar2 -- Код типа присоединённого документа изображения (см. константы SFLINKTYPE_*)
 | ||
|   ) return                  blob        -- Данные считанного изображения (null - если ничего не найдено)
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Найдем изображение */
 | ||
|     for IMG in (select M.BDATA
 | ||
|                   from FILELINKS      M,
 | ||
|                        FILELINKSUNITS U,
 | ||
|                        FLINKTYPES     FLT
 | ||
|                  where M.FILE_TYPE = FLT.RN
 | ||
|                    and FLT.CODE = SFLINKTYPE
 | ||
|                    and U.TABLE_PRN = NRN
 | ||
|                    and U.UNITCODE = 'CostMaterialResources'
 | ||
|                    and M.RN = U.FILELINKS_PRN
 | ||
|                    and M.BDATA is not null
 | ||
|                    and ROWNUM = 1)
 | ||
|     loop
 | ||
|       /* Вернём его */
 | ||
|       return IMG.BDATA;
 | ||
|     end loop;
 | ||
|     /* Ничего не нашли */
 | ||
|     return null;
 | ||
|   end FCMATRESOURCE_IMAGE_GET;
 | ||
|   
 | ||
|   /* Получение таблицы записей "Планы и отчеты производства изделий" */
 | ||
|   procedure FCPRODPLAN_GET
 | ||
|   (
 | ||
|     NCRN                    in number,        -- Рег. номер каталога
 | ||
|     COUT                    out clob          -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NPROGRESS               PKG_STD.TLNUMBER; -- Прогресс плана
 | ||
|     
 | ||
|     /* Получение номера плана из заказа */
 | ||
|     function NUMB_BY_PROD_ORDER_GET
 | ||
|     (
 | ||
|       SPROD_ORDER           in varchar2 -- Заказ
 | ||
|     ) return                varchar2    -- Номер плана
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Возвращаем результат */
 | ||
|       return trim(SUBSTR(SPROD_ORDER, LENGTH(SPROD_ORDER)-2));
 | ||
|     end NUMB_BY_PROD_ORDER_GET;
 | ||
|     
 | ||
|     /* Получение детализации по прогрессу */
 | ||
|     function DETAIL_BY_PROGRESS_GET
 | ||
|     (
 | ||
|       NPROGRESS             in number        -- Прогресс
 | ||
|     ) return                varchar2         -- Детализация по прогрессу
 | ||
|     is
 | ||
|       SRESULT               PKG_STD.TSTRING; -- Детализация по прогрессу
 | ||
|     begin
 | ||
|       /* Определяем детализацию по прогрессу */
 | ||
|       case
 | ||
|         when (NPROGRESS >= 70) then
 | ||
|           SRESULT := 'Основная сборка';
 | ||
|         when (NPROGRESS >= 40) then
 | ||
|           SRESULT := 'Изготовление агрегатов';
 | ||
|         when (NPROGRESS >= 10) then
 | ||
|           SRESULT := 'Изготовление ДСЕ';
 | ||
|         else
 | ||
|           SRESULT := 'Изготовление ДСЕ не начато';
 | ||
|       end case;
 | ||
|       /* Возвращаем результат */
 | ||
|       return SRESULT;
 | ||
|     end DETAIL_BY_PROGRESS_GET;
 | ||
|   begin
 | ||
|     /* Начинаем формирование XML */
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     /* Открываем корень */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
 | ||
|     /* Цикл по планам и отчетам производства изделий */
 | ||
|     for REC in (select SP.RN NRN,
 | ||
|                        SP.MATRES NMATRES,
 | ||
|                        (select trim(PORD.NUMB) from FACEACC PORD where PORD.RN = SP.PROD_ORDER) SPROD_ORDER,
 | ||
|                        D_YEAR(SP.REP_DATE_TO) NYEAR,
 | ||
|                        COALESCE(SP.LABOUR_FACT, 0) NLABOUR_FACT,
 | ||
|                        COALESCE(SP.LABOUR_PLAN, 0) NLABOUR_PLAN
 | ||
|                   from FCPRODPLAN   P,
 | ||
|                        FCPRODPLANSP SP,
 | ||
|                        FINSTATE     FS,
 | ||
|                        ENPERIOD     EN
 | ||
|                  where P.CRN = NCRN
 | ||
|                    and P.CATEGORY = NFCPRODPLAN_CATEGORY_MON
 | ||
|                    and P.STATUS = NFCPRODPLAN_STATUS_MON
 | ||
|                    and FS.RN = P.TYPE
 | ||
|                    and FS.CODE = SFCPRODPLAN_TYPE_MON
 | ||
|                    and EN.RN = P.CALC_PERIOD
 | ||
|                    and SP.PRN = P.RN
 | ||
|                    and ((SP.LABOUR_PLAN is not null) or (SP.LABOUR_FACT is not null))
 | ||
|                    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())
 | ||
|                  order by SP.REP_DATE_TO asc)
 | ||
|     loop
 | ||
|       /* Открываем план */
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLAN_INFO');
 | ||
|       /* Описываем план */
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => NUMB_BY_PROD_ORDER_GET(SPROD_ORDER => REC.SPROD_ORDER));
 | ||
|       /* Определяем прогресс */
 | ||
|       if (REC.NLABOUR_PLAN = 0) then
 | ||
|         /* Не можем определить прогресс */
 | ||
|         NPROGRESS := 0;
 | ||
|       else
 | ||
|         /* Если факта нет */
 | ||
|         if (REC.NLABOUR_FACT = 0) then
 | ||
|           /* Не можем определить прогресс */
 | ||
|           NPROGRESS := 0;
 | ||
|         else
 | ||
|           /* Определим прогресс */
 | ||
|           NPROGRESS := ROUND(REC.NLABOUR_FACT / REC.NLABOUR_PLAN * 100, 2);
 | ||
|         end if;
 | ||
|       end if;
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NPROGRESS', NVALUE => NPROGRESS);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SDETAIL', SVALUE => DETAIL_BY_PROGRESS_GET(NPROGRESS => NPROGRESS));
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NYEAR', NVALUE => REC.NYEAR);
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'BIMAGE');
 | ||
|       PKG_XFAST.VALUE(LBVALUE => FCMATRESOURCE_IMAGE_GET(NRN => REC.NMATRES, SFLINKTYPE => SFLINKTYPE_PREVIEW));
 | ||
|       PKG_XFAST.UP();
 | ||
|       /* Закрываем план */
 | ||
|       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 FCPRODPLAN_GET;
 | ||
|   
 | ||
|   /* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Мониторинг сборки изделий"  */
 | ||
|   procedure FCPRODPLAN_AM_CTLG_INIT
 | ||
|   (
 | ||
|     COUT                    out clob    -- Список каталогов раздела "Планы и отчеты производства изделий"
 | ||
|   )
 | ||
|   is
 | ||
|   begin
 | ||
|     /* Начинаем формирование XML */
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     /* Открываем корень */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
 | ||
|     /* Цикл по планам и отчетам производства изделий */
 | ||
|     for REC in (select TMP.NRN,
 | ||
|                        TMP.SNAME,
 | ||
|                        count(P.RN) NCOUNT_DOCS,
 | ||
|                        min(D_YEAR(ENP.STARTDATE)) NMIN_YEAR,
 | ||
|                        max(D_YEAR(ENP.ENDDATE)) NMAX_YEAR
 | ||
|                   from (select T.RN   as NRN,
 | ||
|                                T.NAME as SNAME
 | ||
|                           from ACATALOG T,
 | ||
|                                UNITLIST UL
 | ||
|                          where T.DOCNAME = 'CostProductPlans'
 | ||
|                            and T.COMPANY = GET_SESSION_COMPANY()
 | ||
|                            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) TMP
 | ||
|                   left outer join FCPRODPLAN P
 | ||
|                     on TMP.NRN = P.CRN
 | ||
|                    and P.CATEGORY = NFCPRODPLAN_CATEGORY_MON
 | ||
|                    and P.STATUS = NFCPRODPLAN_STATUS_MON
 | ||
|                    and P.COMPANY = GET_SESSION_COMPANY()
 | ||
|                    and exists (select null
 | ||
|                                  from FCPRODPLANSP S
 | ||
|                                 where S.PRN = P.RN
 | ||
|                                 and ((S.LABOUR_PLAN is not null) or (S.LABOUR_FACT is not null)))
 | ||
|                    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())
 | ||
|                   left outer join FINSTATE FS
 | ||
|                     on P.TYPE = FS.RN
 | ||
|                    and FS.CODE = SFCPRODPLAN_TYPE_MON
 | ||
|                   left join ENPERIOD ENP
 | ||
|                     on P.CALC_PERIOD = ENP.RN
 | ||
|                  group by TMP.NRN,
 | ||
|                           TMP.SNAME
 | ||
|                  order by TMP.SNAME 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.ATTR(SNAME => 'NMIN_YEAR', NVALUE => REC.NMIN_YEAR);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NMAX_YEAR', NVALUE => REC.NMAX_YEAR);
 | ||
|       /* Закрываем план */
 | ||
|       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 FCPRODPLAN_AM_CTLG_INIT;
 | ||
| 
 | ||
|   /* Считывание деталей производственного состава */
 | ||
|   procedure FCPRODCMP_DETAILS_GET
 | ||
|   (
 | ||
|     NFCPRODPLANSP           in number,                             -- Рег. номер строки плана
 | ||
|     COUT                    out clob                               -- Сериализованная таблица данных
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NDP_MODEL_ID            PKG_STD.TREF;                          -- Рег. номер свойства "Идентификатор в SVG-модели"
 | ||
|     NDP_MODEL_BG_COLOR      PKG_STD.TREF;                          -- Рег. номер свойства "Цвет заливки в SVG-модели"
 | ||
|     NFCPRODPLANSP_LINKED    PKG_STD.TREF;                          -- Рег. номер связанной спецификации плана
 | ||
|     
 | ||
|     /* Функция получения материального ресурса строки плана */
 | ||
|     function FCPRODPLANSP_MATRES_GET
 | ||
|     (
 | ||
|       NFCPRODPLANSP         in number     -- Рег. номер строки плана
 | ||
|     ) return                number        -- Рег. номер мат. ресурса
 | ||
|     is
 | ||
|       NRESULT               PKG_STD.TREF; -- Рег. номер мат. ресурса
 | ||
|     begin
 | ||
|       /* Считываем рег. номер мат. ресурса */
 | ||
|       begin
 | ||
|         select T.MATRES into NRESULT from FCPRODPLANSP T where T.RN = NFCPRODPLANSP;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := null;
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end FCPRODPLANSP_MATRES_GET;
 | ||
|     
 | ||
|     /* Считывание рег. номера спецификации связанного плана */
 | ||
|     function FCPRODPLANSP_LINKED_GET
 | ||
|     (
 | ||
|       NPRODCMPSP              in number,    -- Рег. номер производственного состава
 | ||
|       NFCPRODPLANSP           in number     -- Рег. номер строки плана
 | ||
|     ) return                  number        -- Рег. номер спецификации связанного плана
 | ||
|     is
 | ||
|       NRESULT                 PKG_STD.TREF; -- Рег. номер спецификации связанного плана
 | ||
|     begin
 | ||
|       /* Считываем запись */
 | ||
|       begin
 | ||
|         select S.RN
 | ||
|           into NRESULT
 | ||
|           from FCPRODPLAN   T,
 | ||
|                FCPRODPLANSP S
 | ||
|          where S.PRN_NODE = NFCPRODPLANSP
 | ||
|            and S.PRN = T.RN
 | ||
|            and S.PRODCMPSP = NPRODCMPSP;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           NRESULT := null;
 | ||
|       end;
 | ||
|       /* Возвращаем результат */
 | ||
|       return NRESULT;
 | ||
|     end FCPRODPLANSP_LINKED_GET;
 | ||
|   begin
 | ||
|     /* Начинаем формирование XML */
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     /* Считываем свойства детали для её позиционирования в модели */
 | ||
|     FIND_DOCS_PROPS_CODE_EX(NFLAG_SMART => 1,
 | ||
|                             NCOMPVERS   => NCOMPANY,
 | ||
|                             SUNITCODE   => 'CostProductCompositionSpec',
 | ||
|                             SPROPCODE   => SDP_MODEL_ID,
 | ||
|                             NRN         => NDP_MODEL_ID);
 | ||
|     FIND_DOCS_PROPS_CODE_EX(NFLAG_SMART => 1,
 | ||
|                             NCOMPVERS   => NCOMPANY,
 | ||
|                             SUNITCODE   => 'CostProductCompositionSpec',
 | ||
|                             SPROPCODE   => SDP_MODEL_BG_COLOR,
 | ||
|                             NRN         => NDP_MODEL_BG_COLOR);
 | ||
|     /* Открываем корень */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
 | ||
|     /* Векторная модель */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'BMODEL');
 | ||
|     PKG_XFAST.VALUE(LBVALUE => FCMATRESOURCE_IMAGE_GET(NRN        => FCPRODPLANSP_MATRES_GET(NFCPRODPLANSP => NFCPRODPLANSP),
 | ||
|                                                        SFLINKTYPE => SFLINKTYPE_SVG_MODEL));
 | ||
|     PKG_XFAST.UP();
 | ||
|     /* Цикл по планам и отчетам производства изделий */
 | ||
|     for REC in (select S.RN NRN,
 | ||
|                        (select F.NAME from FCMATRESOURCE F where F.RN = S.MTR_RES) SNAME,
 | ||
|                        PV_MID.STR_VALUE SMODEL_ID,
 | ||
|                        (select PV_MFC.STR_VALUE
 | ||
|                           from DOCS_PROPS_VALS PV_MFC
 | ||
|                          where PV_MFC.UNIT_RN = S.RN
 | ||
|                            and PV_MFC.DOCS_PROP_RN = NDP_MODEL_BG_COLOR) SMODEL_BG_COLOR
 | ||
|                   from FCPRODPLANSP    T,
 | ||
|                        FCPRODCMPSP     S,
 | ||
|                        DOCS_PROPS_VALS PV_MID
 | ||
|                  where T.RN = NFCPRODPLANSP
 | ||
|                    and S.PRN = T.PRODCMP
 | ||
|                    and PV_MID.UNIT_RN = S.RN
 | ||
|                    and PV_MID.DOCS_PROP_RN = NDP_MODEL_ID)
 | ||
|     loop
 | ||
|       /* Получаем рег. номер связанной спецификации плана */
 | ||
|       NFCPRODPLANSP_LINKED := FCPRODPLANSP_LINKED_GET(NPRODCMPSP => REC.NRN, NFCPRODPLANSP => NFCPRODPLANSP);
 | ||
|       /* Открываем план */
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODCMP');
 | ||
|       /* Описываем план */
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => REC.SNAME);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SMODEL_ID', SVALUE => REC.SMODEL_ID);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SMODEL_BG_COLOR', SVALUE => REC.SMODEL_BG_COLOR);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NFCPRODPLANSP_LINK', NVALUE => NFCPRODPLANSP_LINKED);
 | ||
|       /* Закрываем план */
 | ||
|       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 FCPRODCMP_DETAILS_GET;
 | ||
|   
 | ||
|   /*
 | ||
|     Процедуры панели "Выдача сменного задания на участок"
 | ||
|   */
 | ||
|   
 | ||
|   /* Выдать задания сменного задания */
 | ||
|   procedure FCJOBSSP_MP_ISSUE
 | ||
|   (
 | ||
|     NFCJOBS                 in number,                             -- Рег. номер сменного задания
 | ||
|     NCOEFF                  in number := 1.1                       -- Коэффициент выполнения норм
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NDICMUNTS               PKG_STD.TREF;                          -- Рег. номер ед. изм. дня
 | ||
|     DSTART_DATE             PKG_STD.TLDATE;                        -- Дата начала строки плана
 | ||
|     DEND_DATE               PKG_STD.TLDATE;                        -- Дата окончания строки плана
 | ||
|   begin
 | ||
|     /* Если сменное задание не указано */
 | ||
|     if (NFCJOBS is null) then
 | ||
|       P_EXCEPTION(0, 'Сменное задание не определено.');
 | ||
|     end if;
 | ||
|     /* Считываем единицу измерения минут */
 | ||
|     FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                        NFLAG_OPTION => 0,
 | ||
|                        NCOMPANY     => NCOMPANY,
 | ||
|                        SMEAS_MNEMO  => SDICMUNTS_DAY,
 | ||
|                        NRN          => NDICMUNTS);
 | ||
|     /* Отбираем строки с пустым исполнителем факт */
 | ||
|     for REC in (select T.RN
 | ||
|                   from FCJOBSSP T
 | ||
|                  where T.PRN = NFCJOBS
 | ||
|                    and T.PERFORM_FACT is null)
 | ||
|     loop
 | ||
|       /* Удаляем строку */
 | ||
|       P_FCJOBSSP_BASE_DELETE(NRN => REC.RN, NCOMPANY => NCOMPANY);
 | ||
|     end loop;
 | ||
|     /* Цикл по исполнителям строк */
 | ||
|     for PF in (select T.PERFORM_FACT from FCJOBSSP T where T.PRN = NFCJOBS group by T.PERFORM_FACT)
 | ||
|     loop
 | ||
|       /* Цикл по строкам с текущим исполнителем */
 | ||
|       for REC in (select TMP.*,
 | ||
|                          DECODE(B.RN, null, TMP.DDOC_DATE, TMP.DDOC_DATE + B.BEG_TIME) DSTART,
 | ||
|                          F_DICMUNTS_BASE_RECALC_QUANT(0, TMP.COMPANY, TMP.MUNIT, TMP.LABOUR_PLAN, NDICMUNTS) NLABOUR,
 | ||
|                          ROWNUM RNUM
 | ||
|                     from (select T.*,
 | ||
|                                  J.DOCDATE DDOC_DATE,
 | ||
|                                  COALESCE(T.TBOPERMODESP, J.TBOPERMODESP) NTBOPERMODESP
 | ||
|                             from FCJOBS   J,
 | ||
|                                  FCJOBSSP T
 | ||
|                            where J.RN = NFCJOBS
 | ||
|                              and T.PRN = J.RN
 | ||
|                              and T.PERFORM_FACT = PF.PERFORM_FACT
 | ||
|                            order by T.PRIOR_PARTY asc) TMP,
 | ||
|                          TBOPERMODESP B
 | ||
|                    where B.RN = TMP.NTBOPERMODESP)
 | ||
|       loop
 | ||
|         /* Если это первая строка - устанавливаем по смене */
 | ||
|         if (REC.RNUM = 1) then
 | ||
|           DSTART_DATE := REC.DSTART;
 | ||
|           DEND_DATE   := DSTART_DATE + REC.NLABOUR / NCOEFF;
 | ||
|         else
 | ||
|           DSTART_DATE := DEND_DATE;
 | ||
|           DEND_DATE   := DSTART_DATE + REC.NLABOUR / NCOEFF;
 | ||
|         end if;
 | ||
|         /* Обновляем запись строки */
 | ||
|         P_FCJOBSSP_BASE_UPDATE(NRN            => REC.RN,
 | ||
|                                NCOMPANY       => REC.COMPANY,
 | ||
|                                SNUMB          => REC.NUMB,
 | ||
|                                NTBOPERMODESP  => REC.TBOPERMODESP,
 | ||
|                                SBARCODE       => REC.BARCODE,
 | ||
|                                NFACEACC       => REC.FACEACC,
 | ||
|                                NMATRES        => REC.MATRES,
 | ||
|                                NNOMCLASSIF    => REC.NOMCLASSIF,
 | ||
|                                NARTICLE       => REC.ARTICLE,
 | ||
|                                NFCROUTSHTSP   => REC.FCROUTSHTSP,
 | ||
|                                SOPER_NUMB     => REC.OPER_NUMB,
 | ||
|                                NOPER_TPS      => REC.OPER_TPS,
 | ||
|                                SOPER_UK       => REC.OPER_UK,
 | ||
|                                NSIGN_CONTRL   => REC.SIGN_CONTRL,
 | ||
|                                NMANPOWER      => REC.MANPOWER,
 | ||
|                                NCATEGORY      => REC.CATEGORY,
 | ||
|                                DBEG_PLAN      => DSTART_DATE,
 | ||
|                                DEND_PLAN      => DEND_DATE,
 | ||
|                                DBEG_FACT      => REC.BEG_FACT,
 | ||
|                                DEND_FACT      => REC.END_FACT,
 | ||
|                                NQUANT_PLAN    => REC.QUANT_PLAN,
 | ||
|                                NQUANT_FACT    => REC.QUANT_FACT,
 | ||
|                                NNORM          => REC.NORM,
 | ||
|                                NT_SHT_FACT    => REC.T_SHT_FACT,
 | ||
|                                NT_PZ_PLAN     => REC.T_PZ_PLAN,
 | ||
|                                NT_PZ_FACT     => REC.T_PZ_FACT,
 | ||
|                                NT_VSP_PLAN    => REC.T_VSP_PLAN,
 | ||
|                                NT_VSP_FACT    => REC.T_VSP_FACT,
 | ||
|                                NT_O_PLAN      => REC.T_O_PLAN,
 | ||
|                                NT_O_FACT      => REC.T_O_FACT,
 | ||
|                                NNORM_TYPE     => REC.NORM_TYPE,
 | ||
|                                NSIGN_P_R      => REC.SIGN_P_R,
 | ||
|                                NLABOUR_PLAN   => REC.LABOUR_PLAN,
 | ||
|                                NLABOUR_FACT   => REC.LABOUR_FACT,
 | ||
|                                NCOST_PLAN     => REC.COST_PLAN,
 | ||
|                                NCOST_FACT     => REC.COST_FACT,
 | ||
|                                NCOST_FOR      => REC.COST_FOR,
 | ||
|                                NCURNAMES      => REC.CURNAMES,
 | ||
|                                NPERFORM_PLAN  => REC.PERFORM_PLAN,
 | ||
|                                NPERFORM_FACT  => REC.PERFORM_FACT,
 | ||
|                                NSTAFFGRP_PLAN => REC.STAFFGRP_PLAN,
 | ||
|                                NSTAFFGRP_FACT => REC.STAFFGRP_FACT,
 | ||
|                                NEQUIP_PLAN    => REC.EQUIP_PLAN,
 | ||
|                                NEQUIP_FACT    => REC.EQUIP_FACT,
 | ||
|                                NLOSTTYPE      => REC.LOSTTYPE,
 | ||
|                                NLOSTDEFL      => REC.LOSTDEFL,
 | ||
|                                NFOREMAN       => REC.FOREMAN,
 | ||
|                                NINSPECTOR     => REC.INSPECTOR,
 | ||
|                                DOTK_DATE      => REC.OTK_DATE,
 | ||
|                                NSUBDIV        => REC.SUBDIV,
 | ||
|                                NEQCONFIG      => REC.EQCONFIG,
 | ||
|                                SNOTE          => 'Задание выдано ' || TO_CHAR(sysdate, 'dd.mm.yyyy hh24:mi:ss'),
 | ||
|                                NMUNIT         => REC.MUNIT);
 | ||
|       end loop;
 | ||
|     end loop;
 | ||
|   end FCJOBSSP_MP_ISSUE;
 | ||
|   
 | ||
|   /* Исключение исполнителя из операции сменного задания */
 | ||
|   procedure FCJOBSSP_MP_EXC_PERFORM
 | ||
|   (
 | ||
|     NFCJOBSSP               in number                              -- Рег. номер строки сменного задания
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     RFCJOBSSP               FCJOBSSP%rowtype;                      -- Запись строки сменного задания
 | ||
|   begin
 | ||
|     /* Если рег. номер строки не указан */
 | ||
|     if (NFCJOBSSP is null) then
 | ||
|       P_EXCEPTION(0, 'Строка сменного задания не определена.');
 | ||
|     end if;
 | ||
|     /* Считываем запись строки сменного задания */
 | ||
|     RFCJOBSSP := UTL_FCJOBSSP_GET(NCOMPANY => NCOMPANY, NFCJOBSSP => NFCJOBSSP);
 | ||
|     /* Если дата начала факт указана */
 | ||
|     if (RFCJOBSSP.BEG_FACT is not null) then
 | ||
|       P_EXCEPTION(0, 'Указанная строка сменного задания исполняется.');
 | ||
|     end if;
 | ||
|     /* Исключаем исполнителя */
 | ||
|     P_FCJOBSSP_BASE_UPDATE(NRN            => RFCJOBSSP.RN,
 | ||
|                            NCOMPANY       => RFCJOBSSP.COMPANY,
 | ||
|                            SNUMB          => RFCJOBSSP.NUMB,
 | ||
|                            NTBOPERMODESP  => RFCJOBSSP.TBOPERMODESP,
 | ||
|                            SBARCODE       => RFCJOBSSP.BARCODE,
 | ||
|                            NFACEACC       => RFCJOBSSP.FACEACC,
 | ||
|                            NMATRES        => RFCJOBSSP.MATRES,
 | ||
|                            NNOMCLASSIF    => RFCJOBSSP.NOMCLASSIF,
 | ||
|                            NARTICLE       => RFCJOBSSP.ARTICLE,
 | ||
|                            NFCROUTSHTSP   => RFCJOBSSP.FCROUTSHTSP,
 | ||
|                            SOPER_NUMB     => RFCJOBSSP.OPER_NUMB,
 | ||
|                            NOPER_TPS      => RFCJOBSSP.OPER_TPS,
 | ||
|                            SOPER_UK       => RFCJOBSSP.OPER_UK,
 | ||
|                            NSIGN_CONTRL   => RFCJOBSSP.SIGN_CONTRL,
 | ||
|                            NMANPOWER      => RFCJOBSSP.MANPOWER,
 | ||
|                            NCATEGORY      => RFCJOBSSP.CATEGORY,
 | ||
|                            DBEG_PLAN      => RFCJOBSSP.BEG_PLAN,
 | ||
|                            DEND_PLAN      => RFCJOBSSP.END_PLAN,
 | ||
|                            DBEG_FACT      => RFCJOBSSP.BEG_FACT,
 | ||
|                            DEND_FACT      => RFCJOBSSP.END_FACT,
 | ||
|                            NQUANT_PLAN    => RFCJOBSSP.QUANT_PLAN,
 | ||
|                            NQUANT_FACT    => RFCJOBSSP.QUANT_FACT,
 | ||
|                            NNORM          => RFCJOBSSP.NORM,
 | ||
|                            NT_SHT_FACT    => RFCJOBSSP.T_SHT_FACT,
 | ||
|                            NT_PZ_PLAN     => RFCJOBSSP.T_PZ_PLAN,
 | ||
|                            NT_PZ_FACT     => RFCJOBSSP.T_PZ_FACT,
 | ||
|                            NT_VSP_PLAN    => RFCJOBSSP.T_VSP_PLAN,
 | ||
|                            NT_VSP_FACT    => RFCJOBSSP.T_VSP_FACT,
 | ||
|                            NT_O_PLAN      => RFCJOBSSP.T_O_PLAN,
 | ||
|                            NT_O_FACT      => RFCJOBSSP.T_O_FACT,
 | ||
|                            NNORM_TYPE     => RFCJOBSSP.NORM_TYPE,
 | ||
|                            NSIGN_P_R      => RFCJOBSSP.SIGN_P_R,
 | ||
|                            NLABOUR_PLAN   => RFCJOBSSP.LABOUR_PLAN,
 | ||
|                            NLABOUR_FACT   => RFCJOBSSP.LABOUR_FACT,
 | ||
|                            NCOST_PLAN     => RFCJOBSSP.COST_PLAN,
 | ||
|                            NCOST_FACT     => RFCJOBSSP.COST_FACT,
 | ||
|                            NCOST_FOR      => RFCJOBSSP.COST_FOR,
 | ||
|                            NCURNAMES      => RFCJOBSSP.CURNAMES,
 | ||
|                            NPERFORM_PLAN  => RFCJOBSSP.PERFORM_PLAN,
 | ||
|                            NPERFORM_FACT  => null,
 | ||
|                            NSTAFFGRP_PLAN => RFCJOBSSP.STAFFGRP_PLAN,
 | ||
|                            NSTAFFGRP_FACT => RFCJOBSSP.STAFFGRP_FACT,
 | ||
|                            NEQUIP_PLAN    => RFCJOBSSP.EQUIP_PLAN,
 | ||
|                            NEQUIP_FACT    => RFCJOBSSP.EQUIP_FACT,
 | ||
|                            NLOSTTYPE      => RFCJOBSSP.LOSTTYPE,
 | ||
|                            NLOSTDEFL      => RFCJOBSSP.LOSTDEFL,
 | ||
|                            NFOREMAN       => RFCJOBSSP.FOREMAN,
 | ||
|                            NINSPECTOR     => RFCJOBSSP.INSPECTOR,
 | ||
|                            DOTK_DATE      => RFCJOBSSP.OTK_DATE,
 | ||
|                            NSUBDIV        => RFCJOBSSP.SUBDIV,
 | ||
|                            NEQCONFIG      => RFCJOBSSP.EQCONFIG,
 | ||
|                            SNOTE          => RFCJOBSSP.NOTE,
 | ||
|                            NMUNIT         => RFCJOBSSP.MUNIT);
 | ||
|     /* Очищаем строки дополнительных ресурсов */
 | ||
|     for REC in (select T.* from FCJOBSSPAR T where T.PRN = RFCJOBSSP.RN)
 | ||
|     loop
 | ||
|       /* Очищаем исполнителя дополнительного ресурса */
 | ||
|       P_FCJOBSSPAR_BASE_UPDATE(NRN           => REC.RN,
 | ||
|                                NCOMPANY      => REC.COMPANY,
 | ||
|                                NROUTSHTSPAR  => REC.ROUTSHTSPAR,
 | ||
|                                NEQUIPMENT    => REC.EQUIPMENT,
 | ||
|                                NMANPOWER     => REC.MANPOWER,
 | ||
|                                NCATEGORY     => REC.CATEGORY,
 | ||
|                                NNORM         => REC.NORM,
 | ||
|                                NNORM_TYPE    => REC.NORM_TYPE,
 | ||
|                                NSIGN_P_R     => REC.SIGN_P_R,
 | ||
|                                NLABOUR_PLAN  => REC.LABOUR_PLAN,
 | ||
|                                NLABOUR_FACT  => REC.LABOUR_FACT,
 | ||
|                                NCOST_PLAN    => REC.COST_PLAN,
 | ||
|                                NCOST_FACT    => REC.COST_FACT,
 | ||
|                                NCOST_FOR     => REC.COST_FOR,
 | ||
|                                NCURNAMES     => REC.CURNAMES,
 | ||
|                                NPERFORM_PLAN => REC.PERFORM_PLAN,
 | ||
|                                NPERFORM_FACT => null,
 | ||
|                                NMUNIT        => REC.MUNIT,
 | ||
|                                NPROCTYPE     => REC.PROCTYPE);
 | ||
|     end loop;
 | ||
|   end FCJOBSSP_MP_EXC_PERFORM;
 | ||
|   
 | ||
|   /* Включение исполнителя в строку сменного задания */
 | ||
|   procedure FCJOBSSP_MP_INC_PERFORM
 | ||
|   (
 | ||
|     NFCJOBSSP               in number,                             -- Рег. номер строки сменного задания
 | ||
|     SPERFORM_LIST           in clob,                               -- Список отмеченных исполнителей (разделитель - ";")
 | ||
|     NQUANT_PLAN             in number                              -- Включаемое количество
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NQUANT_REMN             PKG_STD.TLNUMBER;                      -- Остаток количества
 | ||
|     RFCJOBSSP               FCJOBSSP%rowtype;                      -- Запись строки сменного задания
 | ||
|     NNEW_FCJOBSSP           PKG_STD.TREF;                          -- Рег. номер новой строки сменного задания
 | ||
|     NNEW_FCJOBSSPAR         PKG_STD.TREF;                          -- Рег. номер нового дополнительного ресурса строки сменного задания
 | ||
|     NROUTLST                PKG_STD.TREF;                          -- Рег. номер связанного МЛ
 | ||
|     NROUTLSTSP              PKG_STD.TREF;                          -- Рег. номер связанной строки МЛ
 | ||
|     NCLNPSPFM               PKG_STD.TREF;                          -- Рег. номер исполнения должности
 | ||
|     
 | ||
|     /* Проверка наличия состава оборудования */
 | ||
|     procedure CLNPSPFM_EXISTS
 | ||
|     (
 | ||
|       NCLNPSPFM               in number,       -- Рег. номер исполнения должности
 | ||
|       NCOMPANY                in number        -- Рег. номер организации
 | ||
|     )
 | ||
|     is
 | ||
|       NEXISTS                 PKG_STD.TNUMBER; -- Буфер
 | ||
|     begin
 | ||
|       /* Проверяем наличие оборудования */
 | ||
|       begin
 | ||
|         select T.RN
 | ||
|           into NEXISTS
 | ||
|           from CLNPSPFM T
 | ||
|          where T.RN = NCLNPSPFM
 | ||
|            and T.COMPANY = NCOMPANY;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           P_EXCEPTION(0, 'Рабочее место не найдено.');
 | ||
|       end;
 | ||
|     end CLNPSPFM_EXISTS;
 | ||
|     
 | ||
|     /* Пересчет "Трудоемкость план" строки сменного задания */
 | ||
|     procedure LABOUR_PLAN_RECALC
 | ||
|     (
 | ||
|       RFCJOBSSP             in out FCJOBSSP%rowtype, -- Запись строки сменного задания
 | ||
|       NQUANT_PLAN           in number                -- Количество план
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Если не установлен признак "То план" */
 | ||
|       if ((RFCJOBSSP.T_O_PLAN is null) or ((RFCJOBSSP.T_O_PLAN is not null) and (RFCJOBSSP.T_O_PLAN = 0))) then
 | ||
|         /* Если установлен признак "На партию выпуска" */
 | ||
|         if (RFCJOBSSP.SIGN_P_R = 1) then
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.NORM;
 | ||
|         else
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.NORM * NQUANT_PLAN;
 | ||
|         end if;
 | ||
|       else
 | ||
|         /* Если установлен признак "На партию выпуска" */
 | ||
|         if (RFCJOBSSP.SIGN_P_R = 1) then
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.T_O_PLAN + COALESCE(RFCJOBSSP.T_PZ_PLAN, 0) +
 | ||
|                                    COALESCE(RFCJOBSSP.T_VSP_PLAN, 0);
 | ||
|         else
 | ||
|           RFCJOBSSP.LABOUR_PLAN := RFCJOBSSP.T_O_PLAN * NQUANT_PLAN + COALESCE(RFCJOBSSP.T_PZ_PLAN, 0) +
 | ||
|                                    COALESCE(RFCJOBSSP.T_VSP_PLAN, 0);
 | ||
|         end if;
 | ||
|       end if;
 | ||
|     end LABOUR_PLAN_RECALC;
 | ||
|   begin
 | ||
|     /* Если включаемое количество меньше 0 или пустое */
 | ||
|     if ((NQUANT_PLAN is null) or ((NQUANT_PLAN is not null) and (NQUANT_PLAN <= 0))) then
 | ||
|       P_EXCEPTION(0, 'Невозможно включить указанное количество.');
 | ||
|     end if;
 | ||
|     /* Если рег. номер строки не указан */
 | ||
|     if (NFCJOBSSP is null) then
 | ||
|       P_EXCEPTION(0, 'Строка сменного задания не определена.');
 | ||
|     end if;
 | ||
|     /* Считываем запись строки сменного задания */
 | ||
|     RFCJOBSSP := UTL_FCJOBSSP_GET(NCOMPANY => NCOMPANY, NFCJOBSSP => NFCJOBSSP);
 | ||
|     /* Если дата начала факт указана */
 | ||
|     if (RFCJOBSSP.BEG_FACT is not null) then
 | ||
|       P_EXCEPTION(0, 'Указанная строка сменного задания исполняется.');
 | ||
|     end if;
 | ||
|     /* Если включаемое количество больше текущего */
 | ||
|     if (NQUANT_PLAN > RFCJOBSSP.QUANT_PLAN) then
 | ||
|       P_EXCEPTION(0,
 | ||
|                   'Указанное количество превышает текущее "Количество план" строки.');
 | ||
|     end if;
 | ||
|     /* Если список исполнителей пуст */
 | ||
|     if (SPERFORM_LIST is null) then
 | ||
|       P_EXCEPTION(0, 'Список исполнителей пуст.');
 | ||
|     end if;
 | ||
|     /* Рассчитываем остаточное количество */
 | ||
|     NQUANT_REMN := RFCJOBSSP.QUANT_PLAN - NQUANT_PLAN;
 | ||
|     /* Пересчитываем "Количество план" */
 | ||
|     LABOUR_PLAN_RECALC(RFCJOBSSP => RFCJOBSSP, NQUANT_PLAN => NQUANT_PLAN);
 | ||
|     /* Обходим исполнителей */
 | ||
|     for I in 1 .. STRCNT(source => SPERFORM_LIST, DELIMETER => ';')
 | ||
|     loop
 | ||
|       /* Считываем рег. номер исполнения должности */
 | ||
|       NCLNPSPFM := TO_NUMBER(STRTOK(source => SPERFORM_LIST, DELIMETER => ';', ITEM => I));
 | ||
|       /* Проверяем наличие исполнения должности */
 | ||
|       CLNPSPFM_EXISTS(NCLNPSPFM => NCLNPSPFM, NCOMPANY => NCOMPANY);
 | ||
|       /* Если это первый отмеченный */
 | ||
|       if (I = 1) then
 | ||
|         /* Включаем исполнителя */
 | ||
|         P_FCJOBSSP_BASE_UPDATE(NRN            => RFCJOBSSP.RN,
 | ||
|                                NCOMPANY       => RFCJOBSSP.COMPANY,
 | ||
|                                SNUMB          => RFCJOBSSP.NUMB,
 | ||
|                                NTBOPERMODESP  => RFCJOBSSP.TBOPERMODESP,
 | ||
|                                SBARCODE       => RFCJOBSSP.BARCODE,
 | ||
|                                NFACEACC       => RFCJOBSSP.FACEACC,
 | ||
|                                NMATRES        => RFCJOBSSP.MATRES,
 | ||
|                                NNOMCLASSIF    => RFCJOBSSP.NOMCLASSIF,
 | ||
|                                NARTICLE       => RFCJOBSSP.ARTICLE,
 | ||
|                                NFCROUTSHTSP   => RFCJOBSSP.FCROUTSHTSP,
 | ||
|                                SOPER_NUMB     => RFCJOBSSP.OPER_NUMB,
 | ||
|                                NOPER_TPS      => RFCJOBSSP.OPER_TPS,
 | ||
|                                SOPER_UK       => RFCJOBSSP.OPER_UK,
 | ||
|                                NSIGN_CONTRL   => RFCJOBSSP.SIGN_CONTRL,
 | ||
|                                NMANPOWER      => RFCJOBSSP.MANPOWER,
 | ||
|                                NCATEGORY      => RFCJOBSSP.CATEGORY,
 | ||
|                                DBEG_PLAN      => RFCJOBSSP.BEG_PLAN,
 | ||
|                                DEND_PLAN      => RFCJOBSSP.END_PLAN,
 | ||
|                                DBEG_FACT      => RFCJOBSSP.BEG_FACT,
 | ||
|                                DEND_FACT      => RFCJOBSSP.END_FACT,
 | ||
|                                NQUANT_PLAN    => NQUANT_PLAN,
 | ||
|                                NQUANT_FACT    => RFCJOBSSP.QUANT_FACT,
 | ||
|                                NNORM          => RFCJOBSSP.NORM,
 | ||
|                                NT_SHT_FACT    => RFCJOBSSP.T_SHT_FACT,
 | ||
|                                NT_PZ_PLAN     => RFCJOBSSP.T_PZ_PLAN,
 | ||
|                                NT_PZ_FACT     => RFCJOBSSP.T_PZ_FACT,
 | ||
|                                NT_VSP_PLAN    => RFCJOBSSP.T_VSP_PLAN,
 | ||
|                                NT_VSP_FACT    => RFCJOBSSP.T_VSP_FACT,
 | ||
|                                NT_O_PLAN      => RFCJOBSSP.T_O_PLAN,
 | ||
|                                NT_O_FACT      => RFCJOBSSP.T_O_FACT,
 | ||
|                                NNORM_TYPE     => RFCJOBSSP.NORM_TYPE,
 | ||
|                                NSIGN_P_R      => RFCJOBSSP.SIGN_P_R,
 | ||
|                                NLABOUR_PLAN   => RFCJOBSSP.LABOUR_PLAN,
 | ||
|                                NLABOUR_FACT   => RFCJOBSSP.LABOUR_FACT,
 | ||
|                                NCOST_PLAN     => RFCJOBSSP.COST_PLAN,
 | ||
|                                NCOST_FACT     => RFCJOBSSP.COST_FACT,
 | ||
|                                NCOST_FOR      => RFCJOBSSP.COST_FOR,
 | ||
|                                NCURNAMES      => RFCJOBSSP.CURNAMES,
 | ||
|                                NPERFORM_PLAN  => RFCJOBSSP.PERFORM_PLAN,
 | ||
|                                NPERFORM_FACT  => NCLNPSPFM,
 | ||
|                                NSTAFFGRP_PLAN => RFCJOBSSP.STAFFGRP_PLAN,
 | ||
|                                NSTAFFGRP_FACT => RFCJOBSSP.STAFFGRP_FACT,
 | ||
|                                NEQUIP_PLAN    => RFCJOBSSP.EQUIP_PLAN,
 | ||
|                                NEQUIP_FACT    => RFCJOBSSP.EQUIP_FACT,
 | ||
|                                NLOSTTYPE      => RFCJOBSSP.LOSTTYPE,
 | ||
|                                NLOSTDEFL      => RFCJOBSSP.LOSTDEFL,
 | ||
|                                NFOREMAN       => RFCJOBSSP.FOREMAN,
 | ||
|                                NINSPECTOR     => RFCJOBSSP.INSPECTOR,
 | ||
|                                DOTK_DATE      => RFCJOBSSP.OTK_DATE,
 | ||
|                                NSUBDIV        => RFCJOBSSP.SUBDIV,
 | ||
|                                NEQCONFIG      => RFCJOBSSP.EQCONFIG,
 | ||
|                                SNOTE          => RFCJOBSSP.NOTE,
 | ||
|                                NMUNIT         => RFCJOBSSP.MUNIT);
 | ||
|         /* Если есть остаток */
 | ||
|         if (NQUANT_REMN <> 0) then
 | ||
|           /* Обнуляем дату отработки */
 | ||
|           RFCJOBSSP.WORK_DATE := null;
 | ||
|           /* Получаем новый номер */
 | ||
|           P_FCJOBSSP_GETNEXTNUMB(NCOMPANY => NCOMPANY, NPRN => RFCJOBSSP.PRN, SNUMB => RFCJOBSSP.NUMB);
 | ||
|           /* Если штрихкод был указан */
 | ||
|           if (RFCJOBSSP.BARCODE is not null) then
 | ||
|             /* Получаем новый штрихкод */
 | ||
|             P_FCJOBSSP_GET_BARCODE(NCOMPANY => NCOMPANY, NRN => RFCJOBSSP.RN, SBARCODE => RFCJOBSSP.BARCODE);
 | ||
|           end if;
 | ||
|           /* Пересчитываем "Количество план" */
 | ||
|           LABOUR_PLAN_RECALC(RFCJOBSSP => RFCJOBSSP, NQUANT_PLAN => NQUANT_REMN);
 | ||
|           /* Размножаем запись */
 | ||
|           P_FCJOBSSP_BASE_INSERT(NCOMPANY       => RFCJOBSSP.COMPANY,
 | ||
|                                  NPRN           => RFCJOBSSP.PRN,
 | ||
|                                  SNUMB          => RFCJOBSSP.NUMB,
 | ||
|                                  NTBOPERMODESP  => RFCJOBSSP.TBOPERMODESP,
 | ||
|                                  SBARCODE       => RFCJOBSSP.BARCODE,
 | ||
|                                  NFACEACC       => RFCJOBSSP.FACEACC,
 | ||
|                                  NMATRES        => RFCJOBSSP.MATRES,
 | ||
|                                  NNOMCLASSIF    => RFCJOBSSP.NOMCLASSIF,
 | ||
|                                  NARTICLE       => RFCJOBSSP.ARTICLE,
 | ||
|                                  NFCROUTSHTSP   => RFCJOBSSP.FCROUTSHTSP,
 | ||
|                                  SOPER_NUMB     => RFCJOBSSP.OPER_NUMB,
 | ||
|                                  NOPER_TPS      => RFCJOBSSP.OPER_TPS,
 | ||
|                                  SOPER_UK       => RFCJOBSSP.OPER_UK,
 | ||
|                                  NSIGN_CONTRL   => RFCJOBSSP.SIGN_CONTRL,
 | ||
|                                  NMANPOWER      => RFCJOBSSP.MANPOWER,
 | ||
|                                  NCATEGORY      => RFCJOBSSP.CATEGORY,
 | ||
|                                  DBEG_PLAN      => RFCJOBSSP.BEG_PLAN,
 | ||
|                                  DEND_PLAN      => RFCJOBSSP.END_PLAN,
 | ||
|                                  DBEG_FACT      => RFCJOBSSP.BEG_FACT,
 | ||
|                                  DEND_FACT      => RFCJOBSSP.END_FACT,
 | ||
|                                  NQUANT_PLAN    => NQUANT_REMN,
 | ||
|                                  NQUANT_FACT    => RFCJOBSSP.QUANT_FACT,
 | ||
|                                  NNORM          => RFCJOBSSP.NORM,
 | ||
|                                  NT_SHT_FACT    => RFCJOBSSP.T_SHT_FACT,
 | ||
|                                  NT_PZ_PLAN     => RFCJOBSSP.T_PZ_PLAN,
 | ||
|                                  NT_PZ_FACT     => RFCJOBSSP.T_PZ_FACT,
 | ||
|                                  NT_VSP_PLAN    => RFCJOBSSP.T_VSP_PLAN,
 | ||
|                                  NT_VSP_FACT    => RFCJOBSSP.T_VSP_FACT,
 | ||
|                                  NT_O_PLAN      => RFCJOBSSP.T_O_PLAN,
 | ||
|                                  NT_O_FACT      => RFCJOBSSP.T_O_FACT,
 | ||
|                                  NNORM_TYPE     => RFCJOBSSP.NORM_TYPE,
 | ||
|                                  NSIGN_P_R      => RFCJOBSSP.SIGN_P_R,
 | ||
|                                  NLABOUR_PLAN   => RFCJOBSSP.LABOUR_PLAN,
 | ||
|                                  NLABOUR_FACT   => RFCJOBSSP.LABOUR_FACT,
 | ||
|                                  NCOST_PLAN     => RFCJOBSSP.COST_PLAN,
 | ||
|                                  NCOST_FACT     => RFCJOBSSP.COST_FACT,
 | ||
|                                  NCOST_FOR      => RFCJOBSSP.COST_FOR,
 | ||
|                                  NCURNAMES      => RFCJOBSSP.CURNAMES,
 | ||
|                                  NPERFORM_PLAN  => RFCJOBSSP.PERFORM_PLAN,
 | ||
|                                  NPERFORM_FACT  => RFCJOBSSP.PERFORM_FACT,
 | ||
|                                  NSTAFFGRP_PLAN => RFCJOBSSP.STAFFGRP_PLAN,
 | ||
|                                  NSTAFFGRP_FACT => RFCJOBSSP.STAFFGRP_FACT,
 | ||
|                                  NEQUIP_PLAN    => RFCJOBSSP.EQUIP_PLAN,
 | ||
|                                  NEQUIP_FACT    => RFCJOBSSP.EQUIP_FACT,
 | ||
|                                  NLOSTTYPE      => RFCJOBSSP.LOSTTYPE,
 | ||
|                                  NLOSTDEFL      => RFCJOBSSP.LOSTDEFL,
 | ||
|                                  NFOREMAN       => RFCJOBSSP.FOREMAN,
 | ||
|                                  NINSPECTOR     => RFCJOBSSP.INSPECTOR,
 | ||
|                                  DOTK_DATE      => RFCJOBSSP.OTK_DATE,
 | ||
|                                  NSUBDIV        => RFCJOBSSP.SUBDIV,
 | ||
|                                  NEQCONFIG      => null,
 | ||
|                                  NSIGN_AR       => 1,
 | ||
|                                  SNOTE          => RFCJOBSSP.NOTE,
 | ||
|                                  NMUNIT         => RFCJOBSSP.MUNIT,
 | ||
|                                  NPRIOR_ORDER   => RFCJOBSSP.PRIOR_ORDER,
 | ||
|                                  NPRIOR_PARTY   => RFCJOBSSP.PRIOR_PARTY,
 | ||
|                                  DEXEC_DATE     => RFCJOBSSP.EXEC_DATE,
 | ||
|                                  DREL_DATE      => RFCJOBSSP.REL_DATE,
 | ||
|                                  NRN            => NNEW_FCJOBSSP);
 | ||
|           /* Переносим дополнительные ресурсы */
 | ||
|           for AR in (select T.* from FCJOBSSPAR T where T.PRN = RFCJOBSSP.RN)
 | ||
|           loop
 | ||
|             /* Добавляем дополнительный ресурс */
 | ||
|             P_FCJOBSSPAR_BASE_INSERT(NCOMPANY      => AR.COMPANY,
 | ||
|                                      NPRN          => NNEW_FCJOBSSP,
 | ||
|                                      NROUTSHTSPAR  => AR.ROUTSHTSPAR,
 | ||
|                                      NEQUIPMENT    => AR.EQUIPMENT,
 | ||
|                                      NMANPOWER     => AR.MANPOWER,
 | ||
|                                      NCATEGORY     => AR.CATEGORY,
 | ||
|                                      NNORM         => AR.NORM,
 | ||
|                                      NNORM_TYPE    => AR.NORM_TYPE,
 | ||
|                                      NSIGN_P_R     => AR.SIGN_P_R,
 | ||
|                                      NLABOUR_PLAN  => AR.LABOUR_PLAN,
 | ||
|                                      NLABOUR_FACT  => AR.LABOUR_FACT,
 | ||
|                                      NCOST_PLAN    => AR.COST_PLAN,
 | ||
|                                      NCOST_FACT    => AR.COST_FACT,
 | ||
|                                      NCOST_FOR     => AR.COST_FOR,
 | ||
|                                      NCURNAMES     => AR.CURNAMES,
 | ||
|                                      NPERFORM_PLAN => AR.PERFORM_PLAN,
 | ||
|                                      NPERFORM_FACT => null,
 | ||
|                                      NMUNIT        => AR.MUNIT,
 | ||
|                                      NPROCTYPE     => AR.PROCTYPE,
 | ||
|                                      NRN           => NNEW_FCJOBSSPAR);
 | ||
|           end loop;
 | ||
|           /* Связанные маршрутный лист и строка маршрутного листа */
 | ||
|           NROUTLST   := F_DOCLINKS_LINK_IN_DOC(SOUT_UNITCODE => 'CostJobsSpecs',
 | ||
|                                                NOUT_DOCUMENT => RFCJOBSSP.RN,
 | ||
|                                                SIN_UNITCODE  => 'CostRouteLists');
 | ||
|           NROUTLSTSP := F_DOCLINKS_LINK_IN_DOC(SOUT_UNITCODE => 'CostJobsSpecs',
 | ||
|                                                NOUT_DOCUMENT => RFCJOBSSP.RN,
 | ||
|                                                SIN_UNITCODE  => 'CostRouteListsSpecs');
 | ||
|           /* Связывание с новой строкой сменного задания */
 | ||
|           if (NROUTLST is not null) and (NROUTLSTSP is not null) then
 | ||
|             /* Создаем связь с заголовоком МЛ */
 | ||
|             P_LINKSALL_LINK_DIRECT(NCOMPANY          => NCOMPANY,
 | ||
|                                    SIN_UNITCODE      => 'CostRouteLists',
 | ||
|                                    NIN_DOCUMENT      => NROUTLST,
 | ||
|                                    NIN_PRN_DOCUMENT  => null,
 | ||
|                                    DIN_IN_DATE       => sysdate,
 | ||
|                                    NIN_STATUS        => 0,
 | ||
|                                    SOUT_UNITCODE     => 'CostJobsSpecs',
 | ||
|                                    NOUT_DOCUMENT     => NNEW_FCJOBSSP,
 | ||
|                                    NOUT_PRN_DOCUMENT => RFCJOBSSP.PRN,
 | ||
|                                    DOUT_IN_DATE      => sysdate,
 | ||
|                                    NOUT_STATUS       => 0);
 | ||
|             /* Создаем связь со спецификацией МЛ */
 | ||
|             P_LINKSALL_LINK_DIRECT(NCOMPANY          => NCOMPANY,
 | ||
|                                    SIN_UNITCODE      => 'CostRouteListsSpecs',
 | ||
|                                    NIN_DOCUMENT      => NROUTLSTSP,
 | ||
|                                    NIN_PRN_DOCUMENT  => NROUTLST,
 | ||
|                                    DIN_IN_DATE       => sysdate,
 | ||
|                                    NIN_STATUS        => 0,
 | ||
|                                    SOUT_UNITCODE     => 'CostJobsSpecs',
 | ||
|                                    NOUT_DOCUMENT     => NNEW_FCJOBSSP,
 | ||
|                                    NOUT_PRN_DOCUMENT => RFCJOBSSP.PRN,
 | ||
|                                    DOUT_IN_DATE      => sysdate,
 | ||
|                                    NOUT_STATUS       => 0);
 | ||
|           end if;
 | ||
|         end if;
 | ||
|       else
 | ||
|         /* Отбираем строку дополнительного ресурса */
 | ||
|         for AR in (select TMP.*
 | ||
|                      from (select ROWNUM as RNUM,
 | ||
|                                   R.*
 | ||
|                              from (select T.* from FCJOBSSPAR T where T.PRN = RFCJOBSSP.RN order by T.RN asc) R) TMP
 | ||
|                     where TMP.RNUM = I - 1)
 | ||
|         loop
 | ||
|           /* Обновляем её */
 | ||
|           P_FCJOBSSPAR_BASE_UPDATE(NRN           => AR.RN,
 | ||
|                                    NCOMPANY      => AR.COMPANY,
 | ||
|                                    NROUTSHTSPAR  => AR.ROUTSHTSPAR,
 | ||
|                                    NEQUIPMENT    => AR.EQUIPMENT,
 | ||
|                                    NMANPOWER     => AR.MANPOWER,
 | ||
|                                    NCATEGORY     => AR.CATEGORY,
 | ||
|                                    NNORM         => AR.NORM,
 | ||
|                                    NNORM_TYPE    => AR.NORM_TYPE,
 | ||
|                                    NSIGN_P_R     => AR.SIGN_P_R,
 | ||
|                                    NLABOUR_PLAN  => AR.LABOUR_PLAN,
 | ||
|                                    NLABOUR_FACT  => AR.LABOUR_FACT,
 | ||
|                                    NCOST_PLAN    => AR.COST_PLAN,
 | ||
|                                    NCOST_FACT    => AR.COST_FACT,
 | ||
|                                    NCOST_FOR     => AR.COST_FOR,
 | ||
|                                    NCURNAMES     => AR.CURNAMES,
 | ||
|                                    NPERFORM_PLAN => AR.PERFORM_PLAN,
 | ||
|                                    NPERFORM_FACT => NCLNPSPFM,
 | ||
|                                    NMUNIT        => AR.MUNIT,
 | ||
|                                    NPROCTYPE     => AR.PROCTYPE);
 | ||
|         end loop;
 | ||
|       end if;
 | ||
|     end loop;
 | ||
|   end FCJOBSSP_MP_INC_PERFORM;
 | ||
|   
 | ||
|   /* Получение спецификации сменного задания */
 | ||
|   procedure FCJOBSSP_MP_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NVERSION                PKG_STD.TREF;                          -- Версия контрагентов
 | ||
|     SWORKERS_LIST           PKG_STD.TSTRING;                       -- Список исполнителей строки сменного задания
 | ||
|     NFCJOBSSP               PKG_STD.TREF;                          -- Рег. номер строки сменного задания
 | ||
|     
 | ||
|     /* Функция формирования списка всех исполнителей строки сменного задания */
 | ||
|     function FCJOBSSP_WORKERS_LIST_GET
 | ||
|     (
 | ||
|       NFCJOBSSP             in number        -- Рег. номер строки сменного задания
 | ||
|     ) return                varchar2         -- Список исполнителей
 | ||
|     is
 | ||
|       SWORKERS_LIST         PKG_STD.TSTRING; -- Список исполнителей
 | ||
|     begin
 | ||
|       /* Обходим исполнителей строки сменного задания */
 | ||
|       for REC in (select T.PERFORM_FACT
 | ||
|                     from FCJOBSSP T
 | ||
|                    where T.RN = NFCJOBSSP
 | ||
|                   union
 | ||
|                   select S.PERFORM_FACT
 | ||
|                     from FCJOBSSPAR S
 | ||
|                    where S.PRN = NFCJOBSSP)
 | ||
|       loop
 | ||
|         SWORKERS_LIST := SWORKERS_LIST || REC.PERFORM_FACT || ',';
 | ||
|       end loop;
 | ||
|       /* Если есть исполнители */
 | ||
|       SWORKERS_LIST := RTRIM(SWORKERS_LIST, ',');
 | ||
|       /* Возвращаем список исполнителей */
 | ||
|       return SWORKERS_LIST;
 | ||
|     end FCJOBSSP_WORKERS_LIST_GET;
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS);
 | ||
|     /* Считываем версию контрагентов */
 | ||
|     FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|     /* Преобразуем номер и размер страницы в номер строк с и по */
 | ||
|     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.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 3);
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSELECT',
 | ||
|                                         SCAPTION   => 'Выбран',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         NWIDTH     => 75);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SFCROUTLST',
 | ||
|                                         SCAPTION   => 'МЛ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true,
 | ||
|                                         NWIDTH     => 120);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SMATRES',
 | ||
|                                         SCAPTION   => 'ДСЕ',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true,
 | ||
|                                         NWIDTH     => 120);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SOPER',
 | ||
|                                         SCAPTION   => 'Операция',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SMANPOWER',
 | ||
|                                         SCAPTION   => 'Профессия',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NQUANT_PLAN',
 | ||
|                                         SCAPTION   => 'Количество',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRESOURCE_NUMB',
 | ||
|                                         SCAPTION   => 'Численность',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NLABOUR_PLAN',
 | ||
|                                         SCAPTION   => 'Трудоемкость',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SFIO',
 | ||
|                                         SCAPTION   => 'ФИО',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NPERFORM_FACT',
 | ||
|                                         SCAPTION   => 'Рег. номер исполнителя факт',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'DBEG_FACT',
 | ||
|                                         SCAPTION   => 'Дата начала факт',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SWORKERS_LIST',
 | ||
|                                         SCAPTION   => 'Список исполнителей',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     /* Обходим данные */
 | ||
|     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 => '                       (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(L I_DOCLINKS_OUT_DOCUMENT)'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               TRIM(D.DOCNUMB) || '' '' || to_char(D.DOCDATE, ''dd.mm.yyyy'')');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from DOCLINKS  L,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               FCROUTLST D');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where L.OUT_DOCUMENT = T.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobsSpecs'));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and L.IN_DOCUMENT = D.RN');
 | ||
|       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 => '                           ' || PKG_SQL_BUILD.ROWLIMIT(NLIMIT => 1, BAND => true) || ') SFCROUTLST,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       MR.CODE || '' '' || MR."NAME" SMATRES,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       TRIM(T.OPER_NUMB) || '' '' || ( select coalesce(O."NAME", T.OPER_UK) from FCOPERTYPES O where T.OPER_TPS = O.RN ) SOPER,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select MP.CODE from FCMANPOWER MP where T.MANPOWER = MP.RN) SMANPOWER,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.QUANT_PLAN NQUANT_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       COALESCE((select COUNT(SP.RN)');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                   from FCJOBSSPAR SP');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  where SP.PRN = T.RN), 0) + 1 NRESOURCE_NUMB,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.LABOUR_PLAN NLABOUR_PLAN,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select AG.AGNFAMILYNAME');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                          from CLNPSPFM   C,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               CLNPERSONS P,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                               AGNLIST    AG');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                         where C.RN = T.PERFORM_FACT');   
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and C.PERSRN = P.RN');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                           and P.PERS_AGENT = AG.RN) SFIO,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.PERFORM_FACT NPERFORM_FACT,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       T.BEG_FACT DBEG_FACT');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from FCJOBSSP T,');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       FCMATRESOURCE MR');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where T.PRN = :NFCJOBS');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.COMPANY = :NCOMPANY');
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.SIGN_CONTRL = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
 | ||
|       PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and MR.RN = T.MATRES');
 | ||
|       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');
 | ||
|       /* Если сортировки не указаны */
 | ||
|       if (CORDERS is not null) then
 | ||
|         /* Учтём сортировки */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG,
 | ||
|                                                  RORDERS    => RO,
 | ||
|                                                  SPATTERN   => '%ORDER_BY%',
 | ||
|                                                  CSQL       => CSQL);
 | ||
|       else
 | ||
|         /* Устанавливаем стандартную сортировку */
 | ||
|         CSQL := replace(CSQL, '%ORDER_BY%', 'order by T.PRIOR_PARTY asc, T.BEG_PLAN asc');
 | ||
|       end if;
 | ||
|       /* Разбираем его */
 | ||
|       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 => 'NFCJOBS', NVALUE => NFCJOBS);
 | ||
|       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.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_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_STR(ICURSOR => ICURSOR, IPOSITION => 9);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 11);
 | ||
|       PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 12);
 | ||
|       /* Делаем выборку */
 | ||
|       if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
 | ||
|         null;
 | ||
|       end if;
 | ||
|       /* Обходим выбранные записи */
 | ||
|       while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
 | ||
|       loop
 | ||
|         /* Читаем данные из курсора рег. номер исполнения */
 | ||
|         PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCJOBSSP);
 | ||
|         /* Считываем список исполнителей строки сменного задания */
 | ||
|         SWORKERS_LIST := FCJOBSSP_WORKERS_LIST_GET(NFCJOBSSP => NFCJOBSSP);
 | ||
|         /* Добавляем колонки с данными */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCJOBSSP, BCLEAR => true);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SFCROUTLST',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 2);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMATRES',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 3);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SOPER', ICURSOR => ICURSOR, NPOSITION => 4);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'SMANPOWER',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 5);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NQUANT_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 6);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NRESOURCE_NUMB',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 7);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NLABOUR_PLAN',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 8);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SFIO', ICURSOR => ICURSOR, NPOSITION => 9);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'NPERFORM_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 10);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW      => RDG_ROW,
 | ||
|                                                  SNAME     => 'DBEG_FACT',
 | ||
|                                                  ICURSOR   => ICURSOR,
 | ||
|                                                  NPOSITION => 11);
 | ||
|         PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SWORKERS_LIST', SVALUE => SWORKERS_LIST);
 | ||
|         /* Добавляем строку в таблицу */
 | ||
|         PKG_P8PANELS_VISUAL.TDG_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.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end FCJOBSSP_MP_DG_GET;
 | ||
|   
 | ||
|   /* Получение рабочих подразделения */
 | ||
|   procedure WORKERS_MP_DG_GET
 | ||
|   (
 | ||
|     NFCJOBS                 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.TDG_ORDERS;        -- Сортировки
 | ||
|     RDG                     PKG_P8PANELS_VISUAL.TDG;               -- Описание таблицы
 | ||
|     RDG_ROW                 PKG_P8PANELS_VISUAL.TDG_ROW;           -- Строка таблицы
 | ||
|     NROW_FROM               PKG_STD.TREF;                          -- Номер строки с
 | ||
|     NROW_TO                 PKG_STD.TREF;                          -- Номер строки по
 | ||
|     CSQL                    clob;                                  -- Буфер для запроса
 | ||
|     ICURSOR                 integer;                               -- Курсор для исполнения запроса
 | ||
|     NSUBDIV                 PKG_STD.TNUMBER;                       -- Рег. номер подразделения пользователя
 | ||
|     DDOC_DATE               PKG_STD.TLDATE;                        -- Дата сменного задания
 | ||
|     NSUM_LABOUR             PKG_STD.TLNUMBER;                      -- Сумма трудоемкости
 | ||
|     NSUM_WORK_TIME          PKG_STD.TLNUMBER;                      -- Сумма рабочего времени
 | ||
|     NLOADING                PKG_STD.TLNUMBER;                      -- Загрузка оборудования
 | ||
|     NDICMUNTS_MIN           PKG_STD.TREF;                          -- Рег. номер ед. изм. минут
 | ||
|     NDICMUNTS_WD            PKG_STD.TREF;                          -- Рег. номер ед. изм. нормочасов
 | ||
|     NCLNPSPFM               PKG_STD.TREF;                          -- Рег. номер исполнения должности
 | ||
|     
 | ||
|     /* Считывание параметров сменного задания */
 | ||
|     procedure FCJOBS_PARAMS_GET
 | ||
|     (
 | ||
|       NFCJOBS                 in number,  -- Рег. номер сменного задания
 | ||
|       NSUBDIV                 out number, -- Рег. номер подразделения
 | ||
|       DDOC_DATE               out date    -- Дата сменного задания
 | ||
|     )
 | ||
|     is
 | ||
|     begin
 | ||
|       /* Считываем параметры сменного задания */
 | ||
|       begin
 | ||
|         select T.SUBDIV,
 | ||
|                T.DOCDATE
 | ||
|           into NSUBDIV,
 | ||
|                DDOC_DATE
 | ||
|           from FCJOBS T
 | ||
|          where T.RN = NFCJOBS;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           P_EXCEPTION(0, 'Ошибка считывания сменного задания.');
 | ||
|       end;
 | ||
|     end FCJOBS_PARAMS_GET;
 | ||
|   begin
 | ||
|     /* Читем сортировки */
 | ||
|     RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_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.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 4);
 | ||
|     /* Описываем колонки таблицы данных */
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NRN',
 | ||
|                                         SCAPTION   => 'Рег. номер',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSELECT',
 | ||
|                                         SCAPTION   => 'Выбран',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SFIO',
 | ||
|                                         SCAPTION   => 'ФИО',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'SPROFESSION',
 | ||
|                                         SCAPTION   => 'Профессия',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NSUM_LABOUR',
 | ||
|                                         SCAPTION   => 'Загрузка в н/ч',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NLOADING',
 | ||
|                                         SCAPTION   => 'Загрузка в %',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BORDER     => true);
 | ||
|     PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
 | ||
|                                         SNAME      => 'NEQUIPMENT',
 | ||
|                                         SCAPTION   => 'Рег. номер оборудования',
 | ||
|                                         SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
 | ||
|                                         BVISIBLE   => false);
 | ||
|     /* Считываем единицу измерения минут */
 | ||
|     FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                        NFLAG_OPTION => 0,
 | ||
|                        NCOMPANY     => NCOMPANY,
 | ||
|                        SMEAS_MNEMO  => SDICMUNTS_MIN,
 | ||
|                        NRN          => NDICMUNTS_MIN);
 | ||
|     /* Считываем единицу измерения минут */
 | ||
|     FIND_DICMUNTS_CODE(NFLAG_SMART  => 0,
 | ||
|                        NFLAG_OPTION => 0,
 | ||
|                        NCOMPANY     => NCOMPANY,
 | ||
|                        SMEAS_MNEMO  => SDICMUNTS_WD,
 | ||
|                        NRN          => NDICMUNTS_WD);
 | ||
|     /* Считываем параметры сменного задания */
 | ||
|     FCJOBS_PARAMS_GET(NFCJOBS => NFCJOBS, NSUBDIV => NSUBDIV, DDOC_DATE => DDOC_DATE);
 | ||
|     /* Если подразделение считано */
 | ||
|     if (NSUBDIV is not null) then
 | ||
|       /* Обходим данные */
 | ||
|       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 C.RN NRN,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       (select AG.AGNFAMILYNAME||'' ''||AG.AGNFIRSTNAME||'' ''||AG.AGNLASTNAME from AGNLIST AG where AG.RN = PR.PERS_AGENT) SFIO,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       D.PSDEP_CODE SPROFESSION');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                  from SUBDIVSMP     T,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       CLNPSDEP      D,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       CLNPSPFM      C,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       CLNPSPFMTYPES CT,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                       CLNPERSONS    PR');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                 where T.PRN = :NSUBDIV');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and T.CLNPSDEP is not null');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and exists (select null');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 from SUBDIVSMPFC F,');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                      ENPERIOD    E');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                where F.PRN = T.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and E.RN = F.PERIOD');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and E.STARTDATE <= :DDOC_DATE');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                  and E.ENDDATE >= :DDOC_DATE');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                                 ' || PKG_SQL_BUILD.ROWLIMIT(NLIMIT => 1, BAND => true) || ')');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and D.RN = T.CLNPSDEP');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and C.PSDEPRN = D.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and C.BEGENG <= :DDOC_DATE');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and (C.ENDENG >= :DDOC_DATE or C.ENDENG is null)');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and C.CLNPSPFMTYPES = CT.RN');
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and CT.IS_PRIMARY = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
 | ||
|         PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => '                   and C.PERSRN = PR.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.TDG_ORDERS_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 => 'NSUBDIV', NVALUE => NSUBDIV);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDOC_DATE', DVALUE => DDOC_DATE);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
 | ||
|         PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
 | ||
|         /* Описываем структуру записи курсора */
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
 | ||
|         PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
 | ||
|         /* Делаем выборку */
 | ||
|         if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
 | ||
|           null;
 | ||
|         end if;
 | ||
|         /* Обходим выбранные записи */
 | ||
|         while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
 | ||
|         loop
 | ||
|           /* Читаем данные из курсора рег. номер исполнения */
 | ||
|           PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NCLNPSPFM);
 | ||
|           /* Обнуляем сумму рабочего времени и трудоемкости */
 | ||
|           NSUM_LABOUR    := 0;
 | ||
|           NSUM_WORK_TIME := 0;
 | ||
|           /* Цикл по различным сменам данного оборудования */
 | ||
|           for REC in (select TMP.TBOPERMODESP,
 | ||
|                              sum(TMP.NLABOUR) NLABOUR
 | ||
|                         from (select COALESCE(T.TBOPERMODESP, J.TBOPERMODESP) TBOPERMODESP,
 | ||
|                                      F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_PLAN, NDICMUNTS_MIN) NLABOUR
 | ||
|                                 from FCJOBS   J,
 | ||
|                                      FCJOBSSP T
 | ||
|                                where J.RN = NFCJOBS
 | ||
|                                  and T.PRN = J.RN
 | ||
|                                  and T.PERFORM_FACT = NCLNPSPFM
 | ||
|                               union all
 | ||
|                               select COALESCE(TS.TBOPERMODESP, JS.TBOPERMODESP),
 | ||
|                                      F_DICMUNTS_BASE_RECALC_QUANT(0, RS.COMPANY, RS.MUNIT, RS.LABOUR_PLAN, NDICMUNTS_MIN)
 | ||
|                                 from FCJOBS     JS,
 | ||
|                                      FCJOBSSP   TS,
 | ||
|                                      FCJOBSSPAR RS
 | ||
|                                where JS.RN = NFCJOBS
 | ||
|                                  and TS.PRN = JS.RN
 | ||
|                                  and RS.PRN = TS.RN
 | ||
|                                  and RS.PERFORM_FACT = NCLNPSPFM) TMP
 | ||
|                        group by TMP.TBOPERMODESP)
 | ||
|           loop
 | ||
|             /* Рассчитываем суммы */
 | ||
|             NSUM_LABOUR    := NSUM_LABOUR + REC.NLABOUR;
 | ||
|             NSUM_WORK_TIME := NSUM_WORK_TIME + UTL_WORK_TIME_GET(NTBOPERMODESP => REC.TBOPERMODESP);
 | ||
|           end loop;
 | ||
|           /* Если оборудование не участвует в сменном задании */
 | ||
|           if (NSUM_WORK_TIME = 0) then
 | ||
|             NLOADING := 0;
 | ||
|           else
 | ||
|             NLOADING := ROUND(NSUM_LABOUR / NSUM_WORK_TIME * 100, 0);
 | ||
|             /* Если трудоемкость не равна 0 */
 | ||
|             if (NSUM_LABOUR <> 0) then
 | ||
|               /* Переводим суммарную трудоемкость в нормочасы */
 | ||
|               NSUM_LABOUR := ROUND(F_DICMUNTS_BASE_RECALC_QUANT(0, NCOMPANY, NDICMUNTS_MIN, NSUM_LABOUR, NDICMUNTS_WD),
 | ||
|                                    2);
 | ||
|             end if;
 | ||
|           end if;
 | ||
|           /* Добавляем колонки с данными */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NCLNPSPFM, BCLEAR => true);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_LABOUR', NVALUE => NSUM_LABOUR);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SFIO',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 2);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLOADING', NVALUE => NLOADING);
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW      => RDG_ROW,
 | ||
|                                                    SNAME     => 'SPROFESSION',
 | ||
|                                                    ICURSOR   => ICURSOR,
 | ||
|                                                    NPOSITION => 3);
 | ||
|           /* Добавляем строку в таблицу */
 | ||
|           PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
 | ||
|         end loop;
 | ||
|       exception
 | ||
|         when others then
 | ||
|           PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
 | ||
|           raise;
 | ||
|       end;
 | ||
|     end if;
 | ||
|     /* Сериализуем описание */
 | ||
|     COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
 | ||
|   end WORKERS_MP_DG_GET;
 | ||
|   
 | ||
|   /* Инициализация записей раздела "Планы и отчеты производства изделий" */
 | ||
|   procedure FCJOBS_MP_INIT
 | ||
|   (
 | ||
|     NFCJOBS                 in number,                             -- Рег. номер записи сменного задания
 | ||
|     COUT                    out clob                               -- Информация о записи сменного задания
 | ||
|   )
 | ||
|   is
 | ||
|     NCOMPANY                PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
 | ||
|     NVERSION                PKG_STD.TREF;                          -- Версия контрагентов
 | ||
|     SDOC_INFO               PKG_STD.TSTRING;                       -- Информация о документе
 | ||
|     
 | ||
|     /* Проверка доступности действия над выбранным сменным заданием */
 | ||
|     procedure ACTION_AVAILABLE
 | ||
|     (
 | ||
|       NFCJOBS               in number        -- Рег. номер записи сменного задания
 | ||
|     )
 | ||
|     is
 | ||
|       NAVAILABLE            PKG_STD.TNUMBER; -- Признак доступности действия (0 - нет, 1 - да)
 | ||
|     begin
 | ||
|       /* Если "Состояние" <> "Не отработано" и дата документа < текущей даты - действие недоступно */
 | ||
|       begin
 | ||
|         select 0
 | ||
|           into NAVAILABLE
 | ||
|           from FCJOBS T
 | ||
|          where T.RN = NFCJOBS
 | ||
|            and ((T.STATE <> 0) or (T.DOCDATE < TRUNC(sysdate)));
 | ||
|       exception
 | ||
|         when others then
 | ||
|           /* Действие доступно */
 | ||
|           NAVAILABLE := 1;
 | ||
|       end;
 | ||
|       /* Если действие недоступно - выводим ошибку */
 | ||
|       if (NAVAILABLE = 0) then
 | ||
|         P_EXCEPTION(0,
 | ||
|                     'Действие "Выдача сменного задания на участок" недоступно для сменного задания с состоянием отличным от "Не отработано" или датой документа ранее текущей даты.');
 | ||
|       end if;
 | ||
|     end ACTION_AVAILABLE;
 | ||
|   begin
 | ||
|     /* Проверяем доступность действия */
 | ||
|     ACTION_AVAILABLE(NFCJOBS => NFCJOBS);
 | ||
|     /* Считываем версию контрагентов */
 | ||
|     FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
 | ||
|     /* Начинаем формирование XML */
 | ||
|     PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
 | ||
|     /* Открываем корень */
 | ||
|     PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
 | ||
|     /* Цикл по планам и отчетам производства изделий */
 | ||
|     for REC in (select T.RN NRN,
 | ||
|                        trim(T.DOCNUMB) SDOC_NUMB,
 | ||
|                        DT.DOCCODE || ', ' || trim(T.DOCPREF) || '-' || trim(T.DOCNUMB) || ', ' ||
 | ||
|                        TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
 | ||
|                        INS.NAME SSUBDIV,
 | ||
|                        case
 | ||
|                          when PER.RN is not null then
 | ||
|                           TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') || ' ' || TN2S(PER.BEG_TIME) || ' - ' || TN2S(PER.END_TIME)
 | ||
|                          else
 | ||
|                           TO_CHAR(T.DOCDATE, 'dd.mm.yyyy')
 | ||
|                        end SPERIOD,
 | ||
|                        (select trim(T2.NUMB) from TBOPERMODESP T2 where T.TBOPERMODESP = T2.RN) STBOPERMODESP,
 | ||
|                        (select 1
 | ||
|                           from FCJOBSSP S
 | ||
|                          where S.PRN = T.RN
 | ||
|                            and S.NOTE is not null
 | ||
|                            and ROWNUM = 1) NHAVE_NOTE
 | ||
|                   from FCJOBS         T,
 | ||
|                        DOCTYPES       DT,
 | ||
|                        INS_DEPARTMENT INS,
 | ||
|                        TBOPERMODESP   PER
 | ||
|                  where T.RN = NFCJOBS
 | ||
|                    and DT.RN = T.DOCTYPE
 | ||
|                    and T.SUBDIV = INS.RN(+)
 | ||
|                    and T.TBOPERMODESP = PER.RN(+)
 | ||
|                  order by SDOC_INFO)
 | ||
|     loop
 | ||
|       /* Если указана смена */
 | ||
|       if (REC.STBOPERMODESP is not null) then
 | ||
|         /* Указываем информацию документа со сменой */
 | ||
|         SDOC_INFO := REC.SDOC_INFO || ', смена ' || REC.STBOPERMODESP;
 | ||
|       else
 | ||
|         /* Указываем информацию документа без смены */
 | ||
|         SDOC_INFO := REC.SDOC_INFO;
 | ||
|       end if;
 | ||
|       /* Открываем план */
 | ||
|       PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
 | ||
|       /* Описываем план */
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => SDOC_INFO);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SDOC_NUMB', SVALUE => REC.SDOC_NUMB);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD);
 | ||
|       PKG_XFAST.ATTR(SNAME => 'NHAVE_NOTE', NVALUE => COALESCE(REC.NHAVE_NOTE, 0));
 | ||
|       /* Закрываем план */
 | ||
|       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 FCJOBS_MP_INIT;
 | ||
| 
 | ||
| end PKG_P8PANELS_MECHREC;
 | ||
| /
 |