* Eventhandler
CLASS lcl_events DEFINITION.
PUBLIC SECTION.
* Platzhalter für Referenz auf SALV-Grid
CLASS-DATA: o_salv TYPE REF TO cl_salv_table.
* Platzhalter für Referenz auf interne Tabelle
CLASS-DATA: it_t024 TYPE STANDARD TABLE OF t024 WITH DEFAULT KEY.
* Eventhandler-Methode für Change-Select, Verzögerung ~1.5s
CLASS-METHODS: on_row_select FOR EVENT delayed_changed_sel_callback OF cl_gui_alv_grid
IMPORTING sender.
ENDCLASS.
CLASS lcl_events IMPLEMENTATION.
* Event behandelt die Auswahl Zeilen/Spalten im Gitter mit 1,5s Verzögerung
METHOD on_row_select.
TRY.
* referenz auf ALV-Grid holen
DATA(o_alv) = CAST cl_gui_alv_grid( sender ).
* selektierte Zeilen, abh. vom if_salv_c_selection_mode
o_alv->get_selected_rows( IMPORTING et_row_no = DATA(it_sel_rows)
et_index_rows = DATA(it_sel_rows_idx) ).
* selektierte Spalten, abh. vom if_salv_c_selection_mode
o_alv->get_selected_columns( IMPORTING et_index_columns = DATA(it_sel_cols_idx) ).
LOOP AT it_sel_cols_idx ASSIGNING FIELD-SYMBOL(<col>).
ENDLOOP.
LOOP AT it_sel_rows_idx ASSIGNING FIELD-SYMBOL(<row>).
ENDLOOP.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
ENDCLASS.
CLASS lcl_salv_helper DEFINITION INHERITING FROM cl_salv_model_base FINAL.
PUBLIC SECTION.
CLASS-METHODS:
get_alv_from_salv
IMPORTING
io_salv_grid TYPE REF TO cl_salv_table
RETURNING
VALUE(ro_grid) TYPE REF TO cl_gui_alv_grid.
ENDCLASS.
CLASS lcl_salv_helper IMPLEMENTATION.
*---------------------------------------------------------------------*
* Wandelt eine Referenz auf cl_salv_table in ein cl_gui_alv_grid um.
*---------------------------------------------------------------------*
* -> io_model - Referenz auf cl_salv_table
* <- ro_grid - Referenz auf cl_gui_alv_grid, bei Fehler INITIAL
*---------------------------------------------------------------------*
METHOD get_alv_from_salv.
IF io_salv_grid IS BOUND.
TRY.
DATA(o_model) = CAST cl_salv_model_base( io_salv_grid->extended_grid_api( ) ).
* Funktioniert nur, wenn SALV-Table schon mit display( ) angezeigt und
* somit schon ein Container dafür erzeugt wurde. Andernfalls ist r_adapter INITIAL.
IF o_model->r_controller IS BOUND AND o_model->r_controller->r_adapter IS BOUND.
IF o_model->r_controller->r_adapter IS INSTANCE OF if_salv_table_display_adapter.
ro_grid = CAST if_salv_table_display_adapter( o_model->r_controller->r_adapter )->get_grid( ).
ENDIF.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
TRY.
* Beispieldaten (Einkäufergruppen) holen
SELECT FROM t024
FIELDS *
INTO TABLE @lcl_events=>it_t024
UP TO 10 ROWS.
IF sy-subrc = 0.
cl_salv_table=>factory( EXPORTING r_container = cl_gui_container=>default_screen
IMPORTING r_salv_table = lcl_events=>o_salv
CHANGING t_table = lcl_events=>it_t024 ).
* Standardbuttons der SALV-Table
lcl_events=>o_salv->get_functions( )->set_all( abap_true ).
* if_salv_c_selection_mode=>single : es kann eine Zeile im SALV/ALV selektiert werden
* if_salv_c_selection_mode=>row_column: es können mehrere Zeile und Spalten im SALV/ALV selektiert werden
* nach 1,5s wird dann der Event on_delayed_change_select ausgelöst
lcl_events=>o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>single ).
* SALV anzeigen
lcl_events=>o_salv->display( ).
* ALV-Objektreferenz aus dem SALV-Grid holen, funktioniert erst nach o_salv->display( )
DATA(o_alv) = lcl_salv_helper=>get_alv_from_salv( lcl_events=>o_salv ).
IF o_alv IS BOUND.
* Event-Handler des ALV
SET HANDLER lcl_events=>on_row_select FOR o_alv.
* Event registrieren
o_alv->register_delayed_event( i_event_id = cl_gui_alv_grid=>mc_evt_delayed_change_select ).
ENDIF.
* Toolbar der Listausgabe unterdrücken
cl_abap_list_layout=>suppress_toolbar( ).
* Listausgabe erzwingen für Erzeugung von cl_gui_container=>default_screen
WRITE: space.
ENDIF.
CATCH cx_root INTO DATA(e_txt).
WRITE: / e_txt->get_text( ).
ENDTRY.