1. 概述
如果笛卡尔积计算结果偏大可能会导致宕机,故 10.0 添加了笛卡尔积限制,不允许提交拥有多个数组的一行。如果提交的一行中包括两个及以上数目的数组类型的数据会检测为产生了笛卡尔积从而阻止数据提交并且提交失败。
注:此项限制始终存在无法关闭。
1)普通报表 cpt 中,当存在笛卡尔积时,点击提交提示“为防止填报笛卡尔积数据提交失败”,如下图:
2)决策报表 frm 中,当存在笛卡尔积,点击按钮进行提交界面没有反馈,可以在日志里查看,如下图:
也可以通过浏览器定位问题,打开开发者工具查看,如下图:
2. 报表产生笛卡尔积的原因
2.1 数据的过滤关系丢失
1)父子格关系丢失后,会造成两个格子之间失去过滤关系,原本的父格不再作为当前格的过滤条件,导致当前格数据为数据集字段的所有值进行扩展,原本父子格一对一关系变成了一对多。
2)跟随关系的丢失或者混乱,会导致子格扩展时出现无法扩展或者同时向多个方向扩展,这样也会造成笛卡尔积。
2.2 模板中出现了不必要的数组
1)使用 数组函数 对数据进行了分组;
2)下拉复选框返回值类型为数组。
3)决策报表中表单的值被保存为List;
3. 场景分析
正常情况下一个填报报表应该是这样:
此时父子格关系都是默认,格子均向下扩展,右边的格子都以左边格子为父格,目前发现以下四种场景会导致笛卡尔积:
3.1 换行导致丢失过滤关系
所谓换行指的是,当一个数据集字段比较多的时候,我们为了显示美观和操作方便,将原本在数据关系上为一行的字段拆分成多行,如下图:
这样会导致笛卡尔积,因为第二行第一个格子的过滤条件丢失,这样提交的时候会出现 n*n(销售员的个数*销量的个数)。
解决方案:将第二行产品类型的父格设置为B2,那么就不会出现笛卡尔积。
3.2 空列扩展导致丢失过滤关系
当一个单元格的内容为空,但是设置了扩展,也会导致 D2 的父格直接变成 C2,失去了原本 D2 和 B2 的过滤关系,如下图:
C 列出现了一个空格,但是设置了向下扩展,这样会导致后面的格子失去过滤条件,这样提交的时候也会出现 n*n(销售员的个数*销量的个数)造成笛卡尔积。
解决方案:将 D2 的左父格设置为 B2 ,那么就不会出现笛卡尔积。
3.3 横向扩展导致过滤跟随关系混乱
这里的横向扩展是一种特殊的情况,当我们在某个字段上方某个格子加上横向扩展的格子,会导致下方过滤条件和跟随关系混乱导致笛卡尔积,如下图:
这种情况一般不会出现,但是有些列隐藏的时候,就要考虑这一点了。
解决方案:设置正确的过滤和父子格关系。
3.4 数组函数
使用数组函数对数据进行了分组,这样提交的时候也会出现 n*n 导致笛卡尔积,例如 array 数组函数,如下图所示:
解决方案:使用 JOINARRAY 函数将数组以字符串方式输出
3.5 下拉复选框返回值类型为数组
当下拉复选框的返回值类型设置为数组时,这样提交的时候也会出现n*n导致笛卡尔积,如下图:
解决方案:将返回值类型修改为字符串
3.6 决策报表中表单的值被保存为 List
决策报表 frm 中,决策报表按钮将报表块的单元格值提交入库时,由于决策报表提交的数据没有父子关系,普通的行数据提交也会被识别成笛卡尔积,然后被限制,如下图:
解决方案:这个是由于决策报表本身对填报的支持不好,因此不推荐这种填报方式。