[ABAP] Native SQL: Case-Insensitive Suche mit SELECT … UPPER

TYPES: BEGIN OF ty_s_tableline,
         matnr TYPE matnr,
         spras TYPE spras,
         maktx TYPE maktx,
       END OF ty_s_tableline.

TYPES: ty_it_table TYPE STANDARD TABLE OF ty_s_tableline WITH DEFAULT KEY.

START-OF-SELECTION.

  TRY.
* Open Cursor and SELECT mit UPPER-CASE-Funktion
* ist im Standard-OpenSQL nicht möglich
      EXEC SQL.
        OPEN dbcur FOR
        SELECT matnr,
               spras,
               maktx
        FROM makt
        WHERE spras = 'D'
          AND UPPER(maktx) LIKE 'SCH%'
      ENDEXEC.

      IF sy-subrc = 0.
        DATA: lv_line TYPE ty_s_tableline.
        DATA: it_table TYPE ty_it_table.

* Loop Cursor Data
        DO.
* DB-Cursor auf nächsten Datensatz setzen, solange, wie Daten vorhanden sind
          EXEC SQL.
            FETCH NEXT dbcur INTO :lv_line
          ENDEXEC.
          IF sy-subrc = 0.
* Daten an itab anfügen
            APPEND lv_line TO it_table.
          ELSE.
            EXIT.
          ENDIF.
        ENDDO.

* Close Cursor
        EXEC SQL.
          CLOSE dbcur
        ENDEXEC.

* Daten ausgeben
        cl_demo_output=>display( it_table ).
      ENDIF.

    CATCH cx_sy_native_sql_error INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] ABAP Database Connectivity (ADBC) – CASE-insensitive Suche auf der Datenbank

* 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.