Die Syntax für die Abfragefolge For...End for lautet:
For(Counter_Variable;Start_Expression;End_Expression{;Increment_Expression}) statement(s) End for
Die Schleife For...End for wird über eine Zählervariable gesteuert:
Counter_Variable ist eine numerische Variable vom Typ Zahl, Ganzzahl oder Lange Ganzzahl. Sie wird von der Schleife auf den in Start_Expression festgelegten Wert initialisiert.
Die Methode führt die Anweisungsfolge vom Zählbeginn bis Ende aus und zählt jeweils um einen Schritt weiter. Die Zählervariable wird nach jedem Durchlaufen der Schleife um den in Increment_Expression festgelegten Wert erhöht. Increment_Expression ist optional, ist hier kein Wert eingetragen, wird die Zählervariable standardmäßig um Eins (1) erhöht.
Sobald die Zählervariable End_Expression durchläuft, stoppt die Schleife.
Wichtig: Die numerischen Ausdrücke Start_Expression, End_Expression und Increment_Expression werden einmal am Schleifenbeginn festgelegt. Sind diese Ausdrücke Variablen, und ändern Sie eine dieser Variablen innerhalb der Schleife, hat das keine Auswirkung auf die Schleife.
Tipp: Für besondere Zwecke können Sie den Wert der Zählervariablen Counter_Variableinnerhalb der Schleife ändern, das wirkt sich dann auch auf die Schleife aus.
Im Normalfall ist Start_Expression kleiner als End_Expression.
Sind Start_Expression und End_Expression gleich, wird die Schleife nur einmal ausgeführt.
Ist Start_Expression größer als End_Expression, wird die Schleife nicht ausgeführt, außer Increment_Expression hat einen negativen Wert.
2. Folgendes Beispiel durchläuft alle Elemente der Tabelle anArray:
For($vlElem;1;Size of array(anArray)) ` Führe etwas mit dem Element aus
anArray{$vlElem}:=... End for
3. Folgendes Beispiel durchläuft alle Zeichen des Textes vtSomeText:
For($vlChar;1;Length(vtSomeText)) ` Führe etwas mit dem Zeichen aus, wenn es ein TAB ist If(Character code(vtSomeText[[$vlChar]])=(Tab)) ` ... End if End for
4. Folgendes Beispiel durchläuft die ausgewählten Datensätze für die Tabelle [aTable]:
FIRST RECORD([aTable]) For($vlRecord;1;Records in selection([aTable])) ` Führe etwas mit dem Datensatz aus SEND RECORD([aTable]) ` ... ` Gehe zum nächsten Datensatz NEXT RECORD([aTable]) End for
Die meisten der Schleifen For...End for in Ihrer Datenbank sehen wie in den oben aufgeführten Beispielen aus.
Manchmal benötigen Sie in einer Schleife eine absteigende Zählervariable. Dazu muss Start_Expression größer als End_Expression sein und Increment_Expression einen negativen Wert haben. Folgende Beispiele führen dieselben Aktionen wie oben aus, sie zählen jedoch in absteigender Reihenfolge:
5. Folgendes Beispiel führt 100 Durchläufe aus:
For(vCounter;100;1;-1) ` Führe etwas aus End for
6. Folgendes Beispiel durchläuft alle Elemente der Tabelle anArray:
For($vlElem;Size of array(anArray);1;-1) ` Führe etwas mit dem Element aus
anArray{$vlElem}:=... End for
7. Folgendes Beispiel durchläuft alle Zeichen des Textes vtSomeText:
For($vlChar;Length(vtSomeText);1;-1) ` Führe etwas mit dem Zeichen aus, wenn es ein TAB ist If(Character code(vtSomeText[[$vlChar]])=(Tab) ` ... End if End for
8. Folgendes Beispiel durchläuft die ausgewählten Datensätze für die Tabelle [aTable]:
LAST RECORD([aTable]) For($vlRecord;Records in selection([aTable]);1;-1) ` Führe etwas mit dem Datensatz aus SEND RECORD([aTable]) ` ... ` Gehe zum nächsten Datensatz PREVIOUS RECORD([aTable]) End for
In manchen Fällen soll eine Schleife n-Male ausgeführt, jedoch verlassen werden, wenn eine andere Bedingung TRUE wird. Dazu fragen Sie diese Bedingung in der Schleife ab. Wenn sie TRUE ist, setzen Sie die Zählervariable explizit auf einen Wert, der höher ist als der Endausdruck.
10. Folgendes Beispiel durchläuft eine Datensatzauswahl bis zum Ende oder bis die Interprozessvariable <>vbWeStop, die anfangs auf FALSE gesetzt ist, TRUE wird. Sie unterbrechen die Operation über die Projektmethode ON EVENT CALL:
<>vbWeStop:=False ON EVENT CALL("HANDLE STOP") ` HANDLE STOP setzt <>vbWeStop auf TRUE, wenn Sie unter Windows ctrl-Punkt, ` Auf Macintosh Befehl-Punkt drücken $vlNbRecords:=Records in selection([aTable]) FIRST RECORD([aTable]) For($vlRecord;1;$vlNbRecords) ` Führe etwas mit dem Datensatz aus SEND RECORD([aTable]) ` ... ` Gehe zum nächsten Datensatz If(<>vbWeStop) $vlRecord:=$vlNbRecords+1 ` Veranlasse die Zählervariable, die Schleife zu verlassen Else NEXT RECORD([aTable]) End if End for ON EVENT CALL("") If(<>vbWeStop) ALERT("Die Operation wurde unterbrochen.") Else ALERT("Die Operation wurde erfolgreich abgeschlossen.") End if
$i :=1 ` Initialisiere den Zähler Repeat ` Führe etwas aus $i :=$i +1 ` Der Zähler muss erhöht werden Until($i=100) ` Durchlaufe 100 Mal
Tipp: Die Schleife For...End for ist normalerweise schneller als die Schleifen While...End while und Repeat...Until, da 4D die Bedingung für jeden Schleifenzyklus intern abfragt und dann den Zähler erhöht. Verwenden Sie deshalb möglichst die Schleife For...End for.
Sie können als Zähler sowohl Variablen vom Typ Zahl, Ganzzahl und Lange Ganzzahl als auch Interprozess-, Prozess und lokale Variablen verwenden. Verwenden Sie für lange sich wiederholende Schleifen, besonders im kompilierten Modus, lokale Variablen vom Typ Lange Ganzzahl.
11. Beispiel:
C_LONGINT($vlCounter) ` Verwende lokale Variablen vom Typ lange Ganzzahl For($vlCounter;1;10000) ` Führe etwas aus End for
Sie können in Schleifen beliebig viele Abfragen For...End for einbauen. Um Fehler zu vermeiden, verwenden Sie für jede Schleifenstruktur eine andere Zählervariable.
12. Folgendes Beispiel durchläuft alle Elemente einer zweidimensionalen Tabelle:
For($vlElem;1;Size of array(anArray)) ` ... ` Führe etwas mit der Spalte aus ` ... For($vlSubElem;1;Size of array(anArray{$vlElem})) ` Führe etwas mit dem Element aus
anArray{$vlElem}{$vlSubElem}:=... End for End for
13. Folgendes Beispiel erstellt eine Zeigertabelle mit allen Datenfeldern Ihrer Datenbank:
ARRAY POINTER($apDateFields;0) $vlElem:=0 For($vlTable;1;Get last table number) If(Is table number valid($vlTable)) For($vlField;1;Get last field number($vlTable)) If(Is field number valid($vlTable;$vlField)) $vpField:=Field($vlTable;$vlField) If(Type($vpField->)=Is date) $vlElem:=$vlElem+1 INSERT IN ARRAY($apDateFields;$vlElem) $apDateFields{$vlElem}:=$vpField End if End if End for End if End for