このページでは、rtSurveyで繰り返しグループを扱うための高度なパターンをカバーします。繰り返しグループのセットアップの基本については、グループ化と繰り返しを参照してください。


動的な繰り返しカウント

デフォルトでは、調査員が繰り返し回数を決定します。repeat_countを使用して繰り返しの回数を固定できます:

typenamelabelrepeat_count
begin_repeathousehold_members世帯員${num_members}
textmember_name氏名
integermember_age年齢
end_repeat

繰り返しはちょうど${num_members}回実行されます。num_membersはフォームの前の部分で収集されます。調査員はインスタンスを追加または削除できません。


インデックスアクセス:indexed-repeat()

繰り返しグループの外から特定の繰り返しインスタンスのフィールド値にアクセスするには、indexed-repeat(repeatedField, repeatGroup, index)を使用します:

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

これはサマリーフィールドを構築したり、繰り返しの後に「主要な」メンバーのデータを参照したりするのに便利です。


現在のインスタンス位置:index()

繰り返しグループ内で、index()は現在のインスタンスの1ベースの位置を返します。各繰り返しにラベルを付けたり、一意の識別子を作成したりするために使用します:

typenamelabel
begin_repeatplots農地
noteplot_label農地番号 ${index()}
textplot_id農地ID
end_repeat

同じインスタンス内のフィールドの参照

繰り返し内では、${fieldname}を使用して同じ繰り返しインスタンス内の別のフィールドを参照します。同じループ内ではindexed-repeat()は不要です:

typenamelabelrelevant
begin_repeatmembersメンバー
textmember_name氏名
integermember_age年齢
textschool_name学校名${member_age} < 18
end_repeat

繰り返し内から親フィールドの参照

繰り返しグループの外(上)にあるフィールドは、通常の${fieldname}で参照できます:

typenamelabel
textvillage村の名前
begin_repeatplots農地
noteplot_context${village}の農地
end_repeat

繰り返しデータのサマリー

繰り返しグループので繰り返し集計関数を使用してサマリーを作成します:

関数説明
count(group)count(${household_members})インスタンスの数
sum(field)sum(${loan_amount})数値フィールドの合計
min(field)min(${member_age})最小値
max(field)max(${member_age})最大値
join(sep, field)join(', ', ${member_name})カンマ区切りリスト
count-if(group, expr)count-if(${members}, ${member_age} < 18)条件付きカウント
sum-if(field, expr)sum-if(${loan_amount}, ${loan_amount} > 500)条件付き合計
join-if(sep, field, expr)join-if(', ', ${name}, ${age} >= 18)条件付き結合

例:世帯サマリー

typenamelabelcalculation
integernum_members何人のメンバーがいますか?
begin_repeatmembersメンバー${num_members}
textmember_name氏名
integermember_age年齢
end_repeat
calculatetotal_memberscount(${members})
calculatechildren_countcount-if(${members}, ${member_age} < 18)
calculateadult_namesjoin-if(', ', ${member_name}, ${member_age} >= 18)
notesummary${total_members}人のメンバー;${children_count}人が18歳未満。大人:${adult_names}

ネストされた繰り返し

繰り返しグループには別の繰り返しグループを含めることができます。これは慎重に使用してください — ネストされた繰り返しは複雑さを増し、調査員を混乱させる可能性があります。

typenamelabel
begin_repeathouseholds世帯
texthh_id世帯ID
begin_repeathh_membersメンバー
textmember_name氏名
end_repeat
end_repeat

内側の繰り返しから外側の繰り返しのフィールドを参照するには、${fieldname}を使用します — 最も近い一致する先祖に解決されます:

hh_members繰り返し内では、${hh_id}はすべての世帯ではなく現在の世帯のIDを返します。


繰り返しグループ内のランク:rank-index()

rankフィールドが繰り返し内に存在する場合、外部から特定のインスタンスの順位ランクを取得するためにrank-index(instanceNumber, repeatedField)を使用します:

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

rank-index(1, ${score})は最高スコアのインスタンスインデックスを返します。


ベストプラクティス

  1. 繰り返し回数が事前にわかっている場合は常にrepeat_countを使用してください — これにより調査員が誤ってインスタンスを追加または削除するのを防げます。
  2. 繰り返しグループに集中してください — インスタンスごとに20以上の質問がある繰り返しはナビゲートが困難です。
  3. 繰り返しグループに明確な名前を付けてください(例:household_membersrepeat1ではなく)— 名前は関数呼び出しとエクスポートされたデータに表示されます。
  4. 予想される最大インスタンス数でパフォーマンスを確認するためにテストしてください。
  5. インスタンスごとに1つの画面にすべてのフィールドを表示するために繰り返しグループにfield-list外観を使用してください(モバイル)。

制限事項

  • indexed-repeat()は有効なインデックス(1からインスタンスのカウント)が必要です — 範囲外のインデックスは空を返します。
  • 2レベルを超えるネストされた繰り返しは推奨されず、一部のクライアントで表示の問題を引き起こす可能性があります。
  • 集計関数(sumcountなど)は繰り返しグループ全体に対して機能します — *-ifバリアントなしではインスタンスのサブセットを集計できません。
このページは役に立ちましたか?