1. 概述
本文將介紹各類排序使用程式中遇到的問題和解決方案。
2. 排序時數值類型欄位存在空值時報錯
問題描述
若對「數值類型欄位」設定了排序,而欄位中存在空值,那麼在預覽或點選標題排序時就會出現報錯。
例如在「訂單 ID」列設定了點擊某一欄標題改變排序,其擴展後排序公式為:if($a=1,$$$,-$$$),表示根據當前列的值進行排序。如下圖所示:
此時預覽報表,點選「訂單 ID」標題,出現報錯如下圖所示:
解決方案
在排序公式中對空值指派後參與排序。
將公式寫為:if($a=1,if(len($$$)=0,min(ds1.select(訂單ID))-1,$$$),if(len($$$)=0,-(min(ds1.select(訂單ID))-1),-$$$)) 。即當欄位為空時,給其指派為(訂單 ID最小值-1),參與排序。
公式說明如下表:
公式 | 說明 |
---|---|
len($$$)=0 | 當前儲存格值為空 |
min(ds1.select(訂單ID))-1 | 獲取資料集 ds1 中「訂單ID」(排序欄位)的(最小值-1) |
-(min(ds1.select(訂單ID))-1) | 獲取資料集 ds1 中「訂單ID」(排序欄位)的 -(最小值-1) |
注:資料集函式使用方法參考資料集函式。
修改公式後,點選預覽報表,效果如下圖所示:
範本下載
已完成範本可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\數值類型欄位排序有空值.cpt
點選下載範本:數值型別欄位排序有空值.cpt
3. 非純數字橫向擴展列亂序排列
問題描述
製作一張月報表時,期望將「月份」資料欄拖入儲存格使用橫向擴展得出,但如果遇到 1月、2月 這種非純數位的擴展表頭時,使用原值排序就會導致錯亂。如下圖所示:
解決方案
使用公式 INT(REPLACE($$$,'月','')) 將「月」更換為空字串,再將字串轉換為 INT 類型。
設定完成後,儲存格的字串值就被轉換成了整數型態資料,再排序的話就會按照設定的升冪或降冪排序了,如下圖所示:
範本下載
已完成範本可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\非純數字擴展列亂序排列的解決方案.cpt
點選下載範本:非純數字擴展欄亂序排列的解決方案.cpt
4. 排序資料中含有字串
問題描述
使用者的資料庫表預先對資料進行了處理,當有空資料時,欄位值為--;但出現了異常現象:含有字串的待排序資料,進行擴展後排序時,升冪時,--於零和負數上方;降冪時,--位於零和負數之間。
如下圖所示:
解決方案
建議先在 SQL 中對字串值進行處理,可選擇置 0 。
5. 範本資料量大造成點選排序時頁面卡頓
問題描述
參考點選 點擊某一欄標題改變排序 進行排序時,每次點選排序都需要進行頁面重新整理,若頁面資料量較大,則每次重新整理所需時間較長。
解決方案
思路:用 JS 實現不重新整理頁面進行排序功能。
若無凍結行,則可參考:JS實現不重新整理頁面進行排序功能
6. 對中文內容按照拼音排序
問題描述
對中文進行排序時,預設是按照 ASCII 碼值進行排序,使用者希望按照中文的拼音先後順序。
解決方案
需先使用 StringPinyin 函式(函式集合插件)將中文轉換成拼音,再利用擴展後排序實現。
7. 報表預覽報錯 Comparison method violates its general contract!
問題描述
使用者報表報錯Comparison method violates its general contract!,無法預覽。
問題原因
資料量過大+設定了擴展後排序導致的。
解決方案
儲存格擴展排序,資料量大會引起排序邏輯衝突的問題,會出現報錯:Comparison method violates its general contract!,建議使用進階排序。
如果資料做了匯總,沒辦法直接改成進階排序,建議把匯總放在 SQL 裏面處理,然後排序再換成進階排序。
8. 圖表分類排序
問題描述
儲存格和資料源中資料已排序,而圖表分類坐標軸資料排布亂序。
原因分析
初步定位為圖表分類坐標軸製圖時為了避免中間存在斷點,所以對優先排布系列中均存在的分類,而後排布部分序列中不存在的分類。
解決方案
將每個系列中的分類補全。
9. MySQL 中文排序無效
解決方案
如果 MySQL 資料庫無法實現按中文拼音首字母排序,需要看一下表欄位是否使用的是 UTF-8 編碼,如果使用的是 UTF-8 編碼,則需要使用 MySQL 的 convert 方法轉換成 GBK 編碼進行排序。且前提是 MySQL 安裝了 GBK 字元集,不然會報錯。
SQL 語句如下:
升冪:SELECT * FROM 銷量 order by convert(英文簡稱 using gbk)
降冪:SELECT * FROM 銷量 order by convert(英文簡稱 using gbk) desc