跨行组计算类报表在报表开发中非常常见,如常见的同期比、环比计算、移动平均值计算等。这类报表由于经常要引用其他行列的数据进行相对/绝对位置运算,使得报表工具在实现时并不轻松。功能相对强大的润乾报表需要借助层次坐标和位移坐标,辅以条件表达式和“$”运算符完成,书写和理解都有相当的难度。
其实通过集算器这类报表则非常容易实现,我们来看一个例子。
报表需求:根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比,样式如下:
这里应该注意的是比去年同期是指与去年同月份的比值,无对应月份则为空;要求只显示本年数据。
集算器代码
A1:建立数据库连接;
A2:执行sql,根据指定年份从订单和订单明细表读取本年和去年订单数据;
A3:按订购日期升序排序;
A4:按照订购日期的年份和月份分组,并汇总订单金额;
A5:增加计算字段“比上期”,即本月金额/上一订单月金额;
A6:按照订购日期的月份升序排序;
A7:增加计算字段“比去年同期”,即本年本月金额/去年本月金额;
A8:选出指定年份的数据;
A9:为报表返回结果集;
报表调用
集算器作为单独的计算中间件为报表提供数据源,展现的工作仍然由报表工具完成。以润乾报表为例,制作报表及展现。
数据集设置
采用类存储过程的调用方式,图中“同比环比”即为集算器脚本(dfx)名称。
其中arg1为报表参数,即指定年份。
报表模板及表达式
如果仅用报表工具实现呢?这里给出两种润乾报表常用的实现方法:
1、多数据源+隐藏列
由于只显示指定年份统计数据,故需要建立两个数据集分别读取本年和去年的数据后,在报表表达式中进行关联运算。
并设置D列隐藏,以便在报表展现时不显示去年数据。
我们看到这种方法除了要使用多数据集外,还要设置隐藏列,无论从报表开发还是报表性能上都不高。
2、单数据源+隐藏行列
通过按订购年月分组,使用润乾报表提供的位移坐标,辅助以隐藏行列的方式实现。
这种方式虽然避免了多源,但是仍然要靠隐藏行列实现,而且E3中计算同期比的计算表达式过于难书写和理解(要理解主格附属格的概念、位移坐标的使用以及如何在格集表达式中引用当前格的主格),这种实现方式也不理想。
通过上面的比较可以看到集算器在实现该类逻辑上的便利,分步计算,语法简单,而且由于计算时不带有任何展现属性(报表计算时带有边框、颜色、字体大小等展现属性),计算结果直接输出给报表,从而也避免了报表工具直接实现时额外的性能开销。