Variante 1 (cl_gui_docking_container)
CLASS lcl_event DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object
sender.
CLASS-METHODS:
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm " Benutzerkommando
sender. " Sender
ENDCLASS.
CLASS lcl_event IMPLEMENTATION.
METHOD handle_toolbar.
* Separator hinzufügen
APPEND VALUE #( butn_type = 3 ) TO e_object->mt_toolbar.
* Print-Button hinzufügen
APPEND VALUE #( butn_type = 5 text = 'Klick!' icon = icon_change_text function = 'PRINT_DATA' quickinfo = 'Etwas ausgeben' disabled = ' ' ) TO e_object->mt_toolbar.
ENDMETHOD.
METHOD handle_user_command.
* TypeCast auf Sender
DATA: o_grid TYPE REF TO cl_gui_alv_grid.
o_grid ?= sender.
CASE e_ucomm.
* Daten speichern
WHEN 'PRINT_DATA'.
WRITE: / 'Klick: ', o_grid->m_guid.
ENDCASE.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: it_data TYPE STANDARD TABLE OF t000.
DATA: o_salv TYPE REF TO cl_salv_table.
* Daten holen
SELECT *
INTO TABLE it_data
FROM t000.
DATA(o_dock) = NEW cl_gui_docking_container( no_autodef_progid_dynnr = abap_true
side = cl_gui_docking_container=>dock_at_top
* style = cl_gui_container=>ws_visible + cl_gui_container=>ws_thickframe + cl_gui_container=>ws_child
ratio = 90
caption = 'Datenausgabe'
name = 'CNT1' ).
* Datenanzeige
TRY.
* Bei Angabe des Containers o_dock bleibt die Abarbeitung nach o_salv->display( ) nicht
* stehen, sondern läuft weiter und die Referenz auf das ALV-Grid kann geholt werden.
* Eine Anzeige des SALV-Grids erfolgt so aber nur, wenn eine Listenausgabe erfolgt, daher das WRITE space.
cl_salv_table=>factory( EXPORTING
r_container = o_dock
IMPORTING
r_salv_table = o_salv
CHANGING
t_table = it_data ).
o_salv->get_functions( )->set_all( ).
o_salv->display( ).
* Trick: Aus dem Container das Grid-Objekt holen und nach cl_gui_alv_grid casten
READ TABLE o_dock->children INDEX 1 ASSIGNING FIELD-SYMBOL(<child>).
DATA(o_alv_grid) = CAST cl_gui_alv_grid( <child> ).
* Eventhandler registrieren
SET HANDLER lcl_event=>handle_toolbar FOR o_alv_grid.
SET HANDLER lcl_event=>handle_user_command FOR o_alv_grid.
* Anzeige neu aufbauen
o_alv_grid->refresh_table_display( ).
CATCH cx_root INTO DATA(e_text).
WRITE: / e_text->get_text( ).
ENDTRY.
* leere Toolbar ausblenden
cl_abap_list_layout=>suppress_toolbar( ).
WRITE space. " wichtig für Erzwingung der Listenausgabe
Variante 2 (cl_gui_splitter_container)
CLASS lcl_event DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object
sender.
CLASS-METHODS:
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm " Benutzerkommando
sender. " Sender
ENDCLASS.
CLASS lcl_event IMPLEMENTATION.
METHOD handle_toolbar.
* Separator hinzufügen
APPEND VALUE #( butn_type = 3 ) TO e_object->mt_toolbar.
* Edit-Button hinzufügen
APPEND VALUE #( butn_type = 5 text = 'Klick!' icon = icon_change_text function = 'PRINT_DATA' quickinfo = 'Etwas ausgeben' disabled = ' ' ) TO e_object->mt_toolbar.
ENDMETHOD.
METHOD handle_user_command.
* TypeCast auf Sender
DATA: o_grid TYPE REF TO cl_gui_alv_grid.
o_grid ?= sender.
CASE e_ucomm.
* Daten speichern
WHEN 'PRINT_DATA'.
WRITE: / 'Klick: ', o_grid->m_guid.
ENDCASE.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: it_data TYPE STANDARD TABLE OF t000.
DATA: o_salv TYPE REF TO cl_salv_table.
* Daten holen
SELECT *
INTO TABLE it_data
FROM t000.
DATA(o_split) = NEW cl_gui_splitter_container( parent = cl_gui_container=>default_screen
no_autodef_progid_dynnr = abap_true
rows = 1
columns = 2 ). " wenn columns = 1, dann FullScreen
* Referenz auf linken Container holen
DATA(o_spl_left) = o_split->get_container( row = 1 column = 1 ).
* Datenanzeige
TRY.
* Bei Angabe des Containers o_spl_left bleibt die Abarbeitung nach o_salv->display( ) nicht
* stehen, sondern läuft weiter und die Referenz auf das ALV-Grid kann geholt werden.
* Eine Anzeige des SALV-Grids erfolgt so aber nur, wenn eine Listenausgabe erfolgt, daher das WRITE space.
cl_salv_table=>factory( EXPORTING
r_container = o_spl_left
IMPORTING
r_salv_table = o_salv
CHANGING
t_table = it_data ).
o_salv->get_functions( )->set_all( ).
o_salv->display( ).
* Trick: Aus dem Container das Grid-Objekt holen und nach cl_gui_alv_grid casten
READ TABLE o_spl_left->children INDEX 1 ASSIGNING FIELD-SYMBOL(<child>).
IF <child> IS ASSIGNED.
DATA(o_alv_grid) = CAST cl_gui_alv_grid( <child> ).
* Eventhandler registrieren
SET HANDLER lcl_event=>handle_toolbar FOR o_alv_grid.
SET HANDLER lcl_event=>handle_user_command FOR o_alv_grid.
* Anzeige neu aufbauen
o_alv_grid->refresh_table_display( ).
ENDIF.
CATCH cx_root INTO DATA(e_text).
WRITE: / e_text->get_text( ).
ENDTRY.
* leere Toolbar ausblenden
cl_abap_list_layout=>suppress_toolbar( ).
WRITE space. " wichtig für Erzwingung der Listenausgabe
Variante 3 (cl_gui_container=>screen0)
CLASS lcl_event DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object
sender.
CLASS-METHODS:
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm " Benutzerkommando
sender. " Sender
ENDCLASS.
CLASS lcl_event IMPLEMENTATION.
METHOD handle_toolbar.
* Separator hinzufügen
APPEND VALUE #( butn_type = 3 ) TO e_object->mt_toolbar.
* Print-Button hinzufügen
APPEND VALUE #( butn_type = 5 text = 'Klick!' icon = icon_change_text function = 'PRINT_DATA' quickinfo = 'Etwas ausgeben' disabled = ' ' ) TO e_object->mt_toolbar.
ENDMETHOD.
METHOD handle_user_command.
* TypeCast auf Sender
DATA: o_grid TYPE REF TO cl_gui_alv_grid.
o_grid ?= sender.
CASE e_ucomm.
* Daten speichern
WHEN 'PRINT_DATA'.
WRITE: / 'Klick: ', o_grid->m_guid.
ENDCASE.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: it_data TYPE STANDARD TABLE OF t000.
DATA: o_salv TYPE REF TO cl_salv_table.
* Daten holen
SELECT *
INTO TABLE it_data
FROM t000.
* Datenanzeige
TRY.
* Bei Angabe des Containers cl_gui_container=>screen0 bleibt die Abarbeitung nach o_salv->display( ) nicht
* stehen, sondern läuft weiter und die Referenz auf das ALV-Grid kann geholt werden.
* Eine Anzeige des SALV-Grids erfolgt so aber nur, wenn eine Listenausgabe erfolgt, daher das WRITE space.
cl_salv_table=>factory( EXPORTING
r_container = cl_gui_container=>screen0
IMPORTING
r_salv_table = o_salv
CHANGING
t_table = it_data ).
o_salv->get_functions( )->set_all( ).
o_salv->display( ).
* Trick: Aus dem Container das Grid-Objekt holen und nach cl_gui_alv_grid casten
READ TABLE cl_gui_container=>screen0->children INDEX 1 ASSIGNING FIELD-SYMBOL(<child>).
DATA(o_alv_grid) = CAST cl_gui_alv_grid( <child> ).
* Eventhandler registrieren
SET HANDLER lcl_event=>handle_toolbar FOR o_alv_grid.
SET HANDLER lcl_event=>handle_user_command FOR o_alv_grid.
* Anzeige neu aufbauen
o_alv_grid->refresh_table_display( ).
CATCH cx_root INTO DATA(e_text).
WRITE: / e_text->get_text( ).
ENDTRY.
* leere Toolbar ausblenden
cl_abap_list_layout=>suppress_toolbar( ).
WRITE space. " wichtig für Erzwingung der Listenausgabe