P8-Panels/db/PKG_P8PANELS_MECHREC.pck

7821 lines
519 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, -- Рег. номер каталога
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;
/* Считывания рег. номера подразделения пользователя */
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, -- Рег. номер каталога
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; -- Уровень для фильтра
/* Объединение значений в строковое представление */
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, -- Рег. номер каталога планов
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 ((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);
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,
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 ((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);
end FCPRODPLANSP_GET;
/* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Производственная программа" */
procedure FCPRODPLAN_PP_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 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 = GET_SESSION_COMPANY()
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 = GET_SESSION_COMPANY()
and (UL.SHOW_INACCESS_CTLG = 1 or exists
(select null from V_USERPRIV UP where UP.CATALOG = T.RN) or exists
(select null
from ACATALOG T1
where exists (select null from V_USERPRIV UP where UP.CATALOG = T1.RN)
connect by prior T1.RN = T1.CRN
start with T1.CRN = T.RN))
order by T.NAME asc)
loop
/* Открываем план */
PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLAN_CRNS');
/* Описываем план */
PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => REC.SNAME);
PKG_XFAST.ATTR(SNAME => 'NCOUNT_DOCS', NVALUE => REC.NCOUNT_DOCS);
/* Закрываем план */
PKG_XFAST.UP();
end loop;
/* Закрываем корень */
PKG_XFAST.UP();
/* Сериализуем */
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
exception
when others then
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end 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;
/