Como muchos otros lenguajes de programación, 4D ofrece la posibilidad de iterar sobre números con una For(…) / End for o sobre una condición gracias a las sentencias While(…)/End while y Repeat/Until(…) . Estas iteraciones (o bucles) son muy útiles, pero no son la forma más adecuada de iterar sobre tipos de datos avanzados como colecciones y selecciones de entidades. Por eso se ha creado el nuevo For each(…)/End for each para facilitar la codificación.
Bucle a través de los elementos de la colección
La sentencia For each / End for each puede utilizarse en varios casos. Un caso es el de recorrer en bucle los elementos de una colección. No es necesario saber de antemano cuántos elementos pertenecen a la colección antes de entrar en el bucle. En cada iteración, la variable pasada como primer parámetro(item) se llenará con el elemento actual de la colección(col).
col:=New collection("charlie"; "delta"; "uniforme"; "foxtrot"; "quebec")
$count :=0
For each (item;col)
If (Length(item)>5)
$count :=$count+1
End if
End for each
ALERT (String($count)+" ¡palabras encontradas!")
Bucle a través de las entidades
El segundo caso es también el más novedoso: el bucle a través de las entidades de una selección de entidades. Las entidades y las selecciones de entidades son parte de un nuevo concepto en 4D, descrito en esta entrada del blog. Lo principal que necesita saber es que las entidades son similares a los registros, y las selecciones de entidades pueden ser comparadas con las selecciones tradicionales , ¡pero ambas son declaradas como objetos!
De nuevo, no es necesario conocer previamente cuántas entidades pertenecen a la selección de entidades antes de entrar en el bucle. En cada iteración, la variable de entidad pasada como primer parámetro se llenará automáticamente con la entidad actual de la selección de entidades.
UK_emps:=ds.Empleados.query("country='UK'")
// Browse the entity selection
For each (emp;UK_emps)
emp. salary :=emp.salary*1.03 // raise the salary
emp .save() // save the result
End for each
Bucle a través de las propiedades de los objetos
La sentencia For each / End for each también se puede utilizar en otro caso: el bucle a través de las propiedades de los objetos. Por ejemplo, puede ser muy útil en caso de querer escribir algún código genérico, sin conocer los nombres de las propiedades del objeto de antemano.
De nuevo, no es necesario saber de antemano cuántas propiedades tiene un objeto antes de entrar en el bucle. Todos los nombres de sus propiedades serán analizados uno por uno. En cada iteración, la variable pasada como primer parámetro(property en el ejemplo de abajo) se llenará con el nombre del atributo del objeto($contact en el ejemplo de abajo).
For each ($property;$contact)
If (Value type($contact[$property])=Is text)
//Change to uppercase each attribute which is a text
$contact[$property]:=Uppercase($contact[$property])
End if
End for each