Halaman ini mencakup pola lanjutan untuk bekerja dengan grup pengulangan di rtSurvey. Untuk dasar-dasar pengaturan grup pengulangan, lihat Pengelompokan dan Pengulangan.


Jumlah pengulangan dinamis

Secara default, enumerator memutuskan berapa kali harus mengulang. Anda dapat memperbaiki jumlah pengulangan menggunakan repeat_count:

typenamelabelrepeat_count
begin_repeathousehold_membersAnggota rumah tangga${num_members}
textmember_nameNama anggota
integermember_ageUsia
end_repeat

Pengulangan berjalan tepat ${num_members} kali, di mana num_members dikumpulkan sebelumnya dalam formulir. Enumerator tidak dapat menambah atau menghapus instans.


Akses terindeks: indexed-repeat()

Akses nilai bidang instans pengulangan tertentu dari luar grup pengulangan menggunakan indexed-repeat(repeatedField, repeatGroup, index):

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

Ini berguna untuk membangun bidang ringkasan atau mereferensikan data anggota “utama” setelah pengulangan.


Posisi instans saat ini: index()

Di dalam grup pengulangan, index() mengembalikan posisi berbasis 1 dari instans saat ini. Gunakan untuk memberi label setiap pengulangan atau membuat pengidentifikasi unik:

typenamelabel
begin_repeatplotsPlot
noteplot_labelPlot nomor ${index()}
textplot_idID Plot
end_repeat

Mereferensikan bidang dalam instans yang sama

Di dalam pengulangan, gunakan ${fieldname} untuk mereferensikan bidang lain dalam instans pengulangan yang sama. Tidak perlu indexed-repeat() dalam loop yang sama:

typenamelabelrelevant
begin_repeatmembersAnggota
textmember_nameNama
integermember_ageUsia
textschool_nameNama sekolah${member_age} < 18
end_repeat

Mereferensikan bidang induk dari dalam pengulangan

Bidang di luar (di atas) grup pengulangan dapat direferensikan secara normal dengan ${fieldname}:

typenamelabel
textvillageNama desa
begin_repeatplotsLahan pertanian
noteplot_contextPlot di ${village}
end_repeat

Meringkas data pengulangan

Gunakan fungsi agregat pengulangan di luar grup pengulangan untuk meringkas:

FungsiContohDeskripsi
count(group)count(${household_members})Jumlah instans
sum(field)sum(${loan_amount})Jumlah bidang numerik
min(field)min(${member_age})Nilai minimum
max(field)max(${member_age})Nilai maksimum
join(sep, field)join(', ', ${member_name})Daftar yang dipisahkan koma
count-if(group, expr)count-if(${members}, ${member_age} < 18)Jumlah kondisional
sum-if(field, expr)sum-if(${loan_amount}, ${loan_amount} > 500)Jumlah kondisional
join-if(sep, field, expr)join-if(', ', ${name}, ${age} >= 18)Gabungan kondisional

Contoh: Ringkasan rumah tangga

typenamelabelcalculation
integernum_membersBerapa banyak anggota?
begin_repeatmembersAnggota${num_members}
textmember_nameNama
integermember_ageUsia
end_repeat
calculatetotal_memberscount(${members})
calculatechildren_countcount-if(${members}, ${member_age} < 18)
calculateadult_namesjoin-if(', ', ${member_name}, ${member_age} >= 18)
notesummary${total_members} anggota; ${children_count} di bawah 18. Dewasa: ${adult_names}

Pengulangan bersarang

Grup pengulangan dapat berisi grup pengulangan lain. Gunakan ini dengan hati-hati — pengulangan bersarang menambah kompleksitas dan bisa membingungkan enumerator.

typenamelabel
begin_repeathouseholdsRumah Tangga
texthh_idID Rumah Tangga
begin_repeathh_membersAnggota
textmember_nameNama anggota
end_repeat
end_repeat

Untuk mereferensikan bidang dalam pengulangan luar dari pengulangan dalam, gunakan ${fieldname} — itu diselesaikan ke leluhur yang paling dekat cocok:

Di dalam pengulangan hh_members, ${hh_id} mengembalikan ID rumah tangga saat ini, bukan semua rumah tangga.


Peringkat dalam grup pengulangan: rank-index()

Ketika bidang rank ada di dalam pengulangan, gunakan rank-index(instanceNumber, repeatedField) dari luar untuk mendapatkan peringkat ordinal instans tertentu:

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

rank-index(1, ${score}) mengembalikan indeks instans dari skor tertinggi.


Praktik Terbaik

  1. Selalu gunakan repeat_count ketika jumlah pengulangan diketahui sebelumnya — ini mencegah enumerator secara tidak sengaja menambah atau menghapus instans.
  2. Jaga grup pengulangan tetap terfokus — pengulangan dengan 20+ pertanyaan per instans sulit dinavigasi.
  3. Beri nama grup pengulangan dengan jelas (misalnya, household_members, bukan repeat1) — nama muncul dalam panggilan fungsi dan data yang diekspor.
  4. Uji dengan jumlah instans maksimum yang diharapkan untuk memverifikasi kinerja.
  5. Gunakan appearance field-list pada grup pengulangan untuk menampilkan semua bidang di satu layar per instans (mobile).

Keterbatasan

  • indexed-repeat() memerlukan indeks yang valid (1 hingga jumlah instans) — indeks di luar rentang mengembalikan kosong.
  • Pengulangan bersarang lebih dari 2 tingkat tidak disarankan dan dapat menyebabkan masalah tampilan pada beberapa klien.
  • Fungsi agregat (sum, count, dll.) beroperasi pada seluruh grup pengulangan — Anda tidak dapat mengagregat subset instans tanpa varian *-if.
Apakah halaman ini membantu?