1. 概述
注:本文方法建議 11.0.3 之前版本參考,11.0.3 及之後版本,建議參考 擴展後排序
1.1 預期效果
設計報表時,希望有多個列可以實現點選變換升冪降冪的功能。即點選第一欄,則根據第一欄升冪或降冪排列;點選第二列,則根據第二列升冪或降冪排列。預期效果如下圖所示:
1.2 實現思路
來實現,即點選資料列標題時,將該資料列所在儲存格作為參數傳遞過去,在擴展後排序公式中接收該參數,根據參數的不同,實現不同的排序。
注1:當有字串類型欄位需要一起排序時,擴展後排序的公式會有所不同。文檔用兩個範例分別進行講解。
注2:在FVS視覺化看板中可使用「當前頁面物件」、決策報表中請使用「當前決策報表物件」超級連結。
注3:當資料過多分頁時,或者在決策報表 Tab 塊中多 Tab 頁使用動態排序時,因為動態參數會重新整理整個頁面,在其他頁點選排序會重新整理跳轉回第一個頁面。
2. 範例一
2.1 資料準備
建立資料集 ds1 ,新增 SQL 查詢語句:SELECT EMPID,EMPNAME,BIRTHDATE,HEIGHT FROM EMPLOYEE limit 10。
2.2 報表設計
將 EMPID , EMPNAME , BIRTHDATE , HEIGHT 欄位分別拖到 A3~D3 儲存格,輸入對應標題,表格樣式如下圖所示:
2.3 新增超級連結動態參數
分別選中 A2、C2、D2 儲存格,選擇右側「超級連結」,新增「動態參數」,各儲存格參數設定如下表:
注:本範例方法中,字串類型的資料無法實現排序。
儲存格 | 參數 | 值類型 | 值 | 說明 |
---|---|---|---|---|
A2 | a | 公式 | if($a==-1,1,-1) | 參數 a 表示點選一次超級連結就更換一次 a 的值,1 代表升冪,-1 代表降冪 參數 asc 表示要排序的儲存格,日期時間類型的資料需要特殊設定 |
asc | 字串 | A3 | ||
C2 | a | 公式 | if($a==1,-1,1) | |
asc | 字串 | tointeger(format(C3,'yyyyMMddHHmmss')) 注:若時間類型僅包含年月日,則參數為:tointeger(replace(C3,"-","")) | ||
D2 | a | 公式 | if($a==1,-1,1) | |
asc | 字串 | D3 |
步驟如下圖所示:
2.4 設定擴展後排序
選中 A3 儲存格,在「儲存格屬性>擴展屬性」中選擇if($a==1,eval($asc),eval($asc)*-1)。
,選中 ,輸入公式公式說明如下表:
公式 | 說明 |
---|---|
eval(exp) | 傳回運算式 exp 計算後的結果。exp :一個運算式形式字串 |
$asc | 傳回參數 $asc 的值 |
if($a==1,eval($asc),eval($asc)*-1) | 如果參數 a 為 1,則根據 asc 的值升冪排序,否則根據 asc 的值降冪排序 |
步驟如下圖所示:
注:後面儲存格是跟隨第一欄擴展的,只有在頂級的左父格設定「擴展後排序」才有效。
2.5 效果預覽
2.5.1 PC 端
儲存報表,點選「分頁預覽」,效果同 1.1 節預期效果一致。
2.5.2 行動端
App 端和 HTML5 端均支援,效果如下圖所示:
3. 範例二
在範例一中,日期時間類型的資料需要特殊設定,字串類型的資料無法實現排序。那麼該如何實現數字、日期、字串都能排序呢?
以範例一範本為例,差別主要在於擴展後排序的公式,下面進行簡單講解。
3.1 新增超級連結動態參數
給 A2、B2、C2、D2 儲存格,均新增「超級連結>動態參數」,參數設定如下表:
儲存格 | 參數 | 值類型 | 值 | 說明 |
---|---|---|---|---|
A2 | a | 公式 | if($a=-1,1,-1) | if($a=1,-1,1) 表示點選一次超級連結就更換一次 a 的值,1 代表升冪,-1 代表降冪 參數 asc 的值為要排序的儲存格 |
asc | 字串 | A3 | ||
B2 | a | 公式 | if($a=1,-1,1) | |
asc | 字串 | B3 | ||
C2 | a | 公式 | if($a=1,-1,1) | |
asc | 字串 | C3 | ||
D2 | a | 公式 | if($a=1,-1,1) | |
asc | 字串 | D3 |
3.2 設定擴展後排序
選中 A3 儲存格,修改擴展後排序的公式為:INARRAY(EVAL($asc),SORTARRAY(EVAL($asc+"[!0]")))*$a
公式說明如下表:
公式 | 說明 |
---|---|
EVAL(exp) | 傳回運算式 exp 計算後的結果。exp :一個運算式形式字串 |
$asc+"[!0]" | 傳回連接後的字元,如參數 $asc 的值為 A3,則傳回 A3[!0],即 A3 儲存格擴展出來的所有值 |
SORTARRAY(array) | 傳回排過序的 array 陣列 注:當陣列元素存在類型不一致或者無法比較時,傳回原陣列。 |
INARRAY(co,array) | 傳回 co 在陣列 array 中的位置,如果 co 不在 array 中,則傳回 0 |
INARRAY(EVAL($asc),SORTARRAY(EVAL($asc+"[!0]")))*$a | 先用 SORTARRAY 對獲取的儲存格擴展的所有值進行排序,再用 INARRAY 傳回當前儲存格的值在排序後的所有值中的位置,再乘以參數 $a 進行升冪、降冪的排序。 |
注:當資料列中存在空值時,小數或整數類型的資料排序可能會失效,需要先進行過濾後在進行排序。
3.3 效果預覽
3.3.1 PC 端
儲存報表,點選「分頁預覽」,效果如下圖所示:
3.3.2 行動端
App 端和 H5 端均支援,效果如下圖所示:
4. 範本下載
已完成範本可參見:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doctw\SpecialSubject\OrderReport\多列動態排序範例一.cpt
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doctw\SpecialSubject\OrderReport\多列動態排序範例二.cpt
點選下載範本: