Bucle while

El bucle while se utiliza en situaciones en las que se desconoce el número necesario de iteraciones del bucle. El número de iteraciones del bucle se decide a partir de la respuesta del usuario a una pregunta en cada iteración del bucle. Por ejemplo, puede que desee solicitar al usuario que especifique algunos detalles de sus ingresos y, al mismo tiempo, preguntarle si tiene más ingresos que especificar. Esto se puede conseguir con un bucle similar a este:

Figura 1. Bucle while
<loop loop-type="while" loop-expression="hasMoreIncome" 
entity="Income">
  <question-page id="IncomePage">
    <cluster>
      <question id="type">
        <label id="Type.Label">
          <![CDATA[Tipo:]]>
        </label>
      </question>
      <question id="amount">
        <label id="Amount.Label">
          <![CDATA[Cantidad:]]>
        </label>
      </question>
      <question id="hasMoreIncome" 
              control-question="true" 
              control-question-type="IEG_BOOLEAN">
        <label id="ContinueQuestion.Label">
          <![CDATA[¿Ingresos adicionales?]]>
        </label>
      </question>
    </cluster>
  </question-page>
</loop>

El bucle while siempre realiza al menos una iteración (que sería más bien un bucle do-while en términos de lenguajes de programación). Si tiene una situación en la que desea comprobar si va a entrar en el bucle, debería incluirlo en una condición.

El bucle while presenta el mismo inconveniente que el bucle for cuando se trata de retroceder en el bucle una vez que se ha especificado información. De igual forma, se convierte a todos los efectos en un bucle for-each hasta el momento en que el usuario ha iterado todos los registros especificados previamente. El bucle while también requiere que se establezca el atributo entity (como en el ejemplo anterior) y da la opción de especificar un criterio.

Un bucle puede anidarse dentro de otro bucle y uno de los usos más comunes del bucle while es anidarlo dentro de un bucle for-each. Para ampliar el ejemplo anterior, puede que ya se hayan capturado varias personas en el momento en que se llega al bucle de ingresos en el script IEG. Para capturar varios ingresos por persona, y suponiendo que al usuario ya se le haya preguntado qué personas tienen ingresos, el bucle anidado tendría un aspecto similar al de este ejemplo:

Figura 2. Bucle anidado
<loop loop-type="for-each" entity="Person" 
criteria="hasIncome==true">
  <loop loop-type="while" loop-expression="hasMoreIncome" 
    entity="Income">
    <question-page id="IncomePage">
      ...
      <cluster>
        ...
        <question id="hasMoreIncome" 
                  control-question="true" 
                  control-question-type="IEG_BOOLEAN">
          <label id="ContinueQuestion.Label">
            <![CDATA[¿Ingresos adicionales?]]>
          </label>
        </question>
      </cluster>
    </question-page>
  </loop>
</loop>

A la hora de utilizar bucles while, se recomienda la expresión del bucle sea una expresión simple que solo haga referencia al id de una pregunta que se haga dentro del bucle para determinar si hay que añadir registros adicionales. Dicha pregunta puede ser una pregunta de control (control-question) de tipo booleano.

La pregunta de control se actualizará automáticamente cuando se añada o suprima un registro a través de la página de resumen. Cuando se revisan las respuestas iterando en el bucle tras la pasada inicial, la pregunta será de solo lectura, salvo en la última iteración, para dar la oportunidad de añadir entidades adicionales.