CL_SALV_TABLE innerhalb einer (statischen) Methode mit Funktionen: OK534 und Mehrfachaufrufe

Der Fehlercode erscheint mit einem Programm Abbruch, wenn eine Funktion von einem ALV erzeugt mit CL_SALV_DATA in einer Methode aufgerufen wird, dessen Deklaration nicht sauber ist.

Ursache ist, dass das ALV in einer statischen Methode erzeugt wurde und die Daten des ALV hier lt_group_check und die anderen Objektreferenzen in CLASS-DATA deklariert werden müssen und nicht lokal mit DATA oder global mit DATA deklariert werden dürfen.

Hier die Funktionsleiste

Hier die Erzeugung der Referenz auf das ALV.

          cl_salv_table=>factory(
            EXPORTING
*          list_display   = IF_SALV_C_BOOL_SAP=>FALSE    " ALV wird im Listenmodus angezeigt
              r_container    = go_vgm_check_cont    " Abstracter Container fuer GUI Controls
*          container_name =
            IMPORTING
              r_salv_table   = go_vgm_check_alv    " Basisklasse einfache ALV Tabellen
            CHANGING
*              t_table        = <check_data>
              t_table        = lt_group_check
          ).

Die Aktivierung der Funktionen erfolgt auf folgende Art und Weise

          "Functions aktivieren
          go_vgm_check_alv->get_functions( )->set_all( abap_true ).


          gr_layout = go_vgm_check_alv->get_layout( ).
          key-report = sy-repid.
          gr_layout->set_key( key ).
* You can pass the folling values to the SET_SAVE_RESTRICTION method.
*RESTRICT_NONE
*RESTRICT_USER_DEPENDANT
*RESTRICT_USER_INDEPENDANT
          gr_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
          DATA: lv_variant TYPE slis_vari VALUE '/DEFAULT'.
          gr_layout->set_initial_layout( lv_variant ).

Das Ganze am Besten in eine Try

TRY.
....

        CATCH cx_salv_msg.    " ALV: Allg. Fehlerklasse  mit Meldung
        CATCH cx_salv_data_error.  " ALV: Allg. Fehlerklasse (wird bei Syntaxprüfung geprüft)
        CATCH cx_salv_not_found.  " ALV: Allg. Fehlerklasse (wird bei Syntaxprüfung geprüft)
        CATCH cx_salv_existing.  " ALV: Allg. Fehlerklasse (wird bei Syntaxprüfung geprüft)
          EXIT.
      ENDTRY

Die Deklaration der Referenzen und Daten muss, wenn der Code in einer (statischen) Methode aufgerufen wird, in class-data erfolgen.

PRIVATE SECTION.
    CONSTANTS:
      gco_cont_vgm_check TYPE c LENGTH 50 VALUE 'CONT_VGM_CHECK'.
    CLASS-DATA:
      go_vgm_check_cont TYPE REF TO cl_gui_custom_container,
      go_vgm_check_alv  TYPE REF TO cl_salv_table,
      gr_layout TYPE REF TO cl_salv_layout, "HST20210601
      key TYPE salv_s_layout_key, "HST20210601

      lt_group_check    TYPE zle_t_io_vbuero_group_check,

Zusammen:

    IF go_vgm_check_cont IS NOT BOUND.
      CREATE OBJECT go_vgm_check_cont
        EXPORTING
          container_name              = gco_cont_vgm_check
        EXCEPTIONS
          cntl_error                  = 1
          cntl_system_error           = 2
          create_error                = 3
          lifetime_error              = 4
          lifetime_dynpro_dynpro_link = 5.
    ENDIF.

    IF go_vgm_check_alv IS NOT BOUND.
      TRY.
          cl_salv_table=>factory(
            EXPORTING
*          list_display   = IF_SALV_C_BOOL_SAP=>FALSE    " ALV wird im Listenmodus angezeigt
              r_container    = go_vgm_check_cont    " Abstracter Container fuer GUI Controls
*          container_name =
            IMPORTING
              r_salv_table   = go_vgm_check_alv    " Basisklasse einfache ALV Tabellen
            CHANGING
*              t_table        = <check_data>
              t_table        = lt_group_check
          ).

          go_vgm_check_alv->get_columns( )->set_color_column( 'CELL_COLORS' ).
          go_vgm_check_alv->get_sorts( )->clear( ).
          go_vgm_check_alv->get_sorts( )->add_sort(
              columnname = 'SAMMELNR'
*              position   =
              sequence   = if_salv_c_sort=>sort_up
              subtotal   = abap_true
*              group      = IF_SALV_C_SORT=>group_none
*              obligatory = IF_SALV_C_BOOL_SAP=>FALSE
          ).


          "Functions aktivieren
          go_vgm_check_alv->get_functions( )->set_all( abap_true ).


          gr_layout = go_vgm_check_alv->get_layout( ).
          key-report = sy-repid.
          gr_layout->set_key( key ).
* You can pass the folling values to the SET_SAVE_RESTRICTION method.
*RESTRICT_NONE
*RESTRICT_USER_DEPENDANT
*RESTRICT_USER_INDEPENDANT
          gr_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
          DATA: lv_variant TYPE slis_vari VALUE '/DEFAULT'.
          gr_layout->set_initial_layout( lv_variant ).


        CATCH cx_salv_msg.    " ALV: Allg. Fehlerklasse  mit Meldung
        CATCH cx_salv_data_error.  " ALV: Allg. Fehlerklasse (wird bei Syntaxprüfung geprüft)
        CATCH cx_salv_not_found.  " ALV: Allg. Fehlerklasse (wird bei Syntaxprüfung geprüft)
        CATCH cx_salv_existing.  " ALV: Allg. Fehlerklasse (wird bei Syntaxprüfung geprüft)
          EXIT.
      ENDTRY.
    ENDIF.

Die Anzeige erfolgt dann, hier mit ein paar Änderungen der Spalten:

    TRY .
        go_vgm_check_alv->set_data(
          CHANGING
*            t_table = <check_data>    " Darzustellende Tabelle
            t_table = lt_group_check    " Darzustellende Tabelle
        ).

        lt_alv_columns = go_vgm_check_alv->get_columns( )->get( ).

        LOOP AT lt_alv_columns ASSIGNING <alv_column> WHERE columnname(4) = 'GEB_'.

          IF <alv_column>-columnname(7) = 'GEB_EH_'.
            <alv_column>-r_column->set_visible( if_salv_c_bool_sap=>false ).
          ELSE.
            SPLIT <alv_column>-columnname AT '_' INTO lv_column_text_l lv_column_text_l.
            lv_column_text_s = lv_column_text_m = lv_column_text_l.

            <alv_column>-r_column->set_short_text( lv_column_text_s ).
            <alv_column>-r_column->set_medium_text( lv_column_text_m ).
            <alv_column>-r_column->set_long_text( lv_column_text_l ).
          ENDIF.
        ENDLOOP.
      CATCH cx_salv_no_new_data_allowed.    " ALV: Setzen neuer Daten nicht erlaubt
      CATCH cx_salv_data_error.  " ALV: Allg. Fehlerklasse (wird bei Syntaxprüfung geprüft)
        EXIT.
    ENDTRY.

    go_vgm_check_alv->get_columns( )->set_optimize( abap_true ).
    go_vgm_check_alv->display( ).

Damit das ganze bei Mehrfachaufrufen funktioniert, müssen die Referenzen beim Ausstieg gelöst werden.

    CASE lv_okcode.
      WHEN 'EXIT' OR 'BACK' OR 'CANCEL'.
        go_vgm_check_cont->free(
           EXCEPTIONS
             cntl_error        = 1
             cntl_system_error = 2
             OTHERS            = 3
         ).
        IF sy-subrc <> 0.
*         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.
        free go_vgm_check_cont.
        free go_vgm_check_alv.
        LEAVE TO SCREEN 0.
      WHEN OTHERS.
    ENDCASE.