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.