Version 6.0
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.
Tip: Für besondere Zwecke können Sie den Wert der Zählervariablen Counter_Variable innerhalb 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.
Allgemeine Beispiele
1. Folgendes Beispiel führt 100 Durchläufe aus:
For (vCounter;1;100) ` Führe etwas aus End for
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 (Ascii(vtSomeText[[$vlChar]])=Char(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.
Zähler verringern
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 (Ascii(vtSomeText[[$vlChar]])=Char(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
Die Zählervariable um mehr als Eins erhöhen
Bei Bedarf können Sie Increment_Expression (positiv oder negativ) für absolute Werte größer als Eins einsetzen.
9. Folgende Schleife ordnet der Tabelle anArray nur die geraden Elemente zu:
For ($vlElem;2;((Size of array(anArray)+1)\2)*2;2) ` Führe etwas mit dem Element #2,#4...#2n aus anArray{$vlElem}:=... End for
Beachten Sie, dass der Endausdruck ((Size of array(anArray)+1)\2)*2 gerade und ungerade Größen in Arrays berücksichtigt.
Die Zählervariable verändern
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
Schleifen vergleichen
Gehen wir zurück zum ersten Beispiel in For...End for:
Folgendes Beispiel führt 100 Durchläufe aus:
For (vCounter;1;100) ` Führe etwas aus End for
Vergleichen Sie dieselbe Aktion, einmal mit der Schleife While...End while, einmal mit der Schleife Repeat...Until.
Ausführung mit der Schleife While...End while:
$i := 1 ` Initialisiere den Zähler While ($i<=100) ` Durchlaufe 100 Mal `Führe etwas aus $i := $i + 1 ` Der Zähler muß erhöht werden End while
Ausführung mit der Schleife Repeat...Until:
$i := 1 ` Initialisiere den Zähler Repeat ` Führe etwas aus $i := $i + 1 ` Der Zähler muß erhöht werden Until ($i=100) ` Durchlaufe 100 Mal
Tip: Die Schleife For...End for loop ist normalerweise schneller als die Schleifen While...End while und Repeat...Until, da 4th Dimension 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 loop.
Die Ausführung der Schleife For...End for optimieren
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
In Schleifen eingebaute For...End for Abfragen
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;Count table) For($vlField;1;Count fields($vlTable)) $vpField:=Field($vlTable;$vlField) If (Type($vpField->)=Is Date) $vlElem:=$vlElem+1 INSERT ELEMENT($apDateFields;$vlElem) $apDateFields{$vlElem}:=$vpField End if End for End for
Referenz
Ablaufsteuerung, Case of...Else...End case, If...Else...End if, Repeat...Until, While...End while.