排序(總結)
排序(總結)
1. 概述
排序分為:數據集中的排序,高級排序以及擴展后排序,下面我們分別看下這三種排序的優缺點。
2. 各排序的優點與不足
2.1 數據集中的排序
優點:通過SQL直接在數據庫排序,性能最佳。
不足:所有計算都必須要在數據庫中做,會導致SQL很復雜,難以維護;另外,有些計算是無法用sql完成的。
2.2 高級排序
優點:這種排序是在擴展過程中,對當前擴展的格子的排序,性能較數據集排序次之,比數據集排序好的地方就是可以利用報表的計算,做一些稍微復雜些的排序。
不足:公式必須通過數據列還原才能使用此排序,並且導致了公式的二次計算;另外若公式無法用數據列進行還原則無法完成。
2.3 擴展后排序
優點:最為靈活,滿足目前所有的排序需求。
不足:由於在擴展完成后進行排序,會對所有格子的位置進行調整,因此性能最差。
注:高級排序是在報表執行前進行排序,擴展后排序是報表執行后再進行排序;三種排序各有其優缺點,可以根據自己排序的具體需求進行選擇。
3. 不同模板的排序
FineReport報表一般性包括純粹的數據展示、圖表展示和控件展示,排序一般應用在數據展示中比較多,但是圖表中也會稍微涉及到一點,那么數據展示排序與圖表排序有什么區別呢?
3.1 數據展示排序
通過單元格展示數據時,可以直接在數據集中進行排序,也可以在單元格中進行排序。
3.2 圖表排序
圖表排序是指對圖片的分類或者系列進行排序,那么,圖表排序也就是對圖表分類或者系列的數據進行排序,在
圖表數據源中我們講解過,圖表數據源分為數據集數據和單元格數據,故圖表排序根據其數據源類型的不同,其排序方法設置也有所不同。
(1)數據集數據
圖表數據來源於數據集,故對圖表排序就需要對數據集中的數據進行排序,即
數據集中的排序;
(2)單元格數據源
圖表排序的詳細示例請查看
圖表排序
數據集中的排序
1. 描述
在預覽報表時,希望某列的數據是升序或是降序排列的,此時就在定義數據集時設置排序。
2. 設置方法
在數據集處定義按照某個字段進行排序:
正序:Select * from [table] order by [column_name] asc
逆序:Select * from [table] order by [column_name] desc
3. 示例
下面我們就看下按照銷量表的銷量分別進行升序和降序的定義方法和效果
3.1 升序
數據集定義
將數據集定義為:SELECT * FROM 銷量 order by 銷量 asc
效果如下圖:

3.2 降序
數據集定義
將數據集定義為:SELECT * FROM 銷量 order by 銷量 desc
效果如下圖:

分組內排序互不干擾
1. 描述
如下圖所示:當點擊華東的銷量時,華東的銷量排序,華北的銷量不受到影響。當點擊華北的銷量時,華北的銷量排序,華東的不受到影響。

2. 思路
1)定義一個數組,用數組里的元素存儲對應分組的升降序(正數為升,負數為降)
2)當點擊銷量時,修改數組對應下標的值
3)根據數組各個下標的值對各分組進行排序
3. 操作步驟
1)創建數據集ds1,sql:SELECT * FROM 銷量 where 產品='蘋果汁' order by 地區,銷量

2)報表界面設計如下:

3)右鍵D2單元格,添加超級鏈接-動態參數,參數名字為:a,值為:ADD2ARRAY(REMOVEARRAY(IF(LEN($a) = 0, RANGE(COUNT(A1[!0;!0])), SPLIT($a, ",")), &A1, 1), IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = -1, 1, -1), &A1)

公式解析:
第一步,定義數組:IF(LEN($a) = 0, RANGE(COUNT(A1[!0;!0])), SPLIT($a, ","))
初始化報表時,參數a為空,因此我們要根據分組的長度定義一個同等長度的數組RANGE(COUNT(A1[!0;!0])),當點擊過一次之后,參數a就被賦予了值,這時我們直接取參數a即可,由於參數在傳遞過程中被自動處理成了字符串,所以這里還要使用split來分割參數a。
接下來是修改數組對應下標的值,由於沒有相應的公式,這里先刪除對應下標的值,然后再在對應下標添加新的值。
第二步,刪除相應點擊位置對應數組下標的值:REMOVEARRAY(上一步結果, &A1, 1)
這里使用&A1獲取相應點擊的分組的位置,然后從上一步結果的數組中在該位置刪除一個值。
第三步,判斷原數組對應下標的值,然后添加相反值到相應點擊位置對應數組下標下:ADD2ARRAY(上一步結果, IF(INDEXOFARRAY(SPLIT($a, ","), &A1) = -1, 1, -1), &A1)
這里使用IF來判斷,由於定義的數組一開始是range(分組數量),所以判斷條件寫為等於-1,所以每個分組點擊第一次的時候必不成立,從而將本是正數的值變成-1,達到變換順序的目的。
4)選中A3單元格,設置擴展后排序,排序公式為:D3 * INDEXOFARRAY(split($a, ","), &A1)

4. 效果預覽
編輯
4.1 PC端預覽效果

4.2 移動端效果
1)APP

2)h5

5. 已完成模板
保存模板,選擇預覽,即可看到上圖效果。
已完成模板可參考%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Advanced\Cacuate_Between_Cells\分組內排序互不干擾.cpt。
擴展后多列按先后排序
1. 描述
在sql中,我們可以用order by A,B 語句將結果先按照A排序,再按照B來排序。
那么,在設計器的擴展后排序功能中如何實現呢?
如下,擴展后結果先按照銷售員排序,再按照銷量排序:

2. 思路
1)字符類型的數據可以通過INARRAY(字符, SORTARRAY(UNIQUEARRAY(擴展的所有字符)))獲得排序位置
2)數值類型的數據直接通過本身的大小排序
將1)和2)的結果經過運算處理得出一個新的排序數,按照新數擴展排序
3. 操作步驟
1)創建數據集ds1:SELECT * FROM 銷量 where 地區='華北'

2)報表設計如下,A2設置為列表

3)A2單元格添加擴展后排序公式,公式為:INARRAY(B2,SORTARRAY(UNIQUEARRAY(B2[!0])))*POWER(10, LEN(MAX(E2[!0])))+E2

4. 預覽效果
4.1 PC端預覽效果
保存預覽,實現效果如描述中所示
4.2 移動端預覽效果
1)app效果

2)H5效果

5. 已完成模板
已完成模板,可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\擴展后多列排序.cpt。
高級排序
1. 描述
高級排序即擴展前排序,其只能根據數據列或者對可以用數據列還原的公式進行排序,下面我們來介紹下如何設置高級排序。
注:高級排序中的所有設置都可以在擴展后排序中進行設置,但是由於擴展前排序性能比擴展后排序好,因此若能用高級排序實現的就可以使用高級排序,若高級排序無法實現的排序,可以使用
擴展后排序。
2. 設置方法
選中有數據列的單元格,雙擊數據列、選擇上方的高級標簽,在排序設置中選中升序或者降序即可,如下圖:

默認的是不排序,選擇升序或者降序后,若希望只根據當前列進行升序或者降序,則不需要填寫公式;若希望根據別的列進行升序或者降序,則填寫對應數據列的名稱即可,稱之為關聯排序。
3. 示例
下面我們以網格式報表中的Details_1.cpt為例,來看下訂單ID根據運貨費進行降序的關聯排序的示例。
3.1 打開模板
打開模板:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\DetailReport\Details_1.cpt
3.2 排序設置
雙擊A2單元格,點擊高級,排序順序選擇降序,然后點擊右邊的按鈕:

打開公式定義對話框,雙擊數據項中的運貨費,如下圖:


點擊確定,則數據列由運貨費的降序排列。
3.3 效果查看
點擊分頁預覽,可以看到數據由運貨費降序排序了:

已完成的模板,可參考:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\Order_1.cpt。
在線查看示例效果請點擊
Order_1.cpt
自定義排序
1. 描述
在對數據列進行排序時,若希望可根據自己的需要,如對某一單元格進行排序,並控制每一數據項的位置(記錄數比較小,自己能夠記得是哪些數據),此時便可通過自定義排序的方式來控制數據順序。
2. 設置方法
在數據列>高級的排序順序中選擇升序或降序后,在公式處填寫自己設置的排序規則。

3. 方案一
3.1 准備數據集
我們新建內置數據集,數據的順序如下:

3.2 排序設置
雙擊A1單元格,選擇“高級”,設置排列順序為“升序”,公式為:switch($$$,"XS",1,"S",2,"M",3,"L",4,"XL",5,"XXL",6),如下圖所示:

注:公式中輸入要進行排序的順序,上圖公式中的$$$為數據列。
注:自定義排序同樣可以在
擴展后排序中進行設置。
3.3 保存預覽
保存模版,數據即以:XS、S、M、L、XL、XXL的順序進行排列,實現效果如下圖:

已完成模板,可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\自定義排序.cpt。
在線查看示例效果請點擊
Order_3.cpt
4. 方案二
4.1 排序設置
以上個模版為例,將排列公式修改為:INDEX($$$,"XS","S","M","L","XL","XXL"),如下圖所示:

4.2 保存模版
保存模版,點擊預覽,也可實現上圖所示的效果。
擴展后排序
1. 描述
若模板中希望按照某列進行排序,而此列是無法用數據集函數還原的即無法使用高級排序進行排序設置,為此FineReport提供了擴展后排序,滿足一切排序的需求。
2. 實現方法
2.1 設置方法
右擊單元格>擴展屬性或者選中單元格,在右側下方的單元格屬性表-擴展屬性中對擴展后排序進行設置,如在A1單元格(這里要注意是在父格上設置)中設置擴展后排序>升序,公式中輸入B1,則A1單元格(父格)會根據B1單元格(子格)的計算結果進行排序,如下圖:

2.2 產生的問題
由於是對擴展后的數據進行重新排序,只是根據結果改變行的順序,因此若模板中有通過seq()或者&單元格設置序號時,原本生成的序號會在重新排序時打亂。
2.3 解決方案
在序號所在的單元格設置條件屬性,條件屬性>新值,在新增的新值處選擇公式,輸入公式row(),這樣在重新排序時會根據當前所在行重新生成序號。
3. 示例
下面我們以擴展后排序來實現多數據集關聯排序。效果如下:
默認項目名稱根據年度投資計划總額升序排列

選擇降序排列后,項目名稱根據年度投資計划總額降序排列

3.1 打開模板
打開模板:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\advanced\Multidatasource\Multi_2.cpt
3.2 超級鏈接設置
給年度投資計划(D2單元格),添加超級鏈接>動態參數,新增2個動態參數為“升序”與“降序”,order就為參數名,其參數值,分別為asc(升序),desc(降序)。如下圖所示:

3.3 排序方法設置
右擊項目名稱所在列(B4單元格),右擊單元格>擴展屬性,在右側下方的單元格屬性面板中設置擴展后排序為升序並且公式為:if($order == 'asc',D4,-D4)。如下圖所示:

注:這個公式的意義在於:若order為asc即升序則按照D4進行升序排列,若選擇desc即降序則按照-D4升序。