4D v18For each...End for each |
||||||||||||||||||||||
|
4D v18
For each...End for each
|
Bucle en colecciones | Bucle en entity selections | Bucle en objetos | |
Tipo Current_Item | Variable del mismo tipo que los elementos de la colección | Entity | Variable texto |
Tipo Expression | Colección (con elementos del mismo tipo) | Selección de entidad | Objeto |
Número de bucles (por defecto) | Número de elementos de la colección | Número de entidades en la selección | Número de propiedades de objetos |
Soporte de Parámetros inicio/fin | Sí | Sí | No |
Cuando For each...End for each se usa con una Expresion de tipo Collection, el parámetro Elemento_actual es una variable del mismo tipo que los elementos de la colección. Por defecto, el número de bucles se basa en la cantidad de elementos de la colección.
La colección debe contener solo elementos del mismo tipo; de lo contrario, se devolverá un error tan pronto como a la variable Elemento_actual se le asigne el primer valor de tipo diferente.
En cada iteración de bucle, la variable Elemento_actual se llena automáticamente con el elemento coincidente de la colección. Los siguientes puntos deben tenerse en cuenta:
Usted desea calcular algunas estadísticas para una colección de números:
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
Cuando For each...End for each se utiliza con una Expresion de tipo Entity selection, el parámetro Elemento_actual contiene la entidad que se procesa actualmente.
El número de bucles se basa en el número de entidades en la entity selection. En cada iteración del bucle, el parámetro Elemento_actual recibe automáticamente la entidad que está siendo procesada.
Nota: si la entity selection contiene una entidad que fue eliminada mientras tanto por otro proceso, se omite automáticamente durante el ciclo.
Tenga en cuenta que cualquier modificación que se aplique a la entidad actual se debe guardar explícitamente utilizando entity.save( ).
Desea elevar el salario de todos los empleados británicos en una entity selection:
C_OBJECT(emp)
For each(emp;ds.Employees.query("country='UK'"))
emp.salary:=emp.salary*1,03
emp.save()
End for each
Cuando For each...End for each se usa con una Expresion del tipo Objeto, el parámetro Elemento_actual es una variable texto que se completa automáticamente con el nombre de la propiedad actualmente procesada.
Las propiedades del objeto se procesan según su orden de creación. Durante el ciclo, las propiedades pueden agregarse o eliminarse del objeto, sin modificar el número de bucles que permanecerán basados en el número original de propiedades del objeto.Desea cambiar los nombres a mayúsculas en el siguiente objeto:
{ "firstname": "gregory", "lastname": "badikora", "age": 20 }
Puedo escribir:
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 }
Puede definir límites para la iteración utilizando los parámetros opcionales inicio y fin.
Nota: los parámetros inicio y fin solo se pueden usar en iteraciones a través de colecciones y de las entity selections (se ignoran en las propiedades de objetos).
Si fin se omite o si fin es mayor que el número de elementos en Expresion, los elementos se iteran desde inicio hasta el último (incluido).
Si los parámetros inicio y fin son valores positivos, representan las posiciones reales de los elementos en Expresion.
Si inicio es un valor negativo, se vuelve a calcular como inicio:=inicio+Tamaño expresion (se considera como el desplazamiento desde el final de Expresion). Si el valor calculado es negativo, inicio toma el valor 0.
Nota: incluso si inicio es negativo, la iteración se sigue realizando en el orden estándar.
Si fin es un valor negativo, se vuelve a calcular como fin:=fin +Tamaño expresion
Por ejemplo:
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"]
Puede controlar la ejecución de For each...End for each agregando una condición Until o While al bucle. Cuando una instrucción Until (condición) o While (condicion) está asociada al bucle, la iteración se detendrá tan pronto como la condicion se evalúe como true.
Puede pasar cualquiera de las palabras claves según sus necesidades:
$colNum:=New collection(1;2;3;4;5;6;7;8;9;10)
$total:=0
For each($num;$colNum)While($total<30) //probado al inicio
$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) //probado al final
$total:=$total+$num
End for each
ALERT(String($total)) //$total = 1001 (1000+1)
El bucle For each...End for each se puede usar en una colección compartida o en un objeto compartido.
Si su código necesita modificar uno o más elementos de la colección o de las propiedades del objeto, debe usar las palabras claves Use...End use. Dependiendo de sus necesidades, puede llamar a las palabras claves Use...End use:
Producto: 4D
Tema: Presentación del lenguaje
Creado por: 4D v17
Manual de lenguaje 4D ( 4D v18)