Deutscheversion lesen von Abrechnungsergebnissen aus der Tabelle BT im Cluster
*&---------------------------------------------------------------------*
*& Report Z_PY_GETPAYRESULTS
*&---------------------------------------------------------------------*
*& Hilfsreport für die Anzeige von Zahlungsinformationen (BT) aus der
*& Transaktion "PC_PAYRESULT"
*&---------------------------------------------------------------------*
REPORT z_py_getpayresults.
"Programm
DATA: lt_payroll_result TYPE TABLE OF payde_result,
ls_payroll_result TYPE payde_result,
lv_pernr TYPE pa0003-pernr,
lv_period TYPE sy-datum,
lv_out_last_day_month TYPE sy-datum,
lv_in_last_day_month TYPE sy-datum,
lt_bt_result TYPE TABLE OF zchstructpayresults,
lt_bt_result_help TYPE TABLE OF zchstructpayresults,
ls_bt_result TYPE zchstructpayresults,
lt_pernr TYPE TABLE OF pa0003-pernr,
ls_pernr TYPE pa0003-pernr,
lv_message TYPE string,
lv_counter TYPE i,
ls_payroll_wpbp TYPE pc205.
DATA: ls_t521b TYPE t521b.
DATA: ls_inter_help TYPE pay99_international.
DATA: lt_help_bt TYPE TABLE OF pc209.
DATA: ls_help_bt TYPE pc209. "mregotz
"ALV
DATA: lt_table TYPE TABLE OF spfli,
lr_alv_table TYPE REF TO cl_salv_table,
lr_funct TYPE REF TO cl_salv_functions.
SELECT-OPTIONS: so_pernr FOR lv_pernr, "Personalnummer
so_perio FOR lv_period OBLIGATORY. "Abrechnungsperiode
"Eingabenvalidierung der Abrechnungsperioden
LOOP AT so_perio.
lv_counter = lv_counter + 1.
"Abgleich mit Sektionsdaten, ob wirklich der erste Tag des Monats angegeben wurde
IF so_perio-low+6(2) <> '01'.
so_perio-low+6(2) = '01'.
CLEAR: lv_message.
CONCATENATE 'Bitte immer den Monatsanfang angeben. Der Wert des Parameters "Periode von" wurde auf den Monatsanfang gesetzt:' so_perio-low+6(2) '.' so_perio-low+4(2) '.' so_perio-low(4) INTO lv_message SEPARATED BY space.
MESSAGE lv_message TYPE 'I'.
ENDIF.
"Wenn ein End-Datum mitgegeben wurde, dann dies für die weitere Verbeitung nutzen. Wenn kein End-Datum angebenen wurde, dann weitere Verarbeitung mit dem Anfangsdatum
IF so_perio-high IS NOT INITIAL.
lv_in_last_day_month = so_perio-high.
ELSE.
lv_in_last_day_month = so_perio-low.
ENDIF.
"Abgleich mit Sektionsdaten, ob wirklich der letzte Tag des Monats angegeben wurde
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
day_in = lv_in_last_day_month
IMPORTING
last_day_of_month = lv_out_last_day_month.
IF so_perio-high <> lv_out_last_day_month.
CLEAR: lv_message.
CONCATENATE 'Bitte immer das Monatsende angeben. Der Wert des Parameters "Periode bis" wurde auf das Monatsende gesetzt:' lv_out_last_day_month+6(2) '.' lv_out_last_day_month+4(2) '.' lv_out_last_day_month(4) INTO lv_message SEPARATED BY space.
MESSAGE lv_message TYPE 'I'.
so_perio-high = lv_out_last_day_month.
ENDIF.
MODIFY so_perio[] FROM so_perio INDEX lv_counter.
ENDLOOP.
CLEAR: lv_counter.
"Personalnummern-Selektion
IF so_pernr[] IS NOT INITIAL.
"Personalnummern aus Select-Option selektieren
SELECT pernr FROM pa0003 INTO TABLE lt_pernr WHERE pernr IN so_pernr[] ORDER BY pernr ASCENDING.
ELSE.
"Wenn Select-option zur Pernr leer ist, dann alle Personalnummern nehmen
MESSAGE 'Sie haben keine Personalnummern ausgewählt, es werden nun alle Personalnummern selektiert' TYPE 'I'.
SELECT pernr FROM pa0003 INTO TABLE lt_pernr ORDER BY pernr ASCENDING.
ENDIF.
"Result-Tabelle mit Zahlungsinformationen erstellen
LOOP AT lt_pernr INTO ls_pernr.
LOOP AT so_perio.
CALL FUNCTION 'HR_GET_PAYROLL_RESULTS'
EXPORTING
pernr = ls_pernr
permo = 01
pabrj = so_perio-low(4)
pabrp = so_perio-low+4(2)
pabrj_end = so_perio-high(4)
pabrp_end = so_perio-high+4(2)
actual = 'A'
TABLES
result_tab = lt_payroll_result
EXCEPTIONS
no_results = 1
error_in_currency_conversion = 2
t500l_entry_not_found = 3
period_mismatch_error = 4
t549q_entry_not_found = 5
internal_error = 6
wrong_structure_of_result_tab = 7
not_authorized_for_all = 8
OTHERS = 9.
LOOP AT lt_payroll_result INTO ls_payroll_result.
"1
* DATA: ls_inter_help TYPE pay99_international.
* DATA: lt_help_bt TYPE TABLE OF pc209.
*
* MOVE-CORRESPONDING ls_payroll_result-inter TO ls_inter_help.
* MOVE-CORRESPONDING ls_inter_help-bt TO lt_help_bt.
*
* MOVE-CORRESPONDING lt_help_bt TO lt_bt_result.
"2
MOVE ls_payroll_result-inter TO ls_inter_help.
lt_help_bt = ls_inter_help-bt.
IF lt_help_bt IS NOT INITIAL.
LOOP AT lt_help_bt INTO ls_help_bt."mregotz
MOVE-CORRESPONDING ls_help_bt TO ls_bt_result."mregotz
IF ls_bt_result-pernr IS INITIAL.
ls_bt_result-pernr = ls_pernr.
ENDIF.
IF ls_bt_result-emfsl IS NOT INITIAL.
READ TABLE ls_payroll_result-inter-wpbp INTO ls_payroll_wpbp INDEX 1.
SELECT SINGLE * FROM t521b INTO ls_t521b
WHERE emfsl = ls_bt_result-emfsl
AND begda <= ls_payroll_wpbp-endda
AND endda >= ls_payroll_wpbp-endda.
ls_bt_result-iban = ls_t521b-iban.
ENDIF.
APPEND ls_bt_result TO lt_bt_result."mregotz
ENDLOOP. "mregotz
ls_bt_result-pernr = ls_pernr.
READ TABLE ls_payroll_result-inter-wpbp INTO ls_payroll_wpbp INDEX 1.
ls_bt_result-period_beg = ls_payroll_wpbp-begda.
ls_bt_result-period_end = ls_payroll_wpbp-endda.
MODIFY lt_bt_result FROM ls_bt_result INDEX 1 TRANSPORTING pernr period_beg period_end.
APPEND LINES OF lt_bt_result TO lt_bt_result_help.
ENDIF.
CLEAR: lt_bt_result, ls_bt_result, ls_inter_help, lt_help_bt, ls_help_bt.
ENDLOOP.
ENDLOOP.
ENDLOOP.
"ALV-Anzeige der Result-Tabelle
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lr_alv_table
CHANGING
t_table = lt_bt_result_help.
CATCH cx_salv_msg .
ENDTRY.
lr_funct = lr_alv_table->get_functions( ).
lr_funct->set_all( abap_true ).
lr_alv_table->display( ).
Schweizerversion
DATA: lt_payroll_result TYPE paych_result OCCURS 0 WITH HEADER LINE,
lv_pernr TYPE pa0003-pernr,
lv_period TYPE sy-datum,
lv_out_last_day_month TYPE sy-datum,
lv_in_last_day_month TYPE sy-datum,
lt_bt_result TYPE TABLE OF zchstructpayresults,
ls_bt_result TYPE zchstructpayresults,
lt_pernr TYPE TABLE OF pa0003-pernr.
"ALV
DATA: lt_table TYPE TABLE OF spfli,
lr_alv_table TYPE REF TO cl_salv_table,
lr_funct TYPE REF TO cl_salv_functions.
SELECT-OPTIONS: so_pernr FOR lv_pernr, "Personalnummer
so_perio FOR lv_period OBLIGATORY. "Abrechnungsperiode
"Eingabenvalidierung der Abrechnungsperioden
LOOP AT so_perio[] ASSIGNING FIELD-SYMBOL(<fs_perio>).
"Abgleich mit Sektionsdaten, ob wirklich der erste Tag des Monats angegeben wurde
IF <fs_perio>-low+6(2) <> '01'.
<fs_perio>-low+6(2) = '01'.
MESSAGE |Bitte immer den Monatsanfang angeben. Der Wert des Parameters "Periode von" wurde auf den Monatsanfang gesetzt: | && <fs_perio>-low+6(2) && '.' && <fs_perio>-low+4(2) && '.' && <fs_perio>-low(4) TYPE 'I' .
ENDIF.
"Wenn ein End-Datum mitgegeben wurde, dann dies für die weitere Verbeitung nutzen. Wenn kein End-Datum angebenen wurde, dann weitere Verarbeitung mit dem Anfangsdatum
IF <fs_perio>-high IS NOT INITIAL.
lv_in_last_day_month = <fs_perio>-high.
ELSE.
lv_in_last_day_month = <fs_perio>-low.
ENDIF.
"Abgleich mit Sektionsdaten, ob wirklich der letzte Tag des Monats angegeben wurde
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
day_in = lv_in_last_day_month
IMPORTING
last_day_of_month = lv_out_last_day_month.
IF <fs_perio>-high <> lv_out_last_day_month.
MESSAGE |Bitte immer das Monatsende angeben. Der Wert des Parameters "Periode bis" wurde auf das Monatsende gesetzt: | && lv_out_last_day_month+6(2) && '.' && lv_out_last_day_month+4(2) && '.' && lv_out_last_day_month(4) TYPE 'I'.
<fs_perio>-high = lv_out_last_day_month.
ENDIF.
ENDLOOP.
UNASSIGN <fs_perio>.
"Personalnummern-Selektion
IF so_pernr[] IS NOT INITIAL.
"Personalnummern aus Select-Option selektieren
SELECT pernr FROM pa0003 INTO TABLE @lt_pernr WHERE pernr IN @so_pernr ORDER BY pernr ASCENDING.
ELSE.
"Wenn Select-option zur Pernr leer ist, dann alle Personalnummern nehmen
MESSAGE 'Sie haben keine Personalnummern ausgewählt, es werden nun alle Personalnummern selektiert' TYPE 'I'.
SELECT pernr FROM pa0003 INTO TABLE lt_pernr ORDER BY pernr ASCENDING.
ENDIF.
"Result-Tabelle mit Zahlungsinformationen erstellen
LOOP AT lt_pernr ASSIGNING FIELD-SYMBOL(<fs_pernr>).
LOOP AT so_perio[] ASSIGNING <fs_perio>.
CALL FUNCTION 'HR_GET_PAYROLL_RESULTS'
EXPORTING
pernr = <fs_pernr>
permo = 01
pabrj = <fs_perio>-low(4)
pabrp = <fs_perio>-low+4(2)
pabrj_end = <fs_perio>-high(4)
pabrp_end = <fs_perio>-high+4(2)
actual = 'A'
TABLES
result_tab = lt_payroll_result
EXCEPTIONS
no_results = 1
error_in_currency_conversion = 2
t500l_entry_not_found = 3
period_mismatch_error = 4
t549q_entry_not_found = 5
internal_error = 6
wrong_structure_of_result_tab = 7
not_authorized_for_all = 8
OTHERS = 9.
LOOP AT lt_payroll_result ASSIGNING FIELD-SYMBOL(<fs_payroll_result>).
DATA(lv_counter) = lines( lt_bt_result ) + 1.
MOVE-CORRESPONDING <fs_payroll_result>-inter-bt TO lt_bt_result KEEPING TARGET LINES.
ls_bt_result-pernr = <fs_pernr>.
ls_bt_result-period_beg = <fs_payroll_result>-inter-wpbp[ 1 ]-begda.
ls_bt_result-period_end = <fs_payroll_result>-inter-wpbp[ 1 ]-endda.
MODIFY lt_bt_result FROM ls_bt_result INDEX lv_counter TRANSPORTING pernr period_beg period_end.
ENDLOOP.
ENDLOOP.
ENDLOOP.
"ALV-Anzeige der Result-Tabelle
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lr_alv_table
CHANGING
t_table = lt_bt_result.
CATCH cx_salv_msg .
ENDTRY.
lr_funct = lr_alv_table->get_functions( ).
lr_funct->set_all( abap_true ).
lr_alv_table->display( ).