Zugriff auf nicht unterstützte Ereignisse des CL_SALV_TABLE

Der SALV wird inzwischen gerne von Programmierern verwendet, da einiges einfacher und einleuchtender ist, als beim ALV-Grid. Allerdings ist auch vieles komplizierter und überhaupt nicht einleuchtend. Zudem hat der SALV einige Funktionen nicht, die der ALV-Grid schon lange zur Verfügung stellt, wie zum Beispiel Editierbarkeit. Ich brauchte neulich in einem Projekt das Ereignis „Verzögertes Reagieren auf Markierungen“ in einem SALV-Grid. Leider bietet der SALV dieses Event nicht an. Developer Hero 2016 Łukasz Pęgiel hat mir das unten stehende Coding zur Verfügung gestellt. Vielen Dank dafür!

Was macht das Ereignis Delayed_Changed_Sel_Callback?

Das Ereignis wird immer dann – verzögert! – ausgelöst, wenn der Anwender die Markierung im Grid ändert, also zum Beispiel Zeilen, Spalten oder einzelne Zellen markiert. Standardmäßig ist die Verzögerung von DELAYED_CHANGED_SEL_CALLBACK auf 1,5 Sekunden eingestellt. Die Funktionalität kann dafür verwendet werden, um Daten anhand der markierten Zellen nachzulesen und anzuzeigen, ohne dass der Anwender eine weitere Taste drücken muss. 1,5 Sekunden sind allerdings häufig eine zu lange Zeit, denn häufig wechselt ein Anwender kurz vor dieser Zeitspanne die Markierung wieder, weil er der Meinung war, dass nun eh nichts mehr passiert. Wie diese Einstellung geändert werden kann, habe ich in dem Beispiel AUTOSUMME beschrieben.

Was ist nun der Trick?

Der Trick, um an die Events des unterliegenden ALV-Grids zu gelangen, liegt darin, das Ereignis AFTER_REFRESH FOR ALL INSTANCES zu registrieren, also auf alle aktuell instanziierten Grids anzuwenden. Zusätzlich muss der implizit immer vorhandene Importing-Parameter SENDER bei der Definition angegeben werden:

 METHODS evh_refresh FOR EVENT after_refresh
      OF cl_gui_alv_grid
      IMPORTING sender.

In dem unten stehenden Programm wird ein einfacher SALV mit Daten aus der Flugdatenbank erzeugt. Es wird das Ereignis AFTER_REFRESH registriert um in diesem Ereignis für den SENDER – also das im SALV verwendete ALV-Grid – das eigentliche Ereignis Delayed_Change_Sel_Callback zu registrieren. Wird die Markierung im Grid geändert, so wird diese Meldung ausgegeben:

2016-10-10_09-46-32

Wer eine Alternative zu SALV und ALV-Grid sucht, der sollte sich das Open-Source-Tool FALV von Łukasz ansehen!

Achtung

Der Zusatz FOR ALL INSTANCES greift wirklich bei ALLEN Instanzen des ALV-Grid!! Deswegen sollte er wirklich nur mit Bedacht benutzt werden und du solltest dir der möglichen Seiteneffekte bewusst sein, denn viele interne Funktionen des SALV und ALV-Grids nutzen ebenfalls wieder ein Grid (Auswahl Feldkatalog, Auswahl Layout etc.). So kann es zu ungewollten Reaktionen – zum Beispiel bei der Änderung des Layouts – kommen:

2016-10-10_09-11-13

Code

REPORT zsalv_grid_events.

CLASS lcl_grid_trick DEFINITION.

 PUBLIC SECTION.

 DATA spfli TYPE STANDARD TABLE OF spfli.
 DATA salv TYPE REF TO cl_salv_table.

 METHODS create_salv.
 METHODS evh_refresh FOR EVENT after_refresh
 OF cl_gui_alv_grid
 IMPORTING sender.
 METHODS evh_delayed_selection
 FOR EVENT delayed_changed_sel_callback
 OF cl_gui_alv_grid
 IMPORTING sender.
 PRIVATE SECTION.
 DATA mv_event_registered TYPE boolean.

ENDCLASS.

CLASS lcl_grid_trick IMPLEMENTATION.

 METHOD create_salv.

 SELECT * UP TO 100 ROWS
 INTO CORRESPONDING FIELDS OF TABLE @spfli
 FROM spfli.

 cl_salv_table=>factory(
 IMPORTING
 r_salv_table = salv
 CHANGING
 t_table = spfli ).

 salv->get_functions( )->set_default( abap_true ).

 SET HANDLER evh_refresh FOR ALL INSTANCES.

 salv->display( ).

 ENDMETHOD.

 METHOD evh_refresh.

 CHECK mv_event_registered = abap_false.
 SET HANDLER evh_delayed_selection FOR sender.
 sender->register_delayed_event( i_event_id = cl_gui_alv_grid=>mc_evt_delayed_change_select ).
 mv_event_registered = abap_true.

 ENDMETHOD.

 METHOD evh_delayed_selection.

 DATA lr_type_description TYPE REF TO cl_abap_typedescr.
 lr_type_description = cl_abap_typedescr=>describe_by_object_ref( sender ).
 MESSAGE i001(00)
 WITH 'Delayed Selection; SENDER ist vom Typ '
 lr_type_description->absolute_name.

 ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

 DATA(output) = NEW lcl_grid_trick( ).
 output->create_salv( ).

 

image_pdfimage_print