Добрый день!
Приведу тут код, может поможет. Тоже делали модификацию ИТ в HRPAD00INFTY.
Code:
METHOD if_ex_hrpad00infty~in_update.
" При сохранении ИТ 0015 -- для премирования:
" делать присвоение затрат, если работник переводился между БЕ
*
DATA: lt_p0759 TYPE TABLE OF p0759,
ls_p0759 TYPE p0759,
lt_p0001 TYPE TABLE OF p0001,
ls_p0001 TYPE p0001,
ls_saved_pref TYPE pref
.
DATA: lv_bukrs TYPE bukrs,
lv_bukrs1 TYPE bukrs,
lv_kokrs TYPE kokrs,
lv_kostl TYPE kostl,
ls_pskey TYPE pskey.
DATA: mit_count(3) TYPE p.
DATA: ls_pref TYPE pref,
lv_pdsnr TYPE pdsnr-pdsnr,
lv_opera TYPE sy-msgty.
DATA: retcode TYPE nrreturn,
range TYPE nrnr VALUE '01',
object TYPE nrobj VALUE 'PD_SEQ_NR',
quantity TYPE nrquan VALUE 1.
*
DATA: ls_prelp TYPE prelp,
ls_p0015 TYPE p0015.
TYPES: BEGIN OF lts_preftab .
INCLUDE TYPE pref AS pref.
TYPES: opera(1).
TYPES: END OF lts_preftab,
ltt_preftab TYPE STANDARD TABLE OF lts_preftab.
FIELD-SYMBOLS : <ls_0015> LIKE LINE OF new_image.
FIELD-SYMBOLS : <ls_pref> TYPE pref,
<ls_pref_line> TYPE lts_preftab,
<lt_preftab> TYPE ltt_preftab.
DATA lv_change.
LOOP AT new_image ASSIGNING <ls_0015> WHERE infty = '0015' AND ( opera = 'I' OR opera = 'U').
ENDLOOP.
CHECK sy-subrc = 0.
MOVE-CORRESPONDING <ls_0015> TO ls_prelp.
CALL METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn
EXPORTING
prelp = ls_prelp
IMPORTING
pnnnn = ls_p0015.
CHECK ls_p0015-zzcre IS NOT INITIAL. " Только для премирования
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = ls_p0015-pernr
infty = '0759'
TABLES
infty_tab = lt_p0759
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
SORT lt_p0759 BY seqnr.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = ls_p0015-pernr
infty = '0001'
begda = ls_p0015-begda
endda = ls_p0015-begda
TABLES
infty_tab = lt_p0001
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
LOOP AT lt_p0001 INTO ls_p0001. ENDLOOP.
lv_bukrs1 = ls_p0001-bukrs. " БЕ на дату выплаты
LOOP AT lt_p0759 INTO ls_p0759 WHERE citem = ls_p0015-zzcre AND seqnr = ls_p0015-zzseqnr. ENDLOOP.
CHECK sy-subrc = 0.
CLEAR lt_p0001.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = ls_p0015-pernr
infty = '0001'
begda = ls_p0759-zzend
endda = ls_p0759-zzend
TABLES
infty_tab = lt_p0001
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
LOOP AT lt_p0001 INTO ls_p0001. ENDLOOP.
lv_bukrs = ls_p0001-bukrs. " БЕ на дату из 759
lv_kokrs = ls_p0001-kokrs.
lv_kostl = ls_p0001-kostl.
CLEAR lv_change.
ASSIGN ('(SAPFP50P)PREF') TO <ls_pref>.
ASSIGN ('(SAPFP50P)PREFTAB[]') TO <lt_preftab>.
IF <ls_pref> IS ASSIGNED AND <lt_preftab> IS ASSIGNED.
ls_saved_pref = <ls_pref>.
ENDIF.
PERFORM open_infotyp IN PROGRAM sapfp50p
USING ls_p0015-pernr ls_p0015-infty
ls_p0015-begda ls_p0015-endda
mit_count.
IF lv_bukrs NE lv_bukrs1. " Если БЕ на конец периода != БЕ на текущую запись ИТ 15
IF ls_p0015-refex NE 'X'.
ls_p0015-refex = 'X'.
lv_change = 'X'.
ENDIF.
IF <ls_pref> IS ASSIGNED AND <lt_preftab> IS ASSIGNED.
LOOP AT <lt_preftab> ASSIGNING <ls_pref_line>
WHERE pernr = ls_p0015-pernr
AND infty = ls_p0015-infty
AND subty = ls_p0015-subty
AND objps = ls_p0015-objps
AND sprps = ls_p0015-sprps
AND endda = ls_p0015-endda
AND begda = ls_p0015-begda
AND seqnr = ls_p0015-seqnr
AND opera <> 'D'.
ENDLOOP.
IF sy-subrc <> 0
OR ( sy-subrc = 0 AND ( <ls_pref_line>-bukrs NE lv_bukrs ) OR
( <ls_pref_line>-kokrs NE lv_kokrs ) OR
( <ls_pref_line>-kostl NE lv_kostl ) ).
MOVE-CORRESPONDING ls_p0015 TO <ls_pref>.
<ls_pref>-bukrs = lv_bukrs.
<ls_pref>-kokrs = lv_kokrs.
<ls_pref>-kostl = lv_kostl.
lv_change = 'X'.
PERFORM update_pref IN PROGRAM sapfp50p
USING ls_p0015.
ENDIF.
ENDIF.
ELSE.
IF ls_p0015-refex EQ 'X'.
ls_p0015-refex = ' '.
lv_change = 'X'.
PERFORM delete_pref IN PROGRAM sapfp50p
USING ls_p0015.[/b]
ENDIF.
ENDIF.
IF lv_change = 'X'.
PERFORM update_infotyp IN PROGRAM sapfp50p
USING ls_p0015.[/b]
IF <ls_pref> IS ASSIGNED AND <lt_preftab> IS ASSIGNED.
<ls_pref> = ls_saved_pref.
ENDIF.
PERFORM put_infotyp_buffer IN PROGRAM sapfp50p.
ENDIF.
ENDMETHOD.