1. 概述
1.1 問題描述
在製作報表時,經常遇到需要透過點選標題實現升冪和降冪交換顯示。文檔 資料集中的排序 中,可透過定義資料集參數,利用動態參數實現點選標題動態排序。
但有些情況下無法用到資料集排序,例如製作報表時有一欄是透過其他資料欄計算得出的,如下圖中「利潤」是由(單價-進價)*數量得來的,那麼這時要如何實現直接點選標題動態排序呢?
1.2 解決思路
來實現,即點選資料欄標題時,將該資料欄所在儲存格作為參數傳遞過去,在擴展後排序公式中接收該參數,根據參數的不同,實現不同的排序。
注1:數值類型和字元類型的設定有所不同,詳情在範例中查看。
注2:本文講解僅一欄資料變換排序,多欄動態排序請參考文檔 多欄動態排序。
2. 範例:數值類型
2.1 資料準備
建立普通報表,建立資料庫查詢 ds1,SQL 查詢語句為:SELECT * FROM 訂單明細 limit 20。如下圖所示:
2.2 設計報表
將資料集中的資料拖入表格,設定 A2 儲存格的「資料設定」為「列表」,F2 儲存格中插入公式:(C2 - E2) * D2,設計報表樣式如下圖所示:
2.3 新增動態參數
選中「利潤」標題所在 F1 儲存格,新增一個「超級連結>動態參數」 a,參數值為公式:if($a=1,-1,1),如下圖所示:
2.4 設定擴展後排序
在「最父格」A2 儲存格設定,選中 A2 儲存格,選擇「儲存格屬性>擴展」,設定「擴展後排序」為升冪,輸入公式:if($a=1,F2,-F2),F2 表示按照 F2 儲存格的值進行排序。如下圖所示:
注:數值類型欄位排序時若欄位為空,需要在排序公式中給空值指派。詳情可參見 排序時數值類型欄位存在空值時報錯。
注:由於只有數值類型資料才有負數,字元類型資料沒有負數,故這種排序方法只適用於「數值類型欄位」排序。
2.5 效果預覽
2.5.1 PC 端
儲存報表,點選「分頁預覽」,效果與 1.1 節效果圖一致。
2.5.2 行動端
App 端和 HTML5 端均支援,效果如下圖所示:
3. 範例:字元類型
3.1 資料準備
建立普通報表,建立資料庫查詢 ds1,SQL 查詢語句為:SELECT * FROM 銷量 where 地區='華北'。如下圖所示:
3.2 設計報表
將資料集中的資料拖入表格,設定 A2 儲存格的「資料設定」為「列表」,報表樣式如下圖所示:
3.3 新增動態參數
選中「銷售員」標題所在 B1 儲存格,新增一個「超級連結>動態參數」 參數設定如下表:
參數名 | 參數值類型 | 參數值 |
---|---|---|
a | 公式 | if(a=1,-1,1) |
asc | 字串 | B2 |
步驟如下圖所示:
3.4 設定擴展後排序
選中 A2 儲存格,選擇「儲存格屬性>擴展」,設定「擴展後排序」為升冪,輸入公式:INARRAY(EVAL($asc),SORTARRAY(EVAL($asc+"[!0]")))*$a。
公式說明如下表:
公式 | 說明 |
---|---|
EVAL($asc) | 傳回運算式 $asc ,即 B2 儲存格計算後的結果。 |
$asc+"[!0]" | 傳回連接後的字元,即傳回 B2[!0],即 B2 儲存格擴展出來的所有值 |
SORTARRAY(array) | 傳回排過序的 array 陣列 注:當陣列元素存在類型不一致或者無法比較時,傳回原陣列。 |
INARRAY(co,array) | 傳回 co 在陣列 array 中的位置,如果 co 不在 array 中,則傳回 0 |
步驟如下圖所示:
3.5 效果預覽
3.5.1 PC 端
儲存報表,點選「分頁預覽」,效果如下圖所示:
3.5.2 行動端
App 端和 HTML5 端均支援,效果如下圖所示:
4. 範本下載
已完成範本可參見:
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\點選標題改變排序-數值類型.cpt
%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\點選標題改變排序-字元類型.cpt
點選下載範本: