diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck
index 78d250c..c9d2594 100644
--- a/db/PKG_P8PANELS_MECHREC.pck
+++ b/db/PKG_P8PANELS_MECHREC.pck
@@ -1,4 +1,20 @@
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 -- Имя пользователя
+ ) return number; -- Подразделение подходит (0 - нет, 1 - да)
/* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
procedure INCOMEFROMDEPS_DG_GET
@@ -26,12 +42,12 @@ create or replace package PKG_P8PANELS_MECHREC as
/* Получение товарных запасов на основании маршрутного листа */
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 -- Сериализованная таблица данных
+ 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 -- Сериализованная таблица данных
);
/* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
@@ -61,6 +77,157 @@ create or replace package PKG_P8PANELS_MECHREC as
(
COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий"
);
+
+ /* Изменение приоритета партии маршрутного листа */
+ procedure FCROUTLST_PRIOR_PARTY_UPDATE
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SPRIOR_PARTY in varchar -- Новое значение приоритета партии
+ );
+
+ /* Изменение заказа маршрутного листа */
+ procedure FCROUTLST_FACEACC_UPDATE
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SFACEACC_NUMB in varchar, -- Номер заказа
+ NFCPRODPLANSP in number -- Рег. номер строки плана
+ );
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана */
+ 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 FCROUTLSTORD_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 SELECTLIST_FCROUTLST_ADD
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ );
+
+ /* Удаление записи маршрутного листа из селектлиста */
+ procedure SELECTLIST_FCROUTLST_DEL
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ );
+
+ /* Выдать задание операции сменного задания */
+ procedure FCJOBSSP_ISSUE
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ );
+
+ /* Исключение оборудования из операции сменного задания */
+ procedure FCJOBSSP_EXC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ );
+
+ /* Включение оборудование в строку сменного задания */
+ procedure FCJOBSSP_INC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ );
+
+ /* Получение таблицы оборудования подразделения */
+ procedure FCEQUIPMENT_DG_GET
+ (
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы маршрутных листов спецификации сменного задания */
+ procedure FCJOBSSP_FCROUTLST_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 FCJOBSSP_DG_GET
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ NIDENT 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
+ (
+ COUT out clob -- Список записей раздела "Сменные задания"
+ );
+
+ /* Получение загрузки цеха */
+ procedure FCJOBS_DEP_LOAD_DG_GET
+ (
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
/* Получение таблицы маршрутных листов, связанных с производственным составом */
procedure FCROUTLST_MON_DG_GET
@@ -141,15 +308,20 @@ create or replace package body PKG_P8PANELS_MECHREC as
NTASK_TYPE_RL constant PKG_STD.TNUMBER := 4; -- Маршрутные листы
NTASK_TYPE_EMPTY constant PKG_STD.TNUMBER := null; -- Нет детализации
+ /* Константы - параметры отборов планов (Производственный план цеха) */
+ 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 := 'План'; -- Тип планов (мнемокод состояния)
+ 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_HOUR constant PKG_STD.TSTRING := 'час'; -- Мнемокод ед. измерения часов
-
+ SDICMUNTS_WD constant PKG_STD.TSTRING := 'Ч/Ч'; -- Мнемокод ед. измерения нормочасов
+ SDICMUNTS_HOUR constant PKG_STD.TSTRING := 'Час'; -- Мнемокод ед. измерения часов
+
+ /* Константы - параметры отборов сменных заданий */
+ NFCJOBS_STATUS_WO constant PKG_STD.TNUMBER := 1; -- Статус сменного задания "Отработан"
/* Константы - дополнительные атрибуты */
STASK_ATTR_START_FACT constant PKG_STD.TSTRING := 'start_fact'; -- Запущено
@@ -159,22 +331,58 @@ create or replace package body PKG_P8PANELS_MECHREC as
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'; -- Паттерн для динамической колонки граф ("день_месяц_год")
+
+ /* Экземпляр дня загрузки цеха */
+ 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 -- Идентификатор отмеченных записей
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NIDENT out number -- Идентификатор отмеченных записей
)
is
/* Рекурсивная процедура формирования списка маршрутных листов */
procedure PUT_FCROUTLST
(
- NIDENT in number, -- Идентификатор отмеченных записей
- NFCROUTLST in number -- Рег. номер маршрутного листа
+ NIDENT in number, -- Идентификатор отмеченных записей
+ NFCROUTLST in number -- Рег. номер маршрутного листа
)
is
- NTMP PKG_STD.TNUMBER; -- Буфер
+ NTMP PKG_STD.TNUMBER; -- Буфер
begin
/* Добавление в список */
begin
@@ -212,7 +420,251 @@ create or replace package body PKG_P8PANELS_MECHREC as
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_CODE_GET
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SUSER in varchar2 -- Имя пользователя
+ ) return varchar2 -- Мнемокод подразделения пользователя
+ is
+ SRESULT PKG_STD.TSTRING; -- Мнемокод подразделения пользователя
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ begin
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Считываем мнемокод подразделения пользователя */
+ begin
+ select I.CODE
+ into SRESULT
+ from CLNPSPFM C,
+ CLNPSPFMTYPES CT,
+ INS_DEPARTMENT I
+ 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 I.RN = C.DEPTRN
+ and ROWNUM = 1;
+ exception
+ when others then
+ SRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return SRESULT;
+ end UTL_SUBDIV_CODE_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 -- Имя пользователя
+ ) 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 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;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_SUBDIV_HIER_CHECK;
+
+ /* Проверка наличия оборудования */
+ procedure UTL_FCEQUIPMENT_EXISTS
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NCOMPANY in number -- Рег. номер организации
+ )
+ is
+ NEXISTS PKG_STD.TNUMBER; -- Буфер
+ begin
+ /* Проверяем наличие оборудования */
+ begin
+ select T.RN
+ into NEXISTS
+ from FCEQUIPMENT T
+ where T.RN = NFCEQUIPMENT
+ and T.COMPANY = NCOMPANY;
+ exception
+ when others then
+ P_EXCEPTION(0, 'Оборудование не найдено.');
+ end;
+ end UTL_FCEQUIPMENT_EXISTS;
+
+ /* Поиск записи в селектлисте */
+ function UTL_SELECTLIST_RN_GET
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SUNITCODE in varchar2, -- Мнемокод раздела
+ SACTIONCODE in varchar2 -- Действие раздела
+ ) return number -- Рег. номер записи в селектлисте
+ is
+ NRESULT PKG_STD.TNUMBER; -- Рег. номер записи в селектлисте
+ begin
+ /* Считываем запись селеклиста */
+ begin
+ select T.RN
+ into NRESULT
+ from SELECTLIST T
+ where T.IDENT = NIDENT
+ and T.UNITCODE = SUNITCODE
+ and T.DOCUMENT = NFCROUTLST
+ and T.ACTIONCODE = SACTIONCODE;
+ exception
+ when others then
+ NRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_SELECTLIST_RN_GET;
+
+ /* Считывание рег. номера основной спецификации плана из "Производственная программа" */
+ 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 = 1
+ and P.COMPANY = NCOMPANY
+ and ROWNUM = 1;
+ exception
+ when others then
+ NRESULT := null;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end UTL_FCPRODPLANSP_MAIN_GET;
+
/* Проверка наличия связанных маршрутных листов */
function LINK_FCROUTLST_CHECK
(
@@ -245,7 +697,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Возвращаем результат */
return NRESULT;
end LINK_FCROUTLST_CHECK;
-
+
/* Проверка наличия связанных приходов из подразделений */
function LINK_INCOMEFROMDEPS_CHECK
(
@@ -299,6 +751,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
raise;
end LINK_INCOMEFROMDEPS_CHECK;
+
+ /*
+ Процедуры панели "Производственная программа"
+ */
/* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
procedure INCOMEFROMDEPS_DG_GET
@@ -342,7 +798,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
SCAPTION => 'Накладная',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => true);
- /* Если тип = 3, то необходимо включать состояние */
+ /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */
if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SDOC_STATE',
@@ -473,7 +929,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
SNAME => 'SDOC_INFO',
ICURSOR => ICURSOR,
NPOSITION => 2);
- /* Если тип = 3, то необходимо включать состояние */
+ /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */
if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SDOC_STATE',
@@ -1619,11 +2075,11 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Считывание максимального уровня иерархии плана по каталогу */
function PRODPLAN_MAX_LEVEL_GET
(
- NCRN in number -- Рег. номер каталога планов
- ) return number -- Максимальный уровень иерархии
+ NCRN in number -- Рег. номер каталога планов
+ ) return number -- Максимальный уровень иерархии
is
- NRESULT PKG_STD.TNUMBER := 1; -- Максимальный уровень иерархии
- NTOTAL PKG_STD.TNUMBER := 0; -- Сумма документов по проверяемому уровню
+ NRESULT PKG_STD.TNUMBER := 1; -- Максимальный уровень иерархии
+ NTOTAL PKG_STD.TNUMBER := 0; -- Сумма документов по проверяемому уровню
begin
/* Цикл по уровням каталога планов */
for REC in (select level,
@@ -1678,11 +2134,11 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Определение дат спецификации плана */
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 -- Итоговая дата выпуска спецификации
+ DREP_DATE in date, -- Дата запуска спецификации
+ DREP_DATE_TO in date, -- Дата выпуска спецификации
+ DINCL_DATE in date, -- Дата включения в план спецификации
+ DDATE_FROM out date, -- Итоговая дата запуска спецификации
+ DDATE_TO out date -- Итоговая дата выпуска спецификации
)
is
begin
@@ -1810,15 +2266,15 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Опеределение класса задачи */
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 -- Класс задачи
+ 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*)
+ NTASK_CLASS PKG_STD.TNUMBER; -- Класс задачи (см. константы NCLASS*)
begin
/* Если одна из дат не указана */
if ((DREP_DATE is null) or (DREP_DATE_TO is null)) then
@@ -1872,13 +2328,13 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Получение типа задачи */
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 -- Ссылки на детализацию
+ 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
@@ -2264,15 +2720,2578 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end ACATALOG_INIT;
+
+ /*
+ Процедуры панели "Производственный план цеха"
+ */
+
+ /* Изменение приоритета партии маршрутного листа */
+ procedure FCROUTLST_PRIOR_PARTY_UPDATE
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SPRIOR_PARTY in varchar -- Новое значение приоритета партии
+ )
+ is
+ RFCROUTLST FCROUTLST%rowtype; -- Запись маршрутного листа
+ begin
+ /* Дорабатывается */
+ P_EXCEPTION(0, 'На стадии разработки.');
+ /* Проверяем нет ли лишних символов */
+ 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_FACEACC_UPDATE
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SFACEACC_NUMB in varchar, -- Номер заказа
+ NFCPRODPLANSP in number -- Рег. номер строки плана
+ )
+ is
+ RFCROUTLST FCROUTLST%rowtype; -- Запись маршрутного листа
+ NFACEACC PKG_STD.TREF; -- Рег. номер лицевого счета
+
+ /* Проверка наличия связей с другими строками плана */
+ function FCROUTLST_CHECK_OTHER_PROD
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NFCPRODPLANSP in number -- Рег. номер строки плана
+ ) 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 D
+ where D.OUT_UNITCODE = 'CostRouteLists'
+ and D.OUT_DOCUMENT = NFCROUTLST
+ and D.IN_UNITCODE = 'CostProductPlansSpecs'
+ and D.IN_DOCUMENT <> NFCPRODPLANSP);
+ exception
+ when others then
+ NRESULT := 0;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end FCROUTLST_CHECK_OTHER_PROD;
+ begin
+ /* Дорабатывается */
+ P_EXCEPTION(0, 'На стадии разработки.');
+ /* Считываем запись маршрутного листа */
+ UTL_FCROUTLST_GET(NFCROUTLST => NFCROUTLST, RFCROUTLST => RFCROUTLST);
+ /* Определяем рег. номер лицевого счета */
+ FIND_FACEACC_NUMB(NFLAG_SMART => 0,
+ NFLAG_OPTION => 1,
+ NCOMPANY => RFCROUTLST.COMPANY,
+ SNUMB => SFACEACC_NUMB,
+ NRN => NFACEACC);
+ /* Если есть связи с другими строками плана */
+ if (FCROUTLST_CHECK_OTHER_PROD(NFCROUTLST => NFCROUTLST, NFCPRODPLANSP => NFCPRODPLANSP) = 1) then
+ null;
+ end if;
+ end FCROUTLST_FACEACC_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.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ 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.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOC_INFO',
+ SCAPTION => 'Документ (тип, №, дата)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT',
+ SCAPTION => 'Количество план',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPROCENT',
+ SCAPTION => 'Готовность партии',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPRIOR_PARTY',
+ SCAPTION => 'Приоритет партии',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPROD_ORDER',
+ SCAPTION => 'Заказ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => false);
+ /*! Пока отключен */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_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 P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 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.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST_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.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true);
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOC_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ /* Проверяем наличие прямой связи между МЛ и спецификацией плана */
+ 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.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NFCROUTLSTORD_QUANT);
+ else
+ /* Берем из заголовка МЛ */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ end if;
+ else
+ /* Указываем 0 */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => 0);
+ end if;
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROCENT', ICURSOR => ICURSOR, NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPRIOR_PARTY',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPROD_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCHANGE_FACEACC', SVALUE => null);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ exception
+ when others then
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end FCROUTLST_DEPT_DG_GET;
+
+ /* Получение таблицы заказов маршрутного листа */
+ procedure FCROUTLSTORD_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.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ SPROD_ORDER PKG_STD.TSTRING; -- Заказ МЛ
+ NQUANT PKG_STD.TLNUMBER; -- Количество МЛ
+ NPRIOR_ORDER PKG_STD.TLNUMBER; -- Приоритет заказа МЛ
+
+ /* Проверка наличия записей спецификации "Заказы" */
+ function FCROUTLSTORD_EXISTS
+ (
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ ) return number -- Наличие записей спецификации заказы (0 - нет, 1 - да)
+ is
+ NRESULT PKG_STD.TNUMBER; -- Наличие записей спецификации заказы (0 - нет, 1 - да)
+ begin
+ /* Проверяем наличие */
+ begin
+ select 1
+ into NRESULT
+ from DUAL
+ where exists (select null
+ from FCROUTLSTORD T
+ where T.PRN = NFCROUTLST
+ and ROWNUM = 1);
+ exception
+ when others then
+ NRESULT := 0;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end FCROUTLSTORD_EXISTS;
+
+ /* Получение значений из заголовка МЛ */
+ procedure FCROUTLST_INFO_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ SPROD_ORDER out varchar2, -- Заказ
+ NQUANT out number, -- Количество
+ NPRIOR_ORDER out number -- Приоритет заказа
+ )
+ is
+ begin
+ /* Считываем информацию из заголовка */
+ begin
+ select (select F.NUMB from FACEACC F where T.FACEACC = F.RN),
+ T.QUANT,
+ T.PRIOR_ORDER
+ into SPROD_ORDER,
+ NQUANT,
+ NPRIOR_ORDER
+ from FCROUTLST T
+ where T.RN = NFCROUTLST;
+ exception
+ when others then
+ SPROD_ORDER := null;
+ NQUANT := null;
+ NPRIOR_ORDER := null;
+ end;
+ end FCROUTLST_INFO_GET;
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPROD_ORDER',
+ SCAPTION => 'Заказ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT',
+ SCAPTION => 'Количество',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPRIOR_ORDER',
+ SCAPTION => 'Приоритет заказа',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Если у маршрутного листа есть записи спецификации "Заказы" - работаем по ним */
+ if (FCROUTLSTORD_EXISTS(NFCROUTLST => NFCROUTLST) = 1) 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 => ' F.NUMB SPROD_ORDER,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT NQUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.PRIOR_ORDER NPRIOR_ORDER,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTORD T');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FACEACC F on T.PROD_ORDER = F.RN');
+ 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.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST', NVALUE => NFCROUTLST);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_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);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPROD_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NQUANT', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPRIOR_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ else
+ /* Считываем значения из заголовка МЛ */
+ FCROUTLST_INFO_GET(NFCROUTLST => NFCROUTLST,
+ SPROD_ORDER => SPROD_ORDER,
+ NQUANT => NQUANT,
+ NPRIOR_ORDER => NPRIOR_ORDER);
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SPROD_ORDER', SVALUE => SPROD_ORDER);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NQUANT);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRIOR_ORDER', NVALUE => NPRIOR_ORDER);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCROUTLSTORD_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.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCPRODPLANSP_MAIN PKG_STD.TREF; -- Рег. номер основного состава из "Производственная программа"
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOC_INFO',
+ SCAPTION => 'Документ (тип, №, дата)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_FACT',
+ SCAPTION => 'Количество сдано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => '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 => ' 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.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP_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_NUM(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(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_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOC_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DDUE_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ exception
+ when others then
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end INCOMEFROMDEPS_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.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ 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.TDATA_GRID, -- Описание таблицы
+ 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.TDATA_GRID_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;
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 6);
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTATUS',
+ SCAPTION => 'Статус',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_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.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRES_CODE',
+ SCAPTION => 'Обозначение',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true,
+ SHINT => 'Содержит ссылку на связанные маршрутные листы.
' ||
+ 'Цвет залики отражает следующие статусы:
' ||
+ 'Зеленый - "Факт" равен "План";
' ||
+ 'Голубой - "План" меньше или равно "Факт" + "Запущено";
' ||
+ 'Желтый - предыдущие условия не выполнены и на текущую дату сумма "Количество план" = 0 или меньше "План", то "Факт" больше или равно "План". ' ||
+ 'Иначе сумма "Количество факт" больше или равно сумме "Количество план";
' ||
+ 'Красный - ни одно из предыдущих условий не выполнено.
',
+ NWIDTH => 120);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_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.TDATA_GRID_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.TDATA_GRID_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.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NFCROUTLST_QUANT',
+ SCAPTION => 'Запущено',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NVALUE_BY_DAYS',
+ SCAPTION => 'План/факт по дням',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ SHINT => 'Значения по спецификации "График сдачи":
' ||
+ 'Черный - значение "Количество план";
' ||
+ 'Синий - значение "Количество факт".
' ||
+ 'Заливка серым определяет текущий день.');
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSUM_PLAN',
+ SCAPTION => 'Сумма "Количество план"',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_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 => ' 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.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.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => '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_NUM(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);
+ /* Делаем выборку */
+ 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.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCPRODPLANSP, BCLEAR => true);
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPROD_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES_CODE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NMAIN_QUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NREL_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NFCROUTLST_QUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ /* Считываем рег. номер связанной спецификации из "Производственная программа" */
+ 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 FCROUTLST FL,
+ DOCLINKS DL,
+ INCOMEFROMDEPS D,
+ INCOMEFROMDEPSSPEC S
+ where FL.RN in (select SL.DOCUMENT
+ from SELECTLIST SL
+ where SL.IDENT = NFCROUTLST_IDENT
+ and SL.UNITCODE = 'CostRouteLists')
+ and FL.STATE = 1
+ and DL.IN_DOCUMENT = FL.RN
+ and DL.IN_UNITCODE = 'CostRouteLists'
+ and DL.OUT_UNITCODE = 'IncomFromDeps'
+ and D.RN = DL.OUT_DOCUMENT
+ and D.DOC_STATE = 2
+ 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.TROW_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.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_PLAN', NVALUE => NSUM_PLAN);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_FACT', NVALUE => NSUM_FACT);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_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.TDATA_GRID_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; -- Версия контрагентов
+ begin
+ /* Считываем версию контрагентов */
+ 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 P.RN NRN,
+ DT.DOCCODE || ', ' || trim(P.PREFIX) || '-' || trim(P.NUMB) || ', ' ||
+ TO_CHAR(P.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
+ D.CODE as SSUBDIV,
+ E.CODE 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.DOCDATE >= trunc(sysdate, 'mm')
+ 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 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 SELECTLIST_FCROUTLST_ADD
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ )
+ is
+ NRN PKG_STD.TSTRING; -- Рег. номер записи в селектлисте
+ begin
+ /* Считываем запись в селеклисте */
+ NRN := UTL_SELECTLIST_RN_GET(NIDENT => NIDENT,
+ NFCROUTLST => NFCROUTLST,
+ SUNITCODE => 'CostRouteLists',
+ SACTIONCODE => 'P8PanelsJobManage');
+ /* Если запись не найдена */
+ if (NRN is null) then
+ /* Добавляем запись в селектлист */
+ P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
+ NCOMPANY => null,
+ NDOCUMENT => NFCROUTLST,
+ SUNITCODE => 'CostRouteLists',
+ SACTIONCODE => 'P8PanelsJobManage',
+ NCRN => null,
+ NDOCUMENT1 => null,
+ SUNITCODE1 => null,
+ SACTIONCODE1 => null,
+ NRN => NRN);
+ end if;
+ end SELECTLIST_FCROUTLST_ADD;
+
+ /* Удаление записи маршрутного листа из селектлиста */
+ procedure SELECTLIST_FCROUTLST_DEL
+ (
+ NIDENT in number, -- Идентификатор селектлиста
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ )
+ is
+ NRN PKG_STD.TSTRING; -- Рег. номер записи в селектлисте
+ begin
+ /* Считываем запись в селеклисте */
+ NRN := UTL_SELECTLIST_RN_GET(NIDENT => NIDENT,
+ NFCROUTLST => NFCROUTLST,
+ SUNITCODE => 'CostRouteLists',
+ SACTIONCODE => 'P8PanelsJobManage');
+ /* Если запись найдена */
+ if (NRN is not null) then
+ /* Удаляем запись из селектлиста */
+ P_SELECTLIST_BASE_DELETE(NRN => NRN);
+ end if;
+ end SELECTLIST_FCROUTLST_DEL;
+
+ /* Выдать задание операции сменного задания */
+ procedure FCJOBSSP_ISSUE
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ begin
+ /* Если список операций не указан */
+ if (SFCJOBSSP_LIST is null) then
+ P_EXCEPTION(0, 'Список операций не определен.');
+ end if;
+ /* Цикл по операциям сменного задания */
+ for REC in (select T.*
+ from FCJOBSSP T
+ where T.PRN = NFCJOBS
+ and T.COMPANY = NCOMPANY
+ and T.RN in (select REGEXP_SUBSTR(SFCJOBSSP_LIST, '[^;]+', 1, level) NRN
+ from DUAL
+ connect by INSTR(SFCJOBSSP_LIST, ';', 1, level - 1) > 0)
+ and T.BEG_FACT is null)
+ loop
+ /* Исключаем оборудование */
+ 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 => REC.BEG_PLAN,
+ DEND_PLAN => REC.END_PLAN,
+ 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_PLAN,
+ NLOSTTYPE => REC.LOSTTYPE,
+ NLOSTDEFL => REC.LOSTDEFL,
+ NFOREMAN => REC.FOREMAN,
+ NINSPECTOR => REC.INSPECTOR,
+ DOTK_DATE => REC.OTK_DATE,
+ NSUBDIV => REC.SUBDIV,
+ NEQCONFIG => REC.EQCONFIG,
+ SNOTE => REC.NOTE,
+ NMUNIT => REC.MUNIT);
+ end loop;
+ end FCJOBSSP_ISSUE;
+
+ /* Исключение оборудования из операции сменного задания */
+ procedure FCJOBSSP_EXC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ begin
+ /* Если оборудование выбрано */
+ if (NFCEQUIPMENT is not null) then
+ /* Проверяем наличие оборудования */
+ UTL_FCEQUIPMENT_EXISTS(NFCEQUIPMENT => NFCEQUIPMENT, NCOMPANY => NCOMPANY);
+ else
+ P_EXCEPTION(0, 'Оборудование не определено.');
+ end if;
+ /* Если список операций не указан */
+ if (SFCJOBSSP_LIST is null) then
+ P_EXCEPTION(0, 'Список операций не определен.');
+ end if;
+ /* Цикл по операциям сменного задания */
+ for REC in (select T.*
+ from FCJOBSSP T
+ where T.PRN = NFCJOBS
+ and T.COMPANY = NCOMPANY
+ and T.RN in (select REGEXP_SUBSTR(SFCJOBSSP_LIST, '[^;]+', 1, level) NRN
+ from DUAL
+ connect by INSTR(SFCJOBSSP_LIST, ';', 1, level - 1) > 0)
+ and T.EQUIP_PLAN = NFCEQUIPMENT)
+ loop
+ /* Если дата начала факт указана */
+ if (REC.BEG_FACT is not null) then
+ P_EXCEPTION(0, 'Операция "%s" исполняется.', REC.OPER_NUMB);
+ 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 => REC.BEG_PLAN,
+ DEND_PLAN => REC.END_PLAN,
+ 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 => null,
+ 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 => REC.NOTE,
+ NMUNIT => REC.MUNIT);
+ end loop;
+ end FCJOBSSP_EXC_FCEQUIPMENT;
+
+ /* Включение оборудование в строку сменного задания */
+ procedure FCJOBSSP_INC_FCEQUIPMENT
+ (
+ NFCEQUIPMENT in number, -- Рег. номер оборудования
+ NFCJOBS in number, -- Рег. номер сменного задания
+ SFCJOBSSP_LIST in varchar2 -- Список операций сменного задания
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ begin
+ /* Если оборудование выбрано */
+ if (NFCEQUIPMENT is not null) then
+ /* Проверяем наличие оборудования */
+ UTL_FCEQUIPMENT_EXISTS(NFCEQUIPMENT => NFCEQUIPMENT, NCOMPANY => NCOMPANY);
+ else
+ P_EXCEPTION(0, 'Оборудование не определено.');
+ end if;
+ /* Если список операций не указан */
+ if (SFCJOBSSP_LIST is null) then
+ P_EXCEPTION(0, 'Список операций не определен.');
+ end if;
+ /* Цикл по операциям сменного задания */
+ for REC in (select T.*
+ from FCJOBSSP T
+ where T.PRN = NFCJOBS
+ and T.COMPANY = NCOMPANY
+ and T.RN in (select REGEXP_SUBSTR(SFCJOBSSP_LIST, '[^;]+', 1, level) NRN
+ from DUAL
+ connect by INSTR(SFCJOBSSP_LIST, ';', 1, level - 1) > 0))
+ loop
+ /* Если дата начала факт указана */
+ if (REC.BEG_FACT is not null) then
+ P_EXCEPTION(0, 'Операция "%s" исполняется.', REC.OPER_NUMB);
+ 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 => REC.BEG_PLAN,
+ DEND_PLAN => REC.END_PLAN,
+ 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 => NFCEQUIPMENT,
+ 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 => REC.NOTE,
+ NMUNIT => REC.MUNIT);
+ end loop;
+ end FCJOBSSP_INC_FCEQUIPMENT;
+
+ /* Получение таблицы оборудования подразделения */
+ procedure FCEQUIPMENT_DG_GET
+ (
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ begin
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSELECT',
+ SCAPTION => 'Выбран',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SCODE',
+ SCAPTION => 'Код',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SNAME',
+ SCAPTION => 'Наименование',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NLOADING',
+ SCAPTION => 'Загрузка',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NCOEFF',
+ SCAPTION => 'Норматив загрузки',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ 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.CODE SCODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.NAME SNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(case');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when S.MUNIT is not null then');
+ 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 => ' S.MUNIT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' S.LABOUR_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F.TIME_MUNIT), 3)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCEQUIPMENT F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FCJOBSSP S on S.EQUIP_PLAN = F.RN and S.WORK_DATE is null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FCJOBS J on J.RN = S.PRN and F.SUBDIV = J.SUBDIV');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.RN = T.RN) NLOADING,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.COEFF NCOEFF');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCEQUIPMENT T');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.SUBDIV is not null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(T.COMPANY, T.SUBDIV, UTILIZER()) = ' || 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)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ /*PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NVERSION', NVALUE => NVERSION);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE', DVALUE => sysdate);*/
+ /* Описываем структуру записи курсора */
+ 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);
+ 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.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SCODE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SNAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NLOADING',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NCOEFF',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCEQUIPMENT_DG_GET;
+
+ /* Получение таблицы маршрутных листов спецификации сменного задания */
+ procedure FCJOBSSP_FCROUTLST_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.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSELECT',
+ SCAPTION => 'Выбран',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SFCROUTLST_INFO',
+ SCAPTION => 'Номер МЛ',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRES',
+ SCAPTION => 'Материальный ресурс',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPRIOR_ORDER',
+ 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 F.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PKG_DOCUMENT.MAKE_NUMBER(F.DOCTYPE, F.DOCPREF, F.DOCNUMB, F.DOCDATE) SFCROUTLST_INFO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F2.CODE || '', '' || F2.NAME SMATRES,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F.PRIOR_ORDER NPRIOR_ORDER');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST F,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMATRESOURCE F2');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.RN in (select FL.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP JS,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLST FL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCROUTLSTSP SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where JS.PRN = :NFCJOBS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and JS.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SP.RN = (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(L I_DOCLINKS_OUT_DOCUMENT)') || ' MAX(L.IN_DOCUMENT)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS L');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where L.OUT_DOCUMENT = JS.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_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteListsSpecs') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SP.STATE = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(SP.COMPANY, SP.SUBDIV, UTILIZER()) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FL.RN = SP.PRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = JS.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = JS.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobs') || ') ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' group by FL.RN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and F2.RN = F.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');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCJOBS', NVALUE => NFCJOBS);
+ /* Описываем структуру записи курсора */
+ 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_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SFCROUTLST_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPRIOR_ORDER',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCJOBSSP_FCROUTLST_DG_GET;
+
+ /* Получение спецификации сменного задания по отмеченным маршрутным листам */
+ procedure FCJOBSSP_DG_GET
+ (
+ NFCJOBS in number, -- Рег. номер сменного задания
+ NIDENT in number, -- Идентификатор процесса
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSELECT',
+ SCAPTION => 'Выбран',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SOPER_NUMB',
+ SCAPTION => 'Номер операции',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SOPER_NAME',
+ SCAPTION => 'Наименование операции',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NISSUED',
+ SCAPTION => 'Выдано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NISSUE',
+ SCAPTION => 'Выдать',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NEQUIP_PLAN',
+ SCAPTION => 'Рег. номер оборудования план',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false,
+ BORDER => true);
+ /* Если список выбраныых маршрутных листов не пустой */
+ if (NIDENT is not null) then
+ --if (SFCROUTLST_LIST 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.NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.SOPER_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.SOPER_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.NISSUED,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.NQUANT_PLAN - TMP.NQUANT_FACT - TMP.NISSUED NISSUE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TMP.NEQUIP_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(L I_DOCLINKS_OUT_DOCUMENT)') || ' T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.OPER_NUMB SOPER_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select coalesce(O.NAME, T.OPER_UK) from FCOPERTYPES O where T.OPER_TPS = O.RN) SOPER_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select sum(S.QUANT_PLAN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP S,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS DL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where S.PRN = T.PRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and S.WORK_DATE is null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobsSpecs'));
+ 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.IN_DOCUMENT = L.IN_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_DOCUMENT = S.RN) NISSUED,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN as NQUANT_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_FACT as NQUANT_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EQUIP_PLAN as NEQUIP_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBSSP T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS L');
+ 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 L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobsSpecs'));
+ 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.IN_DOCUMENT in (select SL."DOCUMENT"');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SELECTLIST SL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SL.IDENT = :NIDENT');
+ 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 SL.ACTIONCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'P8PanelsJobManage') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.RN = L.OUT_DOCUMENT');
+ 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 from V_USERPRIV UP where UP.JUR_PERS = T.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostJobs') || ' )) TMP ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCJOBS', NVALUE => NFCJOBS);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT);
+ /* Описываем структуру записи курсора */
+ 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);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SOPER_NUMB',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SOPER_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NISSUED',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NISSUE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NEQUIP_PLAN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ end if;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCJOBSSP_DG_GET;
+
+ /* Инициализация записей раздела "Планы и отчеты производства изделий" */
+ procedure FCJOBS_INIT
+ (
+ COUT out clob -- Список записей раздела "Сменные задания"
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса
+ NVERSION PKG_STD.TREF; -- Версия контрагентов
+ NPROCESS_IDENT PKG_STD.TREF; -- Идентификатор процесса
+ begin
+ /* Считываем версию контрагентов */
+ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
+ /* Генерируем идентификатор процесса */
+ NPROCESS_IDENT := GEN_IDENT();
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Цикл по планам и отчетам производства изделий */
+ for REC in (select T.RN NRN,
+ DT.DOCCODE || ', ' || trim(T.DOCPREF) || '-' || trim(T.DOCNUMB) || ', ' ||
+ TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
+ INS.CODE 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
+ from FCJOBS T,
+ DOCTYPES DT,
+ INS_DEPARTMENT INS,
+ TBOPERMODESP PER
+ where T.COMPANY = NCOMPANY
+ and T.STATE <> NFCJOBS_STATUS_WO
+ and DT.RN = T.DOCTYPE
+ and T.SUBDIV = INS.RN (+)
+ and T.TBOPERMODESP = PER.RN (+)
+ and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(T.COMPANY, T.SUBDIV, SUTILIZER) = 1
+ and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN)
+ and exists (select null from V_USERPRIV UP where UP.JUR_PERS = T.JUR_PERS and UP.UNITCODE = 'CostJobs')
+ order by SDOC_INFO)
+ loop
+ /* Открываем план */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
+ /* Описываем план */
+ 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.DOWN_NODE(SNAME => 'XINFO');
+ /* Описываем идентификатор процесса */
+ PKG_XFAST.ATTR(SNAME => 'NPROCESS_IDENT', NVALUE => NPROCESS_IDENT);
+ /* Закрываем дополнительную информацию */
+ PKG_XFAST.UP();
+ /* Закрываем корень */
+ 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 FCJOBS_DEP_LOAD_DG_GET
+ (
+ 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.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ DDATE_FROM PKG_STD.TLDATE; -- Дата начала месяца
+ DDATE_TO PKG_STD.TLDATE; -- Дата окончания месяца
+ DDATE PKG_STD.TLDATE; -- Дата для расчетов
+ NDICMUNTS_WD PKG_STD.TREF; -- Рег. номер единицы измерения нормочасов
+ NDICMUNTS_HOUR PKG_STD.TREF; -- Рег. номер единицы измерения часа
+ NFCEQUIPMENT PKG_STD.TREF; -- Рег. номер оборудования
+ TDAYS TJOB_DAYS; -- Коллекция дней месяца
+ NINDEX PKG_STD.TNUMBER; -- Индекс даты в коллекции дат
+
+ /* Считывание индекса коллекции дней */
+ 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 = TRUNC(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.TDATA_GRID, -- Описание таблицы
+ 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 => 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);
+ /* Описываем родительскую колонку таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'N_' || TO_CHAR(DDATE, SCOL_PATTERN_DATE) || '_VALUE',
+ SCAPTION => LPAD(D_DAY(DDATE), 2, '0'),
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ SPARENT => 'NVALUE_BY_DAYS');
+ /* Описываем родительскую колонку таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'N_' || TO_CHAR(DDATE, SCOL_PATTERN_DATE) || '_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 => 0, NTYPE => null);
+ 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;
+
+ /* Добавление информации в итоговый результат */
+ procedure ADD_INFO
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SUTILIZER in varchar2, -- Имя пользователя
+ COUT in out clob -- Сериализованная таблица данных
+ )
+ is
+ begin
+ /* Начинаем формирование XML */
+ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
+ /* Открываем корень */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
+ /* Открываем план */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS');
+ /* Описываем план */
+ PKG_XFAST.VALUE_XML(LCVALUE => COUT);
+ /* Закрываем план */
+ PKG_XFAST.UP();
+ /* Открываем дополнительную информацию */
+ PKG_XFAST.DOWN_NODE(SNAME => 'XINFO');
+ /* Описываем мнемокод подразделения */
+ PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => UTL_SUBDIV_CODE_GET(NCOMPANY => NCOMPANY, SUSER => SUTILIZER));
+ /* Закрываем дополнительную информацию */
+ PKG_XFAST.UP();
+ /* Закрываем корень */
+ 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;
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 5);
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SCODE',
+ SCAPTION => 'Мнемокод',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ NWIDTH => 100);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SNAME',
+ SCAPTION => 'Наименование',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ NWIDTH => 200);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSUBDIV',
+ SCAPTION => 'Участок',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPROCENT_LOAD',
+ SCAPTION => 'Загрузка (%)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NLOAD',
+ SCAPTION => 'Загрузка (н/ч)',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ NWIDTH => 80);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NVALUE_BY_DAYS',
+ SCAPTION => 'Загрузка по дням',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true);
+ /* Считываем первый и последний день месяца */
+ P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
+ /* Считываем единицу измерения нормочасов */
+ FIND_DICMUNTS_CODE(NFLAG_SMART => 0,
+ NFLAG_OPTION => 0,
+ NCOMPANY => NCOMPANY,
+ SMEAS_MNEMO => SDICMUNTS_WD,
+ NRN => NDICMUNTS_WD);
+ /* Считываем единицу измерения часа */
+ FIND_DICMUNTS_CODE(NFLAG_SMART => 0,
+ NFLAG_OPTION => 0,
+ NCOMPANY => NCOMPANY,
+ SMEAS_MNEMO => SDICMUNTS_HOUR,
+ NRN => NDICMUNTS_HOUR);
+ /* Инициализируем дни месяца */
+ DAYS_INIT(RDG => RDG, TJOB_DAYS => TDAYS, 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 EQ.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.CODE SCODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.NAME SNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' I.CODE SSUBDIV,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ROUND(sum(case');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when JS.WORK_DATE is not null 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 => ' ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end) / ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 60));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' / ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 160) || ', 3) NPROCENT_LOAD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ROUND(sum(case');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when JS.WORK_DATE is null then');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' 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 => ' JS.LABOUR_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' :NDICMUNTS)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end), 3) NLOAD');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCJOBS T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCJOBSSP JS,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCEQUIPMENT EQ,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' INS_DEPARTMENT I');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY');
+ 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 PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK(T.COMPANY, T.SUBDIV, UTILIZER()) = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and JS.PRN = T.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQ.RN = JS.EQUIP_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and I.RN = T.SUBDIV');
+ 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 => ' group by EQ.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.CODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQ.NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' I.CODE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_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.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);
+ 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 => NFCEQUIPMENT);
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCEQUIPMENT, BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPROCENT_LOAD',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NLOAD', ICURSOR => ICURSOR, NPOSITION => 6);
+ /* Обходим загруженность по дням */
+ for REC in (select max(TMP.WORK_HOURS) NWORK_HOURS,
+ TMP.BEG_DATE DBEG_DATE,
+ SUM(TMP.LABOUR_PLAN) NLABOUR_PLAN,
+ SUM(TMP.LABOUR_FACT) NLABOUR_FACT
+ from (select BO.RN TBOPERMODESP,
+ case BO.SIGN_SHIFT
+ when 0 then
+ (BO.END_TIME - BO.BEG_TIME) * 24
+ else
+ (BO.END_TIME + 1 - BO.BEG_TIME) * 24
+ end WORK_HOURS,
+ TRUNC(COALESCE(T.BEG_FACT, T.BEG_PLAN)) BEG_DATE,
+ F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_PLAN, NDICMUNTS_HOUR) LABOUR_PLAN,
+ F_DICMUNTS_BASE_RECALC_QUANT(0, T.COMPANY, T.MUNIT, T.LABOUR_FACT, NDICMUNTS_HOUR) LABOUR_FACT
+ from FCJOBSSP T,
+ FCJOBS J,
+ TBOPERMODESP BO
+ where T.COMPANY = NCOMPANY
+ and J.RN = T.PRN
+ and T.BEG_PLAN is not null
+ and T.BEG_PLAN <= DDATE_TO
+ and T.BEG_PLAN >= DDATE_FROM
+ and PKG_P8PANELS_MECHREC.UTL_SUBDIV_HIER_CHECK(J.COMPANY, J.SUBDIV, SUTILIZER) = 1
+ and T.EQUIP_PLAN = NFCEQUIPMENT
+ and BO.RN = COALESCE(J.TBOPERMODESP, T.TBOPERMODESP)
+ order by T.BEG_FACT) TMP
+ group by TMP.BEG_DATE
+ order by TMP.BEG_DATE)
+ loop
+ /* Считываем индекс коллеции текущего дня */
+ NINDEX := TDAYS_INDEX_GET(TDAYS => TDAYS, DDATE => REC.DBEG_DATE);
+ /* Если факта меньше, чем плана */
+ if (REC.NLABOUR_FACT < REC.NLABOUR_PLAN) then
+ /* Тип дня - невыполненный */
+ TDAYS(NINDEX).NTYPE := 0;
+ else
+ /* Тип дня - невыполненный */
+ TDAYS(NINDEX).NTYPE := 1;
+ end if;
+ /* Если часов трудоемкости больше рабочего времени */
+ if (REC.NLABOUR_PLAN > REC.NWORK_HOURS) then
+ /* Указываем полную смену */
+ TDAYS(NINDEX).NVALUE := 1;
+ else
+ /* Указываем долю трудоемкости на смену */
+ TDAYS(NINDEX).NVALUE := REC.NLABOUR_PLAN / REC.NWORK_HOURS;
+ end if;
+ end loop;
+ /* Обходим все дни */
+ for I in TDAYS.FIRST .. TDAYS.LAST
+ loop
+ /* Отмечаем значение дня */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_VALUE',
+ NVALUE => ROUND(TDAYS(I).NVALUE, 3));
+ /* Отмечаем тип дня */
+ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_TYPE',
+ NVALUE => TDAYS(I).NTYPE);
+ /* Обнуляем значения дня */
+ TDAYS(I).NVALUE := 0;
+ TDAYS(I).NTYPE := null;
+ end loop;
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ /* Добавление информации в итоговый результат */
+ ADD_INFO(NCOMPANY => NCOMPANY, SUTILIZER => SUTILIZER, COUT => COUT);
+ end FCJOBS_DEP_LOAD_DG_GET;
+
+ /*
+ Процедуры панели "Мониторинг сборки изделий"
+ */
/* Считывание рег. номера спецификации связанного плана */
function FCPRODPLANSP_LINKED_GET
(
- NPRODCMPSP in number, -- Рег. номер производственного состава
- NFCPRODPLAN in number -- Рег. номер план
- ) return number -- Рег. номер спецификации связанного плана
+ NPRODCMPSP in number, -- Рег. номер производственного состава
+ NFCPRODPLAN in number -- Рег. номер план
+ ) return number -- Рег. номер спецификации связанного плана
is
- NRESULT PKG_STD.TREF; -- Рег. номер спецификации связанного плана
+ NRESULT PKG_STD.TREF; -- Рег. номер спецификации связанного плана
begin
/* Считываем запись */
begin