润乾报表实现预置分组报表及改进

预置分组报表在报表开发中比较常见而且比较棘手。所谓预置分组报表是指分组没有规律,可能是分组范围没有规律,也可能分组顺序没有规律,需要报表开发人员事先预置(固定)分组的报表。常见的预置分组报表一般有如下三类:按段分组报表、固定次序分组报表、多层固定次序分组报表。下面分别看一下这几类报表的特点,以及润乾报表的实现方法。

按段分组报表

这类报表的特点是分段的区间并未在数据库中存储需要根据相应字段(如年龄、日期)计算,并且每个分段可能会发生变化(如每年节假日所在日期可能不同),经常由用户随意指定。如:统计20-30岁,30-40岁,40-50岁各年龄段的用户数量;每年节假日(春节、端午节、国庆节)期间公路铁路承载的旅客统计。

下面通过实例说明,报表样式如下:

该报表是根据订单表统计各(预置)时间段内,各地区的订单数量、订单金额汇总。其中各时间段范围为:

【1996年圣诞前:date <= 1996-12-25

1996年圣诞--1997年国庆:1996-12-25 <=date<= 1997-10-1

1997年国庆--1998年五一:1997-10-1 < date<= 1998-5-1

1998年五一以后:date>1998-5-1】

实现

润乾报表实现该类按段分组报表主要使用ds.plot()函数,计算一个值在一个完全划分中的位置。报表模板及其表达式如下:

其中,参数arg1为日期组,默认值为:1996-12-25,1997-10-1,1998-5-1。

设置B1显示值表达式:map(to(0,count(arg1)+1),arg2),其中参数arg2为字符串组,默认值为:1996年圣诞前,1996年圣诞--1997年国庆,1997年国庆--1998年五一,1998年五一以后。

使用ds.plot()函数可以非常方便地实现上述报表,而且可以通过该函数的参数控制是否包含边界,对于分组较少并且边界包含规律的分组报表尤其适用。

不过,当段界包含不规律时则无法使用ds.plot()实现,比如上例中如果时间范围变成:

【1996年圣诞前:date < 1996-12-25

1996年圣诞--1997年国庆:1996-12-25 <=date <= 1997-10-1

1997年国庆--1998年五一:1997-10-1 <= date<= 1998-5-1

1998年五一以后:date>1998-5-1】

起始和结束两段不包含段界日期,而中间的各个分段则包含,ds.plot()函数则存在限制,难以实现这类问题。

固定次序分组报表

这类报表的特点是用户要求分组次序固定,而数据库中并未存储相应的分组字段。如:要统计长三角地区、珠三角地区以及环首都经济圈内客户的订单情况。数据库客户表中只有城市(如:北京、上海、石家庄)和地区(如:华北、东北、华南)字段,如果单纯为该报表在数据库里增加另外一个地区字段显然是不值得的,所以任务自然落到报表端了。

下面通过一个实例来说明使用润乾报表实现这类报表的过程,报表样式如下:

要求:

1、  根据源数据中的城市分区分组汇总,其中:

环首都经济圈包括:[北京,天津,张家口,承德,保定,廊坊,唐山,秦皇岛,衡水,沧州,石家庄]

长三角地区包括:[上海,南京,苏州,无锡,常州,镇江,南通,扬州,泰州,杭州,宁波,湖州,嘉兴,绍兴,舟山,台州]

珠三角地区包括:[广州,深圳,珠海,佛山,江门,东莞,中山,惠州,肇庆]

其他城市列为其他地区;

2、报表显示的地区顺序固定,即上图所示顺序显示,这里显然无法通过按字母顺序升降来排序。

实现

该类分组报表主要使用润乾报表的ds.overlap()函数实现,报表模板及其表达式如下:

其中,A2的表达式为:

=ds1.overlap(true,城市 in list("北京","天津","张家口","承德","保定","廊坊","唐山","秦皇岛","衡水","沧州","石家庄"),"环首都经济圈",城市 in list("上海","南京","苏州","无锡","常州","镇江","南通","扬州","泰州","杭州","宁波","湖州","嘉兴","绍兴","舟山","台州"),"金三角",城市 in list("广州","深圳","珠海","佛山","江门","东莞","中山","惠州","肇庆"),"珠三角","其他")

这里可以看到ds.overlap()函数的强大,对于固定的分组以及分组下成员较少的情况尤其适用。但当分组或分组成员过多时,继续使用该函数的可读性就太差了,难于维护;此外,本例中看到的是一层分组,如果要实现多层固定次序分组报表,ds.overlap()函数则无法直接实现。下面看一个例子。

多层固定次序分组报表

再修改一下上例的报表需求,要求按地区和城市分组,且地区和城市的展现顺序固定,如下顺序(没有则不显示):

环首都经济圈包括:[北京,天津,张家口,承德,保定,廊坊,唐山,秦皇岛,衡水,沧州,石家庄]

长三角地区包括:[上海,南京,苏州,无锡,常州,镇江,南通,扬州,泰州,杭州,宁波,湖州,嘉兴,绍兴,舟山,台州]

珠三角地区包括:[广州,深圳,珠海,佛山,江门,东莞,中山,惠州,肇庆]

报表样式如下:

该报表由于存在两层固定次序分组(地区、城市),所以无法使用ds.overlap()直接实现,需要先将地区在报表中列出,继而通过ds.overlap()实现,报表模板及其表达式如下:

其中,B2、B3、B4表达式分别为:

B2:=ds1.overlap(true,城市=="北京","北京",城市=="天津","天津",城市=="张家口","张家口",城市=="承德","承德",城市=="保定","保定",城市=="廊坊","廊坊",城市=="唐山","唐山",城市=="秦皇岛","秦皇岛",城市=="衡水","衡水",城市=="沧州","沧州",城市=="石家庄","石家庄")

B3:=ds1.overlap(true,城市=="上海","上海",城市=="南京","南京",城市=="苏州","苏州",城市=="无锡","无锡",城市=="常州","常州",城市=="镇江","镇江",城市=="南通","南通",城市=="扬州","扬州",城市=="泰州","泰州",城市=="杭州","杭州",城市=="宁波","宁波",城市=="湖州","湖州",城市=="嘉兴","嘉兴",城市=="绍兴","绍兴",城市=="舟山","舟山",城市=="台州","台州")

B4:=ds1.overlap(true,城市=="广州","广州",城市=="深圳","深圳",城市=="珠海","珠海",城市=="佛山","佛山",城市=="江门","江门",城市=="东莞","东莞",城市=="中山","中山",城市=="惠州","惠州",城市=="肇庆","肇庆")

可以看到,对于多层固定次序分组报表润乾报表也是可以实现的,只是表达式相对复杂,当(地区)分组较多的时候,这种实现的代价会相对较高。

对于上述三类预置分组报表,润乾报表均可以实现,有些做起来也很简单,这也是润乾报表的强大之处(其它报表工具将会更为困难)。但对于一些更复杂的情况,无论是边界包含无规律、表达式过于复杂,还是多层预置分组难于实现,使用润乾报表解决起来就都不那么轻松了。究其原因,是因为报表工具把数据源准备和呈现混在一起导致(需要在报表模板中编写大量复杂计算逻辑),如果能将这两部分分开,则会使报表制作变得清晰、简单。

为解决这些问题,润乾公司对润乾报表进行了完善,推出润乾集算报表5.0版,在保留了润乾报表已有优势的前提下,还在其中内置了独立的计算引擎:集算器,用于解决数据源准备问题。在集算报表中可以将复杂的数据计算(数据源准备)工作交由集算器完成,可将其视为报表的计算层;而报表本身只负责接收计算结果后进行展现(有时包括一些简单计算),从而将数据源准备和报表呈现分开,使得报表制作更为清晰。

下面用集算报表再实现上述三个例子:

按段分组报表

与润乾报表实现时不同之处在于,这里考虑边界无规律的情况,即:

【1996年圣诞前:date < 1996-12-25

1996年圣诞--1997年国庆:1996-12-25 <=date <= 1997-10-1

1997年国庆--1998年五一:1997-10-1 <= date<= 1998-5-1

1998年五一以后:date>1998-5-1】

起始和结束两段不包含段界日期,而中间的各个分段则包含。

编写计算脚本

首先使用集算器编写计算脚本,完成分组并返回分组汇总结果:

A1:取出订单明细表数据

A2:按照arg1指定的分段进行分组

A3:再按照地区分组,并进行分组汇总计算订单数量和订单金额

A5:为结果集增加时间段字段,即每个分段的显示名称,如:“1996年圣诞前”、“1998年五一以后”

A6:为报表返回的ResultSet

报表调用

使用集算报表设计器,新建报表,使用“集算器”数据集类型,选择上面编辑好的集算脚本(按段分组.dfx)

其中,arg1、arg2为集算脚本参数,param1和param2为报表参数。

设置报表模板及其表达式如下:

在报表中只进行简单的分组汇总,即可完成报表的制作。

使用集算报表实现的最大好处是灵活,无论段界包含与否,均可以使用P.enum()函数实现。所以这里看到,在集算报表中将数据准备(集算脚本)和报表呈现(报表模板)分开带来的好处,在计算层通过集算器完备的计算体系完成数据源准备的工作,在展现层通过报表模板专司展现,层次清晰、实现简单。

下面给出剩余两类报表的实现方法,其他不再赘述。

固定次序分组报表

编写集算脚本

A6:增加地区字段,并在A9中根据城市判断并填充地区信息

A8:按照预置地区顺序对位分组,保证地区顺序满足要求

A9:计算各组汇总值

A10:为报表返回结果集

报表调用

设置报表模板及表达式

相对润乾报表的实现,在集算报表中可以逐步(分步编写代码)实现,从而避免过于冗长的表达式带来的编写和维护问题;而且集算器对集合运算的有效支持使得实现更加简单,如这里通过P.align()函数对订单数据按照固定顺序的地区集合进行对位分组,继而完成汇总的代码就体现了对集合运算支持的有效性和简单性。无论对于开发实现,还是后期报表维护都非常容易。

多层固定次序分组报表

编写计算脚本

在A8中按照指定的城市顺序排序(此时地区也已有序),最后通过A9将排序后的结果集(明细数据)返回给报表。

报表调用

设置报表模板及表达式

本例则进一步体现了集算报表中内置的集算器的强大计算能力,对于无法直接在报表工具中完成的多层固定顺序的分组计算,在集算器中通过前面提到的灵活、分步以及本例中完备的计算能力等特点,使实现变得非常简单。

润乾报表实现预置分组报表及改进

时间: 2024-10-30 08:52:31

润乾报表实现预置分组报表及改进的相关文章

润乾集算报表如何实现报表分组内排序

报表开发中,经常会碰到一些需要进行非常规统计的报表,预置分组.可重复分组.组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源.以及需要对数据源再计算.这些报表本身具备一定的特殊性,使用常规方法往往难于实现. 本文通过一个例子来了解集算报表在制作此类特殊统计报表的便捷过程. 报表说明 根据销售管理系统数据统计某年客户所在地区的订单总额,地区并按订单总额降序排列,要求每个地区中显示销售额在前五名的销售人员及其订单数量和订单金额,其他人员归入"其他"项中.报表样式如下: 应该注意的

润乾集算报表非常规统计之组内排序

报表开发中,经常会碰到一些需要进行非常规统计的报表,预置分组.可重复分组.组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源.以及需要对数据源再计算.这些报表本身具备一定的特殊性,使用常规方法往往难于实现. 而集算报表在完成这类特殊统计报表时则比较简单,这里来看下使用集算报表完成组内排序报表的实现过程. 报表说明 根据销售管理系统数据统计某年客户所在地区的订单总额,地区并按订单总额降序排列,要求每个地区中显示销售额在前五名的销售人员及其订单数量和订单金额,其他人员归入"其他"

润乾报表的组成和变迁

产品发展 润乾公司在润乾报表3.x中首次应用了非线性报表模型,并在该版本的实践过程中积累了丰富的工程化经验.在这些基础上开发出的润乾报表5.x,实现了理论模型和工程实践的完美结合,不仅保持原有的开发高效性,运算性能指标也有了大幅度提高,成为一款经典的报表工具软件. 产品在应用过程中不断有新的需求加入,而且在完善过程中也难以对仍在快速积累中的需求进行深入梳理,润乾报表5.x逐步发展成融合了固定报表.自助报表和填写表单这三项主要功能的庞大体系. 随着应用经验的进一步丰富,我们逐渐意识到,报表工具的这

使用多级分组报表展现分类数据

当你走进便利店,你会发现所有的商品都是按类排放的,分类排放可以帮助您快速找到同类商品,也可以快速发现你想要的商品. 当去饭店吃饭的时候,菜单上的菜也是按类别排列的,比如凉菜,热菜,汤类,主食等.点菜时你会直接翻到你想要的那一类菜单,点菜. -- 通过上面场景,大家就理解分组呈现数据的好处了,分组可以帮助快速定位,方便数据查找,汇总,分析数据趋势等.有时候分析某一单一的商品并无价值,所以采用分组是最常见也是最简单的数据分析手段. 分组报表则是在报表中使用分组功能,是工作中最常用的报表类型,分组功能

润乾报表实现可重复分组报表及改进

可重复分组报表是报表开发中比较常见和麻烦的任务.可重复分组报表是指同一记录出现在不同的分组中被重复统计,常见的可重复分组报表有两类:一类是分组区间有交集,如:统计年龄段在20-30岁.25-35岁.30-40岁之间的用户数量:另外一类是分组区间有包含关系,如:统计各地区以及该地区主要城市的汇总数据,"华北,其中北京:华东,其中上海--". 下面通过两个实例来看一下润乾报表的实现过程. 实例一 根据员工基本信息表按年龄统计各年龄段区间的人数.奖金等汇总情况.报表样式如下: 这里"

润乾集算报表非常规统计之按段分组

报表开发中,经常会碰到一些需要进行非常规统计的报表,固定分组.可重复分组.组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源.以及需要对数据源再计算.这些报表本身具备一定的特殊性,使用常规方法往往难于实现. 对于按段分组报表,各段之间可以有重复,也就可能出现按段可重复的分组报表.集算报表在完成这类特殊统计报表时比较简单,这里通过一个实例说明实现过程. 报表说明 根据员工基本信息表按年龄统计各年龄段区间的人数.奖金等汇总情况.报表样式如下: 这里"30-40岁"和"3

润乾集算报表使用远程HTTP数据源的示例

报表的数据来源多种多样,有时会接收来自HTTP服务器的数据进行报表展现,一般报表工具只能通过报表自定义数据源使用高级语言(如JAVA)进行处理,实现较为复杂.集算报表简单地通用集算器接收HTTP数据源完成报表展现.这里通过一个实例说明. 学生成绩信息存储在远程的JSON格式文件中,其所在HTTP服务器对外提供统一HTTP访问接口,现需要读取学生成绩信息开发报表,汇总学生成绩并按总成绩排名.报表样式如下: JSON文件中包含班级.编号.姓名.学科.成绩等信息,格式如下: [ { "class&qu

用润乾集算报表实现实时报表(T+0)的方案

在报表项目中,客户越来越关注源数据的实时性,希望看到最新发生的数据在报表中体现出来.但是,传统的报表工具+数据仓库+ETL方式很难做到这一点,往往是只能看到昨天.上周甚至是上个月的情况,也就是T+1.T+7.T+30统称T+n报表.很难实现T+0报表,也就是能体现实时信息的报表. 分析其原因在于:1.如果报表的历史数据和最新数据都从客户的生产系统读取,虽然可以实现T+0报表,但是会对生产数据库造成压力,影响客户的业务.2.如果采用数据仓库的方式,那么ETL从生产库中取出数据,需要较长的"窗口时间

润乾报表教程-集算报表优化计算过程

报表作为数据统计分析软件,当它出现性能问题需要对数据源计算进行优化时,执行路径难以控制是阻碍报表优化的难题之一.这是由于数据库执行路径不透明,程序员很难甚至无法干预执行路径,也就难以提高数据库的性能.而一般报表工具不具备强计算能力,大部分计算仍然要依靠数据库进行,这就导致很多报表优化效果不理想. 不同于一般报表工具,润乾集算报表内置了专门用于数据计算的集算引擎,开发人员可以通过编写集算脚本完成报表数据源准备.与数据库执行SQL路径不可控相比,集算脚本的执行过程是可控的,开发人员可根据实际情况编写