[ABAP] SALV-Table IDA in einem Dockingcontainer direkt auf dem Selektionsbildschirm anzeigen

DATA: o_cnt TYPE REF TO cl_gui_docking_container.
DATA: o_alv TYPE REF TO if_salv_gui_table_ida.
DATA: o_collector TYPE REF TO cl_salv_range_tab_collector.
DATA: it_t100 TYPE t100.

SELECT-OPTIONS: s_langu FOR sy-langu.
SELECT-OPTIONS: s_arbgb FOR it_t100-arbgb.
SELECT-OPTIONS: s_msg FOR it_t100-msgnr.
SELECT-OPTIONS: s_text FOR it_t100-text.

AT SELECTION-SCREEN OUTPUT.

* Verhindern, dass der Container mehrfach erzeugt wird, wenn der Focus aus
* best. Oberflächenelementen zurück kommt.
  IF NOT o_cnt IS BOUND.
* Container erzeugen
    o_cnt = NEW #( repid = sy-repid
                   dynnr = sy-dynnr
                   side  = cl_gui_docking_container=>dock_at_bottom " unterer Bildschirmrand
                   extension = 400 ).                               " max. 400 hoch, damit die Selektionskriterien nicht überdeckt werden

* IDA-Grid erzeugen
    o_alv = cl_salv_gui_table_ida=>create( iv_table_name    = 'T100'
                                           io_gui_container = o_cnt ).

    o_collector = NEW #( ).

* Suchkriterien setzen
    o_collector->add_ranges_for_name( iv_name = 'SPRSL' it_ranges = s_langu[] ).
    o_collector->add_ranges_for_name( iv_name = 'ARBGB' it_ranges = s_arbgb[] ).
    o_collector->add_ranges_for_name( iv_name = 'MSGNR' it_ranges = s_msg[] ).
    o_collector->add_ranges_for_name( iv_name = 'TEXT' it_ranges = s_text[] ).
    o_collector->get_collected_ranges( IMPORTING et_named_ranges = DATA(it_name_range_pairs) ).

* IDA-Grid Optionen setzen
    o_alv->set_select_options( it_ranges = it_name_range_pairs ).
    o_alv->display_options( )->enable_alternating_row_pattern( ).
  ENDIF.