825 lines
48 KiB
SQL
825 lines
48 KiB
SQL
create or replace package PKG_P8PANELS_EQUIPSRV as
|
||
|
||
/* Получение параметров фильтра по умолчанию */
|
||
procedure GET_DEFAULT_FP
|
||
(
|
||
COUT out clob -- XML с параметрами фильтра по умолчанию
|
||
);
|
||
|
||
/* Формирование строки с кол-вом часов */
|
||
function HOURS_STR
|
||
(
|
||
NHOURS in number -- Кол-во часов
|
||
) return varchar2; -- Результат работы
|
||
|
||
/* Отбор документов (ТОиР или Графики ремонтов) по дате */
|
||
procedure SELECT_EQUIPSRV
|
||
(
|
||
SBELONG in varchar2, -- Принадлежность к Юр. лицу
|
||
SPRODOBJ in varchar2, -- Производственный объект
|
||
STECHSERV in varchar2 := null, -- Техническая служба
|
||
SRESPDEP in varchar2 := null, -- Ответственное подразделение
|
||
STECHNAME in varchar2, -- Наименование объекта ремонта
|
||
SSRVKIND in varchar2, -- Код вида ремонта
|
||
NYEAR in number, -- Год
|
||
NMONTH in number, -- Месяц
|
||
NDAY in number := null, -- День
|
||
NWORKTYPE in number, -- Тип работы (0 - план, 1 - факт)
|
||
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
|
||
);
|
||
|
||
/* Выполнение работ по ТОиР */
|
||
procedure EQUIPSRV_GRID
|
||
(
|
||
SBELONG in varchar2, -- Принадлежность к Юр. лицу
|
||
SPRODOBJ in varchar2, -- Производственный объект
|
||
STECHSERV in varchar2 := null, -- Техническая служба
|
||
SRESPDEP in varchar2 := null, -- Ответственное подразделение
|
||
NFROMMONTH in number, -- Месяц начала периода
|
||
NFROMYEAR in number, -- Год начала периода
|
||
NTOMONTH in number, -- Месяц окончания периода
|
||
NTOYEAR in number, -- Год окончания периода
|
||
COUT out clob -- График проектов
|
||
);
|
||
|
||
end PKG_P8PANELS_EQUIPSRV;
|
||
/
|
||
create or replace package body PKG_P8PANELS_EQUIPSRV as
|
||
|
||
/* Получение параметров фильтра по умолчанию */
|
||
procedure GET_DEFAULT_FP
|
||
(
|
||
COUT out clob -- XML с параметрами фильтра по умолчанию
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
SJUR_PERS PKG_STD.TSTRING := null; -- Юр. лицо (наименование)
|
||
begin
|
||
/* Находим юр. лицо */
|
||
SJUR_PERS := GET_OPTIONS_STR(SCODE => 'JuridicalPerson', NCOMP_VERS => NCOMPANY);
|
||
/* Формируем XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'JURPERS');
|
||
PKG_XFAST.VALUE(SVALUE => SJUR_PERS);
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'MONTH');
|
||
PKG_XFAST.VALUE(NVALUE => EXTRACT(month from sysdate));
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'YEAR');
|
||
PKG_XFAST.VALUE(NVALUE => EXTRACT(year from sysdate));
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем в clob */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
PKG_XFAST.EPILOGUE();
|
||
end GET_DEFAULT_FP;
|
||
|
||
/* Формирование строки с кол-вом часов */
|
||
function HOURS_STR
|
||
(
|
||
NHOURS in number -- Кол-во часов
|
||
) return varchar2 -- Строка с кол-вом часов
|
||
is
|
||
SRESULT PKG_STD.TSTRING; -- Строка результат
|
||
begin
|
||
if ((mod(TRUNC(NHOURS), 10) = 1) and (mod(TRUNC(NHOURS), 100) != 11)) then
|
||
SRESULT := NHOURS || ' час';
|
||
elsif (((mod(TRUNC(NHOURS), 10) = 2) and (mod(TRUNC(NHOURS), 100) != 12)) or
|
||
((mod(TRUNC(NHOURS), 10) = 3) and (mod(TRUNC(NHOURS), 100) != 13)) or
|
||
((mod(TRUNC(NHOURS), 10) = 4) and (mod(TRUNC(NHOURS), 100) != 14))) then
|
||
SRESULT := NHOURS || ' часа';
|
||
else
|
||
SRESULT := NHOURS || ' часов';
|
||
end if;
|
||
return SRESULT;
|
||
end HOURS_STR;
|
||
|
||
/* Отбор документов (ТОиР или Графики ремонтов) по дате */
|
||
procedure SELECT_EQUIPSRV
|
||
(
|
||
SBELONG in varchar2, -- Принадлежность к Юр. лицу
|
||
SPRODOBJ in varchar2, -- Производственный объект
|
||
STECHSERV in varchar2 := null, -- Техническая служба
|
||
SRESPDEP in varchar2 := null, -- Ответственное подразделение
|
||
STECHNAME in varchar2, -- Наименование объекта ремонта
|
||
SSRVKIND in varchar2, -- Код вида ремонта
|
||
NYEAR in number, -- Год
|
||
NMONTH in number, -- Месяц
|
||
NDAY in number := null, -- День
|
||
NWORKTYPE in number, -- Тип работы (0 - план, 1 - факт)
|
||
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
|
||
SDATE PKG_STD.TSTRING; -- Строка даты
|
||
begin
|
||
/* Проверка на дату с днём */
|
||
if (NDAY is not null) then
|
||
SDATE := LPAD(TO_CHAR(NDAY), 2, '0') || '.' || LPAD(TO_CHAR(NMONTH), 2, '0') || '.' || NYEAR;
|
||
else
|
||
SDATE := LPAD(TO_CHAR(NMONTH), 2, '0') || '.' || NYEAR;
|
||
end if;
|
||
/* Если графики ТОиР */
|
||
if (NWORKTYPE = 0) then
|
||
for C in (select T.RN,
|
||
T.COMPANY,
|
||
T.CRN
|
||
from EQTCHSRV T,
|
||
JURPERSONS J,
|
||
EQTECSRVKIND SK,
|
||
EQCONFIG C1,
|
||
EQCONFIG C2,
|
||
INS_DEPARTMENT DS,
|
||
INS_DEPARTMENT DR
|
||
where T.STATE in (1, 2)
|
||
and T.COMPANY = NCOMPANY
|
||
and T.JUR_PERS = J.RN
|
||
and J.CODE = SBELONG
|
||
and T.EQCONFIG = C1.RN
|
||
and C1.CODE = SPRODOBJ
|
||
and T.DEPTTCSRV = DS.RN(+)
|
||
and (DS.CODE = STECHSERV or STECHSERV is null)
|
||
and T.DEPTRESP = DR.RN(+)
|
||
and (DR.CODE = SRESPDEP or SRESPDEP is null)
|
||
and T.EQCONFIG_TECH = C2.RN
|
||
and C2.NAME = STECHNAME
|
||
and T.EQTECSRVKIND = SK.RN
|
||
and SK.CODE = SSRVKIND
|
||
and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEPRD_BEG) and
|
||
TRUNC(T.DATEPRD_END)) or
|
||
(NDAY is null and TRUNC(T.DATEPRD_BEG, 'MONTH') <= TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') and
|
||
TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') <= TRUNC(LAST_DAY(T.DATEPRD_END)))))
|
||
|
||
loop
|
||
/* Сформируем идентификатор буфера */
|
||
if (NIDENT is null) then
|
||
NIDENT := GEN_IDENT();
|
||
end if;
|
||
/* Добавим подобранное в список отмеченных записей */
|
||
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
|
||
NCOMPANY => C.COMPANY,
|
||
NDOCUMENT => C.RN,
|
||
SUNITCODE => 'EquipTechServices',
|
||
SACTIONCODE => null,
|
||
NCRN => C.CRN,
|
||
NDOCUMENT1 => null,
|
||
SUNITCODE1 => null,
|
||
SACTIONCODE1 => null,
|
||
NRN => NSELECTLIST);
|
||
end loop;
|
||
/* Иначе ремонтные ведомости */
|
||
else
|
||
for C in (select T.RN,
|
||
T.COMPANY,
|
||
T.CRN
|
||
from EQRPSHEETS T,
|
||
JURPERSONS J,
|
||
EQTECSRVKIND SK,
|
||
EQCONFIG C
|
||
where T.STATE in (0, 2, 3)
|
||
and T.COMPANY = NCOMPANY
|
||
and T.JURPERSONS = J.RN
|
||
and J.CODE = SBELONG
|
||
and T.EQCONFIG = C.RN
|
||
and C.NAME = STECHNAME
|
||
and T.TECSRVKIND = SK.RN
|
||
and SK.CODE = SSRVKIND
|
||
and ((NDAY is not null and TO_DATE(SDATE, 'dd.mm.yyyy') between TRUNC(T.DATEFACT_BEG) and
|
||
TRUNC(T.DATEFACT_END)) or
|
||
(NDAY is null and TRUNC(T.DATEFACT_BEG, 'MONTH') <= TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') and
|
||
TRUNC(TO_DATE(SDATE, 'mm.yyyy'), 'MONTH') <= TRUNC(LAST_DAY(T.DATEFACT_END)))))
|
||
loop
|
||
/* Сформируем идентификатор буфера */
|
||
if (NIDENT is null) then
|
||
NIDENT := GEN_IDENT();
|
||
end if;
|
||
/* Добавим подобранное в список отмеченных записей */
|
||
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
|
||
NCOMPANY => C.COMPANY,
|
||
NDOCUMENT => C.RN,
|
||
SUNITCODE => 'EquipRepairSheets',
|
||
SACTIONCODE => null,
|
||
NCRN => C.CRN,
|
||
NDOCUMENT1 => null,
|
||
SUNITCODE1 => null,
|
||
SACTIONCODE1 => null,
|
||
NRN => NSELECTLIST);
|
||
end loop;
|
||
end if;
|
||
end SELECT_EQUIPSRV;
|
||
|
||
/* Выполнение работ по ТОиР */
|
||
procedure EQUIPSRV_GRID
|
||
(
|
||
SBELONG in varchar2, -- Принадлежность к Юр. лицу
|
||
SPRODOBJ in varchar2, -- Производственный объект
|
||
STECHSERV in varchar2 := null, -- Техническая служба
|
||
SRESPDEP in varchar2 := null, -- Ответственное подразделение
|
||
NFROMMONTH in number, -- Месяц начала периода
|
||
NFROMYEAR in number, -- Год начала периода
|
||
NTOMONTH in number, -- Месяц окончания периода
|
||
NTOYEAR in number, -- Год окончания периода
|
||
COUT out clob -- График проектов
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
SPRJ_GROUP_NAME PKG_STD.TSTRING; -- Наименование группы для проекта
|
||
BEXPANDED boolean; -- Флаг раскрытости уровня
|
||
RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы
|
||
RDG_ROW_INFO PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы с информацией по объекту ремонта
|
||
RDG_ROW_PLAN PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы с планом по объекту ремонта
|
||
RDG_ROW_FACT PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы с фактом по объекту ремонта
|
||
NCURYEAR PKG_STD.TNUMBER; -- Текущий год
|
||
NCURMONTH PKG_STD.TNUMBER; -- Текущий месяц
|
||
NTOTALDAYS PKG_STD.TNUMBER; -- Дней в текущем месяце
|
||
SCURTECHOBJ PKG_STD.TSTRING := null; -- Текущий технический объект
|
||
SCURTSKCODE PKG_STD.TSTRING := null; -- Текущий вид ремонта
|
||
NFROMDATE PKG_STD.TLDATE; -- Дата начала периода
|
||
NTODATE PKG_STD.TLDATE; -- Дата конца периода
|
||
NMS PKG_STD.TNUMBER; -- Месяц начала в цикле года
|
||
NME PKG_STD.TNUMBER; -- Месяц окончания в цикле года
|
||
NYEAR_PLAN PKG_STD.TNUMBER; -- Год план
|
||
NMONTH_PLAN PKG_STD.TNUMBER; -- Месяц план
|
||
NDAY_PLAN PKG_STD.TNUMBER; -- День план
|
||
NYEAR_FACT PKG_STD.TNUMBER; -- Год факт
|
||
NMONTH_FACT PKG_STD.TNUMBER; -- Месяц факт
|
||
NDAY_FACT PKG_STD.TNUMBER; -- День факт
|
||
SPERIODNAME PKG_STD.TSTRING; -- Имя периода
|
||
SFACT_CLR PKG_STD.TSTRING; -- Цвет закрашивания фактических дат
|
||
NROWS PKG_STD.TNUMBER := 0; -- Кол-во строк в курсоре
|
||
NWORKPERDAY PKG_STD.TNUMBER(17,2) := null; -- Работы в день
|
||
YM PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для подсчёта работ за месяц
|
||
MCLR PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для закрашивания месяцев
|
||
CR PKG_STD.TSTRING; -- Текущий ключ коллекции MCLR
|
||
GF PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция заполнения групп по объекту ремонта
|
||
COLS PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция закрашивания колонок
|
||
|
||
/* Курсор с работами ТОиР */
|
||
cursor C1 is
|
||
select TT.NEQV_RN NEQV_RN,
|
||
TT.NEQS_RN NEQS_RN,
|
||
TT.NWRK_RN NRN,
|
||
TT.NCOMPANY NCOMPANY,
|
||
TT.SNAME_WORK SWORKNAME,
|
||
EC2.CODE STECHOBJCODE,
|
||
EC2.NAME STECHOBJNAME,
|
||
JP.CODE SBELONG,
|
||
EC1.CODE SPRODOBJ,
|
||
DS.CODE STECHSERV,
|
||
DR.CODE SRESPDEP,
|
||
TT.DDATEPRD_BEG DDATEPLANBEG,
|
||
TT.DDATEPRD_END DDATEPLANEND,
|
||
EQJ.DATEFACT_BEG DDATEFACTBEG,
|
||
COALESCE(EQJ.DATEFACT_END, EQJ.DATEFACT_BEG) DDATEFACTEND,
|
||
EK.CODE STECSRVKINDCODE,
|
||
EK.NAME STECSRVKINDNAME,
|
||
COALESCE(EW.NSUM, (TT.DDATEPRD_END - TT.DDATEPRD_BEG) * 24) NSUMWORKPLAN,
|
||
COALESCE(EWJ.NSUMF, (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT
|
||
from (select B.NEQV_RN NEQV_RN,
|
||
B.NCOMPANY NCOMPANY,
|
||
B.NJUR_PERS NJUR_PERS,
|
||
B.NSTATE NSTATE,
|
||
B.DDATEPRD_BEG DDATEPRD_BEG,
|
||
B.DDATEPRD_END DDATEPRD_END,
|
||
B.NEQS_RN NEQS_RN,
|
||
C.RN NWRK_RN,
|
||
C.PRN NWRK_PRN,
|
||
C.NAME_WORK SNAME_WORK,
|
||
C.DATEPLAN_BEG DDATEPLAN_BEG,
|
||
C.DATEPLAN_END DDATEPLAN_END,
|
||
COALESCE(C.TECSRVKIND, B.NEQTECSRVKIND) NTECSRVKIND,
|
||
COALESCE(C.EQCONFIG, B.NEQCONFIG_TECH) NEQCONFIG,
|
||
C.DEPTPERF NDEPTPERF,
|
||
C.DEPTTCSRV NDEPTTCSRV,
|
||
C.RESP_AGN NRESP_AGN
|
||
from (select EQV.RN NEQV_RN,
|
||
EQV.COMPANY NCOMPANY,
|
||
EQV.JUR_PERS NJUR_PERS,
|
||
EQV.STATE NSTATE,
|
||
EQV.DATEPRD_BEG DDATEPRD_BEG,
|
||
EQV.DATEPRD_END DDATEPRD_END,
|
||
EQV.EQTECSRVKIND NEQTECSRVKIND,
|
||
EQV.EQCONFIG_TECH NEQCONFIG_TECH,
|
||
EQS.RN NEQS_RN
|
||
from EQTCHSRV EQV,
|
||
JURPERSONS J,
|
||
EQCONFIG EC,
|
||
DOCLINKS DL,
|
||
EQRPSHEETS EQS
|
||
where EQV.JUR_PERS = J.RN
|
||
and J.CODE = SBELONG
|
||
and EQV.EQCONFIG = EC.RN
|
||
and EC.CODE = SPRODOBJ
|
||
and EQV.RN = DL.IN_DOCUMENT(+)
|
||
and DL.OUT_UNITCODE(+) = 'EquipRepairSheets'
|
||
and DL.OUT_DOCUMENT = EQS.RN(+)) B,
|
||
EQTCHSRWRK C
|
||
where B.NEQV_RN = C.PRN(+)
|
||
union all
|
||
select B.NEQV_RN NEQV_RN,
|
||
B.NCOMPANY NCOMPANY,
|
||
B.NJUR_PERS NJUR_PERS,
|
||
B.NSTATE NSTATE,
|
||
B.DDATEPLAN_BEG DDATEPLAN_BEG,
|
||
B.DDATEPLAN_END DDATEPLAN_END,
|
||
B.NEQS_RN NEQS_RN,
|
||
C.RN NWRK_RN,
|
||
C.PRN NWRK_PRN,
|
||
C.NAME_WORK SNAME_WORK,
|
||
C.DATEPLAN_BEG DDATEPLAN_BEG,
|
||
C.DATEPLAN_END DDATEPLAN_END,
|
||
COALESCE(C.TECSRVKIND, B.NTECSRVKIND) NTECSRVKIND,
|
||
COALESCE(C.EQCONFIG, B.NEQCONFIG) NEQCONFIG,
|
||
C.DEPTPERF NDEPTPERF,
|
||
null NDEPTTCSRV,
|
||
C.RESP_AGN NRESP_AGN
|
||
from (select null NEQV_RN,
|
||
EQS.COMPANY NCOMPANY,
|
||
EQS.JURPERSONS NJUR_PERS,
|
||
EQS.STATE NSTATE,
|
||
EQS.DATEPLAN_BEG DDATEPLAN_BEG,
|
||
EQS.DATEPLAN_END DDATEPLAN_END,
|
||
EQS.RN NEQS_RN,
|
||
EQS.EQCONFIG NEQCONFIG,
|
||
EQS.TECSRVKIND NTECSRVKIND
|
||
from EQRPSHEETS EQS,
|
||
JURPERSONS J,
|
||
EQCONFIG EC
|
||
where not exists (select 1
|
||
from DOCLINKS DL
|
||
where DL.OUT_DOCUMENT = EQS.RN
|
||
and DL.IN_UNITCODE = 'EquipTechServices')
|
||
and EQS.JURPERSONS = J.RN
|
||
and J.CODE = SBELONG
|
||
and EQS.EQCONFIG = EC.RN
|
||
and EC.CODE = SPRODOBJ) B,
|
||
EQRPSHWRK C
|
||
where B.NEQS_RN = C.PRN(+)) TT,
|
||
EQTECSRVKIND EK,
|
||
JURPERSONS JP,
|
||
EQCONFIG EC1,
|
||
EQCONFIG EC2,
|
||
INS_DEPARTMENT DS,
|
||
INS_DEPARTMENT DR,
|
||
DOCLINKS DL,
|
||
EQTECSRVJRNL EQJ,
|
||
(select T.PRN NPRN,
|
||
sum(T.WORKTIMEPLAN * T.PERFORM_QUANT) NSUM
|
||
from EQTCHSRWRC T
|
||
group by T.PRN) EW,
|
||
(select T.PRN NPRN,
|
||
sum(T.WORKTIMEFACT * T.QUANTFACT) NSUMF
|
||
from EQTCHSRJRNLWRC T
|
||
group by T.PRN) EWJ
|
||
where TT.NCOMPANY = NCOMPANY
|
||
and ((TT.NSTATE in (1, 2) and TT.NEQV_RN is not null) or (TT.NSTATE in (0, 2, 3) and TT.NEQV_RN is null))
|
||
and TT.DDATEPRD_BEG >= NFROMDATE
|
||
and TT.DDATEPRD_END <= NTODATE
|
||
and JP.CODE = SBELONG
|
||
and EC1.CODE = SPRODOBJ
|
||
and (DS.CODE = STECHSERV or STECHSERV is null)
|
||
and (DR.CODE = SRESPDEP or SRESPDEP is null)
|
||
and TT.NEQCONFIG = EC2.RN(+)
|
||
and TT.NDEPTPERF = DR.RN(+)
|
||
and TT.NDEPTTCSRV = DS.RN(+)
|
||
and TT.NWRK_RN = EW.NPRN(+)
|
||
and EQJ.RN = EWJ.NPRN(+)
|
||
and TT.NTECSRVKIND = EK.RN(+)
|
||
and TT.NWRK_RN = DL.IN_DOCUMENT(+)
|
||
and ((DL.OUT_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or
|
||
(DL.OUT_UNITCODE is null and DL.RN is null))
|
||
and DL.OUT_DOCUMENT = EQJ.RN(+)
|
||
order by EC2.NAME,
|
||
EK.CODE;
|
||
begin
|
||
/* Определим дату начала периода */
|
||
NFROMDATE := TO_DATE('01.' || LPAD(TO_CHAR(NFROMMONTH), 2, '0') || '.' || TO_CHAR(NFROMYEAR), 'dd.mm.yyyy');
|
||
/* Определим дату конца периода */
|
||
NTODATE := LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(NTOMONTH), 2, '0') || '.' || TO_CHAR(NTOYEAR), 'dd.mm.yyyy'));
|
||
/* Инициализируем таблицу данных */
|
||
RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2);
|
||
/* Формируем структуру заголовка */
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SOBJINFO',
|
||
SCAPTION => 'Информация по объекту ремонта',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
NWIDTH => 80);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SINFO',
|
||
SCAPTION => 'Объект ремонта',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
NWIDTH => 80);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SWRKTYPE',
|
||
SCAPTION => 'Тип работ',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
SPARENT => 'SINFO',
|
||
NWIDTH => 80);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NRN',
|
||
SCAPTION => 'Рег. номер',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SWORKNAME',
|
||
SCAPTION => 'Наименование работы',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'STECHOBJCODE',
|
||
SCAPTION => 'Код тех. объекта',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'STECHOBJNAME',
|
||
SCAPTION => 'Наименование тех. объекта',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SBELONG',
|
||
SCAPTION => 'Принадлежность',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SPRODOBJ',
|
||
SCAPTION => 'Производственный объект',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'STECHSERV',
|
||
SCAPTION => 'Тех. служба',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SRESPDEP',
|
||
SCAPTION => 'Отвественное подразделение',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'STECSERVCODE',
|
||
SCAPTION => 'Вид ремонта',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DDATEPLANBEG',
|
||
SCAPTION => 'Начало работы (план)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DDATEPLANEND',
|
||
SCAPTION => 'Окончание работы (план)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DDATEFACTBEG',
|
||
SCAPTION => 'Начало работы (факт)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DDATEFACTEND',
|
||
SCAPTION => 'Окончание работы (факт)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'STECSRVKINDCODE',
|
||
SCAPTION => 'Код типа работы',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'STECSRVKINDNAME',
|
||
SCAPTION => 'Наименование типа работы',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
/* Очистка коллекций */
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => GF);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => COLS);
|
||
/* Текущий год */
|
||
NCURYEAR := EXTRACT(year from sysdate);
|
||
/* Текущий месяц */
|
||
NCURMONTH := EXTRACT(month from sysdate);
|
||
/* Цикл по годам периода */
|
||
for Y in NFROMYEAR .. NTOYEAR
|
||
loop
|
||
if (NFROMYEAR = NTOYEAR) then
|
||
NMS := NFROMMONTH;
|
||
NME := NTOMONTH;
|
||
else
|
||
if (Y = NFROMYEAR) then
|
||
NMS := NFROMMONTH;
|
||
NME := 12;
|
||
elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then
|
||
NMS := 1;
|
||
NME := 12;
|
||
elsif (Y = NTOYEAR) then
|
||
NMS := 1;
|
||
NME := NTOMONTH;
|
||
end if;
|
||
end if;
|
||
/* Цикл по месяцам года */
|
||
for M in NMS .. NME
|
||
loop
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', NVALUE => 0);
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', NVALUE => 0);
|
||
/* Находим текущий месяц и делаем его развёрнутым по дням */
|
||
if ((Y = NCURYEAR) and (M = NCURMONTH)) then
|
||
BEXPANDED := true;
|
||
else
|
||
BEXPANDED := false;
|
||
end if;
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M),
|
||
SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y),
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BEXPANDABLE => true,
|
||
BEXPANDED => BEXPANDED);
|
||
/* Подсчёт кол-ва дней в месяце */
|
||
NTOTALDAYS := TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y),
|
||
'dd.mm.yyyy')),
|
||
'dd'),
|
||
'99');
|
||
/* Цикл по дням месяца */
|
||
for D in 1 .. NTOTALDAYS
|
||
loop
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || TO_CHAR(D),
|
||
SCAPTION => TO_CHAR(D, '99'),
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
SPARENT => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M));
|
||
end loop;
|
||
end loop;
|
||
end loop;
|
||
/* Подсчёт кол-ва записей в курсоре */
|
||
for Q1 in C1
|
||
loop
|
||
NROWS := NROWS + 1;
|
||
end loop;
|
||
/* Цикл по курсору */
|
||
for QQ in C1
|
||
loop
|
||
NROWS := NROWS - 1;
|
||
/* Если новый объект ремонта */
|
||
if ((SCURTECHOBJ != QQ.STECHOBJNAME) or (SCURTECHOBJ is null)) then
|
||
/* Если строка с трудоёмкостью по объекту ремонта сформирована */
|
||
if (RDG_ROW_INFO.RCOLS is not null) then
|
||
/* Цикл по годам периода */
|
||
for Y in NFROMYEAR .. NTOYEAR
|
||
loop
|
||
/* Если отчёт в пределах года */
|
||
if (NFROMYEAR = NTOYEAR) then
|
||
NMS := NFROMMONTH;
|
||
NME := NTOMONTH;
|
||
/* Иначе вычисляем кол-во месяцев в каждом году периода отчёта */
|
||
else
|
||
if (Y = NFROMYEAR) then
|
||
NMS := NFROMMONTH;
|
||
NME := 12;
|
||
elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then
|
||
NMS := 1;
|
||
NME := 12;
|
||
elsif (Y = NTOYEAR) then
|
||
NMS := 1;
|
||
NME := NTOMONTH;
|
||
end if;
|
||
end if;
|
||
/* Цикл по месяцам года, заполнение трудоёмкости с привязкой к месяцу */
|
||
for M in NMS .. NME
|
||
loop
|
||
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_INFO,
|
||
SNAME => SPERIODNAME,
|
||
SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
|
||
SROWID => SPERIODNAME || '_P'),
|
||
1)) || ' факт: ' ||
|
||
HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
|
||
SROWID => SPERIODNAME || '_F'),
|
||
1)));
|
||
/* Добавление в коллекцию трудоёмкость план */
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P', NVALUE => 0);
|
||
/* Добавление в коллекцию трудоёмкость факт */
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F', NVALUE => 0);
|
||
end loop;
|
||
end loop;
|
||
/* Добавление строки с трудоёмкостью */
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO);
|
||
end if;
|
||
/* Добавление группы с объектом ремонта */
|
||
SCURTECHOBJ := QQ.STECHOBJNAME;
|
||
SPRJ_GROUP_NAME := SCURTECHOBJ;
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG,
|
||
SNAME => SPRJ_GROUP_NAME,
|
||
SCAPTION => QQ.STECHOBJNAME,
|
||
BEXPANDABLE => false);
|
||
RDG_ROW_INFO := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_INFO, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ);
|
||
end if;
|
||
/* Формируем имя группы для вида ремонта */
|
||
SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE;
|
||
/* Если по данной группе еще нет строк плана и факта */
|
||
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => GF, SROWID => SCURTSKCODE) = false) then
|
||
/* Добавляем строку плана */
|
||
if (RDG_ROW_PLAN.RCOLS is not null) then
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN);
|
||
end if;
|
||
/* Добавляем строку факта */
|
||
if (RDG_ROW_FACT.RCOLS is not null) then
|
||
CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
|
||
/* Цикл по коллекции для закрашивания месяцев */
|
||
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
|
||
loop
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_FACT,
|
||
SNAME => CR,
|
||
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
|
||
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
|
||
end loop;
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT);
|
||
end if;
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR);
|
||
/* Добвим группу для вида ремонта */
|
||
SPRJ_GROUP_NAME := SCURTSKCODE;
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG,
|
||
SNAME => SPRJ_GROUP_NAME,
|
||
SCAPTION => QQ.STECSRVKINDCODE,
|
||
BEXPANDABLE => false);
|
||
/* Строка плана */
|
||
RDG_ROW_PLAN := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SWRKTYPE', SVALUE => 'План');
|
||
/* Строка факта */
|
||
RDG_ROW_FACT := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_FACT, SNAME => 'SWRKTYPE', SVALUE => 'Факт');
|
||
/* Добавляем в заполненные группы */
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => GF, SROWID => SPRJ_GROUP_NAME, SVALUE => '');
|
||
end if;
|
||
/* Плановые работы */
|
||
if (QQ.NEQV_RN is not null) then
|
||
/* Цикл по периоду */
|
||
for X in 0 .. TRUNC(QQ.DDATEPLANEND) - TRUNC(QQ.DDATEPLANBEG)
|
||
loop
|
||
NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + X);
|
||
NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + X);
|
||
NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + X);
|
||
/* Если первый день периода */
|
||
if (X = 0) then
|
||
SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || NMONTH_PLAN;
|
||
/* Подсчёт трудоёмкости за месяц */
|
||
if (QQ.NSUMWORKPLAN is not null) then
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM,
|
||
SROWID => SPERIODNAME || '_P',
|
||
NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P') +
|
||
QQ.NSUMWORKPLAN);
|
||
end if;
|
||
/* Закрашивание месяца плана синим */
|
||
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') =
|
||
false) then
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue');
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS,
|
||
SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN',
|
||
SVALUE => '');
|
||
end if;
|
||
end if;
|
||
SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || TO_CHAR(NMONTH_PLAN) || '_' || TO_CHAR(NDAY_PLAN);
|
||
/* Закрашивание дня плана синим */
|
||
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') =
|
||
false) then
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue');
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS,
|
||
SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN',
|
||
SVALUE => '');
|
||
end if;
|
||
end loop;
|
||
end if;
|
||
/* Фактические и внеплановые работы */
|
||
if ((QQ.DDATEFACTEND is not null) and (QQ.DDATEFACTBEG is not null)) then
|
||
/* Фактические - зелёный, внеплановые - красный */
|
||
if (QQ.NEQV_RN is not null) then
|
||
SFACT_CLR := 'green';
|
||
else
|
||
SFACT_CLR := 'red';
|
||
end if;
|
||
NWORKPERDAY := null;
|
||
/* Если период не в одном месяце, то считаем трудоёмкость в день */
|
||
if (EXTRACT(month from QQ.DDATEFACTBEG) != EXTRACT(month from QQ.DDATEFACTEND)) then
|
||
NWORKPERDAY := QQ.NSUMWORKFACT / (ROUND(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1);
|
||
NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG);
|
||
end if;
|
||
/* Цикл по периоду */
|
||
for X in 0 .. TRUNC(QQ.DDATEFACTEND) - TRUNC(QQ.DDATEFACTBEG)
|
||
loop
|
||
NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + X);
|
||
NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + X);
|
||
NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + X);
|
||
/* Если первый день периода или следующий месяц периода */
|
||
if ((X = 0) or (NCURMONTH != NMONTH_FACT)) then
|
||
/* Обновляется текущий месяц */
|
||
if (NCURMONTH != NMONTH_FACT) then
|
||
NCURMONTH := NMONTH_FACT;
|
||
end if;
|
||
SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || NMONTH_FACT;
|
||
/* Подсчёт трудоёмкости за месяц если период в одном месяце */
|
||
if ((QQ.NSUMWORKFACT is not null) and (NWORKPERDAY is null)) then
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM,
|
||
SROWID => SPERIODNAME || '_F',
|
||
NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') +
|
||
QQ.NSUMWORKFACT);
|
||
end if;
|
||
/* Добавление в коллекцию окрашивания месяца */
|
||
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR);
|
||
else
|
||
/* Если второй цвет для месяца */
|
||
if (STRIN(trim(SFACT_CLR), trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME))) = 0) then
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR,
|
||
SROWID => SPERIODNAME,
|
||
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => SPERIODNAME) || ' ' ||
|
||
SFACT_CLR);
|
||
end if;
|
||
end if;
|
||
end if;
|
||
/* Подсчёт трудоёмкости за месяц если период не в одном месяце */
|
||
if (NWORKPERDAY is not null) then
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM,
|
||
SROWID => SPERIODNAME || '_F',
|
||
NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') +
|
||
NWORKPERDAY);
|
||
end if;
|
||
SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || TO_CHAR(NMONTH_FACT) || '_' || TO_CHAR(NDAY_FACT);
|
||
/* Добавление в коллекцию окрашивания дней факта */
|
||
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR);
|
||
else
|
||
/* Если второй цвет для месяца */
|
||
if ((trim(PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => SPERIODNAME)) = 'green') and
|
||
(trim(SFACT_CLR) = 'red')) then
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR);
|
||
end if;
|
||
end if;
|
||
end loop;
|
||
end if;
|
||
if ((RDG_ROW_INFO.RCOLS is not null) and (NROWS = 0)) then
|
||
/* Цикл по годам периода */
|
||
for Y in NFROMYEAR .. NTOYEAR
|
||
loop
|
||
if (NFROMYEAR = NTOYEAR) then
|
||
NMS := NFROMMONTH;
|
||
NME := NTOMONTH;
|
||
else
|
||
if (Y = NFROMYEAR) then
|
||
NMS := NFROMMONTH;
|
||
NME := 12;
|
||
elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then
|
||
NMS := 1;
|
||
NME := 12;
|
||
elsif (Y = NTOYEAR) then
|
||
NMS := 1;
|
||
NME := NTOMONTH;
|
||
end if;
|
||
end if;
|
||
/* Цикл по месяцам года */
|
||
for M in NMS .. NME
|
||
loop
|
||
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_INFO,
|
||
SNAME => SPERIODNAME,
|
||
SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
|
||
SROWID => SPERIODNAME || '_P'),
|
||
1)) || ' факт: ' ||
|
||
HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
|
||
SROWID => SPERIODNAME || '_F'),
|
||
1)));
|
||
end loop;
|
||
end loop;
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO);
|
||
end if;
|
||
/* План для последней записи */
|
||
if ((RDG_ROW_PLAN.RCOLS is not null) and (NROWS = 0)) then
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN);
|
||
end if;
|
||
/* Факт для последней записи */
|
||
if ((RDG_ROW_FACT.RCOLS is not null) and (NROWS = 0)) then
|
||
CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
|
||
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
|
||
loop
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_FACT,
|
||
SNAME => CR,
|
||
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
|
||
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
|
||
end loop;
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT);
|
||
end if;
|
||
end loop;
|
||
/* Сериализуем описание */
|
||
COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
|
||
/* Очищаем контейнеры */
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => GF);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => COLS);
|
||
end EQUIPSRV_GRID;
|
||
|
||
end PKG_P8PANELS_EQUIPSRV;
|
||
/
|