多层次报表是很常见的报表形式,如分组报表和主子报表。其中的关联运算(组与明细,主表和子表),由于有层次而不能直接在数据库中完成,需要在报表端完成。但报表端一般只用采用排序和遍历的方法实现关联,性能较差。利用润乾集算报表的层次数据集则可以在数据源计算过程中就完成关联计算,并且有层次的结果集直接传送给报表呈现,在关联计算中充分利用集算器的高效算法,从而达到优化性能的目标。
本文通过一个主子报表的实例来了解一下层次数据集的使用方法和效果。
报表描述
使用订单表和订单明细表,查询每个订单详情以及该订单下的订单明细,报表格式如下:
环境及数据描述
测试机型:Dell Inspiron 3420
CPU:Intel Core i5-3210M @2.50GHz *4
RAM:4G
HDD:西数WDC(500G 5400转/分)
操作系统:Win7(X64) SP1
JDK:1.6
数据库:hsqldb
集算报表版本:5.0
表数据
实现步骤
编写计算脚本
首先使用集算报表内置的集算器(专门用于数据计算,为报表提供数据源支持的工具)编写计算脚本(orders.dfx),完成数据计算并返回层次数据集。
A1:连接数据源;
A2-A3:分别查询订单和订单明细表数据;
A4:根据订单编号关联订单和订单明细表;
A5:报表返回订单编号不为空的结果集。
编制报表
新建报表模板后,数据集选择“集算器”,在数据集编辑窗口指定上述编辑好的dfx文件,完成数据集创建。
报表中层次数据集效果
设置报表模板表达式:
不同于在报表中关联,使用层次数据集可通过集算脚本返回的一个结果集完成主子报表的制作,从而获得了更高的性能,下面是在报表中直接关联实现方式:
不使用层次数据集实现
数据集
ds1: select 订单ID,订单ID 订单编号,发货日期,到货日期,客户ID,货主名称,运货商,运货费,货主城市 from 订单
ds2: select * from 订单明细
报表模板
实现效果
这里比较使用层次数据集前(报表中关联)后的时间开销,下表运行结果数据单位为:秒。
可以看到使用层次数据集带来的效果,由于常规的主子表需要在报表完成关联时只能使用遍历算法(只能针对单条主记录去寻找关联的子记录),因此效率不高。而集算器采用了更高效的hash关联方案(可事先将所有子记录按对应码hash到主记录上,代码中的switch函数即使用了hash关联技术,单算关联时间能快出5-10倍),使得主子表的数据源准备(数据计算)效率大大提升。因而,层次方案可以获得更高的整体运算性能。