В итоге бизнес сформулировал правило подсчета дней для детских больничных так: 10 дней считается только в рамках амбулаторных больничных. А ограничение на 15 дней для больничного > 7 лет - по всем (как амбулаторным, так и стационарным). В итоге стандартная логика с этим даже с учетом подлома, фильтрующего содержимое pt_2001, несовместима. Пришлось ломать еще фундаментальнее: в 2 местах.
1) Подсчет разницы - с учетом стационара и без учета. В конце FORM init_current_cal_day:
Code:
ENHANCEMENT 2 Z_RUSI0_INIT_CAL_DAY. "active version
* подсчитать дни, приходящиеся только на этот больничный
perform zzcalc_altern_current_day using ps_ab
pt_2001
p_method
p_datum
p_current_cal_day.
ENDENHANCEMENT.
Сама реализация (zhrpyhosp01 - настроечная таблица для детских больничных):
Code:
data: zzgv_current_cal_day type i. " разница между днем с учетом другого типа отсутствий и без него
form zzcalc_altern_current_day using ps_ab structure pc20i
pt_2001 type p2001_tab
p_method
p_datum
p_current_cal_day.
statics: st_zhrpyhosp01 type sorted table of zhrpyhosp01 with unique key awart endda.
data: l_num_cdays type i,
lv_hospt.
field-symbols: <l_wa_p2001> type p2001,
<fs_zhrpyhosp01> type zhrpyhosp01.
clear: zzgv_current_cal_day. " по умолчанию разницы просто нет
" убрать все отсутствия, не относящиеся к этому типу
if st_zhrpyhosp01 is initial.
select * from zhrpyhosp01 into table st_zhrpyhosp01.
endif.
check st_zhrpyhosp01 is not initial.
loop at st_zhrpyhosp01 assigning <fs_zhrpyhosp01> where awart = ps_ab-awart and
endda >= p_datum and
begda <= p_datum.
lv_hospt = <fs_zhrpyhosp01>-hospt.
endloop.
check sy-subrc = 0. " отсутствие входит в список детских амбулаторных/стационарных
*Evaluate Calendar Days
if lines( pt_2001 ) ne 0.
loop at pt_2001 assigning <l_wa_p2001>.
if lv_hospt = 'X'. " для стационара - только стационар
loop at st_zhrpyhosp01 assigning <fs_zhrpyhosp01> where awart = <l_wa_p2001>-awart and
endda >= p_datum and
begda <= p_datum and
hospt = 'X'. " только стационар
l_num_cdays = <l_wa_p2001>-endda - <l_wa_p2001>-begda + 1.
add l_num_cdays to zzgv_current_cal_day.
exit.
endloop.
else.
" в остальных случаях все кроме стационара
loop at st_zhrpyhosp01 assigning <fs_zhrpyhosp01> where awart = <l_wa_p2001>-awart and
endda >= p_datum and
begda <= p_datum and
hospt = 'X'.
exit.
endloop.
if sy-subrc <> 0. " не стационар
l_num_cdays = <l_wa_p2001>-endda - <l_wa_p2001>-begda + 1.
add l_num_cdays to zzgv_current_cal_day.
endif.
endif.
endloop.
endif.
" разница между полным подсчетом и только амбулаторные отсутствия/стационар
zzgv_current_cal_day = p_current_cal_day - zzgv_current_cal_day.
endform.
2) Применение самой разницы при определении процента. В конце FORM re7rut5:
Code:
ENHANCEMENT 3 Z_RUSI0_RE7RUT5_DIFF_DAYS. "active version
* Если есть разница за счет амбулаторных/стационарных больничных
data: lv_current_cal_day type i.
if zzgv_current_cal_day is not initial and ps_abw-prl > 0. " есть разница и оплата не прекращена
lv_current_cal_day = p_current_cal_day - zzgv_current_cal_day.
refresh lt_i7rut5.
select * from t7rut5 into table lt_i7rut5
where land eq calc_land
and varky eq p_socgr
and moabw eq t001p-moabw
and modsg eq p_modsg
and dna le lv_current_cal_day
and abt eq ps_ab-awart
and begda le ps_ab-obegd
and endda ge ps_ab-obegd.
sort lt_i7rut5 by dna descending.
read table lt_i7rut5 assigning <l_wa_7rut5> index 1.
if sy-subrc = 0.
move-corresponding <l_wa_7rut5> to ps_abw. " изменить процент оплаты для амбулаторных/стационарных больничных
endif.
endif.
ENDENHANCEMENT.