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

[SAP] SAPscript

Transaktionen

SO10 (SAPscript Standardtexte)
SE71 (SAPscript Formular)

  • Formularvergleich: Menü -> Hilfsmittel -> Formulare vergleichen
  • Kopieren: Menü -> Hilfsmittel -> Kopieren von Mandant
  • Druckansicht: Menü -> Hilfsmittel -> Testdruck
  • Formularsuche: Menü -> Formular -> Suchen -> Suche nach Merkmalen

SE72 (SAPscript Stile)
SE75 (SAPscript Einstellungen)

  • Anzeigen und Ändern von Textobjekten + TextIDs, Grafikobjekten, Standardsymbolen

SE78 (Verwaltung von Formulargrafiken)
TXBA (Verwendungsnachweis für Textbausteine)
RECATM (Manage Text Modules)

Tabellen

STXH (STXD SAPscript Text-Datei Header)

  • Formulare suchen: Objekt ‘FORM’, Textname ‘FORMULARNAME’, ID ‘DEF’

TTXID (Zulässige Text-Id’s)
TTXIT (Texte zu Text-Id’s)
TTXOT (Kurztexte zu Textobjekten)
TTXOB (Eigenschaften der Textobjekte)

Reports

RSTXTRAN (Transfer of SAPscript Texts to a Correction)
RSTXSCRP (SAPscript Export to Dataset / SAPscript Import from Dataset)
RSTXPDFT4 (Konvertiere SAPscript (OTF) oder ABAP List Spool Job nach PDF)
RSTXPDFT5 (GUI Download eines Spool-Auftrages)
ICL_TEXTMOD_MAINTAIN (Textbausteine verwalten)

  • beliebige Textobjeke pflegen

SF_MIGRATE (Report zum Migrieren von SAPscript-Formularen)

Links

[ABAP] Case-insensitives SORT von internen Tabellen

TYPES: BEGIN OF ty_name,
         name    TYPE string,
         name_lc TYPE string,
       END OF ty_name.

TYPES: ty_it_name TYPE STANDARD TABLE OF ty_name WITH DEFAULT KEY.

* Tabelle mit Strings, die sortiert werden soll
DATA(it_names) = VALUE ty_it_name( ( name = 'Albert' )
                                   ( name = 'Emma' )
                                   ( name = 'Zorro' )
                                   ( name = 'Donald' )
                                   ( name = 'Lion' )
                                   ( name = 'answer' )
                                   ( name = 'type' )
                                   ( name = 'second' ) ).

* zweite Spalte mit lower-case Strings füllen
LOOP AT it_names ASSIGNING FIELD-SYMBOL(<n>).
  <n>-name_lc = to_lower( <n>-name ).
ENDLOOP.

* erstmal regulär sortieren
SORT: it_names BY name.

* zweite Tabelle anlegen (kopieren)
DATA(it_names_lc) = it_names.

* Spalte lower-case sortieren
SORT: it_names_lc BY name_lc.

* Ausgabe der Ergebnisse
cl_demo_output=>write_data( value = it_names    name = 'case-sensitives SORT' ).
cl_demo_output=>write_data( value = it_names_lc name = 'SORT nach lower-case' ).
cl_demo_output=>display( ).

[OpenUI5] OpenUI5 / JavaScript Code-Vervollständigung mit IntelliSense in Visual Studio Code einrichten

  1. ein Projektverzeichnis anlegen
  2. Im Projektverzeichnis eine initiale package.json manuell oder über
    npm init
    

    anlegen

  3. Erweitern der package.json (im Root-Verzeichnis des Projektes) um die types
    "devDependencies": {
        "@types/openui5": "^1.40.1",
        ...
    }
    

    wobei “^1.40.1” bedeutet: nimm alles was ab Version 1.40.1 verfügbar ist (Mindestanforderung)

  4. das OpenUI5-Package ist unter https://www.npmjs.com/ registriert: https://www.npmjs.com/package/@types/openui5
  5. Kommando

    npm install
    
    (detaillierterer Aufruf: npm install --save @types/openui5)
    

    im Projektverzeichnis ausführen, hierbei wird nach der package.json im akt. Verzeichnis geschaut und ein Unterverzeichnis node_modules mit den Dependencies erzeugt

  6. jsconfig.js neben package.json mit folgendem Inhalt anlegen (manuell oder im VS Code über Button “Glühbirne” (unten rechts) generieren lassen):
    {
        // Unter https://go.microsoft.com/fwlink/?LinkId=759670
        // finden Sie die Dokumentation zum jsconfig.json-Format.
        "compilerOptions": {
            "target": "es6",
            "module": "commonjs",
            "allowSyntheticDefaultImports": true
        },
        "exclude": [
            "node_modules",
            "bower_components",
            "jspm_packages",
            "tmp",
            "temp"
        ]
    }
    
  7. Codevervollständigung solle nun funktionieren, wenn nicht, gibt es hier noch Hinweise: http://shrekshao.github.io/2016/06/20/vscode-01/
  8. Hinweis: die Codevervollständigung funktioniert nur, wenn vollqualifizierte JS-Objekte benutzt werden (z.B.: sap.m.MessageBox anstatt MessageBox)

[ABAP] Texttabelle zu einer Tabelle suchen

DATA: lv_tabname TYPE dd08v-tabname.
DATA: lv_for_key TYPE dd08v-fieldname.

* Prüft über die Tabelle DD08L zu Verfügbarkeit einer Texttabelle
* Siehe auch SE11 -> Tabelle anzeigen -> Menü -> Springen -> Texttabelle
CALL FUNCTION 'DDUT_TEXTTABLE_GET'
  EXPORTING
    tabname    = 'TPAR'
  IMPORTING
    texttable  = lv_tabname
    checkfield = lv_for_key.

WRITE: / 'Texttabelle:', lv_tabname.
WRITE: / 'Fremdschlüssel:', lv_for_key.

[ABAP] Datenelement und zugehörige Domäne auslesen

* Name Datenelement
PARAMETERS: p_elem TYPE rollname DEFAULT 'TXT50'.
* Sprachenschlüssel
PARAMETERS: p_lang TYPE ddlanguage DEFAULT 'D'.

SELECT * INTO TABLE @DATA(it_dd04l) FROM dd04l
  WHERE rollname  = @p_elem.

IF sy-subrc = 0.
* Bezeichner zum Datenelent holen
  SELECT * INTO TABLE @DATA(it_dd04t) FROM dd04t
    WHERE rollname   = @p_elem
      AND ddlanguage = @p_lang.

* aktive Domäne holen
  DATA(lv_domname) = it_dd04l[ as4local = 'A' ]-domname.
  SELECT * INTO TABLE @DATA(it_dd01l) FROM dd01l
    WHERE domname = @lv_domname.

* Bezeichner zur Domäne holen
  SELECT * INTO TABLE @DATA(it_dd01t) FROM dd01t
    WHERE domname    = @lv_domname
      AND ddlanguage = @p_lang.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( value = it_dd04l name = |Datenelement: { p_elem }| ).
    cl_demo_output=>write_data( value = it_dd04t name = |Datenelement: { p_elem }| ).
    cl_demo_output=>write_data( value = it_dd01l name = |Domäne: { lv_domname }| ).
    cl_demo_output=>write_data( value = it_dd01t name = |Domäne: { lv_domname }| ).
    cl_demo_output=>display(  ).
  ENDIF.
ENDIF.