Привожу то, что работает нормально :
Содержимое табл T588Z :
Code:
------------------------------------------------------------------------------------------
| MANDT|INFTY|SUBTY|FNAME|OPERA|SEQNO|KENNZ|VINFO |
------------------------------------------------------------------------------------------
| 700 |2001 |0025 | |06 | 100|F |PROL(ZHRPRG_PROLONGATIONLEAVE4)
| 700 |2001 |0025 | |06 | 105|P |RP50D-FLAG1='X'
| 700 |2001 |0025 | |06 | 110|I |INS,2001,0097,,(RP50D-DATE1),(RP50D-DATE2)/D
И код :
Code:
*&---------------------------------------------------------------------*
*& ПулМодул ZHRPRG_PROLONGATIONLEAVE4 *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
PROGRAM ZHRPRG_PROLONGATIONLEAVE4.
*
*INCLUDE ZBDCRECXX.
DATA: pernr_local LIKE PSPAR-PERNR,
p_beg LIKE PSPAR-BEGDA,
p_end LIKE PSPAR-ENDDA.
INFOTYPES: 2001.
TABLES: PSPAR.
DATA: sum_day TYPE I,"КОЛЛИЧЕСТВО ДОБАВЛЯЕМЫХ ДНЕЙ
var_sum_day TYPE I,
new_begda LIKE SY-DATUM,
new_endda LIKE SY-DATUM,
zbapihrabsatt_in LIKE BAPIHRABSATT_IN,
ZBAPIHRITBASE LIKE BAPIHRITBASE,
zbapiret2 LIKE BAPIRET2 OCCURS 10 WITH HEADER LINE.
DATA:
wa_thol like thol,
currda like p0007-begda.
DATA: FIELD_XX(14).
FIELD-SYMBOLS <FIELD_ID>.
"===========================================================================================================
FORM T2001_98.
pernr_local = PSPAR-PERNR.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
PERNR = pernr_local
INFTY = '2001'
TABLES
INFTY_TAB = P2001.
EXPORT P2001 TO MEMORY ID 'P2001'.
ENDFORM.
" пролонгация отпуска
FORM PROL.
pernr_local = PSPAR-PERNR.
p_beg = PSPAR-BEGDA.
p_end = PSPAR-ENDDA.
data p_beg1 LIKE PSPAR-BEGDA. "DORIN 15.06.2012
data p_end1 LIKE PSPAR-ENDDA. "DORIN 15.06.2012
p_beg1 = PSPAR-BEGDA. "DORIN 15.06.2012 начало больничн 2001 0025
p_end1 = PSPAR-ENDDA. "DORIN 15.06.2012 конец больничн 2011 0025
CLEAR: sum_day, P2001.
IMPORT P2001 FROM MEMORY ID 'P2001_FR_FOR_0025'. "include ZXPADU01
LOOP AT P2001 WHERE SUBTY = '0098' OR SUBTY = '0097' .
CHECK P2001-BEGDA <= p_end AND P2001-ENDDA >= p_beg . " есть ли смысл разделять
CLEAR var_sum_day.
" БОЛЬНИЧНЫЙ ВХОДИТ В ОТПУСК
IF p_beg >= P2001-BEGDA AND p_end <= P2001-ENDDA.
PERFORM CALC_VACATION_DAYS using var_sum_day p_beg p_end.
sum_day = sum_day + var_sum_day.
ENDIF.
" БОЛЬНИЧНЫЙ ПОГЛОЩАЕТ ОТПУСК
IF p_beg < P2001-BEGDA AND p_end > P2001-ENDDA.
PERFORM CALC_VACATION_DAYS using var_sum_day P2001-BEGDA P2001-ENDDA.
sum_day = sum_day + var_sum_day.
ENDIF.
" БОЛЬНИЧНЫЙ ЗДВИНУТ ВЛЕВО
IF p_beg < P2001-BEGDA AND p_end >= P2001-BEGDA AND p_end <= P2001-ENDDA.
PERFORM CALC_VACATION_DAYS using var_sum_day P2001-BEGDA p_end.
sum_day = sum_day + var_sum_day.
ENDIF.
" БОЛНИЧНЫЙ ЗДВИНУТ ВПРАВО
IF p_beg >= P2001-BEGDA AND p_end > P2001-ENDDA AND p_beg <= P2001-ENDDA.
PERFORM CALC_VACATION_DAYS using var_sum_day p_beg P2001-ENDDA.
sum_day = sum_day + var_sum_day.
ENDIF.
ENDLOOP.
"=============================================================================================DORIN 01.08.2012
"data s(20) type c.
"s = LINES( p2001 ). data s_msg(200) type c.
"CONCATENATE '***ZHRPRG_PROLONGATIONLEAVE4 ХРАНИМАЯ ТАБЛ p2001 ' s INTO s_msg.
if LINES( p2001 ) = 0. "здесь проверяем только -- "БОЛЬНИЧНЫЙ CДВИНУТ ВЛЕВО
data zp2001 type p2001 OCCURS 0 WITH HEADER LINE.
refresh zp2001.
IMPORT zp2001 FROM MEMORY ID 'P2001_DORIN_FOR_0025'. "include MPTIME00 логика экрана 2000 mp200000
loop at zp2001 WHERE SUBTY = '0098' OR SUBTY = '0097'.
"БОЛЬНИЧНЫЙ CДВИНУТ ВЛЕВО
IF p_beg < ZP2001-BEGDA AND p_end >= ZP2001-BEGDA AND p_end <= ZP2001-ENDDA.
PERFORM CALC_VACATION_DAYS using var_sum_day ZP2001-BEGDA p_end.
sum_day = sum_day + var_sum_day.
P2001[] = ZP2001[].
exit. "выход из цикла LOOP
ENDIF.
endloop.
endif.
"===========================================================================================================
CLEAR: new_begda, new_endda.
" отсутствие пролонгирунтся после последнего отсутствия
LOOP AT P2001 WHERE SUBTY = '0098' OR SUBTY = '0097' .
IF P2001-ENDDA > new_begda.
new_begda = P2001-ENDDA.
ENDIF.
ENDLOOP.
IF p_end > new_begda.
new_begda = p_end.
ENDIF.
new_begda = new_begda + 1.
currda = new_begda.
data currda_old like p0007-begda.
currda_old = new_begda.
var_sum_day = sum_day.
while var_sum_day > 0.
select single * from thol
into wa_thol
where sort = 'UA ' and monat = currda+4(2) and motag = currda+6(2).
if sy-subrc <> 0.
var_sum_day = var_sum_day - 1.
endif.
currda = currda + 1.
endwhile.
new_endda = currda - 1.
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Религ праздники ПАСХА ТРОИЦА DORIN 30.03.2012
var_sum_day = sum_day.
while var_sum_day > 0.
data rez_out type I. rez_out = 0.
CALL FUNCTION 'ZHR_HOLY_REL'
EXPORTING
DATE_IN = currda_old
IMPORTING
REZ_OUT = rez_out.
if rez_out = 1.
new_endda = new_endda + 1.
endif.
currda_old = currda_old + 1.
var_sum_day = var_sum_day - 1.
endwhile.
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
"ЕСЛИ в 2001 0025 есть праздники уменьшаем длит отпкска 2001 0097 15.06.2012
if sum_day > 0.
while P_BEG1 =< P_END1.
rez_out = 0.
CALL FUNCTION 'ZHR_HOLY_REL' "пасха троица
EXPORTING
DATE_IN = P_BEG1
IMPORTING
REZ_OUT = rez_out.
if rez_out = 1. "пасха троица
new_endda = new_endda - 1.
P_BEG1 = P_BEG1 + 1.
CONTINUE.
endif.
P_BEG1 = P_BEG1 + 1.
endwhile.
endif.
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IF sum_day > 0. " нужно делать разделение
"для строки в табл T588Z
tables rp50d. "СТРУКТУРА HR: поля возврата для динамических мероприятий
rp50d-field1 = 'INS'.
rp50d-date1 = new_begda.
rp50d-date2 = new_endda.
rp50d-flag1 = 'X'.
ENDIF. " IF sum_day > 0.
IF sum_day = 0. " НЕ нужно делать разделение
"для строки в табл T588Z
rp50d-field1 = 'INS'.
rp50d-date1 = new_begda.
rp50d-date2 = new_endda.
rp50d-flag1 = ''.
ENDIF.
FREE MEMORY ID 'P2001'.
FREE MEMORY ID 'ZP2001'. "01.08.2012 DORIN
ENDFORM.
FORM CALC_VACATION_DAYS using sum_vacation_day begdat enddat.
data: currdat like p0007-begda.
currdat = begdat.
sum_vacation_day = 0.
while currdat <= enddat.
select single * from thol into wa_thol
where sort = 'UA ' and monat = currdat+4(2) and motag = currdat+6(2).
if sy-subrc <> 0.
sum_vacation_day = sum_vacation_day + 1.
endif.
currdat = currdat + 1.
endwhile.
ENDFORM. " CALC_VACATION_DAYS