ABAPLOOP_AT_ITAB - LOOP AT ITAB
General Data in Customer Master PERFORM Short ReferenceDiese Dokumentation steht unter dem Copyright der SAP AG.
LOOP AT itab
Syntax
LOOP AT itab result[cond].
...
ENDLOOP.
Wirkung
Die Anweisungen LOOP und ENDLOOP definieren eine Schleife um einen Anweisungsblock. Die Anweisung LOOP liest sequenziell Zeilen aus der internen Tabelle itab.
- Das Ausgabeverhalten result bestimmt, wie und wohin der Zeileninhalt gelesen wird.
- In condkann der Tabellenschlüssel bestimmt werden, mit dem die Schleife ausgeführt wird. Es werdenentweder alle Zeilen gelesen oder die auszulesenden Zeilen können über Bedingungen cond eingeschränkt werden.
Für jede ausgelesene Zeile wird der Anweisungsblock zwischen LOOP und ENDLOOP einmal ausgeführt. Die Ausführung des Anweisungsblocks kann mit den Anweisungen aus dem AbschnittSchleifen verlassen beendet werden.
Wenn kein expliziter Tabellenschlüssel keyname hinter USINGKEY angegeben ist, hängt die Reihenfolge, in der die Zeilen gelesen werden, wie folgt von der Tabellenart ab:
- Standardtabellen und sortierte Tabellen
Die Zeilen werden nach aufsteigenden Zeilennummern imprimären Tabellenindex gelesen. - Hash-Tabellen
Die Zeilen werden in der Reihenfolge bearbeitet, in der sie in die Tabelle eingefügt wurden, und nach einer Sortierung mit der Anweisung SORT in der Sortierreihenfolge.
Die Schleife wird so lange durchlaufen, bis alle Tabellenzeilen, welche die Bedingung cond erfüllen,gelesen wurden oder bis sie durch eine Anweisung verlassen wird. Falls keine entsprechenden Zeilen gefunden werden oder die interne Tabelle leer ist, wird die Schleife nicht durchlaufen.
Systemfelder
Die Anweisung LOOP AT setzt den Wert des Systemfeldes sy-tabix bei jedem Schleifendurchlauf fürIndextabellen und bei Verwendung einessortierten Schlüssels auf die Zeilennummer der aktuellen Tabellenzeile im zugehörigen Tabellenindex. BeiHash-Tabellen und bei Verwendung einesHash-Schlüsselswird sy-tabix auf den Wert 0 gesetzt. LOOP AT lässt sy-subrc unverändert.Nach dem Verlassen der Schleife über ENDLOOP wird sy-tabix auf den Wert gesetzt, den es vor dem Eintritt in die Schleife hatte, und für sy-subrc gilt:
| sy-subrc | Bedeutung |
| 0 | Die Schleife wurde mindestens einmal durchlaufen. |
| 4 | Die Schleife wurde nicht durchlaufen. |
Zusätzlich werden die Systemfelder sy-tfill und sy-tleng versorgt.
Ändern von internen Tabellen in einer Schleife
Im Anweisungsblock einer LOOP-Schleife kann der Aufbau der aktuellen internen Tabelle überdas Einfügen oder Löschen von Zeilen geändert werden. Dabei wird die Lage der eingefügtenbzw. gelöschten Zeile bezüglich der aktuellen Zeile bei Schleifen über Indextabellenoder bei Verwendung eines sortierten Schlüssels durch die Zeilennummern im zugehörigenTabellenindex bestimmt. Bei Schleifen über Hash-Tabellen und bei Verwendung eines Hash-Schlüssels hängt die Lage von der Einfügereihenfolge ab.
- Das Einfügen von Zeilen hinter der aktuellen Zeile bewirkt, dass die neuen Zeilen in den nachfolgenden Schleifendurchgängen durchlaufen werden. Dies kann zu einer Endlosschleife führen.
- Das Löschen von Zeilen hinter der aktuellen Zeile bewirkt, dass die gelöschten Zeilen in den nachfolgenden Schleifendurchgängen nicht mehr durchlaufen werden.
- Das Einfügen von Zeilen vor der aktuellen Zeile bewirkt, dass der interne Schleifenzählerfür jede eingefügte Zeile um 1 erhöht wird. Dies wirkt sich bei Schleifen überIndextabellen oder bei Verwendung eines sortierten Schlüssels im folgenden Schleifendurchgang auf sy-tabix aus, der ebenfalls entsprechend erhöht wird.
- Das Löschen der aktuellen Zeile oder von Zeilen vor der aktuellen Zeile bewirkt, dass der interneSchleifenzähler für jede gelöschte Zeile um 1 verringert wird. Dies wirkt sichbei Schleifen über Indextabellen oder bei Verwendung eines sortierten Schlüssels im folgenden Schleifendurchgang auf sy-tabix aus, der ebenfalls entsprechend verringert wird.
Der Austausch des kompletten Tabellenkörper innerhalb einer LOOP-Schleife überdieselbe Tabelle führt gemäß den oben beschriebenen Regeln zum Verlassen der Schleifebeim nächsten Schleifendurchgang. Dies gilt insbesondere auch dann, wenn danach neue Zeilen indie Tabelle eingefügt wurden. Weil dies in der Regel zu überraschendem Programmverhaltenführt, darf innerhalb einer Schleife nicht ändernd auf den gesamten Tabellenkörperzugegriffen werden. Fall dies statisch erkennbar ist, kommt es innerhalb von Klassen und bei LOOP-Schleifenmit statisch erkennbarem Sekundärschlüssel zu einem Syntaxfehler. Ansonsten wird bei derSyntaxprüfung aus Kompatibilitätsgründen lediglich mit einer Warnung darauf hingewiesen.Zur Laufzeit kommt es bei einem Austausch des kompletten Tabellenkörpers durch Anweisungen wie CLEAR, FREE,LOCAL, REFRESH,SORT, DELETE... WHERE und bei allen Arten von Zuweisungen an itab aber immer zu einem Laufzeitfehler.
Hinweise
- Falls die Angabe der internen Tabelle itab über eineReferenzvariableerfolgt, wird die Schleife vollständig über die beim Eintritt referenzierte Tabelle ausgeführt.Eventuelle Änderungen der Referenzvariablen wirken sich nicht auf die Schleife aus. Das zugehörige Objekt kann so lange nicht vomGarbageCollector gelöscht werden, bis die Schleife beendet wurde. Das Gleiche gilt, wenn die Tabelledurch ein Feldsymbol repräsentiert wird. Auch nach einem Umsetzen des Feldsymbols innerhalb der Schleife wird weiterhin über die beim LOOP-Eintritt an das Feldsymbol gebundene Tabelle iteriert.
- Es findet keine implizite Auswahl eines passenden Schlüssels oder Index statt. Der verwendeteTabellenschlüssel oder Tabellenindex ist immer eindeutig spezifiziert. Es kommt zu einer Warnung von der Syntaxprüfung, wenn es einen passendensekundärenTabellenschlüssel gibt, dieser aber nicht verwendet wird. Diese Warnung sollte durch Verwendung des Schlüssels behoben werden. Sie kann in Ausnahmefällen aber auch durch einPragma umgangen werden.
Beispiel
Geschachtelte LOOP-Schleifen ohne explizite Schlüsselangabe. . In der WHERE-Bedingungfür die innere Schleife wird der Inhalt der aktuellen Zeile der äußeren Schleife ausgewertet.
PARAMETERS p_name TYPE scarr-carrname DEFAULT '*'.
DATA: scarr_tab TYPE SORTED TABLE OF scarr
WITH UNIQUE KEY carrname,
spfli_tab TYPE SORTED TABLE OF spfli
WITH NON-UNIQUE KEY carrid.
FIELD-SYMBOLS <scarr_line> LIKE LINE OF scarr_tab.
DATA spfli_line LIKE LINE OF spfli_tab.
SELECT *
FROM scarr
INTO TABLE scarr_tab.
SELECT *
FROM spfli
INTO TABLE spfli_tab.
LOOP AT scarr_tab ASSIGNING <scarr_line>
WHERE carrname CP p_name.
LOOP AT spfli_tab INTO spfli_line
WHERE carrid = <scarr_line>-carrid.
WRITE: / spfli_line-carrid,
spfli_line-connid.
ENDLOOP.
ENDLOOP.
Beispiel
Folgende Schleife löscht alle Zeilen einer internen Tabelle, da durch die Kurzform der DELETE-Anweisung immer die aktuelle erste Zeile gelöscht wird.
DATA itab TYPE TABLE OF i.
DATA wa LIKE LINE OF itab.
LOOP AT itab INTO wa TO 6.
DELETE itab.
ENDLOOP.
Ausnahmen
Behandelbare Ausnahmen
- Ursache: Fehler in der dynamischen WHERE-Bedingung
Laufzeitfehler: DYN_WHERE_PARSE_ERROR
Unbehandelbare Ausnahmen
- Ursache: Unzulässiges Umsetzen des LOOP-Feldsymbols im Rumpf der Schleife.
Laufzeitfehler: ITAB_ILLEGAL_REG - Ursache: Unzulässige Zuweisung an die LOOP-Referenz im Rumpf der Schleife.
Laufzeitfehler: MOVE_TO_LOOP_REF - Ursache: Unzulässiges Ändern des gesamten Tabellenkörpers in der Schleife
Laufzeitfehler: TABLE_FREE_IN_LOOP
rdisp/max_wprun_time - Maximum work process run time CL_GUI_FRONTEND_SERVICES - Frontend Services
Diese Dokumentation steht unter dem Copyright der SAP AG.
Length: 13263 Date: 20120526 Time: 214458 triton ( 282 ms )






