ZHR_PAUSEAZ – Anzeige der Pausezeiten

Dieses Programm visualisiert die AZP udn Pausen der Mitarbeiter.

REPORT zhr_pauseaz.
"HST 2019-18-06
"    Zähler eingefügt
"HST 2019-06-13
"    Fehler Korrektur Fixzeiten bei Schicht
"    Fehler Korrektur Pausentexte bei Fixpausen
"    Meldung Fehler wenn AZPR nicht für die Gruppe der Mitarbeiterkreise angelegt ist.
"    Kürzel wahlweise ein- und ausblendbar
"HST 2019-06-12
"    ALV Verändert
"    TAZP und Pause Kürzel ergänzt
"    Fehler Korrektur in Falle eines leeren PA0007
"HST 2019-06-11
"    Fehler Korrektur in Falle von fehlender Gruppe Mitarbeiter ABTYP 3 und 4 in AZPR.



TABLES: pa0001, p0001.
DATA lv_datab TYPE sydatum.
DATA lv_datbi TYPE sydatum.
"DATA lt_data TYPE zhr_summary_week_t.


TYPES: BEGIN OF ty_alv,
         zaehl  TYPE integer,
         pernr  TYPE persno,
         ename  TYPE emnam,
         ptext  TYPE pktxt,
         schkz  TYPE schkn,
         rtext  TYPE retext,

         az1    TYPE char40,
         pause1 TYPE char40,

         az2    TYPE char40,
         pause2 TYPE char40,

         az3    TYPE char40,
         pause3 TYPE char40,

         az4    TYPE char40,
         pause4 TYPE char40,

         az5    TYPE char40,
         pause5 TYPE char40,

       END OF ty_alv.


DATA: gt_alv TYPE STANDARD TABLE OF ty_alv,
      gs_alv TYPE ty_alv.



SELECTION-SCREEN BEGIN OF BLOCK all WITH FRAME.

SELECTION-SCREEN BEGIN OF BLOCK per WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_pernr FOR pa0001-pernr MATCHCODE OBJECT prem.
SELECT-OPTIONS: so_persk FOR pa0001-persk.
PARAMETERS: p_orgeh TYPE orgeh.
PARAMETERS: p_kuerz TYPE xfeld AS CHECKBOX DEFAULT abap_true.
SELECTION-SCREEN END OF BLOCK per.

SELECTION-SCREEN BEGIN OF BLOCK dat WITH FRAME TITLE text-003.
SELECT-OPTIONS: so_datum FOR sy-datum OBLIGATORY NO-EXTENSION.
PARAMETERS: p_factid TYPE wfcid DEFAULT 'AT' NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK dat.

SELECTION-SCREEN END OF BLOCK all.



CLASS application DEFINITION CREATE PRIVATE.

  PUBLIC SECTION.

    CLASS-METHODS orgeh_f4.

    CLASS-METHODS persk_f4
      IMPORTING c_dynprofield TYPE dynfnam.

    CLASS-METHODS set_default.

    CLASS-METHODS run.

    CLASS-METHODS get_pernr_data
      "CHANGING c_data TYPE zhr_summary_week_t
      .

    CLASS-METHODS show_alv.


ENDCLASS.

CLASS application IMPLEMENTATION.

  METHOD show_alv.

    DATA: gref_salv TYPE REF TO cl_salv_table,
          gr_layout TYPE REF TO cl_salv_layout,
          ls_key    TYPE salv_s_layout_key.
    DATA: lr_functions TYPE REF TO cl_salv_functions_list.

    DATA: ls_color TYPE lvc_s_colo.

* ALV aufbauen
    TRY.
        CALL METHOD cl_salv_table=>factory
          IMPORTING
            r_salv_table = gref_salv
          CHANGING
            t_table      = gt_alv.
      CATCH cx_salv_msg .
    ENDTRY.

    ls_key-report = sy-repid.
* User can save layout.
    gr_layout  = gref_salv->get_layout( ). "layouts
    gr_layout->set_key( ls_key ).          "Program Name
    gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ). "User can save
    IF sy-slset = 'CUS&Z_PPMDT_01'.
      gr_layout->set_initial_layout( value = '/Z_PPMDT_TEL' ).
    ENDIF.
    lr_functions = gref_salv->get_functions( ).
    "  lr_functions->set_default( ).      "minimal
    lr_functions->set_all( abap_true ). "Standard

* Feldkatalog ändern
    DATA: lr_columns TYPE REF TO cl_salv_columns_table,
          lr_column  TYPE REF TO cl_salv_column_table.

    lr_columns = gref_salv->get_columns( ).

    TRY.

        ls_color-col = col_key.
        ls_color-int = 1.
        ls_color-inv = 0.

        lr_column ?= lr_columns->get_column( 'ZAEHL' ).
        lr_column->set_output_length( '2' ).
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'PERNR' ).
        lr_column->set_output_length( '4' ).
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'ENAME' ).
        lr_column->set_output_length( '20' ).
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'PTEXT' ).
        lr_column->set_output_length( '10' ).
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'SCHKZ' ).
        lr_column->set_output_length( '6' ).
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'RTEXT' ).
        lr_column->set_output_length( '10' ).
        lr_column->set_color( ls_color ).


        ls_color-col = col_key.
        ls_color-int = 0.
        ls_color-inv = 0.

        lr_column ?= lr_columns->get_column( 'AZ1' ).
        lr_column->set_output_length( '15' ).
        lr_column->set_medium_text( 'Montag').
        lr_column->set_long_text( 'Montag').
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'AZ2' ).
        lr_column->set_output_length( '15' ).
        lr_column->set_medium_text( 'Dienstag').
        lr_column->set_long_text( 'Dienstag').
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'AZ3' ).
        lr_column->set_output_length( '15' ).
        lr_column->set_medium_text( 'Mittwoch').
        lr_column->set_long_text( 'Mittwoch').
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'AZ4' ).
        lr_column->set_output_length( '15' ).
        lr_column->set_medium_text( 'Donnerstag').
        lr_column->set_long_text( 'Donnerstag').
        lr_column->set_color( ls_color ).

        lr_column ?= lr_columns->get_column( 'AZ5' ).
        lr_column->set_output_length( '15' ).
        lr_column->set_medium_text( 'Freitag').
        lr_column->set_long_text( 'Freitag').
        lr_column->set_color( ls_color ).


        lr_column ?= lr_columns->get_column( 'PAUSE1' ).
        lr_column->set_output_length( '30' ).
        lr_column->set_medium_text( 'Pause Mo.').

        lr_column ?= lr_columns->get_column( 'PAUSE2' ).
        lr_column->set_output_length( '30' ).
        lr_column->set_medium_text( 'Pause Di.').

        lr_column ?= lr_columns->get_column( 'PAUSE3' ).
        lr_column->set_output_length( '30' ).
        lr_column->set_medium_text( 'Pause Mi.').

        lr_column ?= lr_columns->get_column( 'PAUSE4' ).
        lr_column->set_output_length( '30' ).
        lr_column->set_medium_text( 'Pause Do.').

        lr_column ?= lr_columns->get_column( 'PAUSE5' ).
        lr_column->set_output_length( '30' ).
        lr_column->set_medium_text( 'Pause Fr.').







      CATCH cx_salv_not_found.
    ENDTRY.

* Ausgabe
    gref_salv->display( ).

  ENDMETHOD.


  METHOD orgeh_f4.

    DATA lv_objid TYPE realo.

    "Ausgewählte Orgeinheit aus Tree zurück
    CALL FUNCTION 'RH_TYPE_STRUC_HELP'
      EXPORTING
        act_search_otype         = 'O'
      IMPORTING
        selected_objid           = lv_objid
      EXCEPTIONS
        no_active_plvar          = 1
        no_object_selected       = 2
        no_struc_search_possible = 3
        OTHERS                   = 4.

    p_orgeh = lv_objid.

  ENDMETHOD.

  METHOD persk_f4.

    DATA lt_hreegrp TYPE TABLE OF hreegrp.

    "Mitarbeitergruppe aktiv Mitarbeiterkreis Kombinationen
    SELECT * FROM t503z INTO CORRESPONDING FIELDS OF TABLE lt_hreegrp
              WHERE molga = '03'
                AND persg = '1'.

    LOOP AT lt_hreegrp ASSIGNING FIELD-SYMBOL(<value>).
      "Mitarbeitergruppe Text
      SELECT SINGLE ptext FROM t503t INTO <value>-pktxt
              WHERE sprsl = sy-langu
                AND persk = <value>-persk.
      "Mitarbeiterkreis Text Angestellt und Arbeiter und ...
      SELECT SINGLE ptext FROM t501t INTO <value>-pgtxt
              WHERE sprsl = sy-langu
                AND persg = <value>-persg.
    ENDLOOP.

    "Rückgabe der ausgewählten Zelle in Tabelle in Dynpro
    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'PERSK'
        dynprofield     = c_dynprofield
        dynpprog        = sy-cprog
        "dynpprog        = 'ZHR_REP_SUMMARY_WEEK'
        dynpnr          = '1000'
        value_org       = 'S'
      TABLES
        value_tab       = lt_hreegrp
      EXCEPTIONS
        parameter_error = 1
        no_values_found = 2
        OTHERS          = 3.

  ENDMETHOD.
  METHOD set_default.

    IF so_datum-low IS INITIAL AND
       so_datum-high IS INITIAL.
      APPEND INITIAL LINE TO so_datum ASSIGNING FIELD-SYMBOL(<datum>).
      <datum>-low = sy-datum.
      <datum>-high = sy-datum + 30.
      <datum>-sign = 'I'.
      <datum>-option = 'BT'.
    ENDIF.

  ENDMETHOD.
  METHOD run.

    IF so_datum-low IS NOT INITIAL AND so_datum-high IS NOT INITIAL.
      lv_datab = so_datum-low.
      lv_datbi = so_datum-high.
      " Personaldaten Lesen
      application=>get_pernr_data(
      "CHANGING c_data = lt_data
        ).

      application=>show_alv( ).




      " Ausgabetabelle aufbauen und ausgeben
      "APPLICATION=>OUTPUT( CHANGING C_DATA = LT_DATA
      "C_FCAT  = LT_FCAT_OUT
      "C_KDAYS = LT_KDAYS
      "C_WDAYS = LT_WDAYS
      "C_DD03P = LT_DD03P
      "C_TAGPR = LT_TAGPR
      "C_TEVEN = LT_TEVEN ).

    ELSE.
      MESSAGE i186(b4).
*   Bitte Start- und Endedatum angeben
    ENDIF.



  ENDMETHOD.

*&---------------------------------------------------------------------*
*&  Include           ZHR_REP_SUMMARY_WEEK_0100
*&---------------------------------------------------------------------*
  METHOD get_pernr_data.

    DATA lt_pa0007       TYPE TABLE OF pa0007.
    DATA lt_pa0000       TYPE TABLE OF pa0000.
    DATA lt_pa0001       TYPE TABLE OF pa0001.

    DATA lt_result_tab_o TYPE TABLE OF swhactor.
    DATA lv_isall        TYPE xfeld.
    DATA lt_obj_tab      TYPE TABLE OF hrobject.
    DATA lv_act_plvar    TYPE plvar.
    DATA lv_count(1)     TYPE n.
    DATA field           TYPE fieldname.

    FIELD-SYMBOLS <field> TYPE any.

    "Sollarbeitszeitmodell, alle Personen mit Zeiterfassung
    SELECT * FROM pa0007 INTO TABLE lt_pa0007
              WHERE pernr IN so_pernr
                AND begda LE so_datum-low
                AND endda GE so_datum-low
                AND zterf EQ '1'.

    IF sy-subrc IS INITIAL.


      "Organisatorische Zuordnung in diesem Zeitraum
      SELECT * FROM pa0001 INTO TABLE lt_pa0001
          FOR ALL ENTRIES IN lt_pa0007
          WHERE pernr = lt_pa0007-pernr
                  AND persk IN so_persk
                  AND begda LE so_datum-low
                  AND endda GE so_datum-low.

      "Maßnahmen Aktiv in diesem Zeitraum
      SELECT * FROM pa0000 INTO TABLE lt_pa0000
           FOR ALL ENTRIES IN lt_pa0007
           WHERE pernr = lt_pa0007-pernr
           AND stat2 EQ '3'
           AND begda LE so_datum-low
           AND endda GE so_datum-low.
    ENDIF.

    "Mitarbeiterkreis Texte
    SELECT * FROM t503t INTO TABLE @DATA(lt_t503t)
      WHERE sprsl = @sy-langu.

    "AZPR Texte pro Mitarbeiterkreisgruppierung 1 2 mit Info Feiertagskalender
    SELECT * FROM t508s INTO TABLE @DATA(lt_t508s)
      WHERE sprsl = @sy-langu AND mosid = '03' AND mofid = @p_factid.

    "Mitarbeitergruppe 1=aktiv / Mitarbeiterkreis Angestellte, Arbeiter
    SELECT * FROM t503 INTO TABLE @DATA(lt_t503) WHERE
      persg = '1'.

    "AZPR Verweis auf Periodenzeitplan, Wochenstunden, Monatsstunden, etc.
    SELECT * FROM t508a INTO TABLE @DATA(lt_t508a) WHERE
      mofid = @p_factid.

    "Periodenzeitplan Mo-So TAZP Gruppierung 3
    SELECT * FROM t551a INTO TABLE @DATA(lt_t551a) WHERE
      motpr = '03'.

    "Tagesarbeitszeitplan mit TAZP Gruppierung 3 (bei uns in Verwendung) speziell auch für Freitag
    " mit Info Zeiten und Pause
    SELECT * FROM t550a INTO TABLE @DATA(lt_t550a) WHERE
      motpr = '03'
      AND begda LE @so_datum-low
      AND endda GE @so_datum-low.

    "Pausenplan mit TAZP Gruppierung 3 mit exakten Pausenzeiten
    SELECT * FROM t550p INTO TABLE @DATA(lt_t550p)
      WHERE motpr = '03'.

    "  wurde in der Selektion eine ORG-Einheit eingegeben diese berücksichtigen
    IF p_orgeh IS NOT INITIAL.

      "Planvariante erheben
      CALL FUNCTION 'RH_GET_ACTIVE_WF_PLVAR'
        IMPORTING
          act_plvar = lv_act_plvar
        EXCEPTIONS
          OTHERS    = 1.

      "SubOrgeinheiten der gesetzten Planvariante und gewählten Orgeinheit erheben
      CLEAR: lt_result_tab_o[].
      CALL FUNCTION 'RH_STRUC_GET'
        EXPORTING
          act_otype      = 'O'
          act_objid      = p_orgeh
          act_wegid      = 'SAP_SORG'
          act_plvar      = lv_act_plvar
        TABLES
          result_tab     = lt_result_tab_o
        EXCEPTIONS
          no_plvar_found = 1
          no_entry_found = 2
          OTHERS         = 3.

      "Orgeinheiten. Nur P Personen behalten
      DELETE lt_result_tab_o WHERE otype NE 'P'.
      SORT lt_result_tab_o BY objid.

      " und die selektierten Personalnummern 0007 einschränken, wenn nicht zu den Orgeinheiten passend.
      LOOP AT lt_pa0007 ASSIGNING FIELD-SYMBOL(<pa0007>).
        READ TABLE lt_result_tab_o ASSIGNING FIELD-SYMBOL(<tab_o>) WITH KEY objid = <pa0007>-pernr BINARY SEARCH.
        IF sy-subrc IS NOT INITIAL.
          DELETE TABLE lt_pa0007 FROM <pa0007>.
        ENDIF.
      ENDLOOP.
    ENDIF.

    SORT lt_pa0000 BY pernr.

    "Alle aktiven MA durchgehen
    LOOP AT lt_pa0000 INTO DATA(ls_pa0000).

      CLEAR gs_alv.

      MOVE-CORRESPONDING ls_pa0000 TO gs_alv.

      " Org. Zuordnung Info ergänzen
      READ TABLE lt_pa0001 INTO DATA(ls_pa0001)
      WITH KEY pernr = ls_pa0000-pernr.
      "HST 2019-06-12 Anfang
      IF sy-subrc IS INITIAL.
        MOVE-CORRESPONDING ls_pa0001 TO gs_alv.
      ELSE.
        CLEAR ls_pa0001.
      ENDIF.

      "Personenkreis Text ergänzen
      READ TABLE lt_t503t INTO DATA(ls_t503t)
      WITH KEY persk = ls_pa0001-persk.
      IF sy-subrc IS INITIAL.
        MOVE-CORRESPONDING ls_t503t TO gs_alv.
      ELSE.
        CLEAR ls_t503t.
      ENDIF.

      "Sollarbeitszeitinfo ergänzen, da hier nur MA mit selektierter Orgeinheit übrig sind, wird hier gefiltert.
      READ TABLE lt_pa0007 INTO DATA(ls_pa0007)
      WITH KEY pernr = ls_pa0000-pernr.
      IF sy-subrc IS INITIAL.
        MOVE-CORRESPONDING ls_pa0007 TO gs_alv.
      ELSE.
        CLEAR gs_alv.
        CONTINUE.
      ENDIF.

      "Mitarbeitergruppe / Mitarbeiterkreis lesen ohne weiteren Schritt
      READ TABLE lt_t503 INTO DATA(ls_t503) "ABTYP Gruppe Mitarbeiterkreis
      WITH KEY persk = ls_pa0001-persk persg = '1'.

      "HST 2019-06-12 Ende

      "HST 2019-06-11 Anfang

      " Mitarbeitergruppe/-kreis ermitteln
      " AZPR Text schreiben
      READ TABLE lt_t508s INTO DATA(ls_t508s)
      WITH KEY zeity = ls_t503-abtyp mofid = p_factid schkz = ls_pa0007-schkz.
      IF sy-subrc IS INITIAL.
        MOVE-CORRESPONDING ls_t508s TO gs_alv.
      ELSE.
        gs_alv-rtext = 'Fehler'.
        CLEAR ls_t508s.
      ENDIF.

      " AZPR Tabelle
      READ TABLE lt_t508a INTO DATA(ls_t508a)
    WITH KEY zeity = ls_t503-abtyp mofid = p_factid schkz = ls_pa0007-schkz.
      IF sy-subrc IS INITIAL.
        .
      ELSE.
        gs_alv-rtext = 'Fehler'.
        CLEAR ls_t508a.
      ENDIF.

      " PAZP Ein Satz für Mo-So
      READ TABLE lt_t551a INTO DATA(ls_t551a)
      WITH KEY zmodn = ls_t508a-zmodn.
      IF sy-subrc = 0.

        lv_count = 0.
        DO 5 TIMES.

          ADD 1 TO lv_count.

          CONCATENATE 'ls_t551a-TPRG' lv_count INTO field.
          ASSIGN (field) TO <field>.

          " TAZP ohne Freitag
          READ TABLE lt_t550a INTO DATA(ls_t550a)
          WITH KEY tprog = <field> varia = ''.

          " TAZP mit Freitag
          IF lv_count = 5. " Freitag kann ein kurzer Arbeitstag sein
            " Tagesarbeitszeitplan vom Fr. laden, wenn nichts gefunden wird, wird LS_T550A auch nicht überschreiben
            READ TABLE lt_t550a INTO ls_t550a
            WITH KEY tprog = <field> varia = 'F'.
          ENDIF.

          CONCATENATE 'GS_ALV-AZ' lv_count INTO field.
          ASSIGN (field) TO <field>.
          "Eintragen AZ aus T550A
          IF ls_t550a-nobeg = ''.
            "HST 2019-06-13 Anfang
            CONCATENATE ls_t550a-sobeg(2) ':'  ls_t550a-sobeg+2(2) '-'
            ls_t550a-soend(2) ':' ls_t550a-soend+2(2) 'F' INTO <field>
            RESPECTING BLANKS.
            "<field> = ls_t550a-tprog.
            "HST 2019-06-13 Ende
          ELSE.
            CONCATENATE ls_t550a-nobeg(2) ':'  ls_t550a-nobeg+2(2) '-'
            ls_t550a-noend(2) ':' ls_t550a-noend+2(2) INTO <field>
            RESPECTING BLANKS.
            "<field> = ls_t550a-tprog && ':    ' && ls_t550a-nobeg(2)
            "&& ':' && ls_t550a-nobeg+2(2) && ' - ' && ls_t550a-noend(2) && ':' && ls_t550a-noend+2(2).

          ENDIF.

          IF ls_t550a-tprog = 'FREI'.
            <field> = ls_t550a-tprog.
            "<field> = ''.
          ELSE.
            IF p_kuerz IS NOT INITIAL.
              CONCATENATE ls_t550a-tprog  ': '  <field> INTO <field> RESPECTING BLANKS.
            ENDIF.
            " Eintragen Pause
            IF ls_t550a-pamod IS NOT INITIAL.
              " Pausen aus T550P lt. Pause aus T550A
              LOOP AT lt_t550p INTO DATA(ls_t550p)
              WHERE pamod = ls_t550a-pamod.

                CONCATENATE 'GS_ALV-PAUSE' lv_count INTO field.
                ASSIGN (field) TO <field>.

                IF ls_t550p-stdaz = 0.
                  CONCATENATE ls_t550p-pabeg(2) ':' ls_t550p-pabeg+2(2) '-' ls_t550p-paend(2) ':' ls_t550p-paend+2(2) ' ' <field> INTO <field> RESPECTING BLANKS.
                  "<field> = <field> && '    '  && ls_t550p-pabeg(2) && ':' && ls_t550p-pabeg+2(2) && ' - '
                  "&& ls_t550p-paend(2) && ':' && ls_t550p-paend+2(2).
                ELSE.
                  <field> = <field> && ' n. ' && ls_t550p-stdaz && 'h ' && ls_t550p-pdunb && 'h '.
                ENDIF.

              ENDLOOP.
              IF p_kuerz IS NOT INITIAL.
                CONCATENATE ls_t550a-pamod  ': ' <field> INTO <field> RESPECTING BLANKS.
              ENDIF.

            ELSE.
              CONCATENATE 'GS_ALV-PAUSE' lv_count INTO field.
              ASSIGN (field) TO <field>.

              <field> = 'Keine Pause'.
            ENDIF.

          ENDIF.

        ENDDO.

      ENDIF.
      MOVE '1' TO gs_alv-zaehl.
      APPEND gs_alv TO gt_alv.

    ENDLOOP.

    SORT gt_alv BY ename.

  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

  application=>run( ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_orgeh.
  application=>orgeh_f4( ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_persk-low.
  application=>persk_f4( c_dynprofield = 'SO_PERSK-LOW' ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_persk-high.
  application=>persk_f4( c_dynprofield = 'SO_PERSK-HIGH' ).

AT SELECTION-SCREEN OUTPUT.
  application=>set_default( ).