Bucle for

El bucle for se utiliza para realizar un número determinado de iteraciones en un bucle. El número de iteraciones viene determinado por el valor del atributo loop-expression, que tiene un aspecto similar a este:

Figura 1. Bucle for simplificado
<loop loop-type="for" loop-expression="numPeople">
  <question-page id="PersonDetailsPage" entity="Person">
    ...        
  </question-page>
</loop>

En otras palabras, el número de veces que la página PersonDetailsPage se visualiza viene determinado por el valor de la respuesta a la pregunta de control numPeople. Si bien esto puede funcionar la primera vez que se entra en el bucle, es importante tener en cuenta qué ocurre cuando se itera una segunda o tercera vez cuando se reciben o cambian respuestas. Por ejemplo, durante la iteraciones anteriores, es posible que se capturen una o más personas, por lo que podría tener sentido iterarlas en vez de seguir añadiendo nuevas personas.

De hecho, el bucle for se convierte en un bucle for-each en el momento en que se especifican datos en la entidad contra la que está registrando entradas. Como tal, es necesario dar al bucle for la misma información que se da a un bucle for-each: una entidad sobre la que iterar y un criterio opcional. Una vez especificada la entidad en el bucle, no hay necesidad de especificarla en las páginas dentro del bucle siempre que sean iguales. El bucle puede tener un aspecto similar al siguiente:

Figura 2. Bucle for con entidad y criterio
<loop loop-type="for" loop-expression="numPeople"
        entity="Person" criteria="isPrimary==false">
  <question-page id="PersonDetailsPage">
    ...        
  </question-page>
</loop>

A la hora de utilizar bucles for, se recomienda la expresión del bucle sea una expresión simple que solo haga referencia al id de una pregunta que se haga antes de entrar en el bucle para determinar el número de registros a crear. Dicha pregunta puede ser una pregunta de control (control-question) de tipo entero.

Esta pregunta de control no se actualizará automáticamente, y por ello no se mantendrá sincronizada con el número real de entidades si se añaden o suprimen entidades a través de una página de resumen. Por tanto, su valor no debería utilizarse para nada que no sea la expresión del bucle.

Una vez iniciado el bucle, será imposible para modificar el valor de esta pregunta de control, que será de sólo lectura de forma predeterminada a menos que el atributo "hide-for-control-question" se haya establecido a true en el elemento ieg-script, en cuyo caso la etiqueta y el valor de la pregunta de controlse ocultarán. El diseñador del script deberá asegurarse en tal caso de que la pregunta de control no sea la única pregunta en la página en la que esté definida, ya que esto provocaría que se mostrase una página vacía.

En la práctica, los bucles for tienen una aplicación limitada y, por tanto, se recomienda emplear bucles while para capturar información, ya que pueden resultar más intuitivos al usuario.