‎2019 Mar 05 8:39 AM
Hey,
I got two cases where I get a warning or an error message.
In both cases I'm using a dynamic action which then changes another infotype via FM hr_infotype_operation.
First example:
On changing IT2001 I need to change another IT2001 (Subtype 0171) and IT9010.
For some reason I get the warning that there is no data available for subtype 0171.
While debugging the FM doesn't return any error and also the IT is being processed.
Second example:
On changing IT0008 (wage type 1101) an IT0014 (wagetype 9900 and 9980) should be created. I'm getting an error that the wagetyp 1101 isn't allowed for IT0014.
While debugging here are also now errors.
Does anyone had the same issue using dynamic actions?
I checked all the data while debugging and I they seem alright. The wagetype f.e. is always the right one and in the IT0014 processing there is no wagetyp 1101 to be found.
Somewhere SAP is mixing things together but I can't figure out where and how to seperated these processes.
Class (Main):
DATA: lv_prozent TYPE p0008-bsgrd.
DATA: lv_betrag TYPE pad_amt7s.
DATA: lv_jahresgehalt TYPE pad_amt7s.
DATA: ls_return TYPE bapireturn1.
DATA: ls_p0014 TYPE p0014.
**************************************************************
* Prüfungen um Personalnummer einzuordnen (MaKrs, Tarif) *
**************************************************************
check_pernr( ).
**************************************************************
* Berechnungen der Werte durchführen *
**************************************************************
calculate_values(
IMPORTING
ev_prozent = lv_prozent " Beschäftigungsgrad
ev_betrag = lv_betrag " Lohnartenbetrag für Bezüge
ev_jahresgehalt = lv_jahresgehalt " Lohnartenbetrag für Bezüge
).
ev_jahresgehalt = lv_jahresgehalt.
**************************************************************
* Anpassung / Anlage der Infotypen *
**************************************************************
ls_p0014-pernr = gv_pernr.
ls_p0014-begda = gv_begda.
ls_p0014-endda = gv_endda.
ls_p0014-aedtm = sy-datum.
ls_p0014-infty = '0014'.
ls_p0014-betrg = lv_betrag.
ls_p0014-waers = 'EUR'.
CASE gv_persk.
WHEN '20'."Außendienst => Provision
ls_p0014-lgart = 9985.
ls_p0014-subty = '9985'.
WHEN '01' "AT-Mitarbeiter, Leitender MA, Vorstand/GF => Erfolgsbeteiligung (EFB)
OR '02'
OR '03'.
ls_p0014-lgart = 9900.
ls_p0014-subty = '9900'.
WHEN OTHERS.
ENDCASE.
CALL FUNCTION 'BAPI_EMPLOYEE_ENQUEUE'
EXPORTING
number = gv_pernr
IMPORTING
return = ls_return.
CALL FUNCTION 'HR_INFOTYPE_OPERATION'
EXPORTING
infty = '0014'
number = gv_pernr
subtype = ls_p0014-subty
* OBJECTID =
* LOCKINDICATOR =
validityend = gv_endda
validitybegin = gv_begda
* RECORDNUMBER =
record = ls_p0014
operation = 'INS'
* TCLAS = 'A'
* DIALOG_MODE = '0'
nocommit = ' '
* VIEW_IDENTIFIER =
* SECONDARY_RECORD =
IMPORTING
return = ls_return
* KEY =
.
IF ls_return IS NOT INITIAL.
"Fehlermeldung
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
CASE gv_persk.
WHEN '20'."Außendienst => Provision
ls_p0014-lgart = 9986.
ls_p0014-subty = '9986'.
WHEN '01' "AT-Mitarbeiter, Leitender MA, Vorstand/GF => Erfolgsbeteiligung (EFB)
OR '02'
OR '03'.
ls_p0014-lgart = 9980.
ls_p0014-subty = '9980'.
WHEN OTHERS.
ENDCASE.
CLEAR: ls_p0014-betrg, ls_p0014-waers.
ls_p0014-anzhl = lv_prozent.
ls_p0014-zeinh = 030. "Prozent
CALL FUNCTION 'HR_INFOTYPE_OPERATION'
EXPORTING
infty = '0014'
number = gv_pernr
subtype = ls_p0014-subty
* OBJECTID =
* LOCKINDICATOR =
validityend = gv_endda
validitybegin = gv_begda
* RECORDNUMBER =
record = ls_p0014
operation = 'INS'
* TCLAS = 'A'
* DIALOG_MODE = '0'
nocommit = ' '
* VIEW_IDENTIFIER =
* SECONDARY_RECORD =
IMPORTING
return = ls_return
* KEY =
.
IF ls_return IS NOT INITIAL.
"Fehlermeldung
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
* COMMIT WORK.
ENDIF.
CALL FUNCTION 'BAPI_EMPLOYEE_DEQUEUE'
EXPORTING
number = gv_pernr
IMPORTING
return = ls_return.
ENDMETHOD.
Method CALCULATE VALUES:
METHOD calculate_values.
DATA: lv_betrg TYPE p0008-bet01.
DATA: lv_lgart TYPE p0008-lga01.
DATA: lv_ausna TYPE p0033-aus01.
DATA: lv_y160 TYPE boole_d.
DATA: lt_p0033 TYPE TABLE OF p0033.
DATA: ls_p0033 TYPE p0033.
**************************************************************
* Prozentwert ermitteln *
**************************************************************
CASE gv_trfgr.
WHEN 'AT1-ADP'
OR 'AT2'.
ev_prozent = '15.00'.
WHEN 'AT1'
OR 'VG1'
OR 'VG2'.
ev_prozent = '10.00'.
WHEN 'OFK'
OR 'VG3'.
ev_prozent = '20.00'.
WHEN 'VG2'.
ev_prozent = '25.00'.
WHEN 'LFK1'
OR 'LFK2'
OR 'VG5'
OR 'VG6'.
ev_prozent = '30.00'.
WHEN 'UL'
OR 'VG7'.
ev_prozent = '40.00'.
WHEN 'VS'.
ev_prozent = '50.00'.
WHEN OTHERS.
ENDCASE.
**************************************************************
* EFB-Betrag / Provision berechnen *
**************************************************************
DO 12 TIMES
VARYING lv_lgart
FROM gs_p0008_new-lga01
NEXT gs_p0008_new-lga02
VARYING lv_betrg
FROM gs_p0008_new-bet01
NEXT gs_p0008_new-bet02.
IF lv_lgart EQ '1101'.
ev_betrag = lv_betrg.
EXIT.
ENDIF.
ENDDO.
CALL FUNCTION 'HR_READ_INFOTYPE'
EXPORTING
pernr = gv_pernr
infty = '0033'
begda = gv_begda
endda = gv_endda
TABLES
infty_tab = lt_p0033
EXCEPTIONS
infty_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT lt_p0033 INTO ls_p0033.
DO 20 TIMES
VARYING lv_ausna
FROM ls_p0033-aus01
NEXT ls_p0033-aus02.
IF lv_ausna EQ 'Y160'.
lv_y160 = 'X'.
ENDIF.
ENDDO.
ENDLOOP.
ev_jahresgehalt = ev_betrag.
IF lv_y160 IS INITIAL.
ev_jahresgehalt = ( ev_betrag * 13 ).
ev_betrag = ( ev_betrag * 13 ) * ( ev_prozent / 100 ).
ELSE.
ev_jahresgehalt = ( ev_betrag * 12 ).
ev_betrag = ( ev_betrag * 12 ) * ( ev_prozent / 100 ).
ENDIF.
ENDMETHOD.
Dynamic Action Function:
*****Alten Datensatz ermitteln****************************************
lv_var = '(MP000800)PSAVE'.
ASSIGN (lv_var) TO FIELD-SYMBOL(<psave>) .
ls_p0008_old = <psave>.
**********************************************************************
lo_helper = NEW zcl_dyn_atgehalt_it14(
iv_p0008_new = p0008
iv_p0008_old = ls_p0008_old
).
lo_helper->main(
IMPORTING
ev_jahresgehalt = lv_jahresgehalt " Lohnartenbetrag für Bezüge
).
p0008-ansal = lv_jahresgehalt.
p0008-ancur = 'EUR'.
‎2019 Mar 05 9:20 AM
It would be great if you can provide the code excerpt of the function module.
‎2019 Mar 05 9:41 AM
Hey,
Sorry for the missing coding. I added the coding of the second example I made.
Thanks and kind regards
‎2019 Mar 05 10:21 AM
I was able to debug the process a bit further.
Problem seems to be that the PAI of IT0008 is called twice. (Method P0008_INPUT)
In the second run in the PSPAR-structure the infotype is 0014.
While using the HR_INFOTYPE_OPERATION something was mixed up so that the structure now contains the wrong infotype.
Got anyone an idea how to fix this or how to better implement the logic to generate the IT14?