For...End for

4D - Documentation   Français   English   German   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

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.


4D - Documentation   Français   English   German   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next