报表开发中,经常会碰到一些需要进行非常规统计的报表,固定分组、可重复分组、组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源、以及需要对数据源再计算。这些报表本身具备一定的特殊性,使用常规方法往往难于实现。
对于一些报表,取数后往往需要进行一定计算后供报表展现输出,这就要求报表工具具有较强的数据源再计算的能力。传统工具往往会首先依赖报表自身的计算能力,但报表工具本身的计算能力较弱导致很多计算完不成;接着就需要借助存储过程完成(如果数据来源于数据库),且不论存储过程的编写难度,像跨库或数据库文件混合数据源存储过程根本无法完成;最后就需要使用高级语言为报表自定义数据源完成数据源再计算,而像Java做诸如集合运算的难度,让实现并不轻松。
计算报表在完成这类时则比较简单,这里通过一个例子来看一下。
根据学生成绩表列出指定班级数语外三科成绩均在前十名的学生名单及各科成绩。成绩表部分数据如下:
报表样式如下:
这个报表的难点在于数据取数后,还要完成不同集合间的交运算,从而确定报表数据集。一般报表工具并不具备很强的数据源再计算能力,在完成这类报表时将非常困难,一般需要借助自定义数据集来完成,且代码复杂度较高。
如果需要把数据计算准备好,报表工具只需要负责呈现和简单计算,则过程会比较简单些。但无论是使用复杂SQL、存储过程和自定义JAVA数据集编程,对于这样的复杂运算(实际情况往往比这个例子更麻烦得多)都是一件工作量很大的事情,而且难以维护。
集算报表本身内置了适合结构化计算的脚本,可以方便地写出数据准备的计算(相当于一种更使用更简单的自定义数据集)。上述报表需求使用集算报表可以这样完成。
首先使用集算脚本编辑器,使用系统默认数据源demo:
设置脚本参数,用于接收报表传递过来的班级名称:
编写脚本完成数据源再计算任务,为报表输出计算后结果集:
A1:连接数据源;
A2:根据班级参数取本班学生成绩数据;
A3-A5:分别按照语数外成绩排序后取前10记录;
A6;使用集合交运算获取三科成绩均在前十名的学生名单;
A7:根据A6结果创建结果序表;
A8:循环A6分别取各科成绩填充结果序表;
A9;为报表返回结果集。
使用集算报表编辑器,编辑报表模板,用于数据展现。首先新建参数,并设置默认值
新建报表并设置集算器数据集,调用上述编辑好的脚本文件:
其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的;参数class为报表模板参数,arg1为脚本参数,事实上二者可以同名。
编辑报表表达式,直接使用集算脚本返回的结果集,完成报表制作。
报表中,只需要通过列表表达式将脚本生成的结果集展示即可。
可以看到,使用集算器脚本可以快速完成此类无数据源但规则的报表。而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。
在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的数据源和参数。本例使用脚本数据集可以这样完成:
1. 在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”;
2. 在弹出的脚本数据集编辑窗口中编写脚本:
这里可以看到,在脚本数据集中直接使用了报表中定义好参数class,比起单独的集算脚本更加简单、直接。
3. 报表模板和表达式与使用集算器数据集方式一致,不再赘述。
本文出自 “高性能报表数据计算” 博客,请务必保留此出处http://report5.blog.51cto.com/8028595/1575606
原文地址:http://report5.blog.51cto.com/8028595/1575606