[ABAP] SALV: Events abfangen beim Klick auf die ALV Funktions-Buttons am Beispiel Filter-Setzen

CLASS lcl_salv DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: on_before_function FOR EVENT before_salv_function OF cl_salv_events_table
      IMPORTING e_salv_function
                sender.

    CLASS-METHODS: on_after_function FOR EVENT after_salv_function OF cl_salv_events_table
      IMPORTING e_salv_function
                sender.
ENDCLASS.

CLASS lcl_salv IMPLEMENTATION.
* Event vor ALV-Button Klick
  METHOD on_before_function.
* Werte für e_salv_function sind in cl_salv_gui_ui_function_tools=>cs_list_ui_function deklariert
    CASE e_salv_function.
* '&ETA'
      WHEN cl_salv_gui_ui_function_tools=>cs_list_ui_function-detail.
        MESSAGE |Details { e_salv_function }| TYPE 'S'.
* '&ILT'
      WHEN cl_salv_gui_ui_function_tools=>cs_list_ui_function-filter.
        MESSAGE |Filter { e_salv_function }| TYPE 'S'.
* '%PC'
      WHEN cl_salv_gui_ui_function_tools=>cs_list_ui_function-system_localfile.
        MESSAGE |Export { e_salv_function }| TYPE 'S'.
      WHEN OTHERS.
        MESSAGE |Before Other { e_salv_function }| TYPE 'S'.
    ENDCASE.
  ENDMETHOD.

* Event nach ALV-Button Klick
  METHOD on_after_function.
* Werte für e_salv_function sind in cl_salv_gui_ui_function_tools=>cs_list_ui_function deklariert
    CASE e_salv_function.
* '&ETA'
      WHEN cl_salv_gui_ui_function_tools=>cs_list_ui_function-detail.
        MESSAGE |Details { e_salv_function }| TYPE 'S'.
* '&ILT'
      WHEN cl_salv_gui_ui_function_tools=>cs_list_ui_function-filter.
        MESSAGE |Filter { e_salv_function }| TYPE 'S'.
* '%PC'
      WHEN cl_salv_gui_ui_function_tools=>cs_list_ui_function-system_localfile.
        MESSAGE |Export { e_salv_function }| TYPE 'S'.
      WHEN OTHERS.
        MESSAGE |After Other { e_salv_function }| TYPE 'S'.
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  SELECT FROM mara
    FIELDS *
    INTO TABLE @DATA(it_mara)
    UP TO 10 ROWS.

    try.
* SALV-Table
  DATA: o_salv TYPE REF TO cl_salv_table.

  cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                          CHANGING  t_table      = it_mara ).

* Grundeinstellungen
  o_salv->get_functions( )->set_all( abap_true ).
  o_salv->get_columns( )->set_optimize( abap_true ).
  o_salv->get_display_settings( )->set_list_header( 'Überschrift' ).
  o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
  o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte, Short Text und Medium Text leer lassen für Autosize
  LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
    DATA(o_col) = <c>-r_column.
    o_col->set_short_text( || ).
    o_col->set_medium_text( || ).
    o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
  ENDLOOP.

* Event-Handler für Klick auf die ALV-Funktionsbuttons (Sort, Filter, Export...)
  SET HANDLER lcl_salv=>on_before_function FOR o_salv->get_event( ).
  SET HANDLER lcl_salv=>on_after_function FOR o_salv->get_event( ).

  o_salv->display( ).
CATCH cx_root INTO DATA(e_txt).
  WRITE: / e_txt->get_text( ).
ENDTRY.