4D v18Pour chaque...Fin de chaque |
||||||||||||||||||||||
|
4D v18
Pour chaque...Fin de chaque
|
Boucle sur collections | Boucle sur entity selections | Boucle sur objets | |
Type Elément_courant | Variable du même type que les éléments de la collection | Entity | Variable texte |
Type Expression | Collection (avec éléments du même type) | Entity selection | Objet |
Nombre de boucles (par défaut) | Nombre d'éléments de la collection | Nombre d'entities dans la sélection | Nombre de propriétés d'objets |
Prise en charge de Paramètres début / fin | Oui | Oui | Non |
Lorsque For each...End for each est utilisée avec une Expression de type Collection, le paramètre Elément_courant est une variable du même type que les éléments de la collection. Par défaut, le nombre de boucles est basé sur le nombre d'éléments de la collection.
La collection doit contenir uniquement des éléments du même type. Dans le cas contraire, une erreur sera retournée dès que la première valeur de type différent sera assignée à la variable Elément_courant.
A chaque itération de la boucle, la variable Elément_courant reçoit automatiquement l'élément correspondant de la collection. Vous devez tenir compte des points suivants :
Vous souhaitez calculer quelques statistiques sur une collection de nombres :
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 //nombres pairs
Else
$vOdd:=$vOdd+1 //nombres impairs
End if
Case of
:($item<5000)
$vUnder:=$vUnder+1 //nombres < 5000
:($item>6000)
$vOver:=$vOver+1 //nombres > 6000
End case
End for each
//$vEven=3, $vOdd=4
//$vUnder=4,$vOver=2
Lorsque For each...End for each est utilisée avec une Expression de type Entity selection, le paramètre Elément_courant contient l'entity en cours de traitement.
Le nombre de boucles est basé sur le nombre d'entities présentes dans l'entity selection. A chaque itération de la boucle, le paramètre Elément_courant reçoit automatiquement l'entity qui est en cours de traitement.
Note : Si l'entity selection contient la référence d'une entity qui a été supprimée entre-temps par un autre process, elle est automatiquement ignorée durant la boucle.
N'oubliez pas que toute modification effectuée sur l'entity en cours de traitement doit être explicitement sauvegardée (si nécessaire) à l'aide de la méthode entity.save( ).
Vous souhaitez augmenter le salaire de tous les employés britanniques dans une entity selection :
C_OBJECT(emp)
For each(emp;ds.Employees.query("country='UK'"))
emp.salary:=emp.salary*1,03
emp.save()
End for each
Lorsque For each...End for each est utilisée avec une Expression de type Objet, le paramètre Elément_courant est une variable texte qui reçoit automatiquement le nom de la propriété en cours de traitement.
Les propriétés de l'objet sont itérées en fonction de leur ordre de création. Pendant la boucle, il est possible d'ajouter ou de supprimer des propriétés dans l'objet, sans pour autant modifier le nombre de boucles qui reste basé sur le nombre de propriétés initial de l'objet.
Vous souhaitez passer en majuscules les propriétés contenant des noms dans l'objet suivant :
{ "firstname": "gregory", "lastname": "badikora", "age": 20 }
Vous pouvez écrire :
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 }
Vous pouvez définir des bornes pour l'itération à l'aide des paramètres optionnels début et fin.
Note : Les paramètres début et fin sont utilisables uniquement avec les boucles sur des collections et des entity selections (ils sont ignorés avec les boucles sur des propriétés d'objets).
Si fin est omis ou si fin est plus grand que le nombre d'éléments de Expression, les éléments sont itérés depuis début jusqu'au dernier inclus.
Si les paramètres début et fin sont des valeurs positives, ils représentent des positions d'éléments dans Expression.
Si début est une valeur négative, elle est recalculée comme début:=début+Taille expression (elle est considérée comme un décalage à partir de la fin de Expression). Si la valeur calculée est négative, début prend la valeur 0.
Note : Même si début est une valeur négative, l'itération est toujours effectuée dans le même ordre.
Si fin est une valeur négative, elle est recalculée comme fin:=fin+Taille expression
Par exemple :
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"]
Vous pouvez contrôler l'exécution de For each...End for each en ajoutant une condition Until ou While à la boucle. Lorsqu'une instruction Until(condition) ou While(condition) est associée à la boucle, l'itération stoppe dès que la condition est évaluée à Vrai.
Vous pouvez passer un mot-clé ou l'autre en fonction de vos besoin :
$colNum:=New collection(1;2;3;4;5;6;7;8;9;10)
$total:=0
For each($num;$colNum)While($total<30) //testé au début
$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) //testé à la fin
$total:=$total+$num
End for each
ALERT(String($total)) //$total = 1001 (1000+1)
La boucle For each...End for each peut être utilisée sur une collection partagée ou un objet partagé.
Si votre code doit modifier un ou plusieurs éléments de la collection ou propriétés de l'objet, vous devez utiliser les mots-clés Utiliser...Fin utiliser. En fonction de vos besoins, vous pouvez appeler les mots-clés Utiliser...Fin utiliser :
Produit : 4D
Thème : Présentation du langage
Créé : 4D v17
4D - Langage ( 4D v18)