create or replace package PKG_P8PANELS_EQUIPSRV as /* Получение значения системного параметра "JuridicalPerson" */ procedure GET_JUR_PERS_PRM ( CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) ); function HOURS_STR ( NHOURS in number -- Кол-во часов ) return varchar2; /* Выполнение работ по ТОиР */ procedure EQUIPSRV_GRID ( SBELONG in varchar2, -- Принадлежность к Юр. лицу SPRODOBJ in varchar2, -- Производственный объект STECHSERV in varchar2, -- Техническая служба SRESPDEP in varchar2, -- Ответственное подразделение 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 /* Получение значения системного параметра "JuridicalPerson" */ procedure GET_JUR_PERS_PRM ( CRES out clob -- Значение параметра "JuridicalPerson" (null - если не нашли) ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации SPARAMCODE PKG_STD.TSTRING := 'JuridicalPerson'; -- Код параметра begin CRES := GET_OPTIONS_STR(SCODE => SPARAMCODE, NCOMP_VERS => NCOMPANY); if (CRES is null) then P_EXCEPTION(0, 'Пользовательский параметр не указан.'); end if; end GET_JUR_PERS_PRM; /* Формирование строки с кол-вом часов */ function HOURS_STR ( NHOURS in number -- Кол-во часов ) return varchar2 -- Строка с кол-вом часов is SRESULT PKG_STD.tSTRING; -- Строка результат begin if (MOD(NHOURS, 10) = 1 and MOD(NHOURS, 100) != 11) then SRESULT := NHOURS || ' час'; elsif ((MOD(NHOURS, 10) = 2 and MOD(NHOURS, 100) != 12) or (MOD(NHOURS, 10) = 3 and MOD(NHOURS, 100) != 13) or (MOD(NHOURS, 10) = 4 and MOD(NHOURS, 100) != 14)) then SRESULT := NHOURS || ' часа'; else SRESULT := NHOURS || ' часов'; end if; /* Возвращаем результат */ return SRESULT; end HOURS_STR; /* Выполнение работ по ТОиР */ procedure EQUIPSRV_GRID ( SBELONG in varchar2, -- Принадлежность к Юр. лицу SPRODOBJ in varchar2, -- Производственный объект STECHSERV in varchar2, -- Техническая служба SRESPDEP in varchar2, -- Ответственное подразделение 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.TDATA_GRID; -- Описание таблицы RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0 RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2 NCURYEAR PKG_STD.tNUMBER; -- Текущий год NCURMONTH PKG_STD.tNUMBER; -- Текущий месяц NTOTALDAYS PKG_STD.tNUMBER; -- Дней в текущем месяце SCURTECHOBJ PKG_STD.TSTRING := null; -- Текущий технический объект SCURTSKCODE PKG_STD.TSTRING := null; -- Текущий вид ремонта NFROMDATE date := TO_DATE('01.' || LPAD(TO_CHAR(NFROMMONTH), 2, '0') || '.' || TO_CHAR(NFROMYEAR), 'dd.mm.yyyy'); -- Дата начала периода NTODATE date := LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(NTOMONTH), 2, '0') || '.' || TO_CHAR(NTOYEAR), 'dd.mm.yyyy')); -- Дата конца периода 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; -- Работы в день CR PKG_STD.TSTRING; SGROUP_FILLED PKG_STD.tLSTRING; -- Группы, заполненные строками план/факт SCOLS PKG_STD.tLSTRING; -- Заполнение периодов работ YM PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для подсчёта работ за месяц MCLR PKG_CONTVALLOC1S.tCONTAINER; -- Коллекция для закрашивания месяцев cursor C1 is select TT.NEQV_RN, TT.NEQS_RN, TT.NWRK_RN NRN, TT.COMPANY NCOMPANY, TT.NAME_WORK SWORKNAME, EC2.CODE STECHOBJCODE, EC2.NAME STECHOBJNAME, JP.CODE SBELONG, EC1.CODE SPRODOBJ, DS.CODE STECHSERV, DR.CODE SRESPDEP, TT.DATEPRD_BEG DDATEPLANBEG, TT.DATEPRD_END DDATEPLANEND, EQJ.DATEFACT_BEG DDATEFACTBEG, EQJ.DATEFACT_END DDATEFACTEND, EK.CODE STECSRVKINDCODE, EK.NAME STECSRVKINDNAME, coalesce(EW.NSUM, (TT.DATEPRD_END - TT.DATEPRD_BEG) * 24) NSUMWORKPLAN, coalesce(EWJ.NSUMF, (EQJ.DATEFACT_END - EQJ.DATEFACT_BEG) * 24) NSUMWORKFACT from (select B.*, C.RN nWRK_RN, C.PRN nWRK_PRN, C.NAME_WORK, C.DATEPLAN_BEG, C.DATEPLAN_END, C.TECSRVKIND, C.EQCONFIG, C.DEPTPERF, C.DEPTTCSRV, C.RESP_AGN from (select EQV.RN nEQV_RN, EQV.COMPANY, EQV.JUR_PERS, EQV.STATE, EQV.DATEPRD_BEG, EQV.DATEPRD_END, EQS.RN nEQS_RN from EQTCHSRV EQV, -- Графики ТОиР DOCLINKS DL, EQRPSHEETS EQS -- Ремонтные ведомости where 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.*, C.RN nWRK_RN, C.PRN nWRK_PRN, C.NAME_WORK, C.DATEPLAN_BEG, C.DATEPLAN_END, C.TECSRVKIND, C.EQCONFIG, C.DEPTPERF, null DEPTTCSRV, C.RESP_AGN from (select null nEQV_RN, EQS.COMPANY, EQS.JURPERSONS JUR_PERS, EQS.STATE, EQS.DATEPLAN_BEG, EQS.DATEPLAN_END, EQS.RN nEQS_RN from EQRPSHEETS EQS -- Ремонтные ведомости where not exists (select 1 from DOCLINKS DL where DL.OUT_DOCUMENT = EQS.RN and DL.IN_UNITCODE = 'EquipTechServices')) 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, sum(t.Worktimeplan * t.perform_quant) NSUM from EQTCHSRWRC t group by t.prn) EW, (select t.prn, sum(t.worktimefact * t.quantfact) NSUMF from EQTCHSRJRNLWRC t group by t.prn) EWJ 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.DATEPRD_BEG >= NFROMDATE and TT.DATEPRD_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.EQCONFIG = EC2.RN (+) and TT.DEPTPERF = DR.RN (+) and TT.DEPTTCSRV = DS.RN (+) and TT.NWRK_RN = EW.PRN (+) and EQJ.RN = EWJ.PRN (+) and TT.TECSRVKIND = 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 /* Инициализируем таблицу данных */ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); /* Формируем структуру заголовка */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STEST', SCAPTION => 'ТЕСТ', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SINFO', SCAPTION => 'Информация', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SINFO2', SCAPTION => 'Объект ремонта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SPARENT => 'SINFO'); 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 => 'SWORKNAME', SCAPTION => 'Наименование работы', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STECHOBJCODE', SCAPTION => 'Код тех. объекта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STECHOBJNAME', SCAPTION => 'Наименование тех. объекта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SBELONG', SCAPTION => 'Принадлежность', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SPRODOBJ', SCAPTION => 'Производственный объект', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STECHSERV', SCAPTION => 'Тех. служба', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SRESPDEP', SCAPTION => 'Отвественное подразделение', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STECSERVCODE', SCAPTION => 'Вид ремонта', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DDATEPLANBEG', SCAPTION => 'Начало работы (план)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DDATEPLANEND', SCAPTION => 'Окончание работы (план)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DDATEFACTBEG', SCAPTION => 'Начало работы (факт)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DDATEFACTEND', SCAPTION => 'Окончание работы (факт)', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STECSRVKINDCODE', SCAPTION => 'Код типа работы', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'STECSRVKINDNAME', SCAPTION => 'Наименование типа работы', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BVISIBLE => false); /* Очистка коллекций */ PKG_CONTVALLOC1S.PURGE(YM); PKG_CONTVALLOC1S.PURGE(MCLR); 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(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_P', 0); PKG_CONTVALLOC1S.PUTN(YM, '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_F', 0); if (Y = NCURYEAR and M = NCURMONTH) then BEXPANDED := true; else BEXPANDED := false; end if; PKG_P8PANELS_VISUAL.TDATA_GRID_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.TDATA_GRID_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_ROW0.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.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => SPERIODNAME, SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_P', 0); PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', 0); end loop; end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); end if; SCURTECHOBJ := QQ.STECHOBJNAME; SPRJ_GROUP_NAME := SCURTECHOBJ; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, SNAME => SPRJ_GROUP_NAME, SCAPTION => QQ.STECHOBJNAME, BEXPANDABLE => false); RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'STEST', SVALUE => SCURTECHOBJ); end if; /* Формируем имя группы для вида ремонта */ SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE; /* Если по данной группе еще нет строк плана и факта */ if (STRIN(sSUBSTR => SCURTSKCODE, sSOURCE => SGROUP_FILLED, sDELIM => ';') = 0) then /* Добавляем строку плана */ if (RDG_ROW.RCOLS is not null) then PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; /* Добавляем строку факта */ if (RDG_ROW2.RCOLS is not null) then CR := PKG_CONTVALLOC1S.FIRST_(MCLR); /* Цикл по коллекции для закрашивания месяцев */ for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) loop PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); CR := PKG_CONTVALLOC1S.NEXT_(MCLR, CR); end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); end if; PKG_CONTVALLOC1S.PURGE(MCLR); /* Добвим группу для вида ремонта */ SPRJ_GROUP_NAME := SCURTSKCODE; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, SNAME => SPRJ_GROUP_NAME, SCAPTION => QQ.STECSRVKINDCODE, BEXPANDABLE => false); 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 => 'SINFO2', SVALUE => 'План'); RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SINFO2', SVALUE => 'Факт'); /* Добавляем в заполненные группы */ SGROUP_FILLED := SGROUP_FILLED || SPRJ_GROUP_NAME || ';'; 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(YM, SPERIODNAME || '_P', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P') + QQ.NSUMWORKPLAN); end if; 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'); SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; end if; end if; 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 PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue'); SCOLS := SCOLS || SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN;'; 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(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F') + QQ.NSUMWORKFACT); end if; /* Добавление в коллекцию окрашивания месяца */ if (PKG_CONTVALLOC1S.EXISTS_(rCONTAINER => MCLR, sROWID => SPERIODNAME) = false) then PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); else 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); end if; end if; end if; if (NWORKPERDAY is not null) then PKG_CONTVALLOC1S.PUTN(YM, SPERIODNAME || '_F', PKG_CONTVALLOC1S.GETN(YM, 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(MCLR, SPERIODNAME, SFACT_CLR); else if (trim(PKG_CONTVALLOC1S.GETS(MCLR, SPERIODNAME)) = 'green' and trim(SFACT_CLR) = 'red') then PKG_CONTVALLOC1S.PUTS(MCLR, SPERIODNAME, SFACT_CLR); end if; end if; end loop; end if; if (RDG_ROW0.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.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => SPERIODNAME, SVALUE => 'план: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_P')) || ' факт: ' || HOURS_STR(PKG_CONTVALLOC1S.GETN(YM, SPERIODNAME || '_F'))); end loop; end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0); end if; /* План для последней записи */ if (RDG_ROW.RCOLS is not null and NROWS = 0) then PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; /* Факт для последней записи */ if (RDG_ROW2.RCOLS is not null and NROWS = 0) then CR := PKG_CONTVALLOC1S.FIRST_(MCLR); for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(MCLR) loop PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => CR, SVALUE => PKG_CONTVALLOC1S.GETS(MCLR, CR)); CR := PKG_CONTVALLOC1S.NEXT_(MCLR, cr); end loop; PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2); end if; end loop; /* Сериализуем описание */ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); PKG_CONTVALLOC1S.PURGE(YM); end EQUIPSRV_GRID; end PKG_P8PANELS_EQUIPSRV; /