蘑菇卡通图:报表工具FineReport排序专题

来源:百度文库 编辑:中财网 时间:2024/04/28 08:29:41

 

概述:使用报表软件过程中,很多时候需要对数据进行排序处理,本文着重介绍了web报表工具FineReport的排序功能,主要涉及简单排序、关联排序、交叉表排序……

 

目录

简单排序…………………………………………………………2

关联排序…………………………………………………………5

交叉表排序………………………………………………………7

多数据集关联排序………………………………………………11

拓展后排序………………………………………………………14

  简单排序

实现简单排序有两种方式:直接在sql中排序;使用数据列高级属性中的排序;当然也可以进行自定义排序。

1. 输入sql语句排序

取数时按照某个字段直接进行排序:在sql中直接定义,格式如下:

正序: Select * from table order by column_name asc

逆序: Select * from table order by column_name desc

正序效果:

逆序效果:

2. 数据列高级属性中的排序

选中单元格双击后,数据列>高级设置,模板如下:

预览效果,如下:

其后的字段都会根据排序字段进行排列

注:排序字段与前父格必须是一对多的关系,若为一对一关系,设置子格排序将无效,该情况属于根据后格数据进行排序,关联排序,请看关联排序实现方法。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\order.cpt

3. 自定义排序

有时常希望可根据自己的需要,对某一单元格进行排序,并控制每一数据项的位置(记录数比较小,自己能够记得是哪些数据),此时便可通过自定义排序的方式来控制数据顺序。

3.1 示例

下面以简单例子,展示FineReport实现自定义排序的过程。

数据库中,数据顺序:

模板中的设置,如下:

注:公式中输入的就是您想根据什么方式进行排序

效果预览:

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\define.cpt

 

关联排序

1. 关联排序_数据列

有部分情况,我们希望根据数据表中,某一特定数据列进行排序,可通过关联排序实现。

1.1 示例1

模板设置,如下:

预览效果,如下:

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\relative1.cpt

2. 关联排序_公式统计

有部分情况,我们排序所要依据的条件,是需要通过公式计算出来的统计值,此时也可以通过关联排序实现。

2.1 示例2

模板设置,如下:

注:公式不能直接引用单元格名称,必须将各单元格中的内容具体表示出来。

预览效果,如下:

 

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Subject\Sorting\relative2.cpt

交叉表排序

1. 问题描述

交叉表也可实现动态排序,如:交叉表左表头,根据选择的列的值进行升序或降序排列。如下图所示:

点击其电视,选择升序,效果如下:

选择降序时,效果如下:

2. 示例

2.1 新建报表

2.2 定义报表数据集

定义报表数据集ds1,SQL语句:SELECT 销售员,产品,销量 FROM SALES_BASIC

2.3 表样设计

分别拖入各数据列,其表样的设置如下:

如上单元格中的数据列的设置,如下:

单元格

数据集

数据列

属性

A2

ds1

销售员

默认

B1

ds1

产品

从左到右扩展,其余默认

B2

ds1

销量

汇总|求和,其余默认

2.4 参数设置

  • 添加报表参数

添加报表参数product和order,字符串类型,其中product的默认值为电视。用来选择排序的产品名称与升/降序。

  • 动态参数设置
给B1单元格,添加超级链接>动态参数,用来选择该产品的排列顺序。右击超级链接,新增2个动态参数“升序”与“降序”。其中参数product用公式表示,=$$$取当前值,order升序用asc;降序用desc表示,其参数值也用公式=$$$,如下:

注:这里需强调的是,像如上这样的动态排序,其各参数的值是依据其所对应的列名和排序方式的。

2.5 高级设置

双击A2单元格,选择高级的升序公式,如下:

点击其公式旁的输入框按钮,在公式中输入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.cpt

2.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

分页预览,项目总数(个)这列默认的降序排列,效果如下:

点击项目总数(个)选择升序,效果如下:

可看到项目名称跟着项目总数那列已进行重新排序。

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.cpt

3.2 保存与预览

保存模板。分页预览,年度投资计划这列默认的降序排列,效果如下:

选择升序排列后,效果如下:

可看到项目名称跟着该列值已进行重新排序。

扩展后排序

1. 问题描述

若模板中的某列要按照另外一个数据集的字段或者多个字段计算后的结果进行排序,此时若在数据列高级面板中设置排序,需要用数据集函数取出对应地数据列进行排序或者还原计算过程,如多数据集关联排序,导致高级排序中的公式非常复杂,有没有什么简单的方法呢?

2. 实现方法

为了解决如上问题,FineReport提供了扩展后排序功能,即对扩展后的结果进行排序。

2.1 设置方法

右击单元格>扩展与父格,在弹出的对话框中对扩展后排序进行设置,如在A1单元格中设置扩展后排序>升序,公式中输入B1,则A1单元格会根据B1单元格的计算结果进行排序。

2.2 产生的问题

由于是对扩展后的数据进行重新排序,只是根据结果改变行的顺序,因此若模板中有通过seq或者&产生的序号时,原本生成的序号会在重新排序时打乱。

  • 解决方案

在序号所在的单元格设置条件属性>新值,使用row()公式,这样在重新排序时会根据当前所在行重新生成序号。

3. 示例

下面我们以扩展后排序来实现多数据集关联排序。效果如下:

默认项目名称根据年度投资计划总额降序排列

选择升序排列后,项目名称根据年度投资计划总额升序排列

3.1 打开模板

打开模板:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\plan.cpt

3.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 总结

以上便设置好了,预览即可看到上图效果。可以看出,在数据列的高级处进行排序需要进行很复杂的公式进行还原,而用扩展后排序只需要引用对应的单元格即可。