Revert "exclude dist/"

This reverts commit 74d7f15563ec2a7e3f6db2b6be7c73ac1b40c97c.
This commit is contained in:
Vladislav 2024-04-17 18:10:54 +03:00
parent 1cf6a1fc36
commit 238ce245b3

View File

@ -1,48 +1,80 @@
create or replace package PKG_P8PANELS_EQUIPSRV as create or replace package PKG_P8PANELS_EQUIPSRV as
/* Получение значения системного параметра "JuridicalPerson" */ /* Получение параметров фильтра по умолчанию */
procedure GET_JUR_PERS_PRM procedure GET_DEFAULT_FP
( (
CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) COUT out clob -- XML с параметрами фильтра по умолчанию
); );
/* Формирование строки с кол-вом часов */
function HOURS_STR function HOURS_STR
( (
NHOURS in number -- Кол-во часов NHOURS in number -- Кол-во часов
) return varchar2; ) 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 procedure EQUIPSRV_GRID
( (
SBELONG in varchar2, -- Принадлежность к Юр. лицу SBELONG in varchar2, -- Принадлежность к Юр. лицу
SPRODOBJ in varchar2, -- Производственный объект SPRODOBJ in varchar2, -- Производственный объект
STECHSERV in varchar2, -- Техническая служба STECHSERV in varchar2 := null, -- Техническая служба
SRESPDEP in varchar2, -- Ответственное подразделение SRESPDEP in varchar2 := null, -- Ответственное подразделение
NFROMMONTH in number, -- Месяц начала периода NFROMMONTH in number, -- Месяц начала периода
NFROMYEAR in number, -- Год начала периода NFROMYEAR in number, -- Год начала периода
NTOMONTH in number, -- Месяц окончания периода NTOMONTH in number, -- Месяц окончания периода
NTOYEAR in number, -- Год окончания периода NTOYEAR in number, -- Год окончания периода
COUT out clob -- График проектов COUT out clob -- График проектов
); );
end PKG_P8PANELS_EQUIPSRV; end PKG_P8PANELS_EQUIPSRV;
/ /
create or replace package body PKG_P8PANELS_EQUIPSRV as create or replace package body PKG_P8PANELS_EQUIPSRV as
/* Получение значения системного параметра "JuridicalPerson" */ /* Получение параметров фильтра по умолчанию */
procedure GET_JUR_PERS_PRM procedure GET_DEFAULT_FP
( (
CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) COUT out clob -- XML с параметрами фильтра по умолчанию
) )
is is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
SPARAMCODE PKG_STD.TSTRING := 'JuridicalPerson'; -- Код параметра SJUR_PERS PKG_STD.TSTRING := null; -- Юр. лицо (наименование)
NJUR_PERS PKG_STD.TREF := null; -- Юр. лицо (идентификатор)
begin begin
CRES := GET_OPTIONS_STR(SCODE => SPARAMCODE, /* Находим юр. лицо */
NCOMP_VERS => NCOMPANY); FIND_JURPERSONS_MAIN(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SJUR_PERS => SJUR_PERS, NJUR_PERS => NJUR_PERS);
if (CRES is null) then /* Формируем XML */
P_EXCEPTION(0, 'Пользовательский параметр не указан.'); PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
end if; PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
end GET_JUR_PERS_PRM; 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 function HOURS_STR
@ -50,28 +82,136 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
NHOURS in number -- Кол-во часов NHOURS in number -- Кол-во часов
) return varchar2 -- Строка с кол-вом часов ) return varchar2 -- Строка с кол-вом часов
is is
SRESULT PKG_STD.tSTRING; -- Строка результат SRESULT PKG_STD.TSTRING; -- Строка результат
begin begin
if (MOD(NHOURS, 10) = 1 and MOD(NHOURS, 100) != 11) then if ((mod(NHOURS, 10) = 1) and (mod(NHOURS, 100) != 11)) then
SRESULT := NHOURS || ' час'; SRESULT := NHOURS || ' час';
elsif ((MOD(NHOURS, 10) = 2 and MOD(NHOURS, 100) != 12) elsif (((mod(NHOURS, 10) = 2) and (mod(NHOURS, 100) != 12)) or ((mod(NHOURS, 10) = 3) and (mod(NHOURS, 100) != 13)) or
or (MOD(NHOURS, 10) = 3 and MOD(NHOURS, 100) != 13) ((mod(NHOURS, 10) = 4) and (mod(NHOURS, 100) != 14))) then
or (MOD(NHOURS, 10) = 4 and MOD(NHOURS, 100) != 14)) then
SRESULT := NHOURS || ' часа'; SRESULT := NHOURS || ' часа';
else else
SRESULT := NHOURS || ' часов'; SRESULT := NHOURS || ' часов';
end if; end if;
/* Возвращаем результат */
return SRESULT; return SRESULT;
end HOURS_STR; 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
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 (SDATE = TO_CHAR(T.DATEPRD_BEG, 'mm.yyyy') or
SDATE = TO_CHAR(T.DATEPRD_END, 'mm.yyyy')))))
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 => null,
NDOCUMENT1 => null,
SUNITCODE1 => null,
SACTIONCODE1 => null,
NRN => NSELECTLIST);
end loop;
/* Иначе ремонтные ведомости */
else
for C in (select T.RN,
T.COMPANY
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 (SDATE = TO_CHAR(T.DATEFACT_BEG, 'mm.yyyy') or
SDATE = TO_CHAR(T.DATEFACT_END, 'mm.yyyy')))))
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 => null,
NDOCUMENT1 => null,
SUNITCODE1 => null,
SACTIONCODE1 => null,
NRN => NSELECTLIST);
end loop;
end if;
end SELECT_EQUIPSRV;
/* Выполнение работ по ТОиР */ /* Выполнение работ по ТОиР */
procedure EQUIPSRV_GRID procedure EQUIPSRV_GRID
( (
SBELONG in varchar2, -- Принадлежность к Юр. лицу SBELONG in varchar2, -- Принадлежность к Юр. лицу
SPRODOBJ in varchar2, -- Производственный объект SPRODOBJ in varchar2, -- Производственный объект
STECHSERV in varchar2, -- Техническая служба STECHSERV in varchar2 := null, -- Техническая служба
SRESPDEP in varchar2, -- Ответственное подразделение SRESPDEP in varchar2 := null, -- Ответственное подразделение
NFROMMONTH in number, -- Месяц начала периода NFROMMONTH in number, -- Месяц начала периода
NFROMYEAR in number, -- Год начала периода NFROMYEAR in number, -- Год начала периода
NTOMONTH in number, -- Месяц окончания периода NTOMONTH in number, -- Месяц окончания периода
@ -86,41 +226,36 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0 RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2 RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2
NCURYEAR PKG_STD.tNUMBER; -- Текущий год NCURYEAR PKG_STD.TNUMBER; -- Текущий год
NCURMONTH PKG_STD.tNUMBER; -- Текущий месяц NCURMONTH PKG_STD.TNUMBER; -- Текущий месяц
NTOTALDAYS PKG_STD.tNUMBER; -- Дней в текущем месяце NTOTALDAYS PKG_STD.TNUMBER; -- Дней в текущем месяце
SCURTECHOBJ PKG_STD.TSTRING := null; -- Текущий технический объект SCURTECHOBJ PKG_STD.TSTRING := null; -- Текущий технический объект
SCURTSKCODE PKG_STD.TSTRING := null; -- Текущий вид ремонта SCURTSKCODE PKG_STD.TSTRING := null; -- Текущий вид ремонта
NFROMDATE date := TO_DATE('01.' NFROMDATE PKG_STD.TLDATE; -- Дата начала периода
|| LPAD(TO_CHAR(NFROMMONTH), 2, '0') NTODATE PKG_STD.TLDATE; -- Дата конца периода
|| '.' || TO_CHAR(NFROMYEAR), NMS PKG_STD.TNUMBER; -- Месяц начала в цикле года
'dd.mm.yyyy'); -- Дата начала периода NME PKG_STD.TNUMBER; -- Месяц окончания в цикле года
NTODATE date := LAST_DAY(TO_DATE('01.' NYEAR_PLAN PKG_STD.TNUMBER; -- Год план
|| LPAD(TO_CHAR(NTOMONTH), 2, '0') NMONTH_PLAN PKG_STD.TNUMBER; -- Месяц план
|| '.' || TO_CHAR(NTOYEAR), NDAY_PLAN PKG_STD.TNUMBER; -- День план
'dd.mm.yyyy')); -- Дата конца периода NYEAR_FACT PKG_STD.TNUMBER; -- Год факт
NMS PKG_STD.tNUMBER; -- Месяц начала в цикле года NMONTH_FACT PKG_STD.TNUMBER; -- Месяц факт
NME PKG_STD.tNUMBER; -- Месяц окончания в цикле года NDAY_FACT 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; -- Имя периода SPERIODNAME PKG_STD.TSTRING; -- Имя периода
SFACT_CLR PKG_STD.TSTRING; -- Цвет закрашивания фактических дат SFACT_CLR PKG_STD.TSTRING; -- Цвет закрашивания фактических дат
NROWS PKG_STD.tNUMBER := 0; -- Кол-во строк в курсоре NROWS PKG_STD.TNUMBER := 0; -- Кол-во строк в курсоре
NWORKPERDAY PKG_STD.tNUMBER(17,2) := null; -- Работы в день NWORKPERDAY PKG_STD.TNUMBER(17,2) := null; -- Работы в день
CR PKG_STD.TSTRING; SGROUP_FILLED PKG_STD.TLSTRING; -- Группы, заполненные строками план/факт
SGROUP_FILLED PKG_STD.tLSTRING; -- Группы, заполненные строками план/факт SCOLS PKG_STD.TLSTRING; -- Заполнение периодов работ
SCOLS PKG_STD.tLSTRING; -- Заполнение периодов работ YM PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для подсчёта работ за месяц
YM PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для подсчёта работ за месяц MCLR PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция для закрашивания месяцев
MCLR PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для закрашивания месяцев CR PKG_STD.TSTRING; -- Текущий ключ коллекции MCLR
/* Курсор с работами ТОиР */
cursor C1 is cursor C1 is
select TT.NEQV_RN, select TT.NEQV_RN,
TT.NEQS_RN, TT.NEQS_RN,
TT.NWRK_RN NRN, TT.NWRK_RN NRN,
TT.COMPANY NCOMPANY, TT.COMPANY NCOMPANY,
TT.NAME_WORK SWORKNAME, TT.NAME_WORK SWORKNAME,
EC2.CODE STECHOBJCODE, EC2.CODE STECHOBJCODE,
@ -135,63 +270,60 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
EQJ.DATEFACT_END DDATEFACTEND, EQJ.DATEFACT_END DDATEFACTEND,
EK.CODE STECSRVKINDCODE, EK.CODE STECSRVKINDCODE,
EK.NAME STECSRVKINDNAME, EK.NAME STECSRVKINDNAME,
coalesce(EW.NSUM, COALESCE(EW.NSUM, (TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN,
(TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN, COALESCE(EWJ.NSUMF, (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT
coalesce(EWJ.NSUMF, from (select B.*,
(EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT C.RN NWRK_RN,
from C.PRN NWRK_PRN,
(select B.*, C.NAME_WORK,
C.RN nWRK_RN, C.DATEPLAN_BEG,
C.PRN nWRK_PRN, C.DATEPLAN_END,
C.NAME_WORK, C.TECSRVKIND,
C.DATEPLAN_BEG, C.EQCONFIG,
C.DATEPLAN_END, C.DEPTPERF,
C.TECSRVKIND, C.DEPTTCSRV,
C.EQCONFIG, C.RESP_AGN
C.DEPTPERF, from (select EQV.RN NEQV_RN,
C.DEPTTCSRV, EQV.COMPANY,
C.RESP_AGN EQV.JUR_PERS,
from (select EQV.RN nEQV_RN, EQV.STATE,
EQV.COMPANY, EQV.DATEPRD_BEG,
EQV.JUR_PERS, EQV.DATEPRD_END,
EQV.STATE, EQS.RN NEQS_RN
EQV.DATEPRD_BEG, from EQTCHSRV EQV,
EQV.DATEPRD_END, DOCLINKS DL,
EQS.RN nEQS_RN EQRPSHEETS EQS
from EQTCHSRV EQV, -- Графики ТОиР where EQV.RN = DL.IN_DOCUMENT(+)
DOCLINKS DL, and DL.OUT_UNITCODE(+) = 'EquipRepairSheets'
EQRPSHEETS EQS -- Ремонтные ведомости and DL.OUT_DOCUMENT = EQS.RN(+)) B,
where EQV.RN = DL.IN_DOCUMENT (+)
and DL.OUT_UNITCODE (+) = 'EquipRepairSheets'
and DL.OUT_DOCUMENT = EQS.RN (+)) B,
EQTCHSRWRK C EQTCHSRWRK C
where B.nEQV_RN = C.PRN (+) where B.NEQV_RN = C.PRN(+)
union all union all
select B.*, select B.*,
C.RN nWRK_RN, C.RN NWRK_RN,
C.PRN nWRK_PRN, C.PRN NWRK_PRN,
C.NAME_WORK, C.NAME_WORK,
C.DATEPLAN_BEG, C.DATEPLAN_BEG,
C.DATEPLAN_END, C.DATEPLAN_END,
C.TECSRVKIND, C.TECSRVKIND,
C.EQCONFIG, C.EQCONFIG,
C.DEPTPERF, C.DEPTPERF,
null DEPTTCSRV, null DEPTTCSRV,
C.RESP_AGN C.RESP_AGN
from (select null nEQV_RN, from (select null NEQV_RN,
EQS.COMPANY, EQS.COMPANY,
EQS.JURPERSONS JUR_PERS, EQS.JURPERSONS JUR_PERS,
EQS.STATE, EQS.STATE,
EQS.DATEPLAN_BEG, EQS.DATEPLAN_BEG,
EQS.DATEPLAN_END, EQS.DATEPLAN_END,
EQS.RN nEQS_RN EQS.RN NEQS_RN
from EQRPSHEETS EQS -- Ремонтные ведомости from EQRPSHEETS EQS
where not exists (select 1 where not exists (select 1
from DOCLINKS DL from DOCLINKS DL
where DL.OUT_DOCUMENT = EQS.RN where DL.OUT_DOCUMENT = EQS.RN
and DL.IN_UNITCODE = 'EquipTechServices')) B, and DL.IN_UNITCODE = 'EquipTechServices')) B,
EQRPSHWRK C EQRPSHWRK C
where B.nEQS_RN = C.PRN (+)) TT, where B.NEQS_RN = C.PRN(+)) TT,
EQTECSRVKIND EK, EQTECSRVKIND EK,
JURPERSONS JP, JURPERSONS JP,
EQCONFIG EC1, EQCONFIG EC1,
@ -200,49 +332,55 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
INS_DEPARTMENT DR, INS_DEPARTMENT DR,
DOCLINKS DL, DOCLINKS DL,
EQTECSRVJRNL EQJ, EQTECSRVJRNL EQJ,
(select t.prn, (select T.PRN,
sum(t.Worktimeplan * t.perform_quant) NSUM sum(T.WORKTIMEPLAN * T.PERFORM_QUANT) NSUM
from EQTCHSRWRC t from EQTCHSRWRC T
group by t.prn) EW, group by T.PRN) EW,
(select t.prn, (select T.PRN,
sum(t.worktimefact * t.quantfact) NSUMF sum(T.WORKTIMEFACT * T.QUANTFACT) NSUMF
from EQTCHSRJRNLWRC t from EQTCHSRJRNLWRC T
group by t.prn) EWJ group by T.PRN) EWJ
where TT.COMPANY = NCOMPANY where TT.COMPANY = NCOMPANY
and ((TT.state in (1,2) and nEQV_RN is not null) or (TT.state in (0,2,3) and nEQV_RN is null)) and ((TT.STATE in (1, 2) and NEQV_RN is not null) or (TT.STATE in (0, 2, 3) and NEQV_RN is null))
and TT.DATEPRD_BEG >= NFROMDATE and TT.DATEPRD_BEG >= NFROMDATE
and TT.DATEPRD_END <= NTODATE and TT.DATEPRD_END <= NTODATE
and JP.CODE = SBELONG and JP.CODE = SBELONG
and EC1.CODE = SPRODOBJ and EC1.CODE = SPRODOBJ
and (DS.CODE = STECHSERV or STECHSERV is null) and (DS.CODE = STECHSERV or STECHSERV is null)
and (DR.CODE = SRESPDEP or SRESPDEP is null) and (DR.CODE = SRESPDEP or SRESPDEP is null)
and TT.EQCONFIG = EC2.RN (+) and TT.EQCONFIG = EC2.RN(+)
and TT.DEPTPERF = DR.RN (+) and TT.DEPTPERF = DR.RN(+)
and TT.DEPTTCSRV = DS.RN (+) and TT.DEPTTCSRV = DS.RN(+)
and TT.NWRK_RN = EW.PRN (+) and TT.NWRK_RN = EW.PRN(+)
and EQJ.RN = EWJ.PRN (+) and EQJ.RN = EWJ.PRN(+)
and TT.TECSRVKIND = EK.RN (+) and TT.TECSRVKIND = EK.RN(+)
and TT.NWRK_RN = DL.IN_DOCUMENT (+) 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_UNITCODE = 'EquipTechServiceJournal' and DL.RN is not null) or
and DL.OUT_DOCUMENT = EQJ.RN (+) (DL.OUT_UNITCODE is null and DL.RN is null))
order by EC2.NAME, EK.CODE; and DL.OUT_DOCUMENT = EQJ.RN(+)
order by EC2.NAME,
EK.CODE;
begin 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.TDATA_GRID_MAKE(); RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
/* Формируем структуру заголовка */ /* Формируем структуру заголовка */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'STEST', SNAME => 'STEST',
SCAPTION => 'ТЕСТ', SCAPTION => 'ТЕСТ',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SINFO', SNAME => 'SINFO',
SCAPTION => 'Информация', SCAPTION => 'Объект ремонта',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SINFO2', SNAME => 'SINFO2',
SCAPTION => 'Объект ремонта', SCAPTION => 'Объект ремонта',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
SPARENT => 'SINFO'); SPARENT => 'SINFO');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NRN', SNAME => 'NRN',
SCAPTION => 'Рег. номер', SCAPTION => 'Рег. номер',
@ -317,15 +455,15 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
SNAME => 'STECSRVKINDNAME', SNAME => 'STECSRVKINDNAME',
SCAPTION => 'Наименование типа работы', SCAPTION => 'Наименование типа работы',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => false); BVISIBLE => false);
/* Очистка коллекций */ /* Очистка коллекций */
PKG_CONTVALLOC1S.PURGE(YM); PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM);
PKG_CONTVALLOC1S.PURGE(MCLR); PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR);
/* Текущий год */
NCURYEAR := EXTRACT(year from sysdate); NCURYEAR := EXTRACT(year from sysdate);
NCURMONTH := EXTRACT(month from sysdate); /* Текущий месяц */
NCURMONTH := EXTRACT(month from sysdate);
/* Цикл по годам периода */ /* Цикл по годам периода */
for Y in NFROMYEAR .. NTOYEAR for Y in NFROMYEAR .. NTOYEAR
loop loop
if (NFROMYEAR = NTOYEAR) then if (NFROMYEAR = NTOYEAR) then
@ -335,220 +473,249 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
if (Y = NFROMYEAR) then if (Y = NFROMYEAR) then
NMS := NFROMMONTH; NMS := NFROMMONTH;
NME := 12; NME := 12;
elsif (NFROMYEAR < Y and Y < NTOYEAR) then elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then
NMS := 1; NMS := 1;
NME := 12; NME := 12;
elsif (Y = NTOYEAR) then elsif (Y = NTOYEAR) then
NMS := 1; NMS := 1;
NME := NTOMONTH; NME := NTOMONTH;
end if; end if;
end if; end if;
/* Цикл по месяцам года */ /* Цикл по месяцам года */
for M in NMS .. NME for M in NMS .. NME
loop loop
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', NVALUE => 0);
PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', 0); PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', NVALUE => 0);
PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', 0); /* Находим текущий месяц и делаем его развёрнутым по дням */
if ((Y = NCURYEAR) and (M = NCURMONTH)) then
if (Y = NCURYEAR and M = NCURMONTH) then
BEXPANDED := true; BEXPANDED := true;
else else
BEXPANDED := false; BEXPANDED := false;
end if; end if;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M),
SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M), SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y),
SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y), SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BEXPANDABLE => true, BEXPANDABLE => true,
BEXPANDED => BEXPANDED); 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'); /* Подсчёт кол-ва дней в месяце */
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 for D in 1 .. NTOTALDAYS
loop loop
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || TO_CHAR(D), SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' ||
TO_CHAR(D),
SCAPTION => TO_CHAR(D, '99'), SCAPTION => TO_CHAR(D, '99'),
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
SPARENT => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M)); SPARENT => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M));
end loop; end loop;
end loop; end loop;
end loop; end loop;
/* Подсчёт кол-ва записей в курсоре */
/* Подсчёт кол-ва записей в курсоре */
for Q1 in C1 for Q1 in C1
loop loop
NROWS := NROWS + 1; NROWS := NROWS + 1;
end loop; end loop;
/* Цикл по курсору */ /* Цикл по курсору */
for QQ in C1 for QQ in C1
loop loop
NROWS := NROWS - 1; NROWS := NROWS - 1;
if (SCURTECHOBJ != QQ.STECHOBJNAME or SCURTECHOBJ is null) then /* Если новый объект ремонта */
if ((SCURTECHOBJ != QQ.STECHOBJNAME) or (SCURTECHOBJ is null)) then
/* Если строка с трудоёмкостью по объекту ремонта сформирована */
if (RDG_ROW0.RCOLS is not null) then if (RDG_ROW0.RCOLS is not null) then
/* Цикл по годам периода */ /* Цикл по годам периода */
for Y in NFROMYEAR .. NTOYEAR for Y in NFROMYEAR .. NTOYEAR
loop loop
/* Если отчёт в пределах года */
if (NFROMYEAR = NTOYEAR) then if (NFROMYEAR = NTOYEAR) then
NMS := NFROMMONTH; NMS := NFROMMONTH;
NME := NTOMONTH; NME := NTOMONTH;
/* Иначе вычисляем кол-во месяцев в каждом году периода отчёта*/
else else
if (Y = NFROMYEAR) then if (Y = NFROMYEAR) then
NMS := NFROMMONTH; NMS := NFROMMONTH;
NME := 12; NME := 12;
elsif (NFROMYEAR < Y and Y < NTOYEAR) then elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then
NMS := 1; NMS := 1;
NME := 12; NME := 12;
elsif (Y = NTOYEAR) then elsif (Y = NTOYEAR) then
NMS := 1; NMS := 1;
NME := NTOMONTH; NME := NTOMONTH;
end if; end if;
end if; end if;
/* Цикл по месяцам года, заполнение трудоёмкости с привязкой к месяцу */
/* Цикл по месяцам года */
for M in NMS .. NME for M in NMS .. NME
loop loop
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
SNAME => SPERIODNAME, SNAME => SPERIODNAME,
SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); SVALUE => 'план: ' ||
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', 0); HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) ||
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', 0); ' факт: ' ||
end loop; HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F')));
/* Добавление в коллекцию трудоёмкость план */
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P', NVALUE => 0);
/* Добавление в коллекцию трудоёмкость факт */
PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F', NVALUE => 0);
end loop;
end loop; end loop;
/* Добавление строки с трудоёмкостью */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
end if; end if;
SCURTECHOBJ := QQ.STECHOBJNAME; /* Добавление группы с объектом ремонта */
SCURTECHOBJ := QQ.STECHOBJNAME;
SPRJ_GROUP_NAME := SCURTECHOBJ; SPRJ_GROUP_NAME := SCURTECHOBJ;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG,
SNAME => SPRJ_GROUP_NAME, SNAME => SPRJ_GROUP_NAME,
SCAPTION => QQ.STECHOBJNAME, SCAPTION => QQ.STECHOBJNAME,
BEXPANDABLE => false); BEXPANDABLE => false);
RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ);
end if; end if;
/* Формируем имя группы для вида ремонта */ /* Формируем имя группы для вида ремонта */
SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE; SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE;
/* Если по данной группе еще нет строк плана и факта */ /* Если по данной группе еще нет строк плана и факта */
if (STRIN(sSUBSTR => SCURTSKCODE, sSOURCE => SGROUP_FILLED, sDELIM => ';') = 0) then if (STRIN(SSUBSTR => SCURTSKCODE, SSOURCE => SGROUP_FILLED, SDELIM => ';') = 0) then
/* Добавляем строку плана */ /* Добавляем строку плана */
if (RDG_ROW.RCOLS is not null) then if (RDG_ROW.RCOLS is not null) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end if; end if;
/* Добавляем строку факта */ /* Добавляем строку факта */
if (RDG_ROW2.RCOLS is not null) then if (RDG_ROW2.RCOLS is not null) then
CR := PKG_CONTVALLOC1S.FIRST_(MCLR); CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
/* Цикл по коллекции для закрашивания месяцев */ /* Цикл по коллекции для закрашивания месяцев */
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
loop loop
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2,
CR := PKG_CONTVALLOC1S.NEXT_(MCLR, CR); SNAME => CR,
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
end loop; end loop;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
end if; end if;
PKG_CONTVALLOC1S.PURGE(MCLR); PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR);
/* Добвим группу для вида ремонта */ /* Добвим группу для вида ремонта */
SPRJ_GROUP_NAME := SCURTSKCODE; SPRJ_GROUP_NAME := SCURTSKCODE;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG,
SNAME => SPRJ_GROUP_NAME, SNAME => SPRJ_GROUP_NAME,
SCAPTION => QQ.STECSRVKINDCODE, SCAPTION => QQ.STECSRVKINDCODE,
BEXPANDABLE => false); BEXPANDABLE => false);
RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); /* Строка плана */
RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STEST', SVALUE => QQ.STECSRVKINDCODE); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STEST', SVALUE => QQ.STECSRVKINDCODE);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План'); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SINFO2', SVALUE => 'План');
RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); /* Строка факта */
RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SINFO2', SVALUE => 'Факт'); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SINFO2', SVALUE => 'Факт');
/* Добавляем в заполненные группы */ /* Добавляем в заполненные группы */
SGROUP_FILLED := SGROUP_FILLED || SPRJ_GROUP_NAME || ';'; SGROUP_FILLED := SGROUP_FILLED || SPRJ_GROUP_NAME || ';';
end if; end if;
/* Плановые работы */ /* Плановые работы */
if (QQ.NEQV_RN is not null) then if (QQ.NEQV_RN is not null) then
for x in 0 .. trunc(QQ.DDATEPLANEND) - trunc(QQ.DDATEPLANBEG) /* Цикл по периоду */
for X in 0 .. TRUNC(QQ.DDATEPLANEND) - TRUNC(QQ.DDATEPLANBEG)
loop loop
NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + x); NYEAR_PLAN := EXTRACT(year from QQ.DDATEPLANBEG + X);
NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + x); NMONTH_PLAN := EXTRACT(month from QQ.DDATEPLANBEG + X);
NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + x); NDAY_PLAN := EXTRACT(day from QQ.DDATEPLANBEG + X);
/* Если первый день периода */
if (x = 0) then if (X = 0) then
SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || NMONTH_PLAN; SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || NMONTH_PLAN;
/* Подсчёт трудоёмкости за месяц */
if (QQ.NSUMWORKPLAN is not null) then if (QQ.NSUMWORKPLAN is not null) then
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P') + QQ.NSUMWORKPLAN); PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_P',
NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P') +
QQ.NSUMWORKPLAN);
end if; end if;
/* Закрашивание месяца плана синим */
if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;';
end if; end if;
end if; end if;
SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || TO_CHAR(NMONTH_PLAN) || '_' || TO_CHAR(NDAY_PLAN); SPERIODNAME := '_' || TO_CHAR(NYEAR_PLAN) || '_' || TO_CHAR(NMONTH_PLAN) || '_' || TO_CHAR(NDAY_PLAN);
if (STRIN(sSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', sSOURCE => SCOLS, sDELIM => ';') = 0) then /* Закрашивание дня плана синим */
if (STRIN(SSUBSTR => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SSOURCE => SCOLS, SDELIM => ';') = 0) then
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;';
end if; end if;
end loop; end loop;
end if; end if;
/* Фактические и внеплановые работы */ /* Фактические и внеплановые работы */
if (QQ.DDATEFACTEND is not null and QQ.DDATEFACTBEG is not null) then if ((QQ.DDATEFACTEND is not null) and (QQ.DDATEFACTBEG is not null)) then
if (QQ.nEQV_RN is not null) then /* Фактические - зелёный, внеплановые - красный */
if (QQ.NEQV_RN is not null) then
SFACT_CLR := 'green'; SFACT_CLR := 'green';
else else
SFACT_CLR := 'red'; SFACT_CLR := 'red';
end if; end if;
NWORKPERDAY := null; NWORKPERDAY := null;
/* Если период не в одном месяце, то считаем трудоёмкость в день */
if (EXTRACT(month from QQ.DDATEFACTBEG) != EXTRACT(month from QQ.DDATEFACTEND)) then if (EXTRACT(month from QQ.DDATEFACTBEG) != EXTRACT(month from QQ.DDATEFACTEND)) then
NWORKPERDAY := QQ.NSUMWORKFACT/(round(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1); NWORKPERDAY := QQ.NSUMWORKFACT / (ROUND(QQ.DDATEFACTEND - QQ.DDATEFACTBEG) + 1);
NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG); NCURMONTH := EXTRACT(month from QQ.DDATEFACTBEG);
end if; end if;
/* Цикл по периоду */
for x in 0 .. trunc(QQ.DDATEFACTEND) - trunc(QQ.DDATEFACTBEG) for X in 0 .. TRUNC(QQ.DDATEFACTEND) - TRUNC(QQ.DDATEFACTBEG)
loop loop
NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + x); NYEAR_FACT := EXTRACT(year from QQ.DDATEFACTBEG + X);
NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + x); NMONTH_FACT := EXTRACT(month from QQ.DDATEFACTBEG + X);
NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + x); NDAY_FACT := EXTRACT(day from QQ.DDATEFACTBEG + X);
/* Если первый день периода или следующий месяц периода */
if (x = 0 or NCURMONTH != NMONTH_FACT) then if ((X = 0) or (NCURMONTH != NMONTH_FACT)) then
/* Обновляется текущий месяц */
if (NCURMONTH != NMONTH_FACT) then if (NCURMONTH != NMONTH_FACT) then
NCURMONTH := NMONTH_FACT; NCURMONTH := NMONTH_FACT;
end if; end if;
SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || NMONTH_FACT; SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || NMONTH_FACT;
/* Подсчёт трудоёмкости за месяц если период в одном месяце */
if (QQ.NSUMWORKFACT is not null and NWORKPERDAY is null) then if ((QQ.NSUMWORKFACT is not null) and (NWORKPERDAY is null)) then
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + QQ.NSUMWORKFACT); PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_F',
NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') +
QQ.NSUMWORKFACT);
end if; end if;
/* Добавление в коллекцию окрашивания месяца */ /* Добавление в коллекцию окрашивания месяца */
if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR);
else else
/* Если второй цвет для месяца */
if (STRIN(trim(SFACT_CLR), trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME))) = 0) then if (STRIN(trim(SFACT_CLR), trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME))) = 0) then
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME) || ' ' || SFACT_CLR); PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR,
SROWID => SPERIODNAME,
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => SPERIODNAME) || ' ' ||
SFACT_CLR);
end if; end if;
end if; end if;
end if; end if;
/* Подсчёт трудоёмкости за месяц если период не в одном месяце */
if (NWORKPERDAY is not null) then if (NWORKPERDAY is not null) then
PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + NWORKPERDAY); PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_F',
NVALUE => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, SROWID => SPERIODNAME || '_F') +
NWORKPERDAY);
end if; end if;
SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || TO_CHAR(NMONTH_FACT) || '_' || TO_CHAR(NDAY_FACT); SPERIODNAME := '_' || TO_CHAR(NYEAR_FACT) || '_' || TO_CHAR(NMONTH_FACT) || '_' || TO_CHAR(NDAY_FACT);
/* Добавление окрашивания дней факта */ /* Добавление в коллекцию окрашивания дней факта */
if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => MCLR, SROWID => SPERIODNAME) = false) then
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); PKG_CONTVALLOC1S.PUTS(RCONTAINER => MCLR, SROWID => SPERIODNAME, SVALUE => SFACT_CLR);
else else
if (trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME)) = 'green' and trim(SFACT_CLR) = 'red') then /* Если второй цвет для месяца */
PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); 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 if; end if;
end loop; end loop;
end if; end if;
if ((RDG_ROW0.RCOLS is not null) and (NROWS = 0)) then
if (RDG_ROW0.RCOLS is not null and NROWS = 0) then /* Цикл по годам периода */
/* Цикл по годам периода */
for Y in NFROMYEAR .. NTOYEAR for Y in NFROMYEAR .. NTOYEAR
loop loop
if (NFROMYEAR = NTOYEAR) then if (NFROMYEAR = NTOYEAR) then
@ -558,45 +725,51 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
if (Y = NFROMYEAR) then if (Y = NFROMYEAR) then
NMS := NFROMMONTH; NMS := NFROMMONTH;
NME := 12; NME := 12;
elsif (NFROMYEAR < Y and Y < NTOYEAR) then elsif ((NFROMYEAR < Y) and (Y < NTOYEAR)) then
NMS := 1; NMS := 1;
NME := 12; NME := 12;
elsif (Y = NTOYEAR) then elsif (Y = NTOYEAR) then
NMS := 1; NMS := 1;
NME := NTOMONTH; NME := NTOMONTH;
end if; end if;
end if; end if;
/* Цикл по месяцам года */ /* Цикл по месяцам года */
for M in NMS .. NME for M in NMS .. NME
loop loop
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
SNAME => SPERIODNAME, SNAME => SPERIODNAME,
SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); SVALUE => 'план: ' ||
end loop; HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_P')) ||
' факт: ' ||
HOURS_STR(NHOURS => PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_F')));
end loop;
end loop; end loop;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
end if; end if;
/* План для последней записи */ /* План для последней записи */
if (RDG_ROW.RCOLS is not null and NROWS = 0) then if ((RDG_ROW.RCOLS is not null) and (NROWS = 0)) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end if; end if;
/* Факт для последней записи */ /* Факт для последней записи */
if (RDG_ROW2.RCOLS is not null and NROWS = 0) then if ((RDG_ROW2.RCOLS is not null) and (NROWS = 0)) then
CR := PKG_CONTVALLOC1S.FIRST_(MCLR); CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
loop loop
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2,
CR := PKG_CONTVALLOC1S.NEXT_(MCLR, cr); SNAME => CR,
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
end loop; end loop;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
end if; end if;
end loop; end loop;
/* Сериализуем описание */ /* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
PKG_CONTVALLOC1S.PURGE(YM); PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM);
end EQUIPSRV_GRID; end EQUIPSRV_GRID;
end PKG_P8PANELS_EQUIPSRV; end PKG_P8PANELS_EQUIPSRV;
/ /