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
DATAlt_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.

DATAls_t521b              TYPE t521b.

DATAls_inter_help TYPE pay99_international.
DATAlt_help_bt TYPE TABLE OF pc209.
DATAls_help_bt TYPE pc209"mregotz

"ALV
DATAlt_table     TYPE TABLE OF spfli,
      lr_alv_table TYPE REF TO cl_salv_table,
      lr_funct     TYPE REF TO cl_salv_functions.

SELECT-OPTIONSso_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'.

    CLEARlv_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(4INTO 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.
    CLEARlv_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(4INTO 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.

CLEARlv_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 TRANSPORTING pernr period_beg period_end.

        APPEND LINES OF lt_bt_result TO lt_bt_result_help.
      ENDIF.
      CLEARlt_bt_resultls_bt_resultls_inter_helplt_help_btls_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_allabap_true ).

lr_alv_table->display).

Schweizerversion

DATAlt_payroll_result     TYPE paych_result OCCURS 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
DATAlt_table     TYPE TABLE OF spfli,
      lr_alv_table TYPE REF TO cl_salv_table,
      lr_funct     TYPE REF TO cl_salv_functions.

SELECT-OPTIONSso_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 angebenDer 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 angebenDer 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_counterlineslt_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[ ]-begda.
      ls_bt_result-period_end <fs_payroll_result>-inter-wpbp[ ]-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_allabap_true ).

lr_alv_table->display).

        search this website

Regotz Michel