可重复分组报表是报表开发中比较常见和麻烦的任务。可重复分组报表是指同一记录出现在不同的分组中被重复统计,常见的可重复分组报表有两类:一类是分组区间有交集,如:统计年龄段在20-30岁、25-35岁、30-40岁之间的用户数量;另外一类是分组区间有包含关系,如:统计各地区以及该地区主要城市的汇总数据,“华北,其中北京;华东,其中上海……”。
下面通过两个实例来看一下润乾报表的实现过程。
根据员工基本信息表按年龄统计各年龄段区间的人数、奖金等汇总情况。报表样式如下:
这里“30-40岁”和“35-45”岁两个区间是有重复的。
实现
在润乾报表中,该类报表主要通过ds.enumGroup()函数完成,报表模板及表达式如下:
其中A2单元格表达式为:
=ds1.enumGroup(true,age(BIRTHDAY)>20&&age(BIRTHDAY)<=30,"20岁到30岁",age(BIRTHDAY)>30&&age(BIRTHDAY)<=40,"30岁到40岁",age(BIRTHDAY)>=35&&age(BIRTHDAY)<45,"35岁到45岁",age(BIRTHDAY)>=45,"45岁以上")
通过ds.enumGroup()可以比较容易完成上述报表,分组较少的情况尤其适用。当分组较多的时候,该表达式会因为过于复杂导致报表难于维护。
根据订单表统计各省份订单情况,要求列出某些主要城市(如青岛、深圳、石家庄)的订单情况,报表样式如下:
实现
润乾报表实现该类报表主要使用ds.overlap()函数,报表模板及表达式如下:
其中,A2单元格表达式为:
=ds1.overlap(true,省份=="上海","上海",省份=="北京","北京",省份=="四川","四川",省份=="天津","天津",省份=="山东","山东",城市=="青岛"," 其中:青岛",省份=="广东","广东",城市=="深圳"," 其中:深圳",省份=="江苏","江苏",省份=="江西","江西",省份=="河北","河北",城市=="石家庄"," 其中:石家庄",省份=="海南","海南",省份=="福建","福建",省份=="辽宁","辽宁",省份=="重庆","重庆",省份=="陕西","陕西")
与实例一中一样,ds.overlap()对分组较少的情况尤其适用。当分组较多的时候,表达式过于复杂将导致报表难于维护。
润乾报表可以实现上述两类可重复分组报表,在分组较少的时候做起来尤其简单,这也是其他报表工具无法比拟润乾报表的原因。但当分组较多、计算比较复杂的情况下,润乾报表实现起来就比较困难了,原因在于报表的数据源准备和呈现混合在一起,如果能将这两部分分开,即:独立的计算层(完成复杂计算)和独立的展现层,则会使报表开发变得更加清晰。
润乾公司基于润乾报表内核改进的集算报表5.0,内置了独立的计算引擎:集算器,用于解决数据源准备问题。在集算报表中可以将复杂的数据计算(数据源准备)工作交由集算器完成,可将其视为报表的计算层;而报表本身只负责接收计算后结果进行报表展现(有时包括一些简单计算),从而将数据源准备和报表呈现分开,使得报表制作更为清晰。
对于上述报表,通过集算报表可以这样实现并解决其中的难点:
编写集算脚本
首先使用集算器编写集算器脚本,完成分组汇总,为报表准备数据源:
A1查询员工表数据,由于该表只有出生日期,故在A2中增加并计算年龄字段;A3、A4指定年龄段区间及其区间名称,在A5中进行可重复枚举分组,并在A6中计算分组汇总值,最后A7将结果集返回给报表。
报表调用
使用集算报表设计器,新建报表,使用“集算器”数据集类型,选择上面编辑好的集算脚本(age.dfx)
设置报表模板及表达式
报表中只简单的列表取值即可,无需再完成复杂计算。
可以看到,在集算报表中将数据准备(集算脚本)和报表呈现(报表模板)分开带来的好处,在计算层通过集算器完备的计算体系完成数据源准备的工作。
A1从订单表读取数据
A2-B4列出主要城市与省份的对应列表
A6按照省份分组汇总
A7、A8按指定城市对位分组后汇总
最后通过A9将城市数据插入A6按省汇总的结果中
报表调用
使用集算报表设计器,新建报表,使用“集算器”数据集类型,选择上面编辑好的集算脚本(age.dfx)
设置报表模板及表达式
通过上述两个实例,就润乾报表和集算报表实现方式的区别,可以看到:
1、集算报表由于将计算层和展现层分离,报表开发更为清晰,复杂计算任务均在集算器中完成,报表本身只负责数据展现(报表模板中只编写简单的表达式即可);
2、集算器具备完备的计算体系,拥有丰富的函数库,如实例中用到的P.enum()进行枚举分组和P.align()完成对齐分组,而前者又有3种函数选项,后者则有6种函数选项,如此丰富的函数库,使得几乎所有的复杂运算(数据源准备工作)都可以在集算器中完成;
3、除了丰富的函数,集算器采用分步的编码方式,无论多么复杂的计算逻辑都可以在集算器中逐步实现,从而解决了在润乾报表中只能写在一个表达式中带来的编写和维护难题。