4D v18For each...End for each |
||||||||||||||||||||||
|
4D v18
For each...End for each
|
Schleife durch Collections | Schleife durch Entity-Selections | Schleife durch Objekte | |
Typ Current_Item | Variable vom gleichen Typ wie Collection Elemente | Entity | Textvariable |
Typ Expression | Collection (mit Elementen vom gleichen Typ) | Entity-Selection | Objekt |
Anzahl Schleifen (standardmäßig) | Anzahl der Collection Elemente | Anzahl Entities in der Selection | Anzahl der Objekteigenschaften |
Unterstützung von Parameter begin / end | Ja | Ja | Nein |
Beim Verwenden von For each...End for each mit einer Expression vom Typ Collection ist der Parameter Current_Item eine Variable vom gleichen Typ wie die Collection Elemente. Die Anzahl Schleifen basiert standardmäßig auf der Anzahl Einträge in der Collection.
Die Collection darf nur Elemente vom gleichen Typ enthalten, sonst wird ein Fehler zurückgegeben, sobald die Variable Current_Item dem ersten Wert mit einem unpassenden Typ zugewiesen wird.
Bei jeder Wiederholung der Schleife wird die Variable Current_Item automatisch mit dem passenden Element der Collection gefüllt. Dabei müssen Sie folgende Punkte berücksichtigen:
Für eine Collection mit Zahlen ein paar Statistiken berechnen:
C_COLLECTION($nums)
$nums:=New collection(10;5001;6665;33;1;42;7850)
C_LONGINT($item;$vEven;$vOdd;$vUnder;$vOver)
For each($item;$nums)
If($item%2=0)
$vEven:=$vEven+1
Else
$vOdd:=$vOdd+1
End if
Case of
:($item<5000)
$vUnder:=$vUnder+1
:($item>6000)
$vOver:=$vOver+1
End case
End for each
//$vEven=3, $vOdd=4
//$vUnder=4,$vOver=2
Beim Verwenden von For each...End for each mit einer Expression vom Typ Entity selection ist der Parameter Current_Item die Entity, die gerade bearbeitet wird.
Die Anzahl Schleifen basiert auf der Anzahl Entities in der Entity-Selection. Bei jeder Wiederholung der Schleife wird der Parameter Current_Item automatisch mit der Entity der Entity-Selection gefüllt, die gerade bearbeitet wird.
Hinweis: Enthält die Entity-Selection eine Entity, die zwischenzeitlich durch einen anderen Prozess entfernt wurde, wird diese während der Schleife automatisch übersprungen.
Beachten Sie, dass jede Änderung in der aktuellen Entity explizit mit entity.save( ) gesichert werden muss.
Das Gehalt aller britischen Angestellten in einer Entity-Selection erhöhen:
C_OBJECT(emp)
For each(emp;ds.Employees.query("country='UK'"))
emp.salary:=emp.salary*1,03
emp.save()
End for each
Beim Verwenden von For each...End for each mit einer Expression vom Typ Objekt ist der Parameter Current_Item eine Textvariable, die automatisch mit dem Namen der gerade bearbeiteten Eigenschaft gefüllt wird.
Die Eigenschaften des Objekts werden in der Reihenfolge ihrer Erstellung bearbeitet. Während der Schleife lassen sich Eigenschaften im Objekt hinzufügen oder daraus entfernen. Das verändert nicht die Anzahl Schleifen, diese basiert weiterhin auf der ursprünglichen Anzahl Eigenschaften für das Objekt.
Die Namen in folgendem Objekt auf Großschreibung umstellen:
{ "firstname": "gregory", "lastname": "badikora", "age": 20 }
Sie schreiben:
For each(property;vObject)
If(Value type(vObject[property])=Is text)
vObject[property]:=Uppercase(vObject[property])
End if
End for each
{ "firstname": "GREGORY", "lastname": "BADIKORA", "age": 20 }
Mit den optionalen Parametern begin und end können Sie Grenzen für die Wiederholung der Schleife definieren.
Hinweis: Die Parameter begin und end sind nur für Schleifen in Collections und Entity-Selections möglich, in Objekteigenschaften werden sie ignoriert.
Wird end weggelassen oder ist end größer als die Anzahl Elemente in Expression, werden Elemente ab begin bis zum letzten Element einschließlich durchlaufen.
Sind die Parameter begin und end positive Werte, geben sie die aktuellen Positionen der Elemente in Expression an.
Ist begin ein negativer Wert, wird er als begin:=begin+Expression Größe berechnet (=Versatz vom Ende der Expression). Ist der berechnete Wert negativ, wird begin auf 0 gesetzt.
Hinweis: Auch wenn begin negativ ist, erfolgt der Durchlauf in der standardmäßigen Reihenfolge.
Ist end ein negativer Wert, wird er berechnet als end:=end+Expression Größe
Hierzu ein Beispiel:
C_COLLECTION($col;$col2)
$col:=New collection("a";"b";"c";"d";"e")
$col2:=New collection(1;2;3)
C_TEXT($item)
For each($item;$col;0;3)
$col2.push($item)
End for each
//$col2=[1,2,3,"a","b","c"]
For each($item;$col;-2;-1)
$col2.push($item)
End for each
//$col2=[1,2,3,"a","b","c","d"]
Sie können die Ausführung von For each...End for each durch Einfügen einer Bedingung Until oder While in der Schleife steuern. Ist eine Anweisung Until(condition) oder While(condition) in der Schleife vorhanden, stoppt der Durchlauf, sobald condition mit wahr gewertet wird.
Sie können je nach Bedarf das eine oder andere Schlüsselwort verwenden:
$colNum:=New collection(1;2;3;4;5;6;7;8;9;10)
$total:=0
For each($num;$colNum)While($total<30) //getestet am Anfang
$total:=$total+$num
End for each
ALERT(String($total)) //$total = 36 (1+2+3+4+5+6+7+8)
$total:=1000
For each($num;$colNum)Until($total>30) //getestet am Ende
$total:=$total+$num
End for each
ALERT(String($total)) //$total = 1001 (1000+1)
Die Schleife For each...End for each lässt sich auch in shared objects und shared collections verwenden. Weitere Informationen dazu finden Sie im Abschnitt Shared Objects oder Collections verwenden.
Muss Ihr Code ein oder mehrere Elemente der Collection oder Objekteigenschaften ändern, müssen Sie die Schlüsselwörter Use...End use verwenden. Sie können diese je nach Bedarf wie folgt aufrufen:
Produkt: 4D
Thema: Grundbegriffe
Erstellt: 4D v17
4D Programmiersprache ( 4D v18)