Questa pagina copre i pattern avanzati per lavorare con i gruppi di ripetizione in rtSurvey. Per le nozioni di base sulla configurazione di un gruppo di ripetizione, vedi Raggruppamento e ripetizioni.


Conteggio dinamico delle ripetizioni

Per impostazione predefinita, l’intervistatore decide quante volte ripetere. Puoi fissare il numero di ripetizioni usando repeat_count:

typenamelabelrepeat_count
begin_repeathousehold_membersMembro del nucleo familiare${num_members}
textmember_nameNome del membro
integermember_ageEtà
end_repeat

La ripetizione viene eseguita esattamente ${num_members} volte, dove num_members è stato raccolto in precedenza nel modulo. L’intervistatore non può aggiungere o rimuovere istanze.


Accesso indicizzato: indexed-repeat()

Accedi al valore di un campo di un’istanza di ripetizione specifica dall’esterno del gruppo di ripetizione usando indexed-repeat(repeatedField, repeatGroup, index):

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

Questo è utile per costruire campi di riepilogo o fare riferimento ai dati del membro “primario” dopo la ripetizione.


Posizione dell’istanza corrente: index()

All’interno di un gruppo di ripetizione, index() restituisce la posizione basata su 1 dell’istanza corrente. Usala per etichettare ogni ripetizione o creare identificatori univoci:

typenamelabel
begin_repeatplotsAppezzamento
noteplot_labelAppezzamento numero ${index()}
textplot_idID appezzamento
end_repeat

Riferimento ai campi nella stessa istanza

All’interno di una ripetizione, usa ${fieldname} per fare riferimento a un altro campo nella stessa istanza di ripetizione. Non è necessario indexed-repeat() all’interno dello stesso ciclo:

typenamelabelrelevant
begin_repeatmembersMembro
textmember_nameNome
integermember_ageEtà
textschool_nameNome della scuola${member_age} < 18
end_repeat

Riferimento ai campi padre dall’interno di una ripetizione

I campi fuori (sopra) del gruppo di ripetizione possono essere referenziati normalmente con ${fieldname}:

typenamelabel
textvillageNome del villaggio
begin_repeatplotsAppezzamento agricolo
noteplot_contextAppezzamenti in ${village}
end_repeat

Riepilogo dei dati di ripetizione

Usa le funzioni aggregate di ripetizione fuori dal gruppo di ripetizione per riassumere:

FunzioneEsempioDescrizione
count(group)count(${household_members})Numero di istanze
sum(field)sum(${loan_amount})Somma di un campo numerico
min(field)min(${member_age})Valore minimo
max(field)max(${member_age})Valore massimo
join(sep, field)join(', ', ${member_name})Elenco separato da virgole
count-if(group, expr)count-if(${members}, ${member_age} < 18)Conteggio condizionale
sum-if(field, expr)sum-if(${loan_amount}, ${loan_amount} > 500)Somma condizionale
join-if(sep, field, expr)join-if(', ', ${name}, ${age} >= 18)Unione condizionale

Esempio: Riepilogo del nucleo familiare

typenamelabelcalculation
integernum_membersQuanti membri?
begin_repeatmembersMembro${num_members}
textmember_nameNome
integermember_ageEtà
end_repeat
calculatetotal_memberscount(${members})
calculatechildren_countcount-if(${members}, ${member_age} < 18)
calculateadult_namesjoin-if(', ', ${member_name}, ${member_age} >= 18)
notesummary${total_members} membri; ${children_count} sotto i 18 anni. Adulti: ${adult_names}

Ripetizioni annidate

Un gruppo di ripetizione può contenere un altro gruppo di ripetizione. Usalo con attenzione — le ripetizioni annidate aggiungono complessità e possono confondere gli intervistatori.

typenamelabel
begin_repeathouseholdsNucleo familiare
texthh_idID nucleo familiare
begin_repeathh_membersMembro
textmember_nameNome del membro
end_repeat
end_repeat

Per fare riferimento a un campo in una ripetizione esterna dall’interno di quella interna, usa ${fieldname} — si risolve all’antenato corrispondente più vicino:

All’interno della ripetizione hh_members, ${hh_id} restituisce l’ID del nucleo familiare corrente, non di tutti i nuclei familiari.


Rank all’interno dei gruppi di ripetizione: rank-index()

Quando un campo rank esiste all’interno di una ripetizione, usa rank-index(instanceNumber, repeatedField) dall’esterno per ottenere il rank ordinale di un’istanza specifica:

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

rank-index(1, ${score}) restituisce l’indice di istanza del punteggio più alto.


Best practice

  1. Usa sempre repeat_count quando il numero di ripetizioni è noto in anticipo — impedisce agli intervistatori di aggiungere o rimuovere accidentalmente istanze.
  2. Mantieni i gruppi di ripetizione focalizzati — una ripetizione con più di 20 domande per istanza è difficile da navigare.
  3. Nomina chiaramente i gruppi di ripetizione (es. household_members, non repeat1) — il nome appare nelle chiamate di funzione e nei dati esportati.
  4. Testa con il numero massimo atteso di istanze per verificare le prestazioni.
  5. Usa l’appearance field-list sul gruppo di ripetizione per mostrare tutti i campi su un’unica schermata per istanza (mobile).

Limitazioni

  • indexed-repeat() richiede un indice valido (da 1 al conteggio delle istanze) — gli indici fuori range restituiscono vuoto.
  • Le ripetizioni annidate oltre 2 livelli non sono raccomandate e possono causare problemi di visualizzazione su alcuni client.
  • Le funzioni aggregate (sum, count, ecc.) operano sull’intero gruppo di ripetizione — non puoi aggregare un sottoinsieme di istanze senza le varianti *-if.
Questa pagina è stata utile?