Mit ABAP 740 sind unter anderem Table Expressions neu zum Sprachumfang hinzugekommen. Mit Table Expressions kann lesend und schreibend auf Daten von internen Tabellen zugegriffen werden, ohne dass eine Workarea benötigt wird. Es ist also weder eine Struktur, noch ein Feldsymbol oder gar eine Kopfzeile als Ziel des Datenzugriffs erforderlich. Der Datenzugriff ist vergleichbar mit einem READ Statement. Table Expressions sind vergleichbar mit LAMBDA oder LINQ Ausdrücken in C#.
Die Syntax ist wie folgt:
itab[ <<Feld>> <<Operator>> << Wert>> ]
itab[ <<Feld>> <<Operator>> << Wert>> ]-<<Komponente>>
In diesem Blogbeitrag ist die Verwendung umfassend beschrieben.
Hinweis
Bei der Verwendung von Table Expressions gilt es zu beachten:
- Die Tabelle kann aus tiefen Strukturen und Untertabellen bestehen.
- Der Wertvergleich ist case sensitive, lt_data[ name = 'NAME_2' ] ist anders als lt_data[ name = 'Name_2' ]
- Wird die Zeile nicht gefunden, wird die Exception CX_SY_ITAB_LINE_NOT_FOUND ausgelöst
- SY-SUBRC bleibt unverändert, egal ob die Zeile gefunden wurde oder nicht.
- Werden mehrere Komponenten einer Zeile benötigt, so sollte die ganze Zeile in eine lokale Workarea übertragen werden. Andernfalls erfolgt der Datenzugriff für jede Komponente einzeln. Dies wirkt sich negativ auf die Laufzeit aus.
- Entsprechen mehrere Zeilen der Expression, so wird immer nur auf die erste zugegriffen.
- Wird das Ergebnis einer Table Expression einem Feldsymbol zugewiesen (ASSIGN itab[ feld = '1'] to <fs> ), kann die Prüfung auf erfolgreiche Zuweisung entfallen, da eine Exception ausgelöst wird, falls die Zeile nicht existiert.
Table Expressions lassen sich auch verwenden, um die Existienz eines Datensatzes zu prüfen. Im folgenden Beispiel wird geprüft, ob eine Zeile existiert. Existiert die Zeile nicht, wird hier keine Exception ausgelöst
IF line_exists( lt_data[ name = 'Name_3' ] ). WRITE: / 'line_exist'. ENDIF.
Beispiel
Im folgenden Report wird zunächst eine interne Tabelle mit dem neuen Schlüsselwort VALUE gefüllt. Anschließend erfolgt ein schreibender Zugriff auf eine bestimmte Zeile .
REPORT z_test_table_expressions_1. TYPES: BEGIN OF ty_data, name TYPE char20, ort01 TYPE ort01, count TYPE i, END OF ty_data. TYPES tyt_data TYPE STANDARD TABLE OF ty_data WITH DEFAULT KEY. FIELD-SYMBOLS : TYPE ty_data. " Prepare data DATA(lt_data) = VALUE tyt_data( ( name = 'Name_1' ort01 = 'Ort_1' count = 1 ) ( name = 'Name_2' ort01 = 'Ort_2' count = 2 ) ( name = 'Name_2' ort01 = 'Ort_2' count = 2 ) ( name = 'Name_3' ort01 = 'Ort_3' count = 3 ) ). " Change Data TRY. lt_data[ name = 'Name_2' ]-name = 'Name_22'. lt_data[ name = 'NAME_2' ]-ort01 = 'Ort_22'. " Schlüsselzugriff ist case sensitive CATCH cx_sy_itab_line_not_found. ENDTRY. " Output LOOP AT lt_data ASSIGNING . WRITE: / -name, -ort01, -count. ENDLOOP.