Tato stránka pokrývá pokročilé vzory pro práci se skupinami opakování v rtSurvey. Pro základy nastavení skupiny opakování viz Seskupování a opakování.


Dynamický počet opakování

Ve výchozím nastavení enumerátor rozhoduje, kolikrát opakovat. Počet opakování lze zafixovat pomocí repeat_count:

typenamelabelrepeat_count
begin_repeathousehold_membersČlen domácnosti${num_members}
textmember_nameJméno člena
integermember_ageVěk
end_repeat

Opakování proběhne přesně ${num_members} krát, kde num_members byl sebrán dříve ve formuláři. Enumerátor nemůže přidávat ani odebírat instance.


Indexovaný přístup: indexed-repeat()

Přistupte k hodnotě pole konkrétní instance opakování zvenku skupiny opakování pomocí indexed-repeat(repeatedField, repeatGroup, index):

typenamelabelcalculation
calculatefirst_nameindexed-repeat(${member_name}, ${household_members}, 1)
calculatesecond_nameindexed-repeat(${member_name}, ${household_members}, 2)

To je užitečné pro vytváření souhrnných polí nebo odkazování na data „primárního" člena po opakování.


Aktuální pozice instance: index()

Uvnitř skupiny opakování vrací index() 1-based pozici aktuální instance. Použijte ji pro označení každého opakování nebo vytvoření jedinečných identifikátorů:

typenamelabel
begin_repeatplotsParcela
noteplot_labelČíslo parcely ${index()}
textplot_idID parcely
end_repeat

Odkazování polí ve stejné instanci

V rámci opakování použijte ${fieldname} pro odkazování na jiné pole ve stejné instanci opakování. Není třeba indexed-repeat() v rámci stejné smyčky:

typenamelabelrelevant
begin_repeatmembersČlen
textmember_nameJméno
integermember_ageVěk
textschool_nameNázev školy${member_age} < 18
end_repeat

Odkazování nadřazených polí zevnitř opakování

Pole mimo (nad) skupinu opakování lze normálně odkazovat pomocí ${fieldname}:

typenamelabel
textvillageNázev vesnice
begin_repeatplotsZemědělská parcela
noteplot_contextParcely ve ${village}
end_repeat

Sumarizace dat opakování

Použijte agregační funkce opakování mimo skupinu opakování pro sumarizaci:

FunkcePříkladPopis
count(group)count(${household_members})Počet instancí
sum(field)sum(${loan_amount})Součet číselného pole
min(field)min(${member_age})Minimální hodnota
max(field)max(${member_age})Maximální hodnota
join(sep, field)join(', ', ${member_name})Seznam oddělený čárkami
count-if(group, expr)count-if(${members}, ${member_age} < 18)Podmíněný počet
sum-if(field, expr)sum-if(${loan_amount}, ${loan_amount} > 500)Podmíněný součet
join-if(sep, field, expr)join-if(', ', ${name}, ${age} >= 18)Podmíněné spojení

Příklad: Souhrn domácnosti

typenamelabelcalculation
integernum_membersKolik členů?
begin_repeatmembersČlen${num_members}
textmember_nameJméno
integermember_ageVěk
end_repeat
calculatetotal_memberscount(${members})
calculatechildren_countcount-if(${members}, ${member_age} < 18)
calculateadult_namesjoin-if(', ', ${member_name}, ${member_age} >= 18)
notesummary${total_members} členů; ${children_count} do 18 let. Dospělí: ${adult_names}

Vnořená opakování

Skupina opakování může obsahovat další skupinu opakování. Používejte toto opatrně — vnořená opakování přidávají složitost a mohou být matoucí pro enumerátory.

typenamelabel
begin_repeathouseholdsDomácnost
texthh_idID domácnosti
begin_repeathh_membersČlen
textmember_nameJméno člena
end_repeat
end_repeat

Pro odkazování pole ve vnějším opakování zevnitř vnitřního opakování použijte ${fieldname} — překládá se na nejbližšího odpovídajícího předka:

Uvnitř opakování hh_members vrací ${hh_id} ID aktuální domácnosti, nikoli všech domácností.


Pořadí uvnitř skupin opakování: rank-index()

Když pole rank existuje uvnitř opakování, použijte rank-index(instanceNumber, repeatedField) zvenku pro získání ordinálního pořadí konkrétní instance:

typenamelabelcalculation
calculatetop_scorerrank-index(1, ${score})

rank-index(1, ${score}) vrátí index instance s nejvyšším skóre.


Osvědčené postupy

  1. Vždy používejte repeat_count, když je počet opakování předem znám — zabraňuje enumerátorům v náhodném přidávání nebo odebírání instancí.
  2. Udržujte skupiny opakování zaměřené — opakování s 20+ otázkami na instanci je obtížné navigovat.
  3. Pojmenovávejte skupiny opakování jasně (např. household_members, nikoli repeat1) — název se objevuje ve voláních funkcí a exportovaných datech.
  4. Testujte s maximálním očekávaným počtem instancí pro ověření výkonu.
  5. Používejte vzhled field-list na skupině opakování pro zobrazení všech polí na jedné obrazovce na instanci (mobil).

Omezení

  • indexed-repeat() vyžaduje platný index (1 až počet instancí) — indexy mimo rozsah vrátí prázdnou hodnotu.
  • Vnořená opakování nad 2 úrovně nejsou doporučena a mohou způsobit problémy se zobrazením na některých klientech.
  • Agregační funkce (sum, count atd.) operují na celé skupině opakování — nemůžete agregovat podmnožinu instancí bez variant *-if.
Byla tato stránka užitečná?