[ABAP] SALV-Table – Filter benutzen

DATA: o_alv TYPE REF TO cl_salv_table.

...

DATA: lcl_filters TYPE REF TO cl_salv_filters.

TRY.
    lcl_filters = o_alv->get_filters( ).
    " gesetzten Filter der Spalte 'CARRID' entfernen
    lcl_filters->remove_filter( 'CARRID' ).
    " neuen Filter für Spalte 'CARRID' setzen
    lcl_filters->add_filter( columnname = 'CARRID'
                             sign = 'I'
                             option = 'EQ'
                             low = 'AA' ).
  CATCH cx_salv_existing
        cx_salv_data_error
        cx_salv_not_found.
ENDTRY.

[ABAP] SALV-Table – Benutzerspezifisches Layout setzen

* https://belajarabap.wordpress.com/2022/01/29/alv-report-using-cl_salv_table/
* http://abapmentor.expertise-team.com/post/display-alv-list-easily-in-abap-using-cl-salv-table-part-ii-enable-layout-settings.aspx
* https://community.sap.com/t5/application-development-blog-posts/defining-and-displaying-user-defined-layouts-using-factory-method/ba-p/13500044

* REPORT: SALV_DEMO_TABLE_LAYOUT

PARAMETERS: p_layout TYPE disvariant-variant.

INITIALIZATION.
  DATA(lv_key) = VALUE salv_s_layout_key( report = sy-repid ).

  p_layout = cl_salv_layout_service=>get_default_layout( s_key = lv_key )-layout.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.
  DATA(lv_key) = VALUE salv_s_layout_key( report = sy-repid ).

  p_layout = cl_salv_layout_service=>f4_layouts( lv_key )-layout.

START-OF-SELECTION.

  SELECT FROM mara
    FIELDS *
    INTO TABLE @DATA(it_mara)
    UP TO 100 ROWS.

  IF sy-subrc = 0.
    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_mara ).

*   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( 'MARA' ).
        o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
        o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

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

* SALV-Layout setzen, Layout-Buttons aktivieren
        DATA(o_layout) = o_salv->get_layout( ).
        o_layout->set_default( abap_true ).
        o_layout->set_key( VALUE #( report = sy-repid ) ).
        o_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).

        IF p_layout IS INITIAL.
          o_layout->set_initial_layout( 'DEFAULT' ).
        ELSE.
          o_layout->set_initial_layout( p_layout ).
        ENDIF.

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

[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 – technische Namen der Spalten auslesen

DATA: o_alv TYPE REF TO cl_salv_table.

...

* technische Spaltennamen auslesen
TRY.
    o_col = CAST cl_salv_column_list( o_alv->get_columns( )->get_column( 'SEATSOCC' ) ). " Spalte mit Namen 'SEATSOCC' ermitteln
    WRITE: / | { o_col->get_columnname( ) } |.     " Namen ausgeben
  CATCH cx_salv_not_found.
ENDTRY.

[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 ).

[ABAP] ADBC – ABAP Database Connectivity

* ab V6.10 verfügbar
* http://zevolving.com/2013/05/abap-database-connectivity-adbc/
* https://archive.sap.com/discussions/thread/447887

* DEMO_ADBC_DDL_DML
* DEMO_ADBC_DDL_DML_BINDING
* DEMO_ADBC_DDL_DML_BULK_ACCESS
* DEMO_ADBC_PREPARED_STATEMENT
* DEMO_ADBC_QUERY
* DEMO_ADBC_STORED_PROCEDURE

DATA: o_salv TYPE REF TO cl_salv_table.        " Anzeigeobjekt SALV Grid
DATA: it_cols TYPE adbc_column_tab.            " Selektierte Spalten
DATA: it_tsp01 TYPE STANDARD TABLE OF tsp01.   " Ausgabetabelle
DATA: par TYPE i VALUE 2000.                   " Parameter für Selektion

START-OF-SELECTION.

* zu verarbeitende Spalten
  it_cols = VALUE #( ( 'RQIDENT' )
                     ( 'RQDEST' )
                     ( 'RQPAPER' )
                     ( 'RQO1NAME' ) ).

* Spaltennnamen durch Komma trennen
  DATA(cols) = to_lower( concat_lines_of( table = it_cols sep = ',' ) ).
* Spaltennamen und Parameter in SQL einfügen
  DATA(lv_query) = |SELECT { cols } FROM tsp01 WHERE rqident > '{ par }'|.

  TRY.
* SQL-Connection öffnen
      DATA(o_sql_connection) = NEW cl_sql_connection( ).

      IF abap_true <> o_sql_connection->is_closed( ).
* SQL-Statement erzeugen
        DATA(o_sql) = NEW cl_sql_statement( con_ref = o_sql_connection ).
* Query ausführen
        DATA(o_result) = o_sql->execute_query( lv_query ).
* Ergebnismenge soll in interne Tabelle it_tsp01 und nur die Spalten, welche in it_cols stehen
        o_result->set_param_table( itab_ref             = REF #( it_tsp01 )
                                   corresponding_fields = it_cols ).
* Ergebnismenge in interne Tabelle lesen
* cnt enthält die Anzahl der gelesenen Datensätze
        DATA(cnt) = o_result->next_package( ).
* Ergebnismenge schließen
        o_result->close( ).
* SQL-Connection schließen
        o_sql_connection->close( ).

        IF cnt > 0.
          cl_salv_table=>factory( IMPORTING
                                    r_salv_table = o_salv
                                  CHANGING
                                    t_table = it_tsp01 ).

          o_salv->get_display_settings( )->set_list_header( |DBMS: { o_sql_connection->get_dbms( ) }| ).
          o_salv->get_functions( )->set_all( abap_true ).
          o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
          o_salv->display( ).
        ENDIF.
      ENDIF.
    CATCH cx_root INTO DATA(e_text).
      WRITE: / e_text->get_text( ).
  ENDTRY.