Форма XLSForm позволяет многократно повторять несколько вопросов. Ниже приведены примеры использования повторов:
- Получение нескольких ответов на один и тот же вопрос в одном опросе.
- Получение отдельных, небольших наборов записей, например, имени, возраста и пола всех жителей дома.
- Получение нескольких вопросов типа Карта в одном опросе.
При публикации опроса с повторами каждый повтор создается как связанная таблица в вашем векторном слое, или как связанный слой, если повтор содержит геоточку, геотрассировку или геоформу.
Использование повторов
Чтобы повторить вопросы в Survey123 для получения нескольких ответов, выполните следующие действия в своей таблице на вкладке survey:
- В строке, с которой вы желаете начать повтор, введите begin repeat в столбце type.
- Введите имя для повтора в столбце name.
- В строках, располагающихся ниже, укажите вопросы, которые вы хотите включить в повтор.
- Сразу после указания вопросов введите end repeat в столбце type.
Это создает в вашем опросе группу вопросов, которые могут быть многократно добавлены к результатам опроса. По умолчанию число повторов вопросов не ограничено.
Местоположения точек из первого в повторе вопроса геоточка можно показать на любой карте в опросе. Более подробно см. Точечные наложения на картах.
Ограничение числа повторяющихся записей
Для ограничения числа повторов в Survey123 задайте счетчик повторов, как показано в следующих действиях:
- В строке, с которой вы желаете начать повтор, введите begin repeat в столбце type на вкладке survey.
- Укажите числовое значение количества повторов в столбце repeat_count. Вы также можете указать название вопроса или вычисление, возвращающее числовое значение.
- Введите имя для повтора в столбце name.
- В строках, располагающихся ниже, укажите вопросы, которые вы хотите включить в повтор.
- В последней строке введите begin repeat в столбце type.
Когда пользователь открывает опрос, количество повторов, заданных в столбце repeat_count, уже будет создано. Пользователи не могут создавать или удалять повторы.
Пользователь должен просмотреть все повторы, заданные значением repeat_count, перед отправкой ответа опроса, иначе будут отправлены не все записи. Чтобы убедиться, что все повторы заполнены, можно сделать вопрос в повторе обязательным. Однако имейте в виду, что вопросы в повторах, имеющие соответствующее или условно-зависимое выражение, не будут оцениваться при отправке.
Примечание:
Поведение повтора с изменяющимся числом повторов может быть различным, в зависимости от того, создает ли пользователь ответ опроса или редактирует уже данный ранее.
При создании ответа на счетчике повторов для сокращаемого повтора сверху повтора появляется кнопка удаления всех записей свыше нового числа повторов, содержащих данные. Пустые записи будут автоматически удалены. Независимо от того, нажата ли эта кнопка, отправка ответа опроса не отправляет записи, превышающие новое число повторов.
При редактировании существующего ответа опроса на счетчике повторов для сокращаемого повтора сверху отображается сообщение, предупреждающее о том, что изменилось число повторов. Пользователь не сможет отправить редактируемый ответ с меньшим, чем исходный, числом записей. Добавлять новые записи повторов можно только если для параметра allowAdds задано значение true в столбце bind::esri:parameters. Если allowAdds задано как false, пользователь не сможет вводить число записей повторов, превышающее исходное.
Функции агрегирования
Вы можете использовать функции агрегирования для возврата значений, полученных из ответов на вопросы в повторах. Чтобы это сделать, вопрос вне повтора должен ссылаться на вопрос внутри повтора. Например, следующая формула рассчитывает количество ответов на один вопрос внутри повторов:
count(${repeated_question})
Вы можете использовать следующие функции для агрегирования ответов:
- count
- sum
- min
- max
- join
Эти функции применяются только к ответу текущего опроса. Они не берут в расчет другие записи в векторном слое. Также можно включить вопросы, которые используют sum и count. Однако поскольку значения sum и count будут вычисляться для каждой новой записи, добавленной в повтор, вычисления для предыдущих записей в повторе автоматически обновляться не будут. Эти вычисления можно обновить вручную с помощью кнопки Обновить рядом с вопросом. Использование функций min и max в повторах не поддерживается.
Примечание:
При работе в полевом приложении Survey123, sum и count могут быть расположены внутри или снаружи повтора. Если sum и count используются в веб-приложении Survey123, они должны быть расположены снаружи повтора. Значение sum или count, расположенное снаружи повтора, может учитываться в вычислении внутри повтора.
Функция join может использоваться для связывания вопросов, которые возвращают строку. Функцию sum также можно использовать для соединения вопросов типа геоточка внутри повтора вопроса геотрассировка или геоформа за пределами повтора.
Дополнительные сведения об использовании этих функций см. в разделе Формулы.
Возврат индекса записи повтора
Функция position(..) может использоваться для возврата целого числа, отражающего индекс записи в повторе. Например, первая запись в повторе возвратит 1, вторая - 2 и так далее. В следующем примере функция position(..) используется в скрытом целочисленном вопросе в повторе:
Внимание:
Функция position(..) всегда возвращает 0 в полевом приложении Survey123 или 1 в веб-приложении Survey123 при использовании вне повтора или внутри группы, находящейся внутри повтора.
Вы также можете использовать функцию position(..) в выражении. В следующем примере функция selected-at() использует position(..) для возврата варианта, выбранного в вопросе select_multiple в том же положении, что и текущая запись повтора, и отображения варианта выбора в повторе в виде примечания. Функция selected-at() начинает отсчет вариантов с нуля, поэтому один вычитается из position(..), чтобы обеспечить совпадение индексов.
selected-at(${issues}, position(..)-1)
Вы можете использовать функцию position(..) в сочетании с indexed-repeat() для извлечения значений вопросов из определенных записей повторов.
Использование значений из индексированных повторов
Вы можете использовать функцию indexed-repeat() для возврата значения из определенного вопроса в записи повтора. Для этого необходимо имя вопроса, имя повтора и индексный номер повтора, в указанном порядке. В следующем примере возвращается ответ на вопрос room_no для третьей записи в повторе floor:
indexed-repeat(${room_no}, ${floor}, 3)
Вы можете использовать функцию indexed-repeat() для повторов внутри повторов. При таком использовании она будет получать только значения, доступные из видимого в данный момент родительского повтора.
Внимание:
Функцию indexed-repeat() невозможно использовать внутри повтора на который она ссылается, так как это приведет к циклической ссылке. Например, следующее выражение нельзя использовать для вычисления повтора, названного defects:
indexed-repeat(${defect_type}, ${defects}, 3)
Известные ограничения
При использовании повторов в Survey123 имеются некоторые известные ограничения и неожиданное поведение:
- Если ваш опрос содержит пустой повтор, без ответов между begin repeat и end repeat, все ответы на вопрос не будут отправлены
- Если опрос содержит несколько повторов, и один из них содержит вопрос geopoint, geotrace или geoshape, то часто имена отношений публикуются не по порядку.
- Вложенные повторы поддерживают только отношение один ко многим, и у каждого дочернего объекта может быть только один родительский.
- Вложенные повторы с выражением в столбце relevant и выражением в столбце repeat_count удалят все существующие сохраненные данные в первой записи повтора. Чтобы избежать этого, включите релевантное выражение в выражение repeat_count, чтобы не создавать повторные записи, если повторение нерелевантно.