Mit äußeren Schleifen können @DO-Prozeduren mehrmals vollständig durchlaufen werden. Sollen nur Teile einer Prozedur mehrmals durchlaufen werden, ist dies nur in Form von inneren Schleifen möglich.
Die äußere Schleife wird dadurch realisiert, dass in der @DO-Prozedur auf einen Schleifenzähler Bezug genommen wird, für den beim Aufruf der Prozedur in der @DO-Anweisung Startwert, Endwert und Schrittweite angegeben werden muss (siehe @DO-Anweisung "@DO (Format 1) - Starten von EDT-Prozeduren aus Arbeitsdateien"). Der Schleifenzähler muss ein Sonderzeichen sein und sollte nicht mit Sonderzeichen kollidieren, die im EDT eine feste Bedeutung haben (z.B. %
oder $
), geeignet sind hingegen !
oder |
. Innerhalb der @DO-Prozedur muss der Schleifenzähler wie eine Zeilennummer verwendet werden (nicht wie eine Zeilennummervariable, d.h. er kann innerhalb der Prozedur nicht verändert werden).
Der Schleifenzähler wird nach Abarbeitung der letzten Anweisung innerhalb der @DO-Prozedur um die angegebene Schrittweite erhöht bzw. erniedrigt und mit dem Endwert verglichen. Wenn der Endwert noch nicht über- bzw. unterschritten wurde, wird die Prozedur mit dem veränderten Wert des Schleifenzählers erneut durchlaufen. Wird die letzte Anweisung der @DO-Prozedur nicht ausgeführt, etwa weil die Prozedur mit @RETURN verlassen worden ist, wird die Prozedur nicht erneut durchlaufen sondern evtl. vor Erreichen des angegebenen Endwertes abgebrochen. Ggf. ist also eine künstliche (leere) letzte Anweisung zu schreiben (siehe @CONTINUE-Anweisung).
Das Sonderzeichen, das den Schleifenzähler repräsentiert, kann bei der Eingabe der @DO-Anweisung in einem anderen Zeichensatz vorliegen als innerhalb der aufgerufenen Prozedur. Es wird ggf. nach den gleichen Regeln umcodiert wie Literale, die in anderen EDT-Anweisungen vorkommen können (siehe Abschnitt „Zeichensätze“).
Äußere Schleifen können durch innere Schleifen ersetzt werden. In einer äußeren Schleife kann neben Start- und Endwert nur eine feste positive oder negative Schrittweite angegeben werden. In einer inneren Schleife kann die Schrittweite variabel, z.B. über eine Zeilennummervariable angegeben werden.
Beispiel für eine äußere Schleife
@PROC 3 @DELETE @ @COLUMN 10 ON ! INSERT !:27-36: @END
Durch die obige Anweisungsfolge wird in Arbeitsdatei 3 eine @DO-Prozedur aufgebaut, die nur eine Anweisung @COLUMN... enthält.
Wird diese @DO-Prozedur mit @DO 3, !=11,15
gestartet, wird für den Schleifenzähler !
nacheinander der Wert 11,12,13,14
und 15
eingesetzt (implizite Schrittweite ist 1
). In diesen Zeilen wird der Inhalt der jeweiligen Zeile von Spalte 27-36
an der Spalte 10
nochmals eingefügt.
Wenn diese Prozedur auf eine Arbeitsdatei mit kleinerer Schrittweite (etwa 0.1
) angewendet wird, bleiben also evtl. Zeilen unberücksichtigt. Sollen unabhängig von der Schrittweite alle Zeilen berücksichtigt werden, ist eine innere Schleife zu verwenden (siehe folgendes Beispiel).
Beispiel für eine innere Schleife
@PROC 4 -------------------------------------------------------------- (01) @DELETE @RESET @1.00 @ @IF ERRORS : @G0TO 2 ----------------------------------------------- (02) @ @IF #L10 > 15 @GOTO 2 ---------------------------------------------- (03) @ @COLUMN 10 ON #L10 INSERT #L10:27-36: ------------------------------ (04) @ @SET #L10 = #L10 + 1L ---------------------------------------------- (05) @ @G0T0 1 ------------------------------------------------------------ (06) @2.00 @ @CONTINUE @END.... @SET #L10 = 11 ------------------------------------------------------- (07) @DO 4
(01) | In Arbeitsdatei 4 wird eine @DO-Prozedur aufgebaut. |
(02) | Bei EDT-Fehlern soll die Prozedur abgebrochen werden. |
(03) | Wenn der Schleifenzähler |
(04) | In der über |
(05) | Die Zeilennummer wird auf die nächste existierende Zeilennummer gesetzt. Würde man hier statt |
(06) | Es wird zum Anfang der Schleife gesprungen. |
(07) | Der Anfangswert des Schleifenzählers wird außerhalb der @DO-Prozedur gesetzt, dann wird die Prozedur aufgerufen. |
Hinweis
Zeile 11.00
muss in der zu bearbeitenden Datei existieren und die letzte Zeile der zu bearbeitenden Datei sollte größer sein als 15.00
, ansonsten wird die Prozedur mit einer Fehlermeldung abgebrochen.