Pokročilé opakovania
Pokročilé vzory pre skupiny opakovaní: dynamické počty, vnorené opakovania, sumarizácia dát opakovaní a odkazovanie hodnôt naprieč opakovaniami.
Táto stránka pokrýva pokročilé vzory pre prácu so skupinami opakovaní v rtSurvey. Pre základné nastavenie skupiny opakovaní pozri Zoskupovanie a opakovania.
Dynamický počet opakovaní
Predvolene anketár rozhoduje, koľkokrát opakovať. Počet opakovaní môžete zafixovať pomocou repeat_count:
| type | name | label | repeat_count |
|---|---|---|---|
| begin_repeat | household_members | Člen domácnosti | ${num_members} |
| text | member_name | Meno člena | |
| integer | member_age | Vek | |
| end_repeat |
Opakovanie prebehne presne ${num_members}-krát, kde num_members bol zozbieraný skôr vo formulári. Anketár nemôže pridávať ani odstraňovať inštancie.
Indexovaný prístup: indexed-repeat()
Prístup k hodnote poľa konkrétnej inštancie opakovania zvonku skupiny opakovaní pomocou 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) |
Toto je užitočné na vytváranie súhrnných polí alebo odkazovanie dát „primárneho" člena po opakovní.
Aktuálna pozícia inštancie: index()
Vo vnútri skupiny opakovaní, index() vráti pozíciu aktuálnej inštancie (začína od 1). Použite ho na označenie každého opakovania alebo vytváranie jedinečných identifikátorov:
| type | name | label |
|---|---|---|
| begin_repeat | plots | Parcela |
| note | plot_label | Parcela číslo ${index()} |
| text | plot_id | ID parcely |
| end_repeat |
Odkazovanie polí v tej istej inštancii
V rámci opakovania použite ${fieldname} na odkazovanie iného poľa v tej istej inštancii opakovania. V rámci toho istého cyklu nie je potrebné indexed-repeat():
| type | name | label | relevant |
|---|---|---|---|
| begin_repeat | members | Člen | |
| text | member_name | Meno | |
| integer | member_age | Vek | |
| text | school_name | Názov školy | ${member_age} < 18 |
| end_repeat |
Odkazovanie rodičovských polí zvnútra opakovania
Polia mimo (nad) skupinou opakovaní môžu byť odkazované normálne pomocou ${fieldname}:
| type | name | label |
|---|---|---|
| text | village | Názov obce |
| begin_repeat | plots | Poľnohospodárska parcela |
| note | plot_context | Parcely v ${village} |
| end_repeat |
Sumarizácia dát opakovaní
Použite agregačné funkcie opakovania mimo skupiny opakovaní na sumarizáciu:
| Funkcia | Príklad | Popis |
|---|---|---|
count(group) | count(${household_members}) | Počet inštancií |
sum(field) | sum(${loan_amount}) | Súčet číselného poľa |
min(field) | min(${member_age}) | Minimálna hodnota |
max(field) | max(${member_age}) | Maximálna hodnota |
join(sep, field) | join(', ', ${member_name}) | Zoznam oddelený čiarkami |
count-if(group, expr) | count-if(${members}, ${member_age} < 18) | Podmienený počet |
sum-if(field, expr) | sum-if(${loan_amount}, ${loan_amount} > 500) | Podmienený súčet |
join-if(sep, field, expr) | join-if(', ', ${name}, ${age} >= 18) | Podmienené spojenie |
Príklad: Súhrn domácnosti
| type | name | label | calculation |
|---|---|---|---|
| integer | num_members | Koľko členov? | |
| begin_repeat | members | Člen | ${num_members} |
| text | member_name | Meno | |
| integer | member_age | Vek | |
| 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} členov; ${children_count} mladších ako 18. Dospelí: ${adult_names} |
Vnorené opakovania
Skupina opakovaní môže obsahovať inú skupinu opakovaní. Používajte to opatrne — vnorené opakovania pridávajú komplexnosť a môžu byť mätúce pre anketárov.
| type | name | label |
|---|---|---|
| begin_repeat | households | Domácnosť |
| text | hh_id | ID domácnosti |
| begin_repeat | hh_members | Člen |
| text | member_name | Meno člena |
| end_repeat | ||
| end_repeat |
Na odkazovanie poľa vo vonkajšom opakovaní zvnútra vnútorného opakovania použite ${fieldname} — preloží sa na najbližšieho zodpovedajúceho predka:
Vo vnútri opakovania hh_members, ${hh_id} vráti ID aktuálnej domácnosti, nie všetkých domácností.
Poradie vo vnútri skupín opakovaní: rank-index()
Keď pole rank existuje vo vnútri opakovania, použite rank-index(instanceNumber, repeatedField) zvonku na získanie poradia konkrétnej inštancie:
| type | name | label | calculation |
|---|---|---|---|
| calculate | top_scorer | rank-index(1, ${score}) |
rank-index(1, ${score}) vráti index inštancie s najvyšším skóre.
Najlepšie postupy
- Vždy používajte
repeat_countak je počet opakovaní vopred známy — zabraňuje anketárom náhodne pridávať alebo odstraňovať inštancie. - Udržujte skupiny opakovaní zamerané — opakovanie s viac ako 20 otázkami na inštanciu je ťažko navigovateľné.
- Pomenujte skupiny opakovaní jasne (napr.
household_members, nierepeat1) — názov sa objavuje vo volaní funkcií a exportovaných dátach. - Testujte s maximálnym očakávaným počtom inštancií na overenie výkonu.
- Použite vzhľad
field-listna skupinu opakovaní, aby sa všetky polia zobrazili na jednej obrazovke na inštanciu (mobil).
Obmedzenia
indexed-repeat()vyžaduje platný index (1 až počet inštancií) — indexy mimo rozsahu vracajú prázdnu hodnotu.- Vnorené opakovania nad 2 úrovne sa neodporúčajú a môžu spôsobiť problémy s zobrazením na niektorých klientoch.
- Agregačné funkcie (
sum,countatď.) operujú na celej skupine opakovaní — podmnožinu inštancií nemôžete agregovať bez variantov*-if.