SAP NetWeaver AS ABAP Release 750, ©Copyright 2016 SAP AG. Alle Rechte vorbehalten.
ABAP - Schlüsselwortdokumentation →
ABAP - Referenz →
Interne Daten verarbeiten →
Interne Tabellen →
Ausdrücke und Funktionen für interne Tabellen →
table_exp - Tabellenausdrücke
Syntax
... itab[ itab_line ][-comp|[ ... ]|->comp] ...
Wirkung
Ein Tabellenausdruck besteht aus der Angabe einer internen Tabelle itab direkt gefolgt von einer in eckigen Klammern [
] eingeschlossenen Zeilenangabe
itab_line, an die eine Verkettung -comp|[ ... ]|->comp angehängt werden kann. Der Ausdruck sucht die angegebene Zeile in der internen Tabelle.
- Wenn keine Verkettung angegeben ist, wird die gesamte gefundene Zeile als Resultat vom entsprechenden Zeilentyp zurückgegeben.
- mit dem Strukturkomponenten-Selektor - auf die Komponente comp der gelesenen Zeile zugegriffen werden,
- mit eckigen Klammern [ ... ] eine Verkettung mehrerer Tabellenausdrücke gebildet werden,
- mit dem Objektkomponenten-Selektors -> auf eine Komponente comp des Objekts zugegriffen werden, das vom vorhergehenden Ausdruck referenziert wird.
Das Ergebnis eines Tabellenausdrucks kann wie folgt verwendet werden:
- Ein Tabellenausdruck kann als spezielle Ausdrucksvariante
für den Speicherbereich bei der Anweisung ASSIGN angegeben werden.
Die interne Tabelle itab muss direkt wie unter
Lesepositionen beschrieben über ihren Namen, ein Feldsymbol oder eine dereferenzierte Datenreferenz angegeben werden. Bei einer Tabelle mit
Kopfzeile wird der Tabellenkörper und nicht die Kopfzeile angesprochen.
Wenn die angegebene Zeile nicht gefunden wird, kommt es an allen Operandenpositionen zu einer behandelbaren Ausnahme der Klasse CX_SY_ITAB_LINE_NOT_FOUND außer
- bei Verwendung eines Tabellenausdrucks in der Anweisung
ASSIGN, wo sy-subrc auf den Wert 4 gesetzt wird,
- bei der Verwendung in der Prädikatfunktion line_exists, wo der Wahrheitswert "falsch" zurück gegeben wird.
- bei der Verwendung in der Tabellenfunktion line_index, wo der Wert 0 zurück gegeben wird.
Hinweise
- In einem Tabellenausdruck können hinter itab nicht die leeren
eckigen Klammern [] angegeben werden, die an anderen Operandenpositionen den Tabellenkörper von einer eventuellen
Kopfzeile unterscheiden.
- Für itab können derzeit noch keine Funktionen oder Konstruktorausdrücke, aber die unter
Verkettungen gezeigten Tabellenausdrücke angegeben werden.
- Auf einen Tabellenausdruck kann direkt keine
Offset-/Längenangabe +off(len) folgen, aber auf eine
Verkettung, deren letzte Stelle eine geeignete Strukturkomponente hinter einem Strukturkomponenten-Selektor ist.
- In einer Anweisung mit mehreren Tabellenausdrücken sind doppelte Selektionen, d.h. mehrere
Zugriffe auf die gleiche Zeile einer internen Tabelle in verschiedenen Ausdrücken zu vermeiden.
In solchen Fällen sollte vor der Anweisung eine Selektion erfolgen und das Ergebnis durch ein Feldsymbol oder eine Referenzvariable referenziert werden.
- Die Ausnahmeklasse CX_SY_ITAB_LINE_NOT_FOUND enthält Attribute,
um bei einem gescheiterten Zugriff die Zeilennummer im verwendeten Index oder den verwendeten Schlüssel
anzuzeigen. Wenn in einer Anweisung mit mehreren Tabellenausdrücken nur Indexzugriffe verwendet werden, kann damit nicht unterschieden werden, welcher Ausdruck gescheitert ist.
- Jeder Tabellenausdruck kann als Kurzschreibweise für eine Variante der Anweisung
READ TABLE verstanden werden, die lesende Zugriffe auf Zeilen interner Tabellen an Operandenpositionen ermöglicht.
- An Schreibpositionen gelten für Tabellenausdrücke, deren
Resultat ein Feldsymbol oder eine temporäre Datenreferenzvariable ist, die gleichen
Einschränkungen bezüglich der Modifikation
von Schlüsselfeldern, wie für sonstige Feldsymbole oder Datenreferenzvariablen, die auf
Zeilen interner Tabellen zeigen. Insbesondere führen Tabellenausdrücke, die eine Zeile
einer sortierten oder Hash-Tabelle zurückgeben an Schreibpositionen wie die linke Seite einer Zuweisung oder als Aktualparameter für Ausgabeparameter immer zu einer Ausnahme.
- Im Gegensatz zu READ TABLE ändert ein Tabellenausdruck nicht den Wert des Systemfelds sy-tabix.
- Ein Tabellenausdruck ist wie die Anweisung READ
TABLE ein Einzelzeilenzugriff. Wenn mehrere Zeilen einer interne Tabelle gelesen werden sollen
ist die Anweisung LOOP oder
ein FOR-Ausdruck in aller Regel günstiger als die Verwendung von Tabellenausdrücken in einer Schleife.
- Mesh-Pfadausdrücke sind eine Spezialform von Tabellenausdrücken, die genau wie solche verwendet werden können.
Beispiel
Der Methode get_spfli wird der Inhalt der Komponente carrid
der Zeile der internen Tabelle carrier_tab übergeben, in der die Komponente carrname des
Sekundärschlüssels name einen bestimmten Wert hat.
DATA carrier_tab TYPE HASHED TABLE OF scarr
WITH UNIQUE KEY carrid
WITH NON-UNIQUE SORTED KEY name COMPONENTS carrname.
SELECT * FROM scarr INTO TABLE @carrier_tab.
TRY.
DATA(flight_tab) = cl_demo_spfli=>get_spfli(
carrier_tab[ KEY name
COMPONENTS carrname = 'United Airlines' ]-carrid ).
cl_demo_output=>display( flight_tab ).
CATCH cx_sy_itab_line_not_found.
cl_demo_output=>display( `Nothing found` ).
ENDTRY.
Beispiel
Die erste Berechnung mit Tabellenzeilen ist ein schlechtes Beispiel für die Verwendung von Tabellenausdrücken.
In einer Anweisung wird dreimal die gleiche Selektion ausgeführt. Die zweite Berechnung zeigt, wie dies durch die
Zuweisung an ein Feldsymbol umgangen werden kann.
DATA itab TYPE TABLE OF i.
itab = VALUE #( ( 3 ) ( 5 ) ).
"Bad example
itab[ table_line = 3 ] =
itab[ table_line = 3 ] * itab[ table_line = 3 ].
"Good example
ASSIGN itab[ table_line = 5 ] TO FIELD-SYMBOL(<fs>).
<fs> = <fs> * <fs>.
Beispiele
Das Programm DEMO_TABLE_EXPRESSIONS zeigt weitere Beispiele zur Verwendung von Tabellenausdrücken.
Ausnahmen
Behandelbare Ausnahmen
CX_SY_ITAB_LINE_NOT_FOUND
-
Ursache: Die angegebene Tabellenzeile wurde nicht gefunden.
Laufzeitfehler: ITAB_LINE_NOT_FOUND
Weiterlesen
table_exp - itab_line
table_exp - Resultat
table_exp - Verkettungen
table_exp - default
table_exp - Schreibpositionen