ODK XLSForm拼接动态变量引用触发递归超限错误求助
ODK 动态变量引用递归报错排查解决
报错根因
- 你遇到的
Dependency cycle in s; recursion limit exceeded!!报错,核心原因是ODK XForm计算引擎不支持将拼接生成的${xxx}格式字符串自动识别为合法变量引用。你拼接出的${trust1_1}仅会被当做普通文本处理,引擎检测到文本中包含${}占位符时会反复尝试解析,最终触发递归超限、依赖循环报错。 - 你注释第11行
ref2字段后依然报错,是因为第10行的计算字段本身生成了包含${}的文本,引擎解析该字段值时就会触发递归,和后续是否引用该字段没有直接关联。
可行实现方案
你要实现2×2随机变量的动态取值,不需要用拼接引用的写法,直接用以下方案即可:
方案1:条件分支取值(适配小规模变量集合)
直接在计算字段写条件判断,根据两个随机数的取值直接返回对应trustX_Y变量的值,完全规避${}拼接逻辑:
if( ${rand_no2} = 1 and ${rand_no3_1} = 1, ${trust1_1}, if( ${rand_no2} = 1 and ${rand_no3_1} = 2, ${trust1_2}, if( ${rand_no2} = 2 and ${rand_no3_1} = 1, ${trust2_1}, ${trust2_2} ) ) )
方案2:预加载数据集查询(适配大规模变量集合)
如果后续变量规模扩展,可将所有trustX_Y变量的取值存入CSV文件作为关联数据集,用rand_no2和rand_no3_1拼接成的key直接查询CSV中的对应值,不需要拼接变量引用。
原写法错误点
concat('$','{','trust',${rand_no2},'_' ,${rand_no3_1},'}')的写法只能生成普通文本,无法作为变量引用使用,不要在ODK表单的计算逻辑中拼接${}格式的字符串,会触发引擎的递归解析逻辑。
内容的提问来源于stack exchange,提问作者kemajuan
相关产品推荐
相关产品推荐

