Geavanceerde herhalingen
Geavanceerde patronen voor herhalingsgroepen: dynamische tellingen, geneste herhalingen, samenvatten van herhalingsgegevens en verwijzen naar waarden over herhalingen.
Deze pagina behandelt geavanceerde patronen voor het werken met herhalingsgroepen in rtSurvey. Voor de basis van het instellen van een herhalingsgroep, zie Groepering en herhalingen.
Dynamische herhalingstelling
Standaard beslist de enumerator hoe vaak te herhalen. U kunt het aantal herhalingen fixeren met repeat_count:
| type | name | label | repeat_count |
|---|---|---|---|
| begin_repeat | household_members | Huishoudlid | ${num_members} |
| text | member_name | Naam van lid | |
| integer | member_age | Leeftijd | |
| end_repeat |
De herhaling wordt precies ${num_members} keer uitgevoerd, waarbij num_members eerder in het formulier is verzameld. De enumerator kan geen instanties toevoegen of verwijderen.
Geïndexeerde toegang: indexed-repeat()
Toegang krijgen tot de veldwaarde van een specifieke herhalingsinstantie van buiten de herhalingsgroep met indexed-repeat(herhaaldVeld, herhalingsgroep, 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) |
Dit is nuttig voor het bouwen van samenvattingsvelden of het verwijzen naar de gegevens van het “primaire” lid na de herhaling.
Huidige instantiepositie: index()
Binnen een herhalingsgroep geeft index() de 1-gebaseerde positie van de huidige instantie terug. Gebruik het om elke herhaling te labelen of unieke identificatoren te maken:
| type | name | label |
|---|---|---|
| begin_repeat | plots | Perceel |
| note | plot_label | Perceelnummer ${index()} |
| text | plot_id | Perceel-ID |
| end_repeat |
Verwijzen naar velden in dezelfde instantie
Gebruik binnen een herhaling ${veldnaam} om te verwijzen naar een ander veld in dezelfde herhalingsinstantie. Er is geen indexed-repeat() nodig binnen dezelfde lus:
| type | name | label | relevant |
|---|---|---|---|
| begin_repeat | members | Lid | |
| text | member_name | Naam | |
| integer | member_age | Leeftijd | |
| text | school_name | Schoolnaam | ${member_age} < 18 |
| end_repeat |
Verwijzen naar bovenliggende velden van binnenuit een herhaling
Velden buiten (boven) de herhalingsgroep kunnen normaal worden gerefereerd met ${veldnaam}:
| type | name | label |
|---|---|---|
| text | village | Dorpsnaam |
| begin_repeat | plots | Landbouwperceel |
| note | plot_context | Percelen in ${village} |
| end_repeat |
Herhalingsgegevens samenvatten
Gebruik herhalingsaggregatiefuncties buiten de herhalingsgroep om samen te vatten:
| Functie | Voorbeeld | Beschrijving |
|---|---|---|
count(groep) | count(${household_members}) | Aantal instanties |
sum(veld) | sum(${loan_amount}) | Som van een numeriek veld |
min(veld) | min(${member_age}) | Minimumwaarde |
max(veld) | max(${member_age}) | Maximumwaarde |
join(sep, veld) | join(', ', ${member_name}) | Met komma’s gescheiden lijst |
count-if(groep, expr) | count-if(${members}, ${member_age} < 18) | Voorwaardelijke telling |
sum-if(veld, expr) | sum-if(${loan_amount}, ${loan_amount} > 500) | Voorwaardelijke som |
join-if(sep, veld, expr) | join-if(', ', ${name}, ${age} >= 18) | Voorwaardelijke samenvoeging |
Voorbeeld: Huishoudsamenvatting
| type | name | label | calculation |
|---|---|---|---|
| integer | num_members | Hoeveel leden? | |
| begin_repeat | members | Lid | ${num_members} |
| text | member_name | Naam | |
| integer | member_age | Leeftijd | |
| 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} leden; ${children_count} onder 18. Volwassenen: ${adult_names} |
Geneste herhalingen
Een herhalingsgroep kan een andere herhalingsgroep bevatten. Gebruik dit voorzichtig — geneste herhalingen voegen complexiteit toe en kunnen verwarrend zijn voor enumeratoren.
| type | name | label |
|---|---|---|
| begin_repeat | households | Huishouden |
| text | hh_id | Huishoud-ID |
| begin_repeat | hh_members | Lid |
| text | member_name | Naam van lid |
| end_repeat | ||
| end_repeat |
Om te verwijzen naar een veld in een buitenste herhaling vanuit de binnenste herhaling, gebruikt u ${veldnaam} — het wordt omgezet naar de dichtstbijzijnde overeenkomende voorouder:
Binnen de herhaling hh_members geeft ${hh_id} de ID van het huidige huishouden terug, niet alle huishoudens.
Rang binnen herhalingsgroepen: rank-index()
Wanneer een rank-veld bestaat binnen een herhaling, gebruik dan rank-index(instantienummer, herhaaldVeld) van buiten om de ordinale rang van een specifieke instantie te krijgen:
| type | name | label | calculation |
|---|---|---|---|
| calculate | top_scorer | rank-index(1, ${score}) |
rank-index(1, ${score}) geeft de instantie-index van de hoogste score terug.
Aanbevolen werkwijzen
- Gebruik altijd
repeat_countwanneer het aantal herhalingen van tevoren bekend is — dit voorkomt dat enumeratoren per ongeluk instanties toevoegen of verwijderen. - Houd herhalingsgroepen gefocust — een herhaling met 20+ vragen per instantie is moeilijk te navigeren.
- Benoem herhalingsgroepen duidelijk (bijv.
household_members, nietrepeat1) — de naam verschijnt in functieaanroepen en geëxporteerde gegevens. - Test met het maximale verwachte aantal instanties om de prestaties te verifiëren.
- Gebruik de weergave
field-listop de herhalingsgroep om alle velden op één scherm per instantie te tonen (mobiel).
Beperkingen
indexed-repeat()vereist een geldige index (1 tot het aantal instanties) — indices buiten bereik retourneren leeg.- Geneste herhalingen dieper dan 2 niveaus worden niet aanbevolen en kunnen weergaveproblemen op sommige clients veroorzaken.
- Aggregatiefuncties (
sum,count, etc.) werken op de gehele herhalingsgroep — u kunt geen subset van instanties aggregeren zonder de*-if-varianten.