4D v18

For each...End for each

Home

 
4D v18
For each...End for each

For each...End for each  


 

 

Die Syntax einer Schleife mit For each...End for each sieht folgendermaßen aus:

 For each(Current_Item;Expression{;begin{;end}}){Until|While}(Boolean_Expression)}
    Anweisung(en)
 End for each

Die Struktur For each...End for each führt die Anweisung(en) für jeden aktuellen Eintrag (Current_item) von Expression aus. Der Typ des aktuellen Eintrags richtet sich nach der Art von Expression. Die Schleife For each...End for each kann drei Arten durchlaufen:

  • Collections: Schleife für jedes Element der Collection
  • Entity-Selections: Schleife für jede Entity
  • Objekte: Schleife für jede Objekteigenschaft

Folgende Tabelle vergleicht drei Typen von For each...End for each:

Schleife durch CollectionsSchleife durch Entity-SelectionsSchleife durch Objekte
Typ Current_ItemVariable vom gleichen Typ wie Collection ElementeEntityTextvariable
Typ ExpressionCollection (mit Elementen vom gleichen Typ)Entity-SelectionObjekt
Anzahl Schleifen (standardmäßig)Anzahl der Collection ElementeAnzahl Entities in der SelectionAnzahl der Objekteigenschaften
Unterstützung von Parameter begin / endJaJaNein
  • Die Anzahl Schleifen wird beim Starten berechnet und ändert sich nicht während der Durchführung. Einträge während der Schleife hinzufügen oder entfernen wird in der Regel nicht empfohlen, da dies zu fehlenden oder überflüssigen Wiederholungen führen kann.
  • Standardmäßig werden die angegebenen Anweisungen für jeden Wert in Expression ausgeführt. Es ist jedoch möglich, die Schleife durch Testen einer Bedingung entweder am Anfang (While) oder am Ende der Schleife (Until) zu verlassen.
  • Über die optionalen Parameter begin und end lassen sich in Collections und Entity-Selections Grenzen für die Schleife definieren.

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:

  • Ist die Variable Current_Item vom Typ Objekt oder Collection (z.B. wenn Expression eine Collection von Objekten oder von Collections ist), wird durch Ändern dieser Variablen automatisch das zutreffende Element der Collection geändert (weil Objekte und Collections beide dieselbe Referenz nutzen). Bei einer Variablen mit einem skalaren Typ wird nur die Variable geändert.
  • Die Variable Current_Item muss vom gleichen Typ wie die Elemente der Collection sein. Ist ein Element davon nicht vom gleichen Typ wie die Variable, wird ein Fehler generiert und die Schleife stoppt.
  • Enthält die Collection Elemente mit einem Wert Null, wird ein Fehler generiert, wenn der Variablentyp von Current_Item Null Werte nicht unterstützt, wie z.B. der Typ Lange Ganzzahl.

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.

  • Im Parameter begin übergeben Sie die Position des Elements in Expression, bei der der Durchlauf startet (inkl. begin).
  • Im Parameter end übergeben Sie die Position des Elements in Expression, bei der Durchlauf stoppt (exkl. end). 

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:

  • Eine Collection enthält 10 Elemente (von 0 bis 9)
  • begin=-4 -> begin=-4+10=6 -> der Durchlauf startet mit dem 6. Element (#5)
  • end=-2 -> end=-2+10=8 -> der Durchlauf stoppt vor dem 8. Element (#7), z.B. beim 7. Element.

 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:

  • Die Bedingung Until wird am Ende jedes Durchlaufs getestet, d.h. wenn Expression nicht leer oder null ist, wird die Schleife mindestens einmal ausgeführt.
  • Die Bedingung While wird am Anfang jedes Durchlaufs getestet, d.h. je nach Ergebnis der Bedingung wird die Schleife u.U. gar nicht ausgeführt.

 $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:

  • Vor Eintreten in die Schleife, wenn Einträge zur Wahrung der Integrität zusammen geändert werden sollen oder
  • Innerhalb der Schleife, wenn nur ein paar Elemente/Eigenschaften geändert werden müssen und das Verwalten der Integrität nicht erforderlich ist.

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Grundbegriffe

 
SEITENINHALT 
 
GESCHICHTE 

Erstellt: 4D v17

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v18)