帆软报表之 排序(总结) 一
排序(总结)
排序(总结)
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升序。
拥有自信,努力奋斗,保持乐观积极地情绪,逆着阳光,成功就在前方。自己选择的路,放弃者绝不会成功,成功者绝不放弃。