4D v16.3

For...End for

Home

 
4D v16.3
For...End for

For...End for  


 

 

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_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.

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(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

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);2)
  ` Führe etwas mit dem Element #2,#4...#2n aus
    anArray{$vlElem}:=...
 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

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 muss 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 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



Siehe auch 

Ablaufsteuerung
Case of...Else...End case
If...Else...End if
Repeat...Until
While...End while

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Grundbegriffe

 
GESCHICHTE 

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v16)
4D Programmiersprache ( 4D v16.1)
4D Programmiersprache ( 4D v16.2)
4D Programmiersprache ( 4D v16.3)