报表工具FineReport排序专题
本帖最后由 彦页文武 于 2015-4-30 09:27 编辑
概述:使用报表软件过程中,很多时候需要对数据进行排序处理,本文着重介绍了web报表工具FineReport的排序功能,主要涉及简单排序、关联排序、交叉表排序…… 简单排序实现简单排序有两种方式:直接在sql中排序;使用数据列高级属性中的排序;当然也可以进行自定义排序。1. 输入sql语句排序取数时按照某个字段直接进行排序:在sql中直接定义,格式如下:正序: Select * from table order by column_name asc逆序: Select * from table order by column_name desc正序效果:http://img.blog.csdn.net/20150109092255380?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center逆序效果:http://img.blog.csdn.net/20150109092402117?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center2. 数据列高级属性中的排序选中单元格双击后,数据列>高级设置,模板如下:http://img.blog.csdn.net/20150109092424703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center预览效果,如下:http://img.blog.csdn.net/20150109092450508?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center其后的字段都会根据排序字段进行排列注:排序字段与前父格必须是一对多的关系,若为一对一关系,设置子格排序将无效,该情况属于根据后格数据进行排序,关联排序,请看关联排序实现方法。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\order.cpt3. 自定义排序有时常希望可根据自己的需要,对某一单元格进行排序,并控制每一数据项的位置(记录数比较小,自己能够记得是哪些数据),此时便可通过自定义排序的方式来控制数据顺序。3.1 示例下面以简单例子,展示FineReport实现自定义排序的过程。数据库中,数据顺序:http://img.blog.csdn.net/20150109092433140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center模板中的设置,如下:http://img.blog.csdn.net/20150109092458667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center注:公式中输入的就是您想根据什么方式进行排序效果预览:http://img.blog.csdn.net/20150109092502661?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\define.cpt 关联排序1. 关联排序_数据列有部分情况,我们希望根据数据表中,某一特定数据列进行排序,可通过关联排序实现。1.1 示例1模板设置,如下:http://img.blog.csdn.net/20150109092506686?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center预览效果,如下:http://img.blog.csdn.net/20150109092510820?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\relative1.cpt2. 关联排序_公式统计有部分情况,我们排序所要依据的条件,是需要通过公式计算出来的统计值,此时也可以通过关联排序实现。2.1 示例2模板设置,如下:http://img.blog.csdn.net/20150109092458828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center注:公式不能直接引用单元格名称,必须将各单元格中的内容具体表示出来。预览效果,如下: http://img.blog.csdn.net/20150109093016861?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\relative2.cpt。交叉表排序1. 问题描述交叉表也可实现动态排序,如:交叉表左表头,根据选择的列的值进行升序或降序排列。如下图所示:http://img.blog.csdn.net/20150109093004125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center点击其电视,选择升序,效果如下:http://img.blog.csdn.net/20150109093032695?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center选择降序时,效果如下:http://img.blog.csdn.net/20150109093016109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center2. 示例2.1 新建报表2.2 定义报表数据集定义报表数据集ds1,SQL语句:SELECT 销售员,产品,销量 FROM SALES_BASIC2.3 表样设计分别拖入各数据列,其表样的设置如下:http://img.blog.csdn.net/20150109093042788?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center如上单元格中的数据列的设置,如下:
单元格
数据集
数据列
属性
A2
ds1
销售员
默认
B1
ds1
产品
从左到右扩展,其余默认
B2
ds1
销量
汇总|求和,其余默认
2.4 参数设置· 添加报表参数添加报表参数product和order,字符串类型,其中product的默认值为电视。用来选择排序的产品名称与升/降序。· 动态参数设置给B1单元格,添加超级链接>动态参数,用来选择该产品的排列顺序。右击超级链接,新增2个动态参数“升序”与“降序”。其中参数product用公式表示,=$$$取当前值,order升序用asc;降序用desc表示,其参数值也用公式=$$$,如下:http://img.blog.csdn.net/20150109093047593?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center注:这里需强调的是,像如上这样的动态排序,其各参数的值是依据其所对应的列名和排序方式的。2.5 高级设置双击A2单元格,选择高级的升序公式,如下:http://img.blog.csdn.net/20150109093054769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center点击其公式旁的输入框按钮,在公式中输入if($order=="asc",sum(ds1.select(销量,产品=$product)),-sum(ds1.select(销量,产品=$product)))说明:sum(ds1.select(销量,产品=$product)):表示求出每个销售员$product产品的销量,如$product值为“电视”,则表示每个销售员电视的销量;根据order的值,判断是升序还是降序。若order值为“asc”,即升序,则按照当前产品的销量进行升序排序。反之,则根据-sum(ds1.select(销量,产品=$product))即销量的相反值,降序排列。2.6 保存与预览保存模板。点击分页预览,效果即如上。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\crossorder.cpt多数据集关联排序1. 概述排序也可实现多数据集关联排序,即某个字段,按照另一个数据集字段进行排序,以及按照计算结果进行排序。2. 根据别的数据集排序2.1 打开模板打开模板%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\plan.cpt2.2 超级链接设置给C2单元格,添加超级链接>动态参数,新增2个动态参数为“升序”与“降序”,order就为参数名,其参数的值,分别为asc(升序),desc(降序)表示。2.3 高级设置双击B4单元格,选择高级,排列顺序选择升序,在公式中填入=if($order=='asc',sum(zs.select(数量,ID=$$$)),-sum(zs.select(数量,ID=$$$)))。注:sum(zs.select(数量,ID=$$$))表示求出当前项目名称中的数量。公式的完整意思是如果order是asc即升序,则按照当前项目名称的数量进行升序排序,反之则按-sum(zs.select(数量,ID=$$$))进行升序。2.4 保存与预览保存模板。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\multisorting.cpt分页预览,项目总数(个)这列默认的降序排列,效果如下:http://img.blog.csdn.net/20150109093059246?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center点击项目总数(个)选择升序,效果如下:http://img.blog.csdn.net/20150109093104784?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center可看到项目名称跟着项目总数那列已进行重新排序。3. 按照计算结果进行排序3.1 模板制作和上面的制作步骤是一样的。只要在第二步时,把动态参数设置在D2,并在第三步时,把公式换成:if($order=='asc',sum(cz.select(金额,ID=$$$))+sum(dz.select(金额,ID=$$$))+sum(qt.select(金额,ID=$$$)),-(sum(zs.select(数量,ID=$$$))+sum(dz.select(金额,ID=$$$))+sum(qt.select(金额,ID=$$$))))注:按照计算结果进行排序,不能对计算的结果列进行设置,只能对每个相加的单元格进行设置,且这些相加的单元格必须是数据列。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\accordingresult.cpt3.2 保存与预览保存模板。分页预览,年度投资计划这列默认的降序排列,效果如下:http://img.blog.csdn.net/20150109093110010?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center选择升序排列后,效果如下:http://img.blog.csdn.net/20150109093115502?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center可看到项目名称跟着该列值已进行重新排序。扩展后排序1. 问题描述若模板中的某列要按照另外一个数据集的字段或者多个字段计算后的结果进行排序,此时若在数据列高级面板中设置排序,需要用数据集函数取出对应地数据列进行排序或者还原计算过程,如多数据集关联排序,导致高级排序中的公式非常复杂,有没有什么简单的方法呢?2. 实现方法为了解决如上问题,FineReport提供了扩展后排序功能,即对扩展后的结果进行排序。2.1 设置方法右击单元格>扩展与父格,在弹出的对话框中对扩展后排序进行设置,如在A1单元格中设置扩展后排序>升序,公式中输入B1,则A1单元格会根据B1单元格的计算结果进行排序。2.2 产生的问题由于是对扩展后的数据进行重新排序,只是根据结果改变行的顺序,因此若模板中有通过seq或者&产生的序号时,原本生成的序号会在重新排序时打乱。· 解决方案在序号所在的单元格设置条件属性>新值,使用row()公式,这样在重新排序时会根据当前所在行重新生成序号。3. 示例下面我们以扩展后排序来实现多数据集关联排序。效果如下:默认项目名称根据年度投资计划总额降序排列http://img.blog.csdn.net/20150109093119885?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center选择升序排列后,项目名称根据年度投资计划总额升序排列http://img.blog.csdn.net/20150109093124347?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center3.1 打开模板打开模板:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\plan.cpt3.2 超级链接设置给年度投资计划(D2单元格),添加超级链接>动态参数,新增2个动态参数为“升序”与“降序”,order就为参数名,其参数值,分别为asc(升序),desc(降序)。3.3 排序方法设置右击项目名称所在列(B4单元格),右击>扩展与父格,设置扩展后排序为升序并且公式为:=if($order == 'asc',D4,-D4)。注:这个公式的意义在于:若order为asc即升序则按照D4进行升序排列,若选择desc即降序则按照-D4升序。3.4 条件属性设置原模板中使用了&来产生序号,会发现重新排序后顺序被打乱了,需要使用条件属性重新生成序号。在序号(A4单元格)中增加新值条件属性,选择公式,在公式中输入:=row-3。3.5 总结以上便设置好了,预览即可看到上图效果。可以看出,在数据列的高级处进行排序需要进行很复杂的公式进行还原,而用扩展后排序只需要引用对应的单元格即可。
多列排序1. 问题描述
在上面中介绍了点击数据列标题实现升序降序排序,那么,如果有多个列想实现这样的升序降序功能呢,即点击订单ID是根据订单ID升序排序,再点击订单ID则根据订单ID降序排序,接着点击运货费则根据运货费升序排序,以此类推。
2. 解决思路
由上一节的扩展后排序来实现,即点击数据列标题时,将该数据列所在单元格作为参数传递过去,在扩展后排序公式中接收该参数,根据参数的不同,实现不同的排序,下面详细介绍。
3. 示例
点击年度投资计划时,按照年度投资计划进行排序,点击财政安排数时按照财政安排数排序,点击单位自筹时按照单位自筹排序。
3.1 打开模板
打开模板:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\advanced\Multidatasource\Multi_2.cpt
3.2 超级链接参数设置
为年度投资计划,财政安排数,单位自筹以及其他资金所在单元格设置超级链接。
以年度投资计划为例
选中年度投资计划所在的D2单元格,右键,选择超级链接,添加一个动态参数,增加3个参数,如下图:
http://www.finereporthelp.com/help/13/15/9-1.png
其他的三个标题所在单元格同样设置,不同的是asc和desc参数的值为该标题对应的数据列,如下表:
标题ascdesca
年度投资计划D4-D4if($a==1,0,1)
财政安排数E4-E4if($a==1,0,1)
单位自筹F4-F4if($a==1,0,1)
其他资金G4-G4if($a==1,0,1)
注:参数a的值需选择公式,而参数asc和desc的值不可以选择公式,只能是字符串。参数a的意义在于,点击一次超级链接就替换一次a的值,那么在下面进行排序就可以根据a的值来决定是升序还是降序。
设置完成之后如下图:
http://www.finereporthelp.com/help/13/15/9-2.png
3.3 扩展后排序
选中B4单元格,在单元格属性表>扩展属性中选择扩展后,选中升序,输入公式if($a==1,eval($asc),eval($desc)),如下图:
http://www.finereporthelp.com/help/13/15/9-3.png
注:公式的意义是,如果a的值为1,则根据参数asc进行升序排序,如果a的值不为1,则根据desc的值降序排序,asc和desc的值根据点击的数据列标题变化而变化。
另:如果需要排序的不是数字,而是日期,形如2013-06-25日期数据,那么直接像上面这样操作,是无法实现排序功能的,因为以上的公式均是针对数字而言的,对日期排序的话,只需要将日期转化为数字即可,也就是说在设置超级链接时,参数asc变为tointeger(replace(D4,"-","")),参数desc的值变为-tointeger(replace(D4,"-",""))
3.4 效果查看
点击分页预览,效果如下:
http://www.finereporthelp.com/help/13/15/9-4.gif
已完成模板请参照%FR_HOME%\WebReport\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\Order_5.cpt