Ähnlich wie bei der Schleifenverarbeitung interner Tabellen können die Daten eines Extraktdatenbestands über eine Schleife ausgelesen werden:
LOOP.
...
[AT FIRST | AT fgi [WITH fgj]
| AT LAST.
...
ENDAT.]
...
ENDLOOP.
Mit der Anweisung LOOP wird die Erzeugung des Extraktdatenbestands eines Programms abgeschlossen und eine Schleife über seine sämtlichen Sätze ausgeführt. Es wird pro Schleifendurchlauf ein Extraktdatensatz eingelesen. Die Werte der extrahierten Daten werden innerhalb der Schleife direkt in die Ausgangsfelder zurückgestellt. Es können mehrere Schleifen hintereinander ausgeführt werden. Die Schleife über einen Extraktdatenbestand ist nicht schachtelbar. Weiterhin können innerhalb und nach der Schleife keine weiteren EXTRACT-Anweisungen verwendet werden. In beiden Fällen kommt es zum Laufzeitfehler.
Im Unterschied zu internen Tabellen wird bei Extraktdatenbeständen also kein spezieller Arbeitsbereich oder ein Feldsymbol als Schnittstelle benötigt. Für jeden gelesenen Satz können die eingelesenen Daten innerhalb der Schleife unter ihren ursprünglichen Feldnamen weiterverarbeitet werden.
Um verschiedene Anweisungen nur für bestimmte Sätze des Datenbestands auszuführen, kann man die Steueranweisungen AT und ENDATverwenden.
Die Anweisungsblöcke zwischen den Steueranweisungen werden für die unterschiedlichen Argumente von AT wie folgt abgearbeitet:
· AT FIRST
Der Anweisungsblock wird einmal beim ersten Satz des Datenbestands ausgeführt
· AT fgi [WITH fgj] Der Anweisungsblock wird dann abgearbeitet, wenn die Satzart des aktuellen eingelesenen Extraktsatzes durch die Feldgruppe fgi definiert wurde. Wenn Sie den Zusatz WITH fgj verwenden, muss im Extraktdatenbestand auf den eingelesenen Satz der Feldgruppe fgiunmittelbar ein Satz der Feldgruppe fgj folgen.
· AT LAST
Der Anweisungsblock wird einmal beim letzten Satz des Datenbestands ausgeführt
Die Steueranweisungen AT und ENDAT können auch zur Gruppenstufenverarbeitung eingesetzt werden.
Das folgende Programm sei mit der logischen Datenbank F1S verknüpft.
REPORT demo_extract_loop.
NODES: spfli, sflight.
FIELD-GROUPS: header, flight_info, flight_date.
INSERT: spfli-carrid spfli-connid sflight-fldate
INTO header,
spfli-cityfrom
spfli-cityto
INTO
flight_info.
START-OF-SELECTION.
GET spfli.
EXTRACT flight_info.
GET sflight.
EXTRACT flight_date.
END-OF-SELECTION.
LOOP.
AT FIRST.
WRITE / 'Start of LOOP'.
ULINE.
ENDAT.
AT flight_info WITH flight_date.
WRITE: / 'Info:',
spfli-carrid , spfli-connid, sflight-fldate,
spfli-cityfrom, spfli-cityto.
ENDAT.
AT flight_date.
WRITE: / 'Date:',
spfli-carrid
, spfli-connid, sflight-fldate.
ENDAT.
AT LAST.
ULINE.
WRITE / 'End of LOOP'.
ENDAT.
ENDLOOP.
Das Anlegen und Füllen des Extraktdatenbestands entspricht dem Beispiel unter Extrakt mit Daten füllen. Zum Zeitpunkt END-OF-SELECTION ist die Datenbeschaffung durch die logische Datenbank abgeschlossen und der Datenbestand wird in der LOOP-Schleife einmal gelesen.
Durch die Steueranweisungen AT FIRST und AT LAST werden zu Beginn und Ende der Schleife jeweils eine Zeile und eine Linie in die Liste geschrieben.
Durch die Steueranweisung AT fgi werden für jede der beiden Satzarten die entsprechenden Felder ausgegeben. Durch den Zusatz WITH flight_date werden die Sätze der Feldgruppe flight_info nur dann ausgegeben, wenn danach mindestens ein Satz der Feldgruppe flight_date kommt, also wenn die logische Datenbank zu einem Flug mindestens ein Datum übergeben hat.
Der Anfang der Ausgabeliste sieht etwa folgendermaßen aus:
Dass der Inhalt des Felds sflight-fldate im Bereich header der Satzart flight_info auf der Liste als Gatter (#) dargestellt ist, liegt daran, dass die logische Datenbank am Ende einer Hierarchiestufe alle Felder dieser Stufe mit HEX-Nullwerten füllt. Diese Eigenschaft ist wichtig für das Sortieren und die Gruppenstufenverarbeitung von Extraktdatenbeständen.