Мне не ответили.
На мой взгляд, там есть довольно просто решение. Нужно просто в таблицу собранных доходов добавить строки с нулевой суммой для каждой записи из межрасчета, для которой не соответствующей записи в регулярном расчете. Тогда существующий алгоритм справляется проблемой. Могу поделиться кодом, он не сложный. Он у меня сразу заработал, каких-либо проблем обнаружено не было.
Класс CL_HRPAYRU_PAYFACTX, метод POST_PROCESS_WAGES. Там в начале есть такие строчки
Code:
lt_wages = mo_pltaxrun->at_wages[].
SORT: lt_wages[] BY wcode per.
После них нужно вставить такой код
Code:
FIELD-SYMBOLS: <zs_wages_of_regular> LIKE LINE OF mo_pltaxrun->at_wages[],
<zs_wages_of_offcycle> LIKE LINE OF mo_pltaxrun->at_wages[],
<zs_payment_fact_for_run> LIKE LINE OF mt_payment_fact_for_run[],
<zs_payment_fact_for_run_oc> LIKE LINE OF mt_payment_fact_for_run_oc[].
* REZ_RR ***************************************************************
data: z_found type boolean,
lt_xages type prupy_t_wages,
zs_wages_offcycle LIKE LINE OF mo_pltaxrun->at_wages[].
* ищем запись, которая есть в межрасчетах, но нет в регулярном
LOOP AT zt_wages[] into zs_wages_offcycle.
zv_anyk = get_classification_key_obj(
iv_pernr = iv_pernr
iv_wages_objid = zs_wages_offcycle-objid ).
READ TABLE mt_payment_fact_for_run_oc[] ASSIGNING <zs_payment_fact_for_run_oc>
WITH KEY anyk = zv_anyk.
* это межрасчет
CHECK: sy-subrc = 0.
* ищем в регулярном
clear z_found.
LOOP AT zt_wages[] ASSIGNING <zs_wages_of_regular>
WHERE wtype = zs_wages_offcycle-wtype AND
wcode = zs_wages_offcycle-wcode AND
per = zs_wages_offcycle-per AND
exkey = zs_wages_offcycle-exkey AND
cntr1 = zs_wages_offcycle-cntr1 AND
objid <> zs_wages_offcycle-objid.
zv_anyk = get_classification_key_obj( iv_pernr = iv_pernr
iv_wages_objid = <zs_wages_of_regular>-objid ).
READ TABLE mt_payment_fact_for_run[] ASSIGNING <zs_payment_fact_for_run> WITH KEY anyk = zv_anyk.
if sy-subrc = 0.
* есть такая
z_found = abap_true.
exit.
endif.
endloop.
if z_found = abap_false.
* не нашли, создадим пустую
* выберем регулярный расчет
LOOP at mt_payment_fact_for_run[] ASSIGNING <zs_payment_fact_for_run>
where fpper = <zs_payment_fact_for_run_oc>-fpper.
**1 and Z_FPBEG <= <zs_payment_fact_for_run_oc>-PAYROLL_RUN_ID-BONDT
**1 and Z_FPEND >= <zs_payment_fact_for_run_oc>-PAYROLL_RUN_ID-BONDT.
* Ищю любую запись, мне нужен OBJID
loop at zt_wages[] ASSIGNING <zs_wages_of_regular>.
zv_anyk = get_classification_key_obj(
iv_pernr = iv_pernr
iv_wages_objid = <zs_wages_of_regular>-objid ).
if <zs_payment_fact_for_run>-anyk = zv_anyk.
z_found = abap_true.
exit.
endif.
endloop.
if z_found = abap_true. exit. endif.
ENDLOOP.
if z_found = abap_true.
zs_wages_offcycle-OBJID = <zs_wages_of_regular>-OBJID.
clear zs_wages_offcycle-SUM.
append zs_wages_offcycle to lt_xages.
endif.
endif.
endloop.
if LINES( lt_xages ) > 0.
append lines of lt_xages[] to zt_wages[].
SORT: zt_wages[] BY wcode per.
endif.
* REZ_RR ***********************************************************************
Далее идет стандартный код.
Замечания.
1. код вставлялся путем расширения (ENHANCEMENT), поэтому все штатные переменные переименнованны, например lt_wages[] стал zt_wages[].
2. У меня структура mt_payment_fact_for_run расширена. САП почему-то различает регулярные расчеты только по периоду (fpper). Если расчета месяц сплитован, то будет более одного расчета за месяц, и отделить их друг от друга никак нельзя. Я дополнительно для себя сохраняю даты периодов. У вас этого расширения не будет, поэтому я эти строчки закомментировал (отмечены как **1).