[ABAP] GTT: Globale Temporäre Tabellen zum Zwischenspeichern von Daten

GTT – Globale Temporäre Tabellen

  • Objekt auf Datenbankebene, verfügbar ab NW AS ABAP 7.52
  • Verarbeitung globaler temporärer Daten innerhalb einer Datenbank-LUW
  • ist temporäre transparenten Datenbanktabelle mit Auslieferungsklasse „L“
  • bietet die Möglichkeit, SQL-Operatoren auf temporäre Daten anzuwenden
  • User-spezifisch
  • Workload auf Datenbank
  • Zugriff per Open SQL
  • verursacht geringere Verwaltungskosten als reguläre transparente Tabellen und bietet eine höhere Leistung
* Demoprogramm: DEMO_GTT

* globale temporäre Tabelle DEMO_GTT hat Auslieferungsklasse "L"
* zwei Datensätze einfügen
INSERT demo_gtt FROM TABLE @( VALUE #( ( id = 'A' col = 111 )
                                       ( id = 'B' col = 222 )
                                     )
                            ).

* Daten holen und anzeigen
SELECT FROM demo_gtt
  FIELDS *
  INTO TABLE @DATA(it_gtt).

LOOP AT it_gtt ASSIGNING FIELD-SYMBOL(<f>).
  WRITE: / <f>-id, <f>-col.
ENDLOOP.

* Am Ende immer Daten aus der GTT löschen,
* sonst Exception COMMIT_GTT_ERROR (Implizites Datenbank-Commit wurde abgebrochen wegen nicht leerer GTTs)
DELETE FROM demo_gtt.

Links

[ABAP] Ergebnisse eines SQL-Ausdrucks in einer Zeile verketten (STRING_AGG)

STRING_AGG verkettet die Ergebnisse eines SQL-Ausdrucks in einer Zeile (Typ SSTRING, Länge 1333). Wenn der String länger als 1333 Zeichen ist, wird eine Ausnahme (CX_SY_OPEN_SQL_DB) geworfen. Die Beschränkung auf 1333 Zeichen kann durch die Funktion TO_CLOB umgangen werden.

Variante 1 (transparente Tabelle)

SELECT FROM t100
  FIELDS arbgb,
         to_clob( STRING_AGG( text, ', ' ) ) AS text_agg
WHERE sprsl = 'D'
GROUP BY arbgb
ORDER BY arbgb
INTO TABLE @DATA(it_t100)
UP TO 10 ROWS.

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_t100 ).

* HTML-Code vom Demo-Output holen
  DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
  cl_abap_browser=>show_html( EXPORTING title       = 'T100'
                                        html_string = lv_html
                                        container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

Variante 2 (interne Tabelle)

* interne Tabelle anlegen
TYPES: BEGIN OF ty_s_values,
         name TYPE char5,
         text TYPE char3,
       END OF ty_s_values.

TYPES: ty_it_values TYPE STANDARD TABLE OF ty_s_values WITH DEFAULT KEY.

DATA(it_values) = VALUE ty_it_values(
                                      ( name = 'TEXT1' text = '123' )
                                      ( name = 'TEXT1' text = '456' )
                                      ( name = 'TEXT1' text = '789' )
                                      ( name = 'TEXT2' text = 'abc' )
                                      ( name = 'TEXT2' text = 'def' )
                                      ( name = 'TEXT2' text = 'ghi' )
                                      ( name = 'TEXT3' text = '***' )
                                      ( name = 'TEXT3' text = '---' )
                                      ( name = 'TEXT3' text = '+++' )
                                    ).

* Daten aus der internen Tabelle selektieren
SELECT FROM @it_values AS val
  FIELDS val~name,
         to_clob( STRING_AGG( val~text, ', ' ) ) AS text_agg
WHERE val~name = 'TEXT1'
GROUP BY val~name
ORDER BY val~name
INTO TABLE @DATA(it_agg).

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_agg ).

* HTML-Code vom Demo-Output holen
  DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
  cl_abap_browser=>show_html( EXPORTING title       = 'TXT'
                                        html_string = lv_html
                                        container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

[ABAP] Schlüsselspalten einer DB-Tabelle ermitteln

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

IF sy-subrc = 0.
* Table: Beschreibung
  DATA(o_tdesc) = CAST cl_abap_tabledescr( cl_abap_tabledescr=>describe_by_data( it_mara ) ).
* Row: Beschreibung
  DATA(o_sdesc) = CAST cl_abap_structdescr( o_tdesc->get_table_line_type( ) ).
* Key Fields
  DATA(it_keyflied_list) = o_sdesc->get_ddic_field_list( ).
* nur die Keyfields zurückgeben
  DELETE it_keyflied_list WHERE keyflag <> abap_true.

  cl_demo_output=>write_data( it_keyflied_list ).
  cl_demo_output=>write_data( it_mara ).

* HTML-Code vom Demo-Output holen
  DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
  cl_abap_browser=>show_html( EXPORTING title       = 'Key-Fields'
                                        html_string = lv_html
                                        container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

[ABAP] OpenSQL: NULL-Indicator zum Anzeigen von leeren Rückgabemengen

* in OpenSQL ist es ab Rel. 7.55 möglich einen NULL-Indikators anzugeben
* somit ist es möglich, bei SELECTS Spalten zu kennzeichnen, deren Ergebnismenge NULL enthält
* alternativ siehe auch SQL-Expression COALESCE

SELECT FROM scarr
  LEFT OUTER JOIN spfli ON scarr~carrid = spfli~carrid
FIELDS scarr~carrid,
       spfli~distid
INTO TABLE @DATA(it_res) INDICATORS NULL STRUCTURE null_ind.

* Hier Objekte für die Ausgabe hinzufügen
cl_demo_output=>write_data( it_res ).

* HTML-Code vom Demo-Output holen
DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
cl_abap_browser=>show_html( EXPORTING title       = 'Daten'
                                      html_string = lv_html
                                      container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
WRITE: space.

Links

[ABAP] OpenSQL: Set-Indicator für das Aktualisieren von Spalten

* Set-Indikatoren (ab Rel. 7.55) dienen dem Kennzeichnen von zu aktualisierenden Spalten
* bei Verwendung von Set-Indikatoren werden nur die gekennzeichneten Felder auf der DB aktualisiert

* Datenstruktur mit zusätzlichem Set-Indicator
TYPES: ty_sflight TYPE sflight WITH INDICATORS set_ind.

DATA: it_sflight TYPE STANDARD TABLE OF ty_sflight WITH DEFAULT KEY.

* Daten holen
SELECT FROM sflight
  FIELDS carrid, connid, fldate, price
  WHERE carrid = 'AA'
    AND connid = '0017'
   INTO CORRESPONDING FIELDS OF TABLE @it_sflight.

IF sy-subrc  = 0.
* Daten anpassen
  LOOP AT it_sflight ASSIGNING FIELD-SYMBOL(<f>).
    <f>-price *= '0.1'.
    <f>-set_ind-price = abap_true.
  ENDLOOP.

* nur die Spalten mit Set-Indicator='X' achreiben
  UPDATE sflight FROM TABLE @it_sflight INDICATORS SET STRUCTURE set_ind.
ENDIF.

Links

[ABAP] OpenSQL: Aggregatfunktionen

* DEMO_SQL_EXPR_IN_AGGREGATES

* Funktionen:
*   AVG
*   MAX
*   MIN
*   MEDIAN
*   SUM
*   CORR
*   COUNT
*   GROUPING

Links

[ABAP] OpenSQL: Coalesce – Fehlende SQL-Werte (NULL) ersetzen

* DEMO_SQL_EXPR_COALESCE

* Null-Werte (Nicht vorhandene Email-Adressen), die sich aus dem LEFT OUTER JOIN ergeben, werden durch den String '<leer>' ersetzt
CONSTANTS: co_no_email TYPE ad_smtpadr VALUE '<leer>'.

SELECT u~bname,
       u~persnumber,
       u~addrnumber,
       COALESCE( a~smtp_addr, @co_no_email ) AS email
  INTO TABLE @DATA(it_usr)
  FROM usr21 AS u
  LEFT OUTER JOIN adr6 AS a ON a~persnumber = u~persnumber AND a~addrnumber = u~addrnumber.

IF sy-subrc = 0.
  cl_demo_output=>display( it_usr ).
ENDIF.

Links