На этой странице рассматриваются расширенные шаблоны работы с группами повторений в 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_idID участка
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_idID домохозяйства
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_members, а не repeat1) — имя появляется в вызовах функций и экспортированных данных.
  4. Тестируйте с максимально ожидаемым количеством экземпляров для проверки производительности.
  5. Используйте внешний вид field-list для группы повторений, чтобы показывать все поля на одном экране на экземпляр (мобильные).

Ограничения

  • indexed-repeat() требует допустимого индекса (от 1 до количества экземпляров) — выход за пределы возвращает пустое значение.
  • Вложенные повторения глубже 2 уровней не рекомендуются и могут вызывать проблемы отображения в некоторых клиентах.
  • Агрегирующие функции (sum, count и т.д.) работают со всей группой повторений — нельзя агрегировать подмножество экземпляров без вариантов *-if.
Была ли эта страница полезной?