La boucle While

La boucle while est utilisée dans les situations où le nombre d'itérations de boucle requise est inconnu. Le nombre d'itérations de boucle est déterminé par la réponse d'un utilisateur à une question à l'intérieur de chaque itération de la boucle. Par exemple, vous pouvez demander à l'utilisateur d'entrer des détails de revenus et, en même temps, demander si l'utilisateur a d'autres revenus à entrer. Pour cela, vous pouvez utiliser une boucle comme suit :

Figure 1. Boucle While
<loop loop-type="while" loop-expression="hasMoreIncome" 
entity="Income">
  <question-page id="IncomePage">
    <cluster>
      <question id="type">
        <label id="Type.Label">
          <![CDATA[Type:]]>
        </label>
      </question>
      <question id="amount">
        <label id="Amount.Label">
          <![CDATA[Amount:]]>
        </label>
      </question>
      <question id="hasMoreIncome" 
              control-question="true" 
              control-question-type="IEG_BOOLEAN">
        <label id="ContinueQuestion.Label">
          <![CDATA[More income?]]>
        </label>
      </question>
    </cluster>
  </question-page>
</loop>

La boucle while effectuera toujours au moins une itération (ce qui la rapproche davantage d'une boucle do while en programmation). Si vous rencontrez une situation dans laquelle vous souhaitez vérifier s'il faut aller dans la boucle, celle-ci doit être imbriquée dans une condition.

La boucle while souffre du même problème que la boucle for lorsqu'il s'agit de revenir à travers la boucle, si des informations ont déjà été saisies. Elle devient aussi efficacement une boucle for-each, jusqu'au moment où l'utilisateur est repassé sur tous les enregistrements précédemment saisis. La boucle while nécessite également que l'attribut d'entité soit défini (comme dans l'exemple ci-dessus) et vous donne la possibilité de spécifier un critère.

Les boucles peuvent être imbriquées dans d'autres boucles et l'une des utilisations les plus courantes de la boucle while consiste à l'imbriquer dans une boucle for-each. Pour élargir l'exemple ci-dessus, plusieurs personnes peuvent déjà avoir été capturées au moment où la boucle de revenus est atteinte dans le script IEG. Pour capturer plusieurs revenus par personne, en supposant qu'il ait déjà été demandé à l'utilisateur quelles personnes avaient un revenu, la boucle imbriquée ressemblerait à ceci :

Figure 2. Boucle imbriquée
<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[More income?]]>
          </label>
        </question>
      </cluster>
    </question-page>
  </loop>
</loop>

Lors de l'utilisation de la boucle while, il est recommandé que l'expression while soit une expression simple, se référant seulement à l'ID d'une question posée à l'intérieur de la boucle pour déterminer si d'autres enregistrements doivent être ajoutés. Cette question doit être une question-contrôle de type booléen.

La question-contrôle sera mise à jour automatiquement lors de l'ajout ou de la suppression d'un enregistrement via la page de synthèse. Lorsque vous passez en revue les réponses en parcourant la boucle après la première tentative, la question sera en lecture seule, sauf sur la dernière itération, afin de donner la possibilité d'ajouter d'autres entités.