La double itération, ou itération imbriquée, consiste à placer une itération à l’intérieur d’une autre. Chaque élément (DataIterator) exécute sa propre boucle sur son ensemble de données.
En pratique, l’internalName du premier DataIterator sert de préfixe au DataPath du second DataIterator. La réussite d’une double itération repose donc sur une bonne compréhension du fonctionnement du DataIterator.
Contexte du cas pratique : Chaque étudiant doit avoir une fiche contenant ses informations personnelles et ses diplômes.
Une section représentant la fiche de chaque étudiant, qui sera itérée en fonction de leur nombre.
Un content de cette section représentant les diplômes sera également itéré en fonction du nombre de diplômes de chaque étudiant.
Liste des attributs du 1er DataIterator
Ce premier DataIterator permet d’itérer sur la liste des étudiants, chaque itération correspondant à une fiche individuelle.
DataPath = ETUDIANTS
InternalName : id
Liste des attributs du 2nd DataIterator
Ce second DataIterator, placé à l’intérieur du premier, itère sur les diplômes associés à chaque étudiant.
DataPath = id|Diplomes
InternalName : diplome
L’internalName par défaut est nommé item.
Il est également possible de mettre en place une triple itération : le principe reste le même.
On peut itérer une Section qui contient un Content itératif, lui-même contenant une liste itérative.
<Section IsReadOnly="" NewPage="screen" OutputMode="all" OutputTarget="all" Type="standard">
<Title TradId="2">Double itération (Enrôlement étudiant)</Title>
<Section Type="standard" OutputMode="all" OutputTarget="all" NewPage="screen">
<DataIterator AddInsert="false" Counter="countetudiant" DataPath="ETUDIANTS" InternalName="id"/>
<Title>Fiche n°<Data Expression="$(countetudiant)+1" TradId="4"/></Title>
<Content OutputMode="all" OutputTarget="all" NewPage="none" StyleName="remark">
<QuestionSet HorizontalAlignment="left" LabelHorizontalAlignment="left" LabelPosition="auto"
OutputMode="all" OutputTarget="all" Spacing="normal" StyleName="fieldset">
<Title TradId="3">Identification étudiant n° <Data Expression="$(countetudiant)+1" TradId="4"/></Title>
<Question>
<Label IsTooltipOnly="false" TradId="5">Nom</Label>
<TextBox AutoSize="false" DataType="string" Name="id|Nom" NumberOfVisibleCharacters="15" RefreshOnExit="false"/>
</Question>
<Question>
<Label IsTooltipOnly="false" TradId="6">Prénom</Label>
<TextBox AutoSize="false" DataType="string" Name="id|Prenom" NumberOfVisibleCharacters="15" RefreshOnExit="false"/>
</Question>
<Question>
<Label IsTooltipOnly="false" TradId="7">Âge</Label>
<NumberBox AutoSize="false" FractionDigits="0" Name="id|Age" NumberOfVisibleCharacters="15" RefreshOnExit="false">
<Description>Âge en années</Description>
</NumberBox>
</Question>
</QuestionSet>
</Content>
<Content NewPage="none" OutputMode="all" OutputTarget="all" StyleName="definition">
<DataIterator AddInsert="false" Counter="countdiplome" DataPath="id|DIPLOMES" InternalName="diplome"/>
<Paragraph OutputMode="all" OutputTarget="all" Spacing="normal" TradId="10">Diplôme n° <Data Expression="$(countdiplome)+1" TradId="11"/></Paragraph>
<QuestionSet OutputMode="all" OutputTarget="all" LabelHorizontalAlignment="left" LabelPosition="auto"
Spacing="normal" HorizontalAlignment="left" StyleName="oddEven">
<Question>
<Label IsTooltipOnly="false" TradId="12">Nom du diplôme</Label>
<TextBox AutoSize="false" DataType="string" Name="diplome|Nom" NumberOfVisibleCharacters="30" RefreshOnExit="false"/>
</Question>
<Question>
<Label IsTooltipOnly="false" TradId="12">Nom de l'établissement</Label>
<TextBox AutoSize="false" DataType="string" Name="diplome|Etablissement" NumberOfVisibleCharacters="30" RefreshOnExit="false"/>
</Question>
<Question>
<Label IsTooltipOnly="false" TradId="13">Date de délivrance</Label>
<DateBox RefreshOnExit="false" Name="diplome|DateDelivrance" Format="form">
<Description>Date de délivrance</Description>
</DateBox>
</Question>
</QuestionSet>
<Paragraph OutputMode="all" OutputTarget="all" Spacing="normal" HorizontalAlignment="right">
<IteratorControlButton Type="delete">Supprimer</IteratorControlButton>
<IteratorControlButton Type="insertAfter">Ajouter après</IteratorControlButton>
</Paragraph>
</Content>
<Content OutputMode="all" OutputTarget="all" NewPage="none" StyleName="warning">
<Paragraph HorizontalAlignment="right" OutputMode="all" OutputTarget="all" Spacing="normal">
<IteratorControlButton Type="delete">Supprimer</IteratorControlButton>
<IteratorControlButton Type="insertAfter">Ajouter après</IteratorControlButton>
</Paragraph>
</Content>
</Section>
</Section>

