可重复分组报表也在报表开发中比较常见和麻烦的任务。可重复分组报表是指同一记录出现在不同的分组中被重复统计,常见的可重复分组报表有两类:一类是分组区间有交集,如:统计年龄段在20-30岁、25-35岁、30-40岁之间的用户数量;另外一类是分组区间有包含关系,如:统计各地区以及该地区主要城市的汇总数据,“华北,其中北京;华东,其中上海……”。
这类报表通过报表工具往往不易实现,即使实现也经常会伴随着报表难于开发维护、性能不高等问题。
通过集算器可以很好解决这个问题,这里通过两个例子来说明实现过程。
例一
根据员工基本信息表按年龄统计各年龄段区间的人数、奖金等汇总情况。报表样式如下:
这里“30-40岁”和“35-45”岁两个区间是有重复的。
集算器代码
A1建立数据源连接,A2查询员工表数据,由于该表只有出生日期,故在A3中增加并计算年龄字段;A4、A5指定年龄段区间及其区间名称,在A6中进行可重复枚举分组,并在A7中计算分组汇总值,最后A8将结果集返回给报表。
报表调用
由于集算器的主要工作是为报表做数据源准备,它只做数据计算,报表展现的工作仍由报表工具完成,这里选用润乾报表进行展现。
数据集设置
选用存储过程数据集,采用类存储过程的调用方式,其中“年龄段”为集算器脚本(dfx)名称。
报表模板
说到润乾报表,作为一款优良的报表工具,这个例子润乾报表可以通过ds.enumGroup()函数实现:
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岁以上")
这是四个分组的情况,可以想象一下如果有几十个分组这个表达式将异常冗长,很难维护,而在集算器中则非常清晰。
例二
根据订单表统计各省份订单情况,要求列出某些主要城市(如青岛、深圳、石家庄)的订单情况,报表样式如下:
集算器代码
A1、A2:建立数据库连接从订单表读取数据;
A3:列出主要城市与省份的对应列表;
A7:按照省份分组汇总;
A8、A9:按指定城市对位分组后汇总;
A10:将城市数据插入A7按省汇总的结果中。
报表调用
报表调用方式与上例相同,报表模板及其表达式如下:
通过润乾报表单独实现一般可以通过两种方法:
1、依靠大量隐藏行
即先按省份分组,在下一行再按城市分组并设置其跟随上一行扩展,设置城市所在行隐藏行表达式,将不需要显示的城市全部隐藏。
这种方法虽然可以实现,但大量的隐藏行极大地影响了报表效率,当城市分组很多的情况尤其明显。
2、通过overlap()函数
润乾报表中ds.overlap()可以用于完成可重复分组报表,本例表达式可以写成:
ds1.overlap(true,省份=="上海","上海",省份=="北京","北京",省份=="四川","四川",省份=="天津","天津",省份=="山东","山东",城市=="青岛"," 其中:青岛",省份=="广东","广东",城市=="深圳"," 其中:深圳",省份=="江苏","江苏",省份=="江西","江西",省份=="河北","河北",城市=="石家庄"," 其中:石家庄",省份=="海南","海南",省份=="福建","福建",省份=="辽宁","辽宁",省份=="重庆","重庆",省份=="陕西","陕西")
通过overlap实现有两个明显缺点,第一是表达式长度,长到让人无法忍受的程度,可读性差难于更改,而且类似的表达式被写许多遍,自动报表的优势荡然无存;第二是由于统计省份都在表达式里写死了,这样报表过于固定无法随原始数据变化而变化,发生数据变化时还需要修改报表模板,造成维护困难。
集算器完成这类报表时即没有隐藏行列影响效率的担忧,又不会因为表达式长度和报表固定使报表使用受限,集算器作为集合运算的利器具有丰富的类库,代码结构清晰,可以帮助用户快速完成此类特殊格式报表的制作,是报表制作中不可或缺的好帮手。
可重复分组报表