跨行组计算类报表在报表开发中非常常见,如常见的同期比、环比计算、移动平均值计算等。这类报表由于经常要引用其他行列的数据进行相对/绝对位置运算,使得报表实现并不轻松。润乾报表在实现时需要借助层次坐标和位移坐标,辅以条件表达式和“$”运算符完成。下面通过一个实例说明润乾报表的实现方式。
报表需求
根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比。报表样式如下:
这里应该注意的是比去年同期是指与去年同月份的比值,无对应月份则为空;要求只显示本年数据。
润乾报表实现
方法一:多数据源+隐藏列
首先通过两个数据集分别读取今年和去年的数据,在报表模板中进行关联后分别显示两年同月的数据,从而完成比较。
数据集设置
通过ds1和ds2分别取今年和去年数据,数据集设置如下:
报表模板及表达式设置
其中,需要设置D列隐藏,以便报表展现时不显示去年数据。
这种实现方式相对简单,无需复杂的表达式即可实现,但缺点是由于要使用多数据源,从同样数据表中过滤两次分别输出两个数据集,取数效率较低。此外,隐藏列D也会影响报表性能。
方法二:位移坐标+隐藏行列
通过按订购年月分组,使用润乾报表提供的位移坐标,辅助以隐藏行列的方式实现
数据集设置
数据集参数如下:
报表模板及表达式设置
通过这种方式,通过润乾报表中层次坐标的高级写法避免了多源,体现了润乾报表的强大之处,但是仍然要依靠隐藏行列实现,而且E3中计算同期比的计算表达式过于难书写和理解(要理解主格附属格的概念、位移坐标的使用以及如何在格集表达式中引用当前格的主格),这也给报表开发和维护带来了困难。
无论是多数据源,还是层次坐标,依赖隐藏行列,都是因为需要在报表中完成同环比计算导致,而往往这样的计算还比较复杂。这是因为传统报表工具将数据计算(数据源准备)和报表呈现混在一起导致(即使功能强大的润乾报表也不例外),如果将这两部分分开,则会使报表开发更加清晰。
润乾公司在润乾报表的基础上增加了用于复杂数据计算的引擎集算器,形成新一代强计算型报表工具集算报表5.0版,报表模板可只用于报表呈现,将计算和展现分开,梳理了报表结构,使得报表制作更加清晰、简单。
本文中的报表需求,通过集算报表可以采用如下方式实现:
集算报表实现
编写集算脚本
使用集算脚本编辑工具完成同环比计算脚本,并为报表输出计算后结果集:
A1:执行sql,根据指定年份从订单和订单明细表读取本年和去年订单数据
A2:按订购日期升序排序
A3:按照订购日期的年份和月份分组,并汇总订单金额
A4:增加计算字段“比上期”,即本月金额/上一订单月金额
A5:按照订购日期的月份升序排序
A6:增加计算字段“比去年同期”,即本年本月金额/去年本月金额
A7:选出指定年份的数据
A8:为报表返回结果集
报表调用
使用集算报表设计器,新建报表,使用“集算器”数据集类型,选择上面编辑好的集算脚本(orders.dfx)
报表模板及表达式
通过简单的列表直接取得集算脚本的计算结果进行展现。
使用集算报表实现相比润乾报表可以看到这样一些改变:
1、 更加简单。集算脚本可以分步编写,将原本润乾报表中需要写在一个表达式里的复杂计算拆分成多步,逐步实现,降低了问题的复杂度;
2、 更加灵活。集算器具有非常丰富的函数库,同一计算任务可以选择多种方式实现,如分组汇总即可以直接使用A.groups(),又可以先A.group()再汇总;
3、 性能更高。集算脚本计算时不带有任何展现属性(这点和一般报表工具有很大差别),只将计算后的结果集返回给报表进行展现,性能更高;此外,由于集算报表中不再依赖大量影响报表效率的隐藏行列,从而进一步提高了报表性能。
转载于:https://blog.51cto.com/report5/1537427