润乾报表实现预置分组报表及改进
- 格式:pdf
- 大小:698.20 KB
- 文档页数:7
润乾报表4.0产品手册企业级报表工具的理想选择北京润乾信息系统技术有限公司目录1、产品构成 (4)1.1产品构成图 (4)1.2产品构成 (4)2、核心优势 (6)2.1类Excel界面模型 (6)2.2非线性报表模型 (6)2.3强关联语义层模型 (8)2.4多源填报模型 (10)3、功能特点 (11)3.1报表设计 (11)3.2报表展现 (11)3.3数据填报 (15)3.4通用查询 (15)3.5即时报表 (16)3.6OLAP分析 (17)3.7报表分析 (18)3.8报表管理与调度 (18)3.9全面的部署集成方法 (19)3.10开发接口 (19)4、优势服务 (21)4.1我们的优势 (21)4.2服务与支持 (21)5、支持环境 (22)6、典型客户 (23)北京润乾信息系统技术有限公司简介北京润乾信息系统技术有限公司是北京市海淀高科技园区内的高新技术企业、软件企业,主要从事企业级报表工具产品的研发和推广。
润乾公司一直致力于在平台产品领域的探索,我们一直认为,报表在应用系统中是非常重要、不可缺少的组成部分,高效的报表工具不仅可以大大提高应用系统开发商的开发效率,而且可以使最终用户能够真正参与到报表的设计和修改中,从而不断灵活适应实际业务需要。
经过几个版本的积累和努力,润乾公司于2004年2月推出润乾报表3.0,率先实现了零编码处理复杂非线性报表的方式,配合以类EXCEL的绘制方式,润乾报表的制表效率数倍于以国外产品为代表的传统工具,且在展现输出、填报、集成性等细节方面也有全面超越,成为报表领域的新一代革命性产品。
在随后的版本中,润乾公司继续不断创新,相继推出了多源填报模型和强关联语义模型,大大扩展了报表工具的应用范围,改进了报表工具的应用方式,引领了报表工具的发展。
润乾公司深信,面对中国这样一个多样化需求、快速增长的软件市场,是可以以应用需求为基础、发挥中国人的智慧和创造力,做出优秀的报表工具,在企业级平台产品市场与国外厂商竞争的。
润乾报表优化与性能管理润乾报表优化与性能管理编制者:吴国邦⽬录第⼀章、报表优化 (4)1. 灵活应⽤多数据集 (4)1.1.1. ⽹格式、分组式、交叉式尽量⽤单数据集 (4)1.1.2. 多源分⽚、主⼦报表尽量⽤多数据集 (6)2. 写sql的技巧 (8)2.1.1. 尽量在sql⾥进⾏group (8)2.1.2. 尽量不⽤select * from (10)2.1.3. 尽量在sql⾥排序 (10)2.1.4. 尽量在sql⾥过滤 (10)2.1.5. ⼤数据量可以采⽤存储过程 (11)3. 当前⾏、当前组的概念 (11)3.1.1. select函数 (11)3.1.2. select1()函数 (12)3.1.3. group函数 (13)4.写表达式的技巧 (15)4.1. or/|| 操作符 (15)4.2. and/&& 操作符 (15)4.3. 过滤条件 (16)4.4. ⼆分法查找函数bselect1 (17)4.5. 巧⽤空值判断nvl (19)4.6. 数据类型的考虑 (20)5. 枚举分组 (21)5.1. enumgroup函数 (21)5.2. plot函数 (23)6. 如何减少冗余单元格占⽤内存 (26)6.1. 空⽩单元格的应⽤ (26)6.2. 慎⽤隐藏⾏列 (27)6.3. 慎⽤合并单元格 (27)第⼆章、性能管理 (29)7.单⽤户缓存 (29)7.1.1. 概念定义 (29)7.1.2. 功能背景 (29)7.1.3. 使⽤⽅法 (30)7.2. 多⽤户间共享缓存 (31)7.2.1. 概念定义 (31)7.2.2. 功能背景 (31)7.2.3. 控制⽅式 (32)7.2.4. 使⽤⽅法 (33)7.3. 静态并发控制 (35)7.3.1. 概念定义 (35)7.3.2. 功能背景 (36)7.3.3. 使⽤⽅法 (36)7.4动态并发控制 (37)7.4.1. 概念定义 (37)7.4.2. 功能背景 (37)7.4.3. 使⽤⽅法 (37)7.5. ⼤报表运算中断 (39)7.5.1. 概念定义 (39)7.5.2. 功能背景 (39)7.5.3. 使⽤⽅法 (39)7.6. 集群时缓存同步 (40)7.6.1. 概念定义 (40)7.6.2. 功能背景 (40)7.6.3. 使⽤⽅法 (41)8.7. 表达式预解析 (43)8.7.1. 概念定义 (43)8.7.2. 功能背景 (43)8.7.3. 使⽤⽅法 (44)第⼀章、报表优化1. 灵活应⽤多数据集1.1.1. ⽹格式、分组式、交叉式尽量⽤单数据集看如下的报表:图 1.1.这是⼀个⽐较典型的多层交叉报表,其做法有两种:第⼀种:图 1.2.这种做法设计了五个数据集,每⼀层的表头都来⾃⼀个码表,交叉点的数据汇总时根据条件和表头关联第⼆种:图 1.3.这种做法只设计了⼀个数据集,把码表和事实记录表叉乘起来,在报表中进⾏分组扩展我们试⽐较⼀下两种做法的优缺点:第⼀种做法:1.数据集不需要对多表进⾏叉乘,取数速度快2.事实记录数据集可以在sql⾥先进⾏分组聚集操作,减少取过来的记录书,加快取数的速度和报表运算速度3.表头扩展直接对码表进⾏select操作,运算速度快4.交叉点汇总需要对事实记录表进⾏检索遍历,查找出和表头关联的记录进⾏汇总,交叉点的格⼦数远远⼤于表头单元格的个数,事实记录表的记录数也⼀般远远⼤于码表的记录数,每个交叉点都要对事实记录表遍历检索⼀次,运算速度⾮常慢第⼆种做法:1.数据集需要对码表和事实记录表进⾏叉乘,取数速度慢,但是⼀般情况下码表的字段数只有⼀两个,⽽且数据库有索引,记录数不是⾮常⼤的情况下慢不了很多2.在数据集sql⾥就可以对表头字段先进⾏分组聚集,这样取过来的记录数⼤⼤减少,加快了取数速度和报表的运算速度3.表头单元格是对事实记录表进⾏分组操作,然后再扩展,⽐第⼀种做法慢⼀些,但是由于对数据集只要进⾏⼀次的分组操作,因此慢不了太多4.交叉点汇总不需要再对事实记录表进⾏检索遍历了,⽽是直接对当前组集⾥的记录进⾏汇总,因此速度⼤⼤提⾼了总结:第⼆种的做法性能优于第⼀种1.1.2. 多源分⽚、主⼦报表尽量⽤多数据集看如下报表:图 1.4.这是⼀个⽐较典型的主⼦报表,主表⼀条记录对应⼦表多条记录,是个典型的⼀对多的关系,再引伸⼀下,⼀个主表可以对应多个⼦表,每个⼦表都是多条记录。
润乾集算报表开发多源分片报表使用润乾集算报表可以开发多源分片报表,在同一报表中的不同部分可以包含不同数据来源。
集算报表提供的扩展模型和主格模型让这类报表开发非常简单。
下面通过具体实例来来看一下多源分片报表的开发过程。
业务系统中的某类订单统计表中统计了多个维度订单情况,如下图示:该报表由多个独立的片区组成,且每个片区内的数据来源不尽相同。
这就是一个典型的多源分片报表。
使用集算报表制作步骤如下:连接数据源使用集算报表设计器,连接自带数据源DEMO。
设置数据集新建报表并设置数据集,由于数据来源不同,需要设置多个数据集。
各数据集SQL如下:ds1: SELECT 客户.地区,客户.城市,订单明细.数量,订单明细.折扣,订单明细.单价,订单.雇员ID,订单.订购日期,订单明细.产品ID FROM 订单明细,订单,客户WHERE 客户.客户ID = 订单.客户ID AND 订单.订单ID = 订单明细.订单ID and 订单.订购日期is not null and 客户.地区in ('华南','西南') and year(订单.订购日期)>=1998ds2: SELECT 类别.类别ID,类别.类别名称FROM 类别ds3:SELECT 雇员.雇员ID,订单明细.产品ID,雇员.职务,雇员.姓氏||雇员.名字as 姓名FROM 雇员,订单,订单明细WHERE 雇员.雇员ID = 订单.雇员ID AND 订单.订单ID = 订单明细.订单ID ORDER BY 订单.订购日期ASCds4: SELECT 产品.类别ID,产品.产品ID FROM 产品编辑报表表达式根据目标报表样式,分别设置每片区报表表达式。
其中:A1-E4按日期维度汇总了每个地区的销售额;A5-E6按销售人员维度汇总了每个地区的销售额;F1-G4按日期维度汇总了每类产品的销售额;F5-G6按销售人员维度汇总了每类产品的销售额。
润乾报表实现组内排序报表及改进报表开发中经常会遇到需要进行组内排序的报表,如按月份的分组汇总值排序显示,并显示每月销售额前十名的记录。
使用报表工具一般通过隐藏行列辅助可以实现,下面通过实例说明润乾报表的实现过程,以及改进方案。
报表需求根据销售管理系统数据统计客户所在地区的订单总额,地区并按订单总额降序排列,要求每个地区中显示销售额在前五名的销售人员及其订单数量和订单金额,其他人员归入“其他”项中。
报表样式如下:这里应该注意的是地区分组中如果销售人数少于5个则不显示“其他”项(如上图中的西北地区)。
润乾报表实现润乾报表实现主要依靠条件隐藏行实现,根据分组成员数量是否显示“其他”项,报表模板及表达式如下:在润乾报表中,使用ds.group()的多个参数,结合条件判断隐藏行,多种使用方法结合完成了报表开发,可见润乾报表的强大之处。
但是由于要按照分组后汇总的订单金额排序,所以在B3的分组表达式中应用ds1.sum(订单金额)表达式作为ds.group()的参数,对于原始数据量较大的情况下,该表达式效率较低;而且,由于只显示前5名销售,在C3(排名)和D3(其他)中设置了隐藏行表达式,对于分组较多的情况仍然会存在性能问题;另外需要在E3和F3中使用格集过滤表达式计算其他销售人员合计,计算时要带着单元格属性计算,效率仍然不高。
上述提到的问题在传统报表工具中皆是存在的,原因在于数据计算(报表数据源准备)与报表呈现混在一起导致,开发人员不得不再报表中编写较复杂的计算逻辑以完成报表开发,造成报表开发和运行效率都不高。
如果能将两部分分开,势必能提升开发和运行效率。
润乾公司在润乾报表的基础上,推出了可以完全满足复杂报表开发的集算报表,其内置了用于完成报表数据计算(数据源准备)的集算器,从而将数据计算和报表呈现剥离开,进一步梳理了报表开发流程,使得报表开发变得更加清晰。
上述报表需求使用集算报表可以这样完成:集算报表实现编写集算脚本使用集算脚本编辑工具完成计算脚本,并为报表输出计算后结果集:A1:执行sql得到初步汇总订单数据A2:按照地区分组后组内成员按订单金额排序A3-C7:循环A3,取前五名记录,并将超过第五的记录都归入“其他”项,结果写回A3A8:结果按地区总额降序排列后返回给报表报表调用使用集算报表设计器,新建报表,使用“集算器”数据集类型,选择上面编辑好的集算脚本(sort.dfx)报表模板及表达式报表模板中根据集算脚本返回的结果集,分别取得地区分组和销售列表等数据,无需复杂表达式即完成报表开发。
润乾报表3.0介绍润乾报表 3.0是用于统计报表制作及报表及数据填报的大型企业级工具软件。
产品首次成功解决了报表单元格与关系数据库之间的关联规律性,特别适合于中国式报表的填报和统计。
一、产品优势1.绘制方便润乾报表采用类EXCEL的绘制方式,真正做到所见即所得,把程序员从繁重且无聊的报表格式设置工作中解脱出来,极大的提高的表格绘制的方便度和效率,产品特有的EXCEL导入功能(包括格式)可充分利用业务人员原有积累。
2.数据模型先进润乾报表独创的数据模型首次成功地解决了中国报表中单元格与数据字段之间的弱关联性,彻底打破传统行式报表方案,报表行列完全对称,特有的层次扩展机制使多层分组及交叉报表制作非常简单,提供针对关联格的跨行跨组运算,很容易计算小计、同期比等数据。
同一报表中支持多个异构的数据源,允许报表各片之间无关,可用多个简单的数据集成组合出复杂报表,程序员无须再为每张报表编程(脚本或存储过程)或写复杂SQL准备数据。
3.输出能力丰富润乾报表每个单元格属性均提供条件控制,如颜色、行高、是否可见等均可与格内数据相关;支持代码显示值对应、多种数据格式、图片文件和图片字段的处理。
产品提供十几种各类统计图,支持PNG/GIF/JPG三种格式。
每张报表均可生成HTML、EXCEL、PDF三种输出格式(输出结果完全不失真,包括其内的统计图)。
单元格与统计图例均可加带参数的链接从而实现数据钻取功能,多层报表可在线收缩展开。
4.打印控制强大润乾报表提供强大的打印控制功能,按行数和纸张大小分页分栏或强制分页,表头自动重复(包括左表头),允许一张纸上打多个报表,提供末页补足空行。
可采用像素和毫米两种计量单位,独创的底图描绘功能以支持套打;5.集成性好润乾报表采用纯JAVA开发,利用服务器端提供丰富的API调用和标记可完全无缝地嵌入到基于J2EE的应用程序中(可看作应用程序员自己写的代码),程序员可更换报表的数据库连接和数据源、采用应用服务器的连接池管理;设计器也提供外置的数据源和数据字典定义,可由应用程序员提供这些信息。
润乾报表之分组
这次任务是要实现报表分组,设计图如下↓
预览效果图如下↓
这次主要是有俩个分组,并且还有序号。
尝试直接写分组函数在单元格C5但是没有⽣效。
解决⽅案:
1、在A5写了⼀个隐藏的列,单元格属性【可视】勾掉即可;此时的效果是看不到A5
2、将G5的分组语句【=DATA.group(APPLICATION_NO;APPLICATION_NO:-1)】放在A5⾥⾯;
3、将G5的左主格设置为A5;此时的效果,识别码字段已经事倒叙排列
4、C5的分组语句正常写,左主格设为A5;此时的效果是批号字段也⼜来分组效果
5、B5⽤来显⽰序号,【=seq(D9)】设置左主格为D9;此时的效果即为预览效果图
PS:这⾥说⼀下group函数,函数后⾯的数字有俩个值-->1、-1使⽤来排序的设置,默认是1即正序,-1是倒序。
润乾报表集算报表5.0在保留润乾报表V4.x的核⼼功能外,进⾏了优化和精简,其中报表函数也做了适当优化,这⾥就常见计算来⽐较⼀下⼆者函数语法之间的差异。
对⽐函数⼀览表1、数据集函数1.1、ds.group()润乾报表:datasetName.group(selectExp{,descExp{,filterExp{,sortExp{,groupSortExp{,groupDescExp{,rootGroupExp}}}}}})集算报表:datasetName.group(<selectExp>{,filter_exp};{sort1}{:order1},…;{groupSortExp }:{ groupOrderExp })选项:@r 是否root数据集表达式。
主要改变:1、增加@r函数选项,取代原rootGroupExp表达式参数;2、取消分组前记录的排序顺序descExp参数;3、更改排序表达式和排序顺序参数语法。
举例:1.2、ds.select()/ds.select1()润乾报表:datasetName.select( <select_exp>{,desc_exp{, filter_exp{, sort_exp{,rootGroupExp}}}} )datasetName.select1(selectExp{,filterExp{,rootGroupExp}})集算报表:将原ds.select()和ds.select1()合并为ds.select(),语法如下:datasetName.select(<select_exp>{:order_exp},{ filter_exp },{num_exp},{distinct_exp})选项:@r 是否root数据集表达式。
主要改变:1、增加@r函数选项,取代原rootGroupExp表达式参数;2、取消数据的排序顺序descExp参数;3、更改排序顺序参数语法。
目录1. 前言1.1. 使用对象1.2. 文档目的2. 入门2.1. 制作一张报表的步骤2.2. 启动报表设计器2.3. 选择设计器授权2.4. 连接数据源2.5. 一张最简单的报表2.6. 将报表发布到web上3. 网格式报表3.1. 网格式报表,体会扩展3.2. 显示格式、显示值3.3. 报表区域3.4. 设置预警条件3.5. 增加动态背景色3.6. 取数排序3.7. 导出excel3.8. 内建数据集3.8.1. 内建数据集的概念3.8.2. 内建数据集的用途3.8.3. 编辑内建数据集3.8.4. 内/外部数据集的转换4. 参数4.1. 参数的概念4.2. 参数的使用4.3. 参数模板设计4.4. 将报表和参数模板结合起来发布5. 行式报表5.1. 行式报表的概念5.2. 把网格报表变成行式报表6. 分组报表6.1. 分组报表,体验主子格概念6.2. 多层分组6.3. 汇总统计6.3.1. 分组汇总6.3.2. 汇总样式变换16.3.3. 汇总样式变换26.3.4. 汇总样式变换36.4. 组表头重复6.5. 计算列的汇总6.6. 三维饼形统计图,初步了解统计图的使用6.7. 跟随扩展的统计图7. 交叉报表7.1. 交叉报表,体会横向扩展7.2. 多层交叉,深入了解扩展7.3. 汇总统计,深入了解汇总规则7.4. 定位与拉伸7.5. 柱形统计图,与交叉报表的结合7.6. 跟随扩展的统计图8. 自由报表8.1. 自由格式的报表,深入了解主格概念8.2. 图片字段9. 主子表9.1. 单表式主子报表9.2. 嵌入式主子报表9.3. 引入式主子报表10. 打印10.1. 打印设置10.1.1. 纸张与方向10.1.2. 打印缩放10.1.3. 页边距与对齐10.1.4. 镜像打印10.2. 分页10.2.1. 页眉页脚、表头表尾等的打印方式10.2.2. 分页方式10.2.3. 强制分页10.3. 分栏10.3.1. 业务背景10.3.2. 实际操作10.4. 套打10.4.1. 业务背景10.4.2. 实际操作11. 宏11.1. 宏的概念11.2. 实例11.3. 参数与宏的区别,在web上如何使用宏12. 动态参数的应用12.1. 需求背景12.2. 1实例介绍12.3. 总结12.4. 临时变量13. 动态宏的应用13.1. 需求背景13.2. 实例介绍13.3. 总结14. 高级统计图14.1. 双轴柱线图14.2. 双轴折线图14.3. 时间走势图14.4. 时序状态图14.5. 甘特图14.6. 仪表盘14.7. 雷达图14.8. 里程碑图14.9. 工字图14.10. 全距图京C备05019289号版权信息@CopyRight 北京润乾信息系统技术有限公司第 1 章前言上一页下一页第 1 章前言目录1.1. 使用对象1.2. 文档目的1.1. 使用对象润乾报表V4.5初级教程适用于对报表业务有一定的了解,需要学习润乾报表的初学者。
润乾报表实现预置分组报表及改进预置分组报表在报表开发中比较常见而且比较棘手。
所谓预置分组报表是指分组没有规律,可能是分组范围没有规律,也可能分组顺序没有规律,需要报表开发人员事先预置(固定)分组的报表。
常见的预置分组报表一般有如下三类:按段分组报表、固定次序分组报表、多层固定次序分组报表。
下面分别看一下这几类报表的特点,以及润乾报表的实现方法。
按段分组报表这类报表的特点是分段的区间并未在数据库中存储需要根据相应字段(如年龄、日期)计算,并且每个分段可能会发生变化(如每年节假日所在日期可能不同),经常由用户随意指定。
如:统计20-30岁,30-40岁,40-50岁各年龄段的用户数量;每年节假日(春节、端午节、国庆节)期间公路铁路承载的旅客统计。
下面通过实例说明,报表样式如下:该报表是根据订单表统计各(预置)时间段内,各地区的订单数量、订单金额汇总。
其中各时间段范围为:【1996年圣诞前:date <= 1996-12-251996年圣诞--1997年国庆:1996-12-25 <=date <= 1997-10-11997年国庆--1998年五一:1997-10-1 < date <= 1998-5-11998年五一以后: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()函数可以非常方便地实现上述报表,而且可以通过该函数的参数控制是否包含边界,对于分组较少并且边界包含规律的分组报表尤其适用。
分页说明:为方便大家开发,本人在工资系统中作出一个DEMO,经过测试后能正常使用。
先将部分代码与注意事项发给大家看一下第一步:如果该报表需要分页的话,请将下面的<form action="${ctx}/rq/report/showExt"method="post"id="reportForm"> <input type="hidden"name="raq"id="raq"/><input type="hidden"name="param"id="param"/><input type="hidden"name="countSql"id="countSql"/></form>替换掉原先的。
第二步:增加$j("#countSql").val("分页语句");请注意字符串的要写单引号:并且写成如下形式:\\'${字符串}\\'ShowExt.jsp 修改成<report:extHtml name="report1"reportFileName="<%=raq%>"funcBarLocation=""params="<%=param.toString()%>"needPageMark="yes"pageCount="20"totalCountExp="<%=countSql%>"paperHeight="600"/>附录:3.8. 分页计算标签本功能采用报表组的原理来实现,因此需要支持报表组的授权3.8.1. 概念定义使用分页计算标签可以在报表比较大的情况下实现以页为单位对数据进行读取和展现及导出等操作。
润乾报表实现无数据源的规则报表及改进某报表系统中有部分报表需要按照一定规则显示数据,如:显示查询日期范围内的奇数日数据,要求数据库中即使无记录该日期也显示(内容为空)。
本文重点来实现奇数日期序列,数据区不是重点,故置空。
以上述报表需求为例,这里来看一下润乾报表的实现过程,以及改进方法。
润乾报表实现以下为润乾报表的实现方式,考虑跨年和跨月份的情况使用时要对辅助列A列进行隐藏,以及对第2行进行条件隐藏,偶数的日期不显示。
所以报表工具实现要依靠大量隐藏行列。
报表工具实现需要借助隐藏行格完成,主要原因是数据计算和报表呈现混在一起导致,既要完成报表展现,又要兼顾数据计算,往往导致报表计算能力不足。
如果能将数据计算和报表呈现剥离开,那么报表开发将更加快捷。
润乾集算报表5.0是在保留原有润乾报表核心功能的情况下,推出的强计算报表工具,其内置的集算器非常适合完成数据计算,从而将报表数据准备和呈现分开。
本例的需求采用集算报表实现要简单得多,方法如下:集算报表实现编写集算脚本首先使用集算器编写计算逻辑,为报表输出两个日期之间的奇数日。
A1:根据起止日期参数,列出该日期段中的所有日期A2:选出奇数日A3:为报表返回结果集报表调用使用集算报表设计器,新建报表,使用“集算器”数据集类型,选择上面编辑好的集算脚本(time.dfx)设置报表模板及表达式报表中只简单的列表取值即可,无需再完成复杂计算。
由于集算器对集合运算的有效支持,使得从一个集合(所有日期)中选出部分数据(奇数日)非常容易。
不同于在一般报表工具中计算,集算器进行数据计算时不带有任何展现属性,因此效率更高;同时,由于报表端不再包含大量的隐藏格,报表效率得到了进一步提升。
此外,对于代码很简单的脚本,可以不必独立编辑出脚本文件,而使用集算报表内置的脚本数据集,把脚本直接嵌入到报表模板。
方法如下:1、在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”2、在弹出的脚本数据集编辑窗口中编写集算脚本脚本数据集中可以直接使用报表定义的参数,如上述脚本中的begin、end即为报表参数。
润乾报表实现动态数据源报表及改进经常会遇到一些报表需要根据不同的情况(参数)连接不同的数据源从而完成相应的数据的展现,也就是经常说的动态数据源报表。
报表工具通常的做法有两种,一是不同的情况加载不同的数据源连接参数,如:url、driver、username、password等;二是利用已配置的多个连接池,根据不同情况选择。
这里通过一个实例,说明润乾报表的实现过程及改进方案。
报表说明应用中需要通过参数控制报表连接的数据源,当参数flag为1时连接数据源一(db1),否则连接数据源二(db2)。
润乾报表实现首先根据flag参数为context设置不同数据源(这里以两个hsql数据库为例):String flag=request.getParameter("flag");Connection con1 = null;Connection con2 = null;try{Driver driver = (Driver)Class.forName("org.hsqldb.jdbcDriver").newInstance();DriverManager.registerDriver(driver);con1=DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/runqianDB","sa"," ");con2=DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/demo","sa","");}catch (Exception e){e.printStackTrace();}Context cxt= new Context();String defDsName = cxt.getDefDataSourceName ();if ("1".equals(flag) || "1"==flag){cxt.setConnection(defDsName, con1);}else{cxt.setConnection(defDsName, con2);}将cxt存入request:request.setAttribute("myContext", cxt );以context方式发布报表:<report:html name="report1"contextName=”myContext”/>通过使用润乾报表的API可以完成动态数据源报表,详尽的API的确为应用开发人员提供了诸多便利。
润乾集算报表非常规统计之按段分组报表开发中,经常会碰到一些需要进行非常规统计的报表,固定分组、可重复分组、组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源、以及需要对数据源再计算。
这些报表本身具备一定的特殊性,使用常规方法往往难于实现。
对于按段分组报表,各段之间可以有重复,也就可能出现按段可重复的分组报表。
集算报表在完成这类特殊统计报表时比较简单,这里通过一个实例说明实现过程。
报表说明根据员工基本信息表按年龄统计各年龄段区间的人数、奖金等汇总情况。
报表样式如下:这里“30-40岁”和“35-45”岁两个区间是有重复的。
下面来对比一下润乾报表和集算报表实现上的差异。
这个报表的麻烦之处在于需要进行的分组是有重复的,报表要完成较复杂的数据计算工作,但一般报表工具的计算能力较弱,如果采用报表工具本身来完成这个计算工作则会相当复杂,比如采用用润乾报表来实现将会是这样的:在润乾报表中,该类报表主要通过ds.enumGroup()函数完成,报表模板及表达式如下:其中A2单元格表达式为:=ds1.enumGroup(true,age(BIRTHDA Y)>20&&age(BIRTHDAY)<=30,"20岁到30岁",age(BIRTHDAY)>30&&age(BIRTHDA Y)<=40,"30岁到40岁",age(BIRTHDAY)>=35&&age(BIRTHDAY)<45,"35岁到45岁", age(BIRTHDAY)>=45,"45岁以上")润乾报表在实现上使用了ds.enumGroup()函数,在分组较少的时候做起来比较简单,这也是其他报表工具无法比拟润乾报表的方面。
但当分组较多,计算比较复杂的情况下,润乾报表实现起来就比较困难了。
报表使用手册报表使用手册XX 股份有限公司中国济南目录1 概述............................................................................................................................. .- 3 -2 安装...............................................................................................................................-3 -2.1 准备好安装程序...........................................................................................- 3 -2.2 安装中的选项...............................................................................................- 3 -2.3 授权文件配置...............................................................................................- 4 -3 报表制作.......................................................................................................................- 5 -3.1 报表制作要求...............................................................................................- 5 -3.2 制作一张报表的步骤...................................................................................- 5 -3.3 启动报表设计器...........................................................................................- 6 -3.4 连接数据源...................................................................................................- 7 -3.4.1 数据源对话框..........................................................................................- 7 -3.4.2 编辑数据源..............................................................................................- 7 -3.4.3 注意事项..................................................................................................- 9 -3.5 设计报表格式.............................................................................................- 10 -3.5.1 格式设计................................................................................................- 10 -3.5.2 需注意事项............................................................................................- 11 -3.6 定义参数.....................................................................................................- 11 -3.6.1 参数的编辑............................................................................................- 11 -3.6.2 常用参数举例........................................................................................- 12 -3.7 定义宏.........................................................................................................- 12 -3.7.1 宏的编辑................................................................................................- 12 -3.7.2 常用宏举例............................................................................................- 13 -3.8 建立数据集.................................................................................................- 13 -3.8.1 数据集的编辑........................................................................................- 13 -3.8.2 常用数据集举例....................................................................................- 14 -3.9 设置单元格属性.........................................................................................- 16 -3.9.1 数据集在单元格中应用........................................................................- 16 -3.9.2 显示格式................................................................................................- 16 -3.9.3 设置预警条件........................................................................................- 16 -3.9.4 增加动态背景色....................................................................................- 17 -3.9.5 按参数隐藏列........................................................................................- 17 -3.9.6 主格应用................................................................................................- 17 -3.10 报表预览.....................................................................................................- 18 -3.11 报表发布.....................................................................................................- 18 -4 报表部署.....................................................................................................................- 19 -4.1 部署位置.....................................................................................................- 19 -4.2 Web 中显示................................................................................................- 19 -5 重要概念.....................................................................................................................- 20 -5.1 数据源.........................................................................................................- 20 -5.2 数据集.........................................................................................................- 20 -5.3 参数.............................................................................................................- 20 -5.4 宏定义.........................................................................................................- 21 -5.5 单元格....................................................................................................... .- 22 -5.6 主格.............................................................................................................- 22 -6 常用函数.....................................................................................................................- 24 -6.1 数据集函数.................................................................................................- 24 -6.1.1 select() .....................................................................................................- 24 -6.1.2 select1() ...................................................................................................- 24 -6.1.3 count() .....................................................................................................- 25 -6.2 单元格函数.................................................................................................- 25 -6.2.1 if() ............................................................................................................- 25 -6.2.2 row() ........................................................................................................- 25 -6.2.3 value()......................................................................................................- 25 -6.3 字符串函数.................................................................................................- 25 -6.3.1 pos().........................................................................................................- 25 -6.3.2 mid() ........................................................................................................- 25 -6.4 数据类型转换函数.....................................................................................- 25 -6.4.1 dateTime() ...............................................................................................- 25 -6.4.2 str() ..........................................................................................................- 25 -1概述该文档主要满足iES-E200 电量采集系统中自定义报表制作编写。
润乾报表实现预置分组报表及改进预置分组报表在报表开发中比较常见而且比较棘手。
所谓预置分组报表是指分组没有规律,可能是分组范围没有规律,也可能分组顺序没有规律,需要报表开发人员事先预置(固定)分组的报表。
常见的预置分组报表一般有如下三类:按段分组报表、固定次序分组报表、多层固定次序分组报表。
下面分别看一下这几类报表的特点,以及润乾报表的实现方法。
按段分组报表这类报表的特点是分段的区间并未在数据库中存储需要根据相应字段(如年龄、日期)计算,并且每个分段可能会发生变化(如每年节假日所在日期可能不同),经常由用户随意指定。
如:统计20-30岁,30-40岁,40-50岁各年龄段的用户数量;每年节假日(春节、端午节、国庆节)期间公路铁路承载的旅客统计。
下面通过实例说明,报表样式如下:该报表是根据订单表统计各(预置)时间段内,各地区的订单数量、订单金额汇总。
其中各时间段范围为:【1996年圣诞前:date <= 1996-12-251996年圣诞--1997年国庆:1996-12-25 <=date <= 1997-10-11997年国庆--1998年五一:1997-10-1 < date <= 1998-5-11998年五一以后: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-251996年圣诞--1997年国庆:1996-12-25 <= date <= 1997-10-11997年国庆--1998年五一:1997-10-1 <= date <= 1998-5-11998年五一以后: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版,在保留了润乾报表已有优势的前提下,还在其中内置了独立的计算引擎:集算器,用于解决数据源准备问题。
在集算报表中可以将复杂的数据计算(数据源准备)工作交由集算器完成,可将其视为报表的计算层;而报表本身只负责接收计算结果后进行展现(有时包括一些简单计算),从而将数据源准备和报表呈现分开,使得报表制作更为清晰。