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 中,決策報表按鈕将報表塊的單元格值提交入庫時,由於決策報表提交的數據沒有父子關系,普通的行數據提交也會被識别成笛卡爾積,然後被限制,如下圖:
解決方案:這個是由於決策報表本身對填報的支持不好,因此不推薦這種填報方式。