[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] Retourenumlagerungsbestellungen lesen

* Bestellung
PARAMETERS: p_ebeln TYPE ekko-ebeln.

START-OF-SELECTION.

* Retourenumlagerungsbestellungen zur Bestellung lesen
  SELECT FROM ekko AS e
    INNER JOIN ekpo AS p ON ( e~ebeln EQ p~ebeln )
* Verwendung von CAST und substring, da Belegposition unterschiedliche Typen (NUMC5 und NUMC10) verwendet
    INNER JOIN msr_d_executed AS r ON ( p~ebeln EQ r~ref_doc_nr ) AND ( CAST( p~ebelp AS CHAR ) EQ substring( CAST( r~ref_doc_item AS CHAR ), 6, 5 ) )
  FIELDS DISTINCT
      e~ebeln,
      p~ebelp,
      p~matnr,
      p~txz01,
      p~menge,
      p~meins,
      p~netpr,
      r~doc_nr,
      r~doc_item
  WHERE e~ebeln EQ @p_ebeln
  INTO TABLE @DATA(it_ebeln).

  IF sy-subrc = 0.
    cl_demo_output=>write_data( it_ebeln ).
    DATA(lv_html) = cl_demo_output=>get( ).
    cl_abap_browser=>show_html( EXPORTING title       = 'Daten'
                                          html_string = lv_html
                                          container   = cl_gui_container=>default_screen ).

    WRITE: space.
  ENDIF.

Links

[ABAP] Datenbanktabellen mittels SE16N editieren

* Tabellename
PARAMETERS: lv_tab TYPE se16n_tab DEFAULT 'T024'.
* max. Anzahl Datensätze für die Anzeige
PARAMETERS: lv_maxl TYPE sytabix DEFAULT 500.
* Edit-Parameter, diese entsprechen den Variablen GD-EDIT und GD-SAPEDIT in der SE16N
PARAMETERS: lv_edit TYPE abap_bool AS CHECKBOX DEFAULT abap_true.
PARAMETERS: lv_sedit TYPE abap_bool AS CHECKBOX DEFAULT abap_true.
* Mandantenspalte ausblenden
PARAMETERS: lv_clnt TYPE abap_bool AS CHECKBOX DEFAULT abap_false.
* technische Namen anzeigen
PARAMETERS: lv_tech TYPE abap_bool AS CHECKBOX DEFAULT abap_false.

INITIALIZATION.
  %_lv_tab_%_app_%-text = 'Tabelle:'.
  %_lv_edit_%_app_%-text = 'Edit Parameter 1 (GD-EDIT)'.
  %_lv_sedit_%_app_%-text = 'Edit Parameter 2 (GD-SAPEDIT)'.
  %_lv_maxl_%_app_%-text = 'Maximale Trefferzahl'.
  %_lv_clnt_%_app_%-text = 'Tabelle ist mandantenabhängig'.
  %_lv_tech_%_app_%-text = 'Technische Namen'.

START-OF-SELECTION.
* Anzeige einer Tabelle als Vollbild, analog SE16N
* Achtung: Tabelle lv_tab kann analog zum bekannten SE16N-Parameter &sap_edit vollumfänglich editiert werden,
*          dies kann bei Fehlbedienung zu Dateninkonsistenzen führen --> Funktion daher nicht im Produktivsystem verwenden!
  CALL FUNCTION 'SE16N_INTERFACE'
    EXPORTING
      i_tab        = lv_tab
      i_edit       = lv_edit
      i_sapedit    = lv_sedit
      i_max_lines  = lv_maxl
      i_clnt_dep   = lv_clnt
      i_tech_names = lv_tech
* CHANGING
*     IT_AND_SELFIELDS            =
    EXCEPTIONS
      no_values    = 1
      OTHERS       = 2.

  IF sy-subrc <> 0.
    WRITE: / 'Fehler:', sy-subrc.
  ENDIF.

Links

[ABAP] Neue / obsolete Transaktionscodes für S/4 HANA suchen

* https://thinkdoforward.com/neue-transaktionen-mit-s-4hana-so-einfach-findest-zu-sie/
PARAMETERS: p_rel TYPE saprl DEFAULT '751'.
SELECT-OPTIONS: so_ta FOR lv_s_tcode.

START-OF-SELECTION.

  SELECT c~rel_name, c~s_tcode, c~t_tcode, tx~ttext
    INTO TABLE @DATA(it_prgn_corr2)
    FROM prgn_corr2 AS c
    INNER JOIN tstc AS t ON ( c~t_tcode = t~tcode )
    RIGHT OUTER JOIN tstct AS tx ON ( t~tcode = tx~tcode )
    WHERE c~rel_name >= @p_rel
      AND c~s_tcode IN @so_ta
      AND tx~sprsl = @sy-langu.

  SORT: it_prgn_corr2 BY s_tcode rel_name.


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

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

      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_columnname( ) } [{ o_col->get_long_text( ) }]| ).
      ENDLOOP.

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

[ABAP] Mandanten und zugeordnete logische Systeme auslesen

* Mandantenpflege: SCC4
* Zuweisung logisches System zu Mandant: Springen -> Detail
* Tabelle Mandanten: T000

* Tabelle Logische Systeme: TBDLS

* Sucht aus der Liste der gepflegten logischen Systeme diejenigen heraus,
* die mit dem akt. System und Mandanten verknüpft sind
SELECT t000~mandt,
       tbdls~logsys,
       tbdlst~stext
  INTO TABLE @DATA(it_syst)
  FROM t000
  INNER JOIN tbdls ON t000~logsys = tbdls~logsys
  INNER JOIN tbdlst ON tbdls~logsys = tbdlst~logsys.

IF sy-subrc = 0.
  cl_demo_output=>display_data( it_syst ).
ENDIF.