资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
润乾报表实现预置分组报表润乾报表实现预置分组报表及改进及改进 预置分组报表在报表开发中比较常见而且比较棘手。 所谓预置分组报表是指分组没有规 律,可能是分组范围没有规律,也可能分组顺序没有规律,需要报表开发人员事先预置(固定) 分组的报表。 常见的预置分组报表一般有如下三类: 按段分组报表、 固定次序分组报表、 多层固定次序分组报表。下面分别看一下这几类报表的特点,以及润乾报表的实现方法。 按段按段分组报表分组报表 这类报表的特点是分段的区间并未在数据库中存储需要根据相应字段(如年龄、日期)计算,并且每个分段可能会发生变化(如每年节假日所在日期可能不同) ,经常由用户随意 指定。如:统计 20-30 岁,30-40 岁,40-50 岁各年龄段的用户数量;每年节假日(春节、端 午节、国庆节)期间公路铁路承载的旅客统计。 下面通过实例说明,报表样式如下: 该报表是根据订单表统计各(预置)时间段内,各地区的订单数量、订单金额汇总。其中各时间段范围为: 【1996 年圣诞前: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 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 1998-5-1】 起始和结束两段不包含段界日期,而中间的各个分段则包含。 编写编写计算计算脚本脚本 首先使用集算器编写计算脚本,完成分组并返回分组汇总结果: A 1 =demo.query(“SELECT 订单.订购日期,订单明细.数量,订单明细.单价,订单明细.折扣, 客户.地区 FROM 订单明细,订单,客户 WHERE 客户.客户 ID = 订单.客户 ID AND 订单.订单 ID = 订单明细.订单 ID“) 2 =A1.enum(arg1.array(),string(订购日期,“yyyy-MM-dd“) 3 =A2.(.groups(地区;count(订购日期):订单数量,sum(单价*数量):订单金额) 4 =arg2.array() 5 =A4.(A3(#).derive(A4.:区间).conj() 6 result A5 A1:取出订单明细表数据 A2:按照 arg1 指定的分段进行分组 A3:再按照地区分组,并进行分组汇总计算订单数量和订单金额 A5:为结果集增加时间段字段,即每个分段的显示名称,如: “1996 年圣诞前”、 “1998 年 五一以后” A6:为报表返回的 ResultSet 报表报表调用调用 使用集算报表设计器,新建报表,使用“集算器”数据集类型,选择上面编辑好的集算脚本(按段分组.dfx) 其中,arg1、arg2 为集算脚本参数,param1 和 param2 为报表参数。 设置报表模板及其表达式如下: 在报表中只进行简单的分组汇总,即可完成报表的制作。 使用集算报表实现的最大好处是灵活,无论段界包含与否,均可以使用 P.enum()函数实 现。所以这里看到,在集算报表中将数据准备(集算脚本)和报表呈现(报表模板)分开带来的好处, 在计算层通过集算器完备的计算体系完成数据源准备的工作, 在展现层通过报表 模板专司展现,层次清晰、实现简单。 下面给出剩余两类报表的实现方法,其他不再赘述。 固定固定次序分组报表次序分组报表 编写集算脚本编写集算脚本 A B 1 =demo.query(“SELECT 客户.城市,订单明细.数量,订单明细.单价,订 单明细.折扣 FROM 客户,订单,订单明细 WHERE 客户.客户 ID = 订单.客户 ID AND 订单.订单 ID=订单明细.订单 ID“) 2 北京,天津,张家口,承德,保定,廊坊,唐山,秦皇岛,衡水,沧州,石家庄 环首都经济圈 3 上海,南京,苏州,无锡,常州,镇江,南通,扬州,泰州,杭州,宁波,湖州,嘉兴,绍兴,舟山,台州 长三角 4 广州,深圳,珠海,佛山,江门,东莞,中山,惠州,肇庆 珠三角 5 =A2:A4 =B2:B4|“其他“ 6 =A1.derive(:地区) 7 A6.run(B5(ifn(A5.pselect(.pos(A6.城市),4):地区) 8 =A6.aligna(B5,地区) 9 =A8.new(B5(#):地区,.sum(单价*数量):销售额,.sum(折扣*数量*单 价):折扣金额) 10 result A9 A6:增加地区字段,并在 A9 中根据城市判断并填充地区信息 A8:按照预置地区顺序对位分组,保证地区顺序满足要求 A9:计算各组汇总值 A10:为报表返回结果集 报表调用报表调用 设置设置报表报表模板模板及表达式及表达式 相对润乾报表的实现,在集算报表中可以逐步(分步编写代码)实现,从而避免过于冗长的表达式带来的编写和维护问题;而且集算器对集合运算的有效支持使得实现更加简单, 如这里通过 P.align()函数对订单数据按照固定顺序的地区集合进行对位分组,继而完成汇总 的代码就体现了对集合运算支持的有效性和简单性。 无论对于开发实现, 还是后期报表维护 都非常容易。 多层多层固定固定次序次序分组报表分组报表 编写计算编写计算脚本脚本 A B 1 =demo.query(“SELECT 客户.城市,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号