[ABAP] SALV-Table: Nullwerte verbergen

* Variante 1: Für eine Spalte des Gitters 
DATA(o_col) = CAST cl_salv_column( o_alv->get_columns( )->get_column( 'MATNR' ) ).
o_col->set_zero( abap_false ).

* Variante 2: Für alle Spalten des Gitters: Nullwerte anzeigen/verstecken
LOOP AT o_alv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
  <c>-r_column->set_zero( abap_false ).
ENDLOOP.

[ABAP] Einschränkungen bei der Verwendung von SALV-Tables

  • Anzahl der Spalten ist auf 90 begrenzt
  • Ausgabelänge einer Spalte ist auf 128 Zeichen begrenzt
  • Basisfunktionen für das Drucken, komplexe Drucklayouts sind im ALV nicht vorgesehen
  • zur Sortierung und für Zwischensummen stehen max. neun Ebenen bzw. Spalten zur Verfügung
  • bei aggregierbaren Spalten -> interne Länge der Spalte <= Länge Einzelwerte + Länge Ergebnis
  • nur flach strukturierte Tabellen darstellbar, Darstellung verschachtelter Tabellen ist nicht möglich
  • Tabellen sind nicht eingabebereit
  • Tabelle als Grid im Container -> keinen Batch-Modus nutzbar
  • Ergebnisse (Summen und Zwischensummen) können nicht übergeben oder manipuliert werden

[ABAP] SALV-Table als F4-Suchhilfe-PopUp verwenden

CLASS lcl_salv_f4 DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: get_selected_value
      IMPORTING
                i_table_name      TYPE string
                i_display_columns TYPE string DEFAULT '*'
                i_sel_column      TYPE string
                i_max_datacnt     TYPE i OPTIONAL
                i_top             TYPE i DEFAULT 3
                i_bottom          TYPE i DEFAULT 25
                i_left            TYPE i DEFAULT 25
                i_right           TYPE i DEFAULT 160
      RETURNING VALUE(ret_val)    TYPE string.
ENDCLASS.

CLASS lcl_salv_f4 IMPLEMENTATION.
  METHOD get_selected_value.

    ret_val = ''.

    TRY.
        IF i_display_columns NE ''.
* Datenreferenzen auf Table und Row
          DATA: o_table TYPE REF TO data.
          DATA: o_row TYPE REF TO data.

          FIELD-SYMBOLS: <table> TYPE STANDARD TABLE.
          FIELD-SYMBOLS: <row> TYPE any.

          CREATE DATA o_table TYPE STANDARD TABLE OF (i_table_name).
          ASSIGN o_table->* TO <table>.

          CREATE DATA o_row LIKE LINE OF <table>.
          ASSIGN o_row->* TO <row>.

* SELECT-Statement anpassen
          IF i_max_datacnt IS NOT INITIAL.
            SELECT (i_display_columns) FROM (i_table_name) INTO CORRESPONDING FIELDS OF TABLE @<table> UP TO @i_max_datacnt ROWS.
          ELSE.
            SELECT (i_display_columns) FROM (i_table_name) INTO CORRESPONDING FIELDS OF TABLE @<table>.
          ENDIF.

* SALV-Grid erzeugen
          DATA: o_salv TYPE REF TO cl_salv_table.

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

          o_salv->get_functions( )->set_default( abap_true ).
          o_salv->get_columns( )->set_optimize( abap_true ).
          o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
          o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>single ).
          o_salv->get_display_settings( )->set_list_header( 'Auswahl' ).

* Strukturbeschreibung einer Tabellenzeile
          DATA: o_struct TYPE REF TO cl_abap_structdescr.
          o_struct ?= cl_abap_typedescr=>describe_by_data( <row> ).

* Komponenten der Struktur
*          DATA: it_comp_tab TYPE abap_component_tab.
          DATA(it_comp_tab) = o_struct->get_components( ).

          DATA(it_columns) = o_salv->get_columns( ).
          DATA: lv_col TYPE REF TO cl_salv_column.

          LOOP AT it_comp_tab INTO DATA(lv_comp).
* Spalte anhand des Komponentennamens holen
            lv_col ?= it_columns->get_column( |{ lv_comp-name }| ).

* wenn Anzeigespalte als Komponente der Struktur verfügbar, dann Spalte anzeigen
            IF ( i_display_columns CS lv_comp-name ) OR ( i_display_columns = '*' ).
              lv_col->set_visible( abap_true ).
            ELSE.
              lv_col->set_visible( abap_false ).
            ENDIF.
          ENDLOOP.

* Popup-SALV-Grid anzeigen
          o_salv->set_screen_popup( start_column = i_left
                                    end_column   = i_right
                                    start_line   = i_top
                                    end_line     = i_bottom ).

* Popup anzeigen und auf Klick warten
          o_salv->display( ).

* Auswahl auswerten
          DATA(it_sel_rows) = o_salv->get_selections( )->get_selected_rows( ).

* Nummer der ersten gewählten Tabellenzeile holen -> it_sel_rows[ 1 ]
* Tabellenzeile ermitteln -> <table>[ ... ]
* und Feldwert anhand der Spaltennummer auslesen -> COMPONENT i_sel_column
          ASSIGN COMPONENT i_sel_column OF STRUCTURE <table>[ it_sel_rows[ 1 ] ] TO FIELD-SYMBOL(<cell>).

* Rückgabewert
          ret_val = <cell>.

        ENDIF.

      CATCH cx_root.

    ENDTRY.

  ENDMETHOD.
ENDCLASS.

PARAMETERS: p_par TYPE string OBLIGATORY.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_par.
  p_par = lcl_salv_f4=>get_selected_value( i_table_name = 'spfli'
                                           i_display_columns = 'mandt, carrid, connid, cityto, airpfrom'
                                           i_sel_column = 'cityto' ).

[ABAP] dynamische Tabelle zur Laufzeit aus einem Feldkatalog erstellen und in SALV-Table anzeigen

DATA : it_fcat TYPE lvc_t_fcat.

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  EXPORTING
    i_structure_name = 'SPFLI'  " Dictionary-Struktur
  CHANGING
    ct_fieldcat      = it_fcat. " Feldkatalog

DATA: o_tab TYPE REF TO data.
* dynamische Tabelle aus dem Feldkatalog erstellen
cl_alv_table_create=>create_dynamic_table( EXPORTING
                                             it_fieldcatalog = it_fcat
                                           IMPORTING
                                             ep_table        = o_tab ).

* dynamische Tabelle auf Feldsymbol abbilden
FIELD-SYMBOLS: <tab> TYPE ANY TABLE.
ASSIGN o_tab->* TO <tab>.

* Daten holen
SELECT * FROM spfli INTO TABLE <tab> UP TO 10 ROWS.

* Daten anzeigen
DATA: o_alv TYPE REF TO cl_salv_table.
TRY.
    cl_salv_table=>factory( IMPORTING
                              r_salv_table = o_alv
                            CHANGING
                              t_table      = <tab> ).

    o_alv->display( ).

  CATCH cx_root.
ENDTRY.

Links

[ABAP] SALV-Table – Zeilen farbig anzeigen

TYPES: BEGIN OF ty_s_sflight,
         fldate	   TYPE s_date,
         planetype TYPE s_planetye,
         seatsmax	 TYPE s_seatsmax,
         seatsocc	 TYPE s_seatsocc,
         color     TYPE lvc_t_scol, " Farbspalte
       END OF ty_s_sflight.

TYPES: ty_it_sflight TYPE STANDARD TABLE OF ty_s_sflight WITH DEFAULT KEY.

START-OF-SELECTION.

  DATA(it_sflight) = VALUE ty_it_sflight( ).

  SELECT fldate,
         planetype,
         seatsmax,
         seatsocc
    INTO CORRESPONDING FIELDS OF TABLE @it_sflight
    FROM sflight.

  TRY.
      DATA: o_alv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING r_salv_table = o_alv
                              CHANGING  t_table      = it_sflight ).

* Farben in der Tabellen-Spalte 'COLOR' setzen
      LOOP AT it_sflight ASSIGNING FIELD-SYMBOL(<f>).
* Wenn >= 370 Belegte Plätze in der Economy Class
        IF <f>-seatsocc >= 370.
* in die Spalte COLOR wird für jede Tabellen-Zeile eine Farbtabelle eingefügt
          <f>-color = VALUE #( ( color-col = 5  " grün
                                 color-int = 0
                                 color-inv = 0
                               )
                             ).
        ENDIF.
      ENDLOOP.

* Namen der Farbspalte setzen
      o_alv->get_columns( )->set_color_column( 'COLOR' ).

* Grid anzeigen
      o_alv->display( ).
    CATCH cx_root INTO DATA(e_text).
      WRITE: / e_text->get_text( ).
  ENDTRY.

Links

[ABAP] Dynamische Dokumente mit SALV-Form LayoutGrid / ABAP-Renderer erstellen

START-OF-SELECTION.

* Grid
  DATA(o_grid) = NEW cl_salv_form_layout_grid( ).

* Gridlines
  o_grid->set_grid_lines( if_salv_form_c_grid_lines=>lines ).

* Header (Überschrift), Colspan
  DATA(o_head) = o_grid->create_header_information( row = 1
                                                    column = 1
                                                    text = 'Überschrift'
                                                    colspan = 2 ).

* Header Align Center
  DATA: o_al_head TYPE REF TO cl_salv_form_layout_data_grid.
  o_al_head ?= o_head->get_layout_data( ).
  o_al_head->set_h_align( if_salv_form_c_h_align=>center ).

* Text
  DATA(o_text) = o_grid->create_text( row = 2
                                      column  = 2
                                      text    = 'Right'
                                      tooltip = 'Right' ).

* Text Align Right
  DATA: o_al_text TYPE REF TO cl_salv_form_layout_data_grid.
  o_al_text ?= o_text->get_layout_data( ).
  o_al_text->set_h_align( if_salv_form_c_h_align=>right ).

* GroupBox
  DATA(o_grp1) = NEW cl_salv_form_groupbox( header = 'My Groupbox 1' ).
  o_grid->set_element( row = 3
                       column = 1
                       r_element = o_grp1 ).

  DATA(o_grp_grid) = o_grp1->create_grid( ).
  o_grp_grid->set_grid_lines( if_salv_form_c_grid_lines=>lines ).
  o_grp_grid->create_text( row = 1
                           column = 1
                           text = 'Icon' ).

* Icon
  DATA(o_icon) = NEW cl_salv_form_icon( icon = icon_header
                                        tooltip = 'Tooltip for Icon' ).

  o_grp_grid->set_element( row       = 1
                           column    = 2
                           r_element = o_icon ).

* Label, Text
  DATA(o_label) = o_grid->create_label( row = 4
                                        column = 1
                                        text = 'Name:' ).
  o_text = o_grid->create_text( row = 4
                                column = 2
                                text = 'Herr Mayer' ).
  o_label->set_label_for( o_text ).

* Row
  DATA(o_row) = o_grid->add_row( ).
  o_label = o_row->create_label( text = 'Firma:' ).
  o_text = o_row->create_text( text = 'Beier' ).
  o_label->set_label_for( o_text ).

* HTML-Renderer
  DATA(o_form) = NEW cl_salv_form_window_dydos( popup = abap_true     " als modales Fenster anzeigen, nicht verfügbar bei cl_salv_form_window_abap
                                                r_content = o_grid ).

* Status
  DATA(o_status) = o_form->get_status( ).
  o_status->set_titlebar( titlebar       = 'FORM1_TITLE'              " GUI-Titel der Anwendung muss gepflegt sein
                          titlebar_repid = sy-repid ).

* Display
  o_form->display( ).

[ABAP] Dialogbox mit SALV-Table ohne zusätzliches Dynpro

* Eventhandlerklasse
CLASS cl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS on_close FOR EVENT close OF cl_gui_dialogbox_container
      IMPORTING sender.
ENDCLASS.

CLASS cl_handle_events IMPLEMENTATION.
  METHOD on_close.
    IF sender IS NOT INITIAL.
      sender->free( ).
    ENDIF.
  ENDMETHOD.
ENDCLASS.

DATA: it_sflight TYPE STANDARD TABLE OF sflight.

START-OF-SELECTION.
  " Daten holen
  SELECT * INTO TABLE it_sflight FROM sflight WHERE carrid = 'LH'.

  " Container für Popup erzeugen
  DATA(o_gui_cnt) = NEW cl_gui_dialogbox_container( no_autodef_progid_dynnr = abap_true
                                                    caption = 'Ausgabe Testdaten für Lufthansa'
                                                    top = 20
                                                    left = 20
                                                    width = 1280
                                                    height = 400 ).

  DATA: o_salv TYPE REF TO cl_salv_table.

  " SALV-Table erzeugen
  cl_salv_table=>factory( EXPORTING
                            r_container  = o_gui_cnt
                          IMPORTING
                            r_salv_table = o_salv
                          CHANGING
                            t_table      = it_sflight ).

  " Events registrieren
  DATA(o_events) = NEW cl_handle_events( ).
  SET HANDLER o_events->on_close FOR o_gui_cnt.

  " SALV-Table anzeigen
  o_salv->display( ).

  " Anzeige des Popup erzwingen
  WRITE: / space.

[ABAP] SALV-Table: Funktionsbuttons hinzufügen

Variante 1 (nur wenn in eigenem Dynpro + Container)

SELECT * FROM sflights INTO TABLE @DATA(it_data).

DATA: o_salv TYPE REF TO cl_salv_table.

cl_salv_table=>factory( EXPORTING
                          r_container  = cl_gui_container=>default_screen " Standard-Container der Listausgabe nutzen
                        IMPORTING
                          r_salv_table = o_salv
                        CHANGING
                          t_table      = it_data ).

o_salv->get_functions( )->set_all( ).

* Für diesen Button muss zus. noch ein Event-Handler ausgeprägt werden
o_salv->get_functions( )->add_function( name     = 'MYFUNC'
                                        icon     = |{ icon_complete }|
                                        text     = 'Funktionstext'
                                        tooltip  = 'ToolTipText'
                                        position = if_salv_c_function_position=>right_of_salv_functions ).

o_salv->display( ).

* Erzwingen von cl_gui_container=>default_screen (Listausgabe)
WRITE space.

Variante 2 (PF_STATUS)

* ohne Angabe eines Containers in der factory-Methode:
SELECT * FROM sflights INTO TABLE @DATA(it_data).

DATA: o_salv TYPE REF TO cl_salv_table.

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

* PF-Status aus Programm SAPLSLVC_FULLSCREEN benutzen
o_salv->set_screen_status( pfstatus      = 'STANDARD_FULLSCREEN'
                           report        = 'SAPLSLVC_FULLSCREEN'
                           set_functions = cl_salv_model_base=>c_functions_all ).

o_salv->display( ).

oder

SELECT * FROM sflights INTO TABLE @DATA(it_data).

DATA: o_salv TYPE REF TO cl_salv_table.

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

* PF-Status manuelle aus Funktionsgruppe SALV_METADATA_STATUS kopieren
* im lokalen Programm (sy-repid) aufrufen
o_salv->set_screen_status( pfstatus      = 'SALV_TABLE_STANDARD'
                           report        = sy-repid
                           set_functions = cl_salv_model_base=>c_functions_all ).

o_salv->display( ).