Ta strona opisuje zaawansowane wzorce pracy z grupami powtórzeń w rtSurvey. Podstawy konfigurowania grup powtórzeń znajdziesz w Grupowanie i powtórzenia.


Dynamiczna liczba powtórzeń

Domyślnie ankieter decyduje o liczbie powtórzeń. Możesz ustalić liczbę powtórzeń za pomocą repeat_count:

typenamelabelrepeat_count
begin_repeathousehold_membersCzłonek gospodarstwa${num_members}
textmember_nameImię członka
integermember_ageWiek
end_repeat

Powtórzenie uruchamia się dokładnie ${num_members} razy, gdzie num_members zostało zebrane wcześniej w formularzu. Ankieter nie może dodawać ani usuwać instancji.


Dostęp indeksowany: indexed-repeat()

Uzyskaj dostęp do wartości pola konkretnej instancji powtórzenia spoza grupy powtórzeń za pomocą indexed-repeat(repeatedField, repeatGroup, index):

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

Jest to przydatne do budowania pól podsumowań lub odwoływania się do danych „głównego" członka po powtórzeniu.


Bieżąca pozycja instancji: index()

Wewnątrz grupy powtórzeń index() zwraca 1-opartą pozycję bieżącej instancji. Użyj go do etykietowania każdego powtórzenia lub tworzenia unikalnych identyfikatorów:

typenamelabel
begin_repeatplotsDziałka
noteplot_labelDziałka numer ${index()}
textplot_idID działki
end_repeat

Odwoływanie się do pól w tej samej instancji

Wewnątrz powtórzenia użyj ${fieldname}, aby odwołać się do innego pola w tej samej instancji powtórzenia. Nie ma potrzeby używania indexed-repeat() w obrębie tej samej pętli:

typenamelabelrelevant
begin_repeatmembersCzłonek
textmember_nameImię
integermember_ageWiek
textschool_nameNazwa szkoły${member_age} < 18
end_repeat

Odwoływanie się do pól nadrzędnych z wewnątrz powtórzenia

Do pól spoza (powyżej) grupy powtórzeń można normalnie odwoływać się za pomocą ${fieldname}:

typenamelabel
textvillageNazwa wsi
begin_repeatplotsDziałka rolna
noteplot_contextDziałki w ${village}
end_repeat

Podsumowywanie danych z powtórzeń

Użyj funkcji agregujących powtórzeń poza grupą powtórzeń do podsumowania:

FunkcjaPrzykładOpis
count(group)count(${household_members})Liczba instancji
sum(field)sum(${loan_amount})Suma pola numerycznego
min(field)min(${member_age})Wartość minimalna
max(field)max(${member_age})Wartość maksymalna
join(sep, field)join(', ', ${member_name})Lista rozdzielona przecinkami
count-if(group, expr)count-if(${members}, ${member_age} < 18)Liczenie warunkowe
sum-if(field, expr)sum-if(${loan_amount}, ${loan_amount} > 500)Sumowanie warunkowe
join-if(sep, field, expr)join-if(', ', ${name}, ${age} >= 18)Łączenie warunkowe

Przykład: Podsumowanie gospodarstwa domowego

typenamelabelcalculation
integernum_membersIle osób?
begin_repeatmembersCzłonek${num_members}
textmember_nameImię
integermember_ageWiek
end_repeat
calculatetotal_memberscount(${members})
calculatechildren_countcount-if(${members}, ${member_age} < 18)
calculateadult_namesjoin-if(', ', ${member_name}, ${member_age} >= 18)
notesummary${total_members} członków; ${children_count} poniżej 18 lat. Dorośli: ${adult_names}

Zagnieżdżone powtórzenia

Grupa powtórzeń może zawierać inną grupę powtórzeń. Używaj tego ostrożnie — zagnieżdżone powtórzenia dodają złożoności i mogą być mylące dla ankieterów.

typenamelabel
begin_repeathouseholdsGospodarstwo
texthh_idID gospodarstwa
begin_repeathh_membersCzłonek
textmember_nameImię członka
end_repeat
end_repeat

Aby odwołać się do pola w zewnętrznym powtórzeniu z wewnętrznego, użyj ${fieldname} — rozwiązuje się do najbliższego pasującego przodka:

Wewnątrz powtórzenia hh_members, ${hh_id} zwraca ID bieżącego gospodarstwa, a nie wszystkich gospodarstw.


Rank wewnątrz grup powtórzeń: rank-index()

Gdy pole rank istnieje wewnątrz powtórzenia, użyj rank-index(instanceNumber, repeatedField) spoza, aby uzyskać pozycję rankingową określonej instancji:

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

rank-index(1, ${score}) zwraca indeks instancji z najwyższym wynikiem.


Najlepsze praktyki

  1. Zawsze używaj repeat_count, gdy liczba powtórzeń jest z góry znana — zapobiega to przypadkowemu dodawaniu lub usuwaniu instancji przez ankieterów.
  2. Utrzymuj grupy powtórzeń skupione — powtórzenie z ponad 20 pytaniami na instancję jest trudne do nawigacji.
  3. Nazwy grup powtórzeń powinny być jasne (np. household_members, a nie repeat1) — nazwa pojawia się w wywołaniach funkcji i wyeksportowanych danych.
  4. Testuj z maksymalną oczekiwaną liczbą instancji, aby zweryfikować wydajność.
  5. Używaj wyglądu field-list na grupie powtórzeń, aby pokazywać wszystkie pola na jednym ekranie na instancję (mobilne).

Ograniczenia

  • indexed-repeat() wymaga prawidłowego indeksu (od 1 do liczby instancji) — indeksy poza zakresem zwracają puste.
  • Zagnieżdżone powtórzenia powyżej 2 poziomów nie są zalecane i mogą powodować problemy z wyświetlaniem w niektórych klientach.
  • Funkcje agregujące (sum, count itp.) operują na całej grupie powtórzeń — nie można agregować podzbioru instancji bez wariantów *-if.
Czy ta strona była pomocna?