首页 > 代码库 > 润乾集算报表非常规统计之跨行组运算

润乾集算报表非常规统计之跨行组运算

    报表开发中,经常会碰到一些需要进行非常规统计的报表,固定分组、可重复分组、组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源、以及需要对数据源再计算。这些报表本身具备一定的特殊性,使用常规方法往往难于实现。

    集算报表完成这类特殊统计报表则非常简单,这里通过一个需要完成跨行组计算的报表为例,说明使用集算报表的实现过程。

报表说明

    根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比。报表样式如下:

wKioL1RTItfzLQWZAAE-0grVvDM343.jpg

这里应该注意的是比去年同期是指与去年同月份的比值,无对应月份则为空;要求只显示本年数据

这个报表的麻烦之处在于需要较复杂的数据计算工作,但一般报表工具的计算能力较弱,如果采用报表工具本身来完成这个计算工作则会相当复杂,比如采用用润乾报表来实现将会是这样的:

方法一:多数据源+隐藏列

    首先通过两个数据集分别读取今年和去年的数据,在报表模板中进行关联后分别显示两年同月的数据,从而完成比较。

数据集设置

    通过ds1ds2分别取今年和去年数据,数据集设置如下:

wKiom1RTIn6xfLy3AAE9lxHqVB4527.jpg

报表模板及表达式设置

wKioL1RTItnTGw6zAACfl70rfcE026.jpg

其中,需要设置D列隐藏,以便报表展现时不显示去年数据。

 

    这种实现方式相对简单,无需复杂的表达式即可实现,但缺点是由于要使用多数据源,从同样数据表中过滤两次分别输出两个数据集,取数效率较低。此外,隐藏列D也会影响报表性能。

方法二:位移坐标+隐藏行列

通过按订购年月分组,使用润乾报表提供的位移坐标,辅助以隐藏行列的方式实现。

数据集设置

wKioL1RTItmRLB4OAAE1cGTaBXc770.jpg

数据集参数如下:

wKiom1RTIoChndVoAAHXmWeDJDc365.jpg

报表模板及表达式设置

wKioL1RTItvR4IurAADSnaJM1p8789.jpg

通过这种方式,通过润乾报表中层次坐标的高级写法避免了多源,体现了润乾报表的强大之处,但是仍然要依靠隐藏行列实现,而且E3中计算同期比的计算表达式过于难书写和理解(要理解主格附属格的概念、位移坐标的使用以及如何在格集表达式中引用当前格的主格),这也给报表开发和维护带来了困难。

无论是多数据源,还是层次坐标,依赖隐藏行列,都是因为需要在报表中完成同环比计算导致,而往往这样的计算还比较复杂。这是因为传统报表工具将数据计算(数据源准备)和报表呈现混在一起导致(即使功能强大的润乾报表也不例外),如果将这两部分分开,则会使报表开发更加清晰。

 

另一种办法是事先把数据计算准备好,报表工具只需要负责呈现和简单计算。但无论是使用复杂SQL、存储过程和自定义JAVA数据集编程,对于这样的复杂运算(实际情况往往比这个例子更麻烦得多)都是一件工作量很大的事情,而且难以维护。

集算报表本身内置了适合结构化计算的脚本,可以方便地写出数据准备的计算(相当于一种更使用更简单的自定义数据集)。上述报表需求使用集算报表可以这样完成。

编写集算脚本

    使用集算脚本编辑器编写集算脚本,使用系统默认数据源demo:

wKiom1RTIoHSdzVJAABTXsIFcF0495.jpg

编写脚本完成同比环比计算(右侧为单元格运行格值):

wKiom1RTIoOQW4puAAL51V4owFc013.jpg

    A1:连接数据源demo;

    A2:根据年份参数取出今年和去年两年的订单数据;

    A3:关闭数据连接;

    A4:按订购日期排序;

    A5:按年 月分组,并汇总订单金额;

    A6:计算比上期,这里注意到使用[-1]来引用上一条记录;

    A7:按月份排序;

    A8:计算相同月份和上一年的比值,即同期比;

    A9:只选出本年数据,通过A10为报表返回结果集;

编辑报表模板

    使用集算报表编辑器,设置数据源,用于报表预览:

wKioL1RTIt2iD4UVAABKUQ8wiN0161.jpg

    新建报表模板设置报表参数:

wKiom1RTIoTT07XnAACOlyV9Mn0040.jpg

设置集算器数据集,调用上述编辑好的脚本文件:

wKioL1RTIt6DlTDjAADt6SYaP-A077.jpg

其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的;参数arg1为脚本参数,year为报表模板参数,这里将报表输入参数传递给脚本用于数据计算,事实上两个参数可以同名。

 

报表模板及表达式如下:

wKiom1RTIoXDWgMcAACP3YphZjo519.jpg

可以看到,使用集算器脚本可以快速完成跨行组运算的报表。而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。

   在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的数据源和参数。以上述第二个报表需求为例,使用脚本数据集可以这样完成:

1.  在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择脚本数据集

2.  在弹出的脚本数据集编辑窗口中编写脚本:

wKioL1RTIuDT3wQ7AAJCyyW0G7c362.jpg

这里可以看到,在脚本数据集中直接使用了报表中定义好的数据源demo和参数year,比起单独的集算脚本更加简单、直接。

3. 报表模板和表达式与使用集算器数据集方式一致,不再赘述。



本文出自 “高性能报表数据计算” 博客,请务必保留此出处http://report5.blog.51cto.com/8028595/1570338

润乾集算报表非常规统计之跨行组运算