* ab Version 7.51 auch im OpenSQL verfügbar (LOWER, UPPER)
* https://help.sap.com/doc/abapdocu_751_index_htm/7.51/de-DE/abenopen_sql_functions.htm
* https://archive.sap.com/discussions/thread/3470652
DATA: o_salv TYPE REF TO cl_salv_table. " Anzeigeobjekt SALV Grid
DATA: it_cols TYPE adbc_column_tab. " Selektierte Spalten
DATA: it_makt TYPE STANDARD TABLE OF makt. " Ausgabetabelle
START-OF-SELECTION.
* zu verarbeitende Spalten
it_cols = VALUE #( ( 'MATNR' )
( 'SPRAS' )
( 'MAKTX' )
( 'MAKTG' ) ).
* Spaltennnamen durch Komma trennen
DATA(cols) = to_lower( concat_lines_of( table = it_cols sep = ',' ) ).
* Spaltennamen und Parameter in SQL einfügen, alle Bezeichner suchen, die mit 'sch*' beginnen
DATA(lv_query) = |SELECT { cols } FROM makt WHERE spras = 'D' AND upper(maktx) LIKE 'SCH%'|.
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_makt und nur die Spalten, welche in it_cols stehen
o_result->set_param_table( itab_ref = REF #( it_makt )
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_makt ).
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.