1. 概述
如果笛卡爾積計算結果偏大可能會導致當機,故 10.0 新增了笛卡爾積限制,不允許提交擁有多個陣列的一列。如果提交的一列中包括兩個及以上數目的陣列類型的資料會檢查為產生了笛卡爾積進而阻止資料提交併且提交失敗。
1)普通報表 cpt 中,當存在笛卡爾積時,點選提交會提示“存在笛卡爾積”,如下圖:
注:建議更新最新版jar包,當出現笛卡爾積時會有相關定位提示。
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 中,決策報表按鈕將報表塊的儲存格值提交入庫時,由於決策報表提交的資料沒有父子關係,普通的列資料提交也會被識別成笛卡爾積,然後被限制,如下圖:
解決方案:這個是由於決策報表本身對填報的支援不好,因此不推薦這種填報方式。