Итак... Вставляем нижеследующее в инклуд ZX_HRULTAB0_PERNR
Code:
* если на выходной попадает отпуск отображаем его отпуском
data: tmcode like T5YTS-TSCD0,
tanzhl(5),
now_txt like T5YTS-TSCD0,
myind like sy-tabix
, awart like tabel-awart1
, abwtg like tabel-abwtg1.
data: begin of ots_txt occurs 6,
awart(5),
abwtg type i,
end of ots_txt.
* сначала меняем выходные дни у всех видов отсут
loop at ab.
select single TSCD0 from T5YTS into now_txt
where type = '1' and
name = ab-AWART.
LOOP AT tabel where pernr = pernr-pernr.
myind = sy-tabix.
endloop.
clear ots_txt.
ots_txt-awart = now_txt.
DO 31 TIMES
VARYING tmcode FROM tabel-tmcode011 NEXT tabel-tmcode021
VARYING tanzhl FROM tabel-tanzhl011 NEXT tabel-tanzhl021.
if tmcode is initial.
exit.
endif.
* если обе даты не входят в период - не рассматриваем
if ( ( PABRP > ab-begda+4(2) and PABRP > ab-endda+4(2) ) or
( PABRP < ab-begda+4(2) and PABRP < ab-endda+4(2) ) ).
* если период (отсут\присут) покрывает весь интерес период
elseif PABRP > ab-begda+4(2) and PABRP < ab-endda+4(2).
tmcode = now_txt.
add 1 to ots_txt-abwtg.
* если пересекается с началом интересующего периода
elseif PABRP > ab-begda+4(2) and PABRP = ab-endda+4(2) .
if sy-index <= ab-endda+6(2).
tmcode = now_txt.
add 1 to ots_txt-abwtg.
endif.
* если пересекается с концом интересующего периода
elseif PABRP = ab-begda+4(2) and PABRP < ab-endda+4(2).
if sy-index >= ab-begda+6(2).
tmcode = now_txt.
add 1 to ots_txt-abwtg.
endif.
* если ни с чем не пересекается
else.
if sy-index >= ab-begda+6(2) and sy-index <= ab-endda+6(2).
tmcode = now_txt.
add 1 to ots_txt-abwtg.
endif. "norma
endif.
ENDDO.
MODIFY tabel index myind.
collect ots_txt.
endloop.
* теперь в ots_txt обновленное с учетов выходных кол-во дней
do 10 times
VARYING awart FROM tabel-awart1 NEXT tabel-awart2
VARYING abwtg FROM tabel-abwtg1 NEXT tabel-abwtg2.
select single TSCD0 from T5YTS into now_txt
where type = '1' and
name = awart.
loop at ots_txt where awart = now_txt.
abwtg = ots_txt-abwtg.
* awart = ots_txt-awart.
endloop.
if awart is initial.
exit.
endif.
enddo.
if myind <> 0. " это чтобы не было дампа когда нет pernr
MODIFY tabel index myind.
endif.
Табличка T5YTS - Time Scedule Report Customizing Table
1 - тип оценочного элемента (отсутствия)
ab - табличка в кластере b2, где все отсутствия
Проверки на даты нужны потому, что если будем читать кластер на, например, 8 месяц, то он может содержать записи, которые будут зелезать на другие месяцы.
Внутреняя табличка ots_txt заполняется, чтобы в графе неявки по причинам/дни(часы) стояли календарные дни (т.е. кол-во дней с выходными)