[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: Codevorlage mit den wichtigsten Einstellungen

* Beispieldaten
SELECT * FROM t000 INTO TABLE @DATA(it_t000).

* Copy & Paste - fertig
TRY.
* SALV-Table
    DATA: o_salv TYPE REF TO cl_salv_table.

    cl_salv_table=>factory( IMPORTING
                              r_salv_table   = o_salv
                            CHANGING
                              t_table        = it_t000 ).

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

* Farbe für Spalte setzen
*o_salv->get_columns( )->set_color_column( 'COLOR' ).
* aufsteigend sortieren
*o_salv->get_sorts( )->add_sort( columnname = 'COL1' sequence = if_salv_c_sort=>sort_up ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte
    LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
      DATA(o_col) = <c>-r_column.
* Short Text leer setzen, damit das Autosize für die Spaltenüberschriften funktioniert
      o_col->set_short_text( || ).
* Medium Text leer setzen, damit das Autosize für die Spaltenüberschriften funktioniert
      o_col->set_medium_text( || ).
      o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
    ENDLOOP.

    o_salv->display( ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] ALV-Grid: Bei Refresh Cursor- und Scrollposition halten

Variante 1 ( refresh_table_display )

DATA: o_alv TYPE REF TO cl_gui_alv_grid.
  
...

DATA: lv_stable TYPE lvc_s_stbl.
lv_stable-row = 'X'.
lv_stable-col = 'X'.

o_alv->refresh_table_display( is_stable = lv_stable ).

Variante 2 ( set_scroll_info_via_id, set_current_cell_via_id )

DATA: o_alv TYPE REF TO cl_gui_alv_grid.
  
...

* Scrollbalken und Cursorposition im Gitter auslesen
DATA: lv_row_no TYPE lvc_s_roid.
DATA: lv_row_info TYPE lvc_s_row.
DATA: lv_col_info TYPE lvc_s_col.

o_alv->get_scroll_info_via_id( IMPORTING
                                 es_row_no   = lv_row_no
                                 es_row_info = lv_row_info
                                 es_col_info = lv_col_info ).

DATA: lv_row_no2 TYPE lvc_s_roid.
DATA: lv_row_id2 TYPE lvc_s_row.
DATA: lv_col_id2 TYPE lvc_s_col.

o_alv->get_current_cell( IMPORTING
                           es_row_id = lv_row_id2
                           es_col_id = lv_col_id2
                           es_row_no = lv_row_no2 ).
                           
o_alv->refresh_table_display( ).

* Scrollbalken und Cursorposition im Gitter auf die alte Position setzen
o_alv->set_scroll_info_via_id( is_row_info = lv_row_info
                               is_col_info = lv_col_info
                               is_row_no   = lv_row_no ).

o_alv->set_current_cell_via_id( is_row_id    = lv_row_id2
                                is_column_id = lv_col_id2
                                is_row_no    = lv_row_no2 ).

Weiterführende Infos: Link

[ABAP] GUI-Elemente ohne Dynprodefinition anzeigen

Variante 1 (Listausgabe mit WRITE erzwingen)

START-OF-SELECTION.

  DATA: it_sflight TYPE STANDARD TABLE OF sflight.

  SELECT * FROM sflight INTO TABLE @it_sflight.

* ALV-Grid in Standarddynpro cl_gui_container=>default_screen einbetten
  DATA(o_alv) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>default_screen ).

  o_alv->set_table_for_first_display( EXPORTING
                                        i_structure_name = 'SFLIGHT'
                                      CHANGING
                                        it_outtab        = it_sflight ).

* Ausgabe von cl_gui_container=>default_screen erzwingen
  WRITE space.

Variante 2 (Aufruf leeres Dynpro 100)

SELECTION-SCREEN BEGIN OF SCREEN 100.
SELECTION-SCREEN END OF SCREEN 100.

START-OF-SELECTION.

  DATA: it_sflight TYPE STANDARD TABLE OF sflight.

  SELECT * FROM sflight INTO TABLE @it_sflight.

* ALV-Grid in Standarddynpro cl_gui_container=>default_screen einbetten
  DATA(o_alv) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>default_screen ).

  o_alv->set_table_for_first_display( EXPORTING
                                        i_structure_name = 'SFLIGHT'
                                      CHANGING
                                        it_outtab        = it_sflight ).

* leeres Dynpro anzeigen und Ausgabe von cl_gui_container=>default_screen erzwingen
  CALL SCREEN 100.

[ABAP] ALV-Grid: Gitter-Zeile löschen

Variante 1 (Standard-Button)

-> Button cl_gui_alv_grid=>mc_fc_loc_delete_row muss in der Toolbar eingeblendet sein
-> die zugehörige interne Tabelle wird automatisch geupdated

Variante 2 (on_user_command)

* interne Tabelle it_itab muss global bekannt sein
METHOD on_user_command.
  CASE e_ucomm.
* Button-Kommando BTN_DEL_ROW abfangen
    WHEN 'BTN_DEL_ROW'.
      DATA: it_row_no TYPE lvc_t_roid.
      DATA: lv_flag TYPE boolean.

      sender->get_selected_rows( IMPORTING et_row_no = it_row_no ).

      IF lines( it_row_no ) > 0.
        SORT: it_row_no BY row_id.
        lv_flag = abap_false.

        LOOP AT it_row_no ASSIGNING FIELD-SYMBOL(<fs_row>).
          IF lv_flag = abap_false.
            DELETE it_itab INDEX <fs_row>-row_id.
            lv_flag = abap_true.
          ELSE.
            DELETE it_itab INDEX <fs_row>-row_id - 1.
          ENDIF.
        ENDLOOP.

        sender->refresh_table_display( ).
      ENDIF.
  ENDCASE.
ENDMETHOD.

[ABAP] ALV-Grid: Toolbar-Buttons entfernen

Variante 1 (Event on_toolbar)

* Die Button-Bezeichner sind Konstanten der Klasse cl_gui_alv_grid
METHOD on_toolbar.
* alle Toolbar-Buttons entfernen, außer
  DELETE e_object->mt_toolbar WHERE
        function NE cl_gui_alv_grid=>mc_fc_refresh          " Refresh
    AND function NE cl_gui_alv_grid=>mc_fc_loc_append_row   " Append
    AND function NE cl_gui_alv_grid=>mc_fc_loc_insert_row   " Insert
    AND function NE cl_gui_alv_grid=>mc_fc_loc_delete_row   " Delete
    AND function NE cl_gui_alv_grid=>mc_mb_export           " Excel
    AND function NE cl_gui_alv_grid=>mc_fc_current_variant. " Layout
ENDMETHOD.

Variante 2 (it_toolbar_excluding)

DATA: o_alv TYPE REF TO cl_gui_alv_grid.
DATA: it_tab TYPE STANDARD TABLE OF ...
DATA: it_fcat TYPE lvc_t_fcat.

...

* Liste mit auszuschließenden Toolbuttons erstellen
DATA(it_excl_toolbuttons) = VALUE ui_functions( ( cl_gui_alv_grid=>mc_fc_maximum )
                                                ( cl_gui_alv_grid=>mc_fc_minimum ) ).

* Layout anpassen
DATA(lv_layout) = VALUE lvc_s_layo( grid_title = 'ALV-Grid'
                                    zebra      = abap_true ).
                                    
* ALV-Grid anzeigen
o_alv->set_table_for_first_display( EXPORTING
                                      it_toolbar_excluding = it_excl_toolbuttons
                                      is_layout            = lv_layout
                                    CHANGING
                                      it_fieldcatalog      = it_fcat
                                      it_outtab            = it_tab ).