[ABAP] Zwei SALV-Grids in einem Splittercontainer anzeigen

* Daten für SALV-Grid oben
SELECT *
  INTO TABLE @DATA(it_scarr)
  FROM scarr.

* Daten für SALV-Grid unten
SELECT *
  INTO TABLE @DATA(it_sflight)
  FROM sflight.

* Referenzen auf GUI-Objekte
* Splitter
DATA: o_splitter_main TYPE REF TO cl_gui_splitter_container.
* Splitter-Container oben
DATA: o_container_o   TYPE REF TO cl_gui_container.
* Splitter-Container unten
DATA: o_container_u   TYPE REF TO cl_gui_container.

* Splitter auf default_screen erzeugen
o_splitter_main = NEW #( parent                  = cl_gui_container=>default_screen
                         no_autodef_progid_dynnr = abap_true       " wichtig
                         rows                    = 2
                         columns                 = 1 ).

* Höhe oberer Splitter in %
o_splitter_main->set_row_height( id = 1 height = 40 ).

* REF auf oberen und unteren Splitcontainer holen
o_container_o = o_splitter_main->get_container( row = 1 column = 1 ).
o_container_u = o_splitter_main->get_container( row = 2 column = 1 ).

* SALV-Table oben mit Fluggesellschaften
DATA: o_salv_o TYPE REF TO cl_salv_table.

cl_salv_table=>factory( EXPORTING
                          r_container  = o_container_o
                        IMPORTING
                          r_salv_table = o_salv_o
                        CHANGING
                          t_table      = it_scarr ).

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

* Spaltenüberschriften: technischer Name und Beschreibungstexte
LOOP AT o_salv_o->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<so>).
  DATA(o_col_o) = <so>-r_column.
  o_col_o->set_short_text( || ).
  o_col_o->set_medium_text( || ).
  o_col_o->set_long_text( |{ o_col_o->get_columnname( ) }| ).
ENDLOOP.

* SALV-Grid anzeigen
o_salv_o->display( ).

* SALV-Table unten mit Flügen
DATA: o_salv_u TYPE REF TO cl_salv_table.

cl_salv_table=>factory( EXPORTING
                          r_container  = o_container_u
                        IMPORTING
                          r_salv_table = o_salv_u
                        CHANGING
                          t_table      = it_sflight ).

* Grundeinstellungen
o_salv_u->get_functions( )->set_all( abap_true ).
o_salv_u->get_columns( )->set_optimize( abap_true ).
o_salv_u->get_display_settings( )->set_list_header( 'Flüge' ).
o_salv_u->get_display_settings( )->set_striped_pattern( abap_true ).
o_salv_u->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte
LOOP AT o_salv_u->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<su>).
  DATA(o_col_u) = <su>-r_column.
  o_col_u->set_short_text( || ).
  o_col_u->set_medium_text( || ).
  o_col_u->set_long_text( |{ o_col_u->get_columnname( ) }| ).
ENDLOOP.

* SALV-Grid anzeigen
o_salv_u->display( ).

* leere Toolbar ausblenden
cl_abap_list_layout=>suppress_toolbar( ).

* Erzwingen von cl_gui_container=>default_screen
WRITE: space.

[ABAP] SALV-Table – technische und reguläre Spaltennamen gleichzeitig anzeigen

DATA: o_salv TYPE REF TO cl_salv_table.

...

LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
  <c>-r_column->set_short_text( |{ <c>-r_column->get_columnname( ) } [{ <c>-r_column->get_short_text( ) }]| ).
  <c>-r_column->set_medium_text( |{ <c>-r_column->get_columnname( ) } [{ <c>-r_column->get_medium_text( ) }]| ).
  <c>-r_column->set_long_text( |{ <c>-r_column->get_columnname( ) } [{ <c>-r_column->get_long_text( ) }]| ).
ENDLOOP.

[ABAP] SALV-Table – technische Namen der Spalten anzeigen

Variante 1 (kurz)

DATA: o_salv TYPE REF TO cl_salv_table.

...

LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
  <c>-r_column->set_short_text( |{ <c>-r_column->get_columnname( ) }| ).
  <c>-r_column->set_medium_text( |{ <c>-r_column->get_columnname( ) }| ).
  <c>-r_column->set_long_text( |{ <c>-r_column->get_columnname( ) }| ).
ENDLOOP.

Variante 2 (RTTS, RTTI)

DATA: o_alv TYPE REF TO cl_salv_table.

...

* Datendescriptor für Tabellenzeile (z.B.: Struct "ls_spfli") holen
DATA: o_struct TYPE REF TO cl_abap_structdescr.
o_struct ?= cl_abap_typedescr=>describe_by_data( ls_spfli ).

DATA: o_comp_tab TYPE abap_component_tab.
o_comp_tab = o_struct->get_components( ).

* Spalten der SALV-Table holen
DATA(lo_columns) = o_salv->get_columns( ).
DATA: lv_col TYPE REF TO cl_salv_column.
            
LOOP AT o_comp_tab INTO DATA(ls_comp).
  lv_col ?= lo_columns->get_column( |{ ls_comp-name }| ).

* Spaltennamen auf Structnamen ändern
  lv_col->set_short_text( | { ls_comp-name } | ).
  lv_col->set_medium_text( | { ls_comp-name } | ).
  lv_col->set_long_text( | { ls_comp-name } | ).
ENDLOOP.

[ABAP] SALV-Table – Spaltenbreite einstellen

Variante 1 (set_optimize)

DATA: o_alv TYPE REF TO cl_salv_table.
 
...

* damit sich set_optimize an long_text ausrichtet, darf short_text und medium_text nicht gesetzt sein
DATA: o_col TYPE REF TO cl_salv_column.

* Spalte 'CARRID'
o_col = o_alv->get_columns( )->get_column( 'CARRID' ).
o_col->set_short_text( '' ).
o_col->set_medium_text( '' ).
o_col->set_long_text( 'Carrier-ID' ).
          
* optimale Spaltenbreite für alle Spalten setzen
o_alv->get_columns( )->set_optimize( abap_true ).

Variante 2 (set_output_length)

	
DATA: o_alv TYPE REF TO cl_salv_table.
 
...
 
* Spaltenbreite setzen
DATA: o_col TYPE REF TO cl_salv_column.
 
o_col = o_alv->get_columns( )->get_column( 'CARRID' ).
* funktioniert nur, wenn set_optimize( ) nicht gesetzt ist
o_col->set_output_length( 15 ).