Répétitions avancées
Schémas avancés pour les groupes de répétition : comptages dynamiques, répétitions imbriquées, résumé des données répétées et référencement de valeurs entre répétitions.
Cette page couvre les schémas avancés pour travailler avec des groupes de répétition dans rtSurvey. Pour les bases de la configuration d’un groupe de répétition, consultez Regroupement et répétitions.
Nombre de répétitions dynamique
Par défaut, l’enquêteur décide du nombre de répétitions. Vous pouvez fixer le nombre de répétitions en utilisant repeat_count :
| type | name | label | repeat_count |
|---|---|---|---|
| begin_repeat | household_members | Membre du ménage | ${num_members} |
| text | member_name | Nom du membre | |
| integer | member_age | Âge | |
| end_repeat |
La répétition s’exécute exactement ${num_members} fois, où num_members a été collecté plus tôt dans le formulaire. L’enquêteur ne peut pas ajouter ou supprimer des instances.
Accès indexé : indexed-repeat()
Accédez à la valeur d’un champ d’une instance spécifique de répétition depuis l’extérieur du groupe de répétition en utilisant indexed-repeat(repeatedField, repeatGroup, index) :
| type | name | label | calculation |
|---|---|---|---|
| calculate | first_name | indexed-repeat(${member_name}, ${household_members}, 1) | |
| calculate | second_name | indexed-repeat(${member_name}, ${household_members}, 2) |
C’est utile pour créer des champs récapitulatifs ou référencer les données du membre “principal” après la répétition.
Position de l’instance actuelle : index()
Dans un groupe de répétition, index() retourne la position (basée sur 1) de l’instance actuelle. Utilisez-le pour étiqueter chaque répétition ou créer des identifiants uniques :
| type | name | label |
|---|---|---|
| begin_repeat | plots | Parcelle |
| note | plot_label | Parcelle numéro ${index()} |
| text | plot_id | Identifiant de la parcelle |
| end_repeat |
Référencer des champs dans la même instance
Dans une répétition, utilisez ${fieldname} pour référencer un autre champ dans la même instance de répétition. Il n’est pas nécessaire d’utiliser indexed-repeat() dans la même boucle :
| type | name | label | relevant |
|---|---|---|---|
| begin_repeat | members | Membre | |
| text | member_name | Nom | |
| integer | member_age | Âge | |
| text | school_name | Nom de l’école | ${member_age} < 18 |
| end_repeat |
Référencer des champs parents depuis l’intérieur d’une répétition
Les champs en dehors (au-dessus) du groupe de répétition peuvent être référencés normalement avec ${fieldname} :
| type | name | label |
|---|---|---|
| text | village | Nom du village |
| begin_repeat | plots | Parcelle agricole |
| note | plot_context | Parcelles dans ${village} |
| end_repeat |
Résumer les données répétées
Utilisez les fonctions d’agrégation de répétition en dehors du groupe de répétition pour résumer :
| Fonction | Exemple | Description |
|---|---|---|
count(group) | count(${household_members}) | Nombre d’instances |
sum(field) | sum(${loan_amount}) | Somme d’un champ numérique |
min(field) | min(${member_age}) | Valeur minimale |
max(field) | max(${member_age}) | Valeur maximale |
join(sep, field) | join(', ', ${member_name}) | Liste séparée par des virgules |
count-if(group, expr) | count-if(${members}, ${member_age} < 18) | Comptage conditionnel |
sum-if(field, expr) | sum-if(${loan_amount}, ${loan_amount} > 500) | Somme conditionnelle |
join-if(sep, field, expr) | join-if(', ', ${name}, ${age} >= 18) | Jointure conditionnelle |
Exemple : Résumé du ménage
| type | name | label | calculation |
|---|---|---|---|
| integer | num_members | Combien de membres ? | |
| begin_repeat | members | Membre | ${num_members} |
| text | member_name | Nom | |
| integer | member_age | Âge | |
| end_repeat | |||
| calculate | total_members | count(${members}) | |
| calculate | children_count | count-if(${members}, ${member_age} < 18) | |
| calculate | adult_names | join-if(', ', ${member_name}, ${member_age} >= 18) | |
| note | summary | ${total_members} membres ; ${children_count} de moins de 18 ans. Adultes : ${adult_names} |
Répétitions imbriquées
Un groupe de répétition peut contenir un autre groupe de répétition. Utilisez ceci avec précaution — les répétitions imbriquées ajoutent de la complexité et peuvent être déroutantes pour les enquêteurs.
| type | name | label |
|---|---|---|
| begin_repeat | households | Ménage |
| text | hh_id | Identifiant du ménage |
| begin_repeat | hh_members | Membre |
| text | member_name | Nom du membre |
| end_repeat | ||
| end_repeat |
Pour référencer un champ dans une répétition externe depuis la répétition interne, utilisez ${fieldname} — il se résout au plus proche ancêtre correspondant :
Dans la répétition hh_members, ${hh_id} retourne l’identifiant du ménage actuel, pas de tous les ménages.
Classement dans les groupes de répétition : rank-index()
Quand un champ rank existe dans une répétition, utilisez rank-index(instanceNumber, repeatedField) depuis l’extérieur pour obtenir le rang ordinal d’une instance spécifique :
| type | name | label | calculation |
|---|---|---|---|
| calculate | top_scorer | rank-index(1, ${score}) |
rank-index(1, ${score}) retourne l’index d’instance du score le plus élevé.
Bonnes pratiques
- Utilisez toujours
repeat_countlorsque le nombre de répétitions est connu à l’avance — cela évite aux enquêteurs d’ajouter ou supprimer accidentellement des instances. - Gardez les groupes de répétition focalisés — une répétition avec plus de 20 questions par instance est difficile à naviguer.
- Nommez les groupes de répétition clairement (ex. :
household_members, pasrepeat1) — le nom apparaît dans les appels de fonctions et les données exportées. - Testez avec le nombre maximum d’instances attendu pour vérifier les performances.
- Utilisez l’apparence
field-listsur le groupe de répétition pour afficher tous les champs sur un seul écran par instance (mobile).
Limitations
indexed-repeat()nécessite un index valide (de 1 au nombre d’instances) — les index hors plage retournent vide.- Les répétitions imbriquées au-delà de 2 niveaux ne sont pas recommandées et peuvent causer des problèmes d’affichage sur certains clients.
- Les fonctions d’agrégation (
sum,count, etc.) opèrent sur l’ensemble du groupe de répétition — vous ne pouvez pas agréger un sous-ensemble d’instances sans les variantes*-if.