重复

XLSForm 可多次重复一组问题。 以下是重复使用方法的部分示例:

  • 在一个调查中捕获同一问题的多个答案。
  • 捕获单独的、较小的记录集合,例如家庭中各个成员的姓名、年龄和性别。
  • 在一个调查中捕获多个地图问题。
重复向单个问题提供多个响应

当发布包含重复的调查时,每个重复将在要素图层中被创建为相关表,如果重复包含地理点、geotrace 或 geoshape 问题,则将被创建为相关图层。

使用重复

要在 Survey123 中重复一组问题以捕获多个响应,请在电子表格的调查选项卡中完成以下步骤:

  1. 在您希望开始重复的行的 type 列中,输入 begin repeat
  2. name 列中,提供重复的名称。
  3. 在此条目下的行中,输入要包括在重复中的问题。
  4. 输入问题之后,立即在类型列中输入 end repeat

调查中将创建一组问题,您可以将这组问题重复添加到调查结果中。 默认情况下,对于可重复问题的次数没有限制。

可以在调查的任意地图上显示重复中第一个地理点问题中的点位置。 有关详细信息,请参阅地图上的点叠加

限制重复记录的数量

要定义 Survey123 中的重复次数,按照以下步骤设置重复计数:

  1. 调查选项卡中您希望开始重复的行的 type 列中,输入 begin repeat
  2. repeat_count 列中,提供重复数的数值。 您还可以提供问题名称或返回数值的计算。
  3. name 列中,提供重复的名称。
  4. 在此条目下的行中,输入要包括在重复中的问题。
  5. 类型列的最后一行中,输入 end repeat

当用户打开调查时,repeat_count 列中设置的重复数已经创建完成。 用户无法创建或删除重复。

在提交调查响应之前,用户必须导航由 repeat_count 值定义的所有重复;否则,系统将不会提交全部重复记录。 为确保提交所有重复,您可以将重复中的问题设置为必填。 但请注意,提交时系统不会评估重复中应用了相关语句或根据条件必填语句的问题。

注:

具有变化重复计数的重复行为有所不同,具体取决于用户是创建调查响应还是编辑之前提交的调查响应。

创建调查响应时,待减少重复的重复计数将在重复顶部具有一个按钮,用于删除超过新重复计数的所有包含数据的记录;将自动删除空白记录。 无论是否按下此按钮,提交调查响应都不会发送超过新重复计数的记录。

编辑现有调查响应时,待减少重复的重复计数会在重复顶部显示一条消息,警告重复记录数量已更改。 用户无法提交数量少于原始重复记录数的已编辑响应。 仅当在 bind::esri:parameters 列中将 allowAdds 设置为 true 时,才接受其他新的重复记录。 如果 allowAdds 设置为 false,则用户无法输入超过原始重复记录数的数量。

聚合函数

可以使用聚合函数以返回从跨重复的响应中派生出的值。 为此,重复中的问题可由重复外的问题引用。 例如,以下公式将对跨重复的单个问题的响应进行计数:

count(${repeated_question})

可以使用以下函数来聚合响应:

  • count
  • sum
  • min
  • max
  • join

这些函数仅适用于当前的调查响应。 它们不考虑要素图层中的其他记录。 您也可以在重复内包含使用 sumcount 的问题。 但是,虽然将为添加到重复中的每个新记录计算 sumcount 值,但重复中先前条目的计算将不会自动更新。 可以使用问题旁的刷新按钮来手动刷新这些计算。 仅支持在重复之外使用 minmax

注:

Survey123 外业应用程序中使用时,可将 sumcountjoin 函数置于重复的内部或外部。 如果要在 Survey123 web 应用程序中使用 sumcountjoin,必须将其放置在重复的外部。 可以在重复内部的计算中引用来自重复外部的 sumcountjoin 值。

可以使用 join 函数来串联返回字符串的问题。 您还可以使用 sum 函数来连接重复内的地理点问题作为重复外的 geotrace 或 geoshape 问题。

有关如何使用这些函数的信息,请参阅公式

返回重复记录的索引

可以使用 position(..) 函数返回整数,以反映重复中的重复记录索引。 例如,重复记录中的第一个记录将返回 1,第二个记录将返回 2,依此类推。 在以下示例中,position(..) 函数用于重复中的隐藏整型问题:

XLSForm 中的 position(..) 函数的示例
警告:

当在重复之外或在重复内的组内使用时,position(..) 函数将始终在 Survey123 外业应用程序中返回 0 或在 Survey123 Web 应用程序中返回 1。

您也可以在表达式中使用 position(..) 函数。 在以下示例中,selected-at() 函数使用 position(..) 返回在 select_multiple 问题中选择的与当前重复记录位于相同位置的选项,并在重复中将该选项显示为备注。 selected-at() 函数从零开始对选项进行计数,因此从 position(..) 中减去 1 以确保索引匹配。

selected-at(${issues}, position(..)-1)

XLSForm 中的 position(..) 和 selected-at() 函数的示例

可以将 position(..) 函数与 indexed-repeat() 结合使用以从特定重复记录中提取问题值。

使用索引重复中的值

可以使用 indexed-repeat() 函数以返回重复记录中的特定问题中的值。 这需要按该顺序输入问题名称、重复名称和重复的索引号。 对于重复 floor 中的第三个记录,以下示例将返回问题 room_no 的答案:

indexed-repeat(${room_no}, ${floor}, 3)

对于重复内的重复,可以使用 indexed-repeat() 函数。 以这种方式使用时,它将仅接收可从当前可见的父重复访问的值。

警告:

indexed-repeat() 函数不能用于其引用的重复,因为会导致循环引用。 例如,以下表达式不能用于名为 defects 的重复内的计算:

indexed-repeat(${defect_type}, ${defects}, 3)

已知局限性

Survey123 中使用重复时,存在以下已知局限性和意外行为:

  • 如果您的调查中包含没有问题的重复,且 begin repeatend repeat 之间不存在问题,则所有调查响应都将无法提交。
  • 如果您的调查包含多个重复,并且其中一个具有地理点、geotrace 或 geoshape 问题,则系统可能不按顺序发布关系命名。
  • 嵌套重复仅支持一对多的关系,而且每个子项只能有一个父项。
  • relevant 列和 repeat_count 列中均包含一个表达式的嵌套重复将清除第一条重复记录中已保存的所有现有数据。 为避免这种情况,请将相关表达式合并到 repeat_count 表达式中,以便在重复不相关时不创建重复记录。