润乾集算报表非常规统计之组内排序

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

而集算报表在完成这类特殊统计报表时则比较简单,这里来看下使用集算报表完成组内排序报表的实现过程。

报表说明

根据销售管理系统数据统计某年客户所在地区的订单总额,地区并按订单总额降序排列,要求每个地区中显示销售额在前五名的销售人员及其订单数量和订单金额,其他人员归入“其他”项中。报表样式如下:

应该注意的是地区分组中如果销售人数少于5个则不显示“其他”项(如上图中的华东地区)。这个报表的麻烦之处在于需要较复杂的数据计算工作,但一般报表工具的计算能力较弱,如果采用报表工具本身来完成这个计算工作则会相当复杂,比如采用用润乾报表来实现将会是这样的:

在润乾报表中,使用ds.group()的多个参数,结合条件判断隐藏行,多种使用方法结合完成了报表开发,可见润乾报表的强大之处。

但是由于要按照分组后汇总的订单金额排序,所以在B3的分组表达式中应用ds1.sum(订单金额)表达式作为ds.group()的参数,对于原始数据量较大的情况下,该表达式效率较低;而且,由于只显示前5名销售,在C3(排名)和D3(其他)中设置了隐藏行表达式,对于分组较多的情况仍然会存在性能问题;另外需要在E3和F3中使用格集过滤表达式计算其他销售人员合计,计算时要带着单元格属性计算,效率仍然不高。

润乾报表已经是计算能力很强的报表工具了,采用其它报表工具只会更麻烦甚至实现不了。

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

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

编写集算脚本

首先使用集算脚本编辑器设置脚本参数:

编写脚本完成数据分组汇总以及排序等运算:

A1:建立数据库连接;

A2:执行sql根据年份参数查询订单信息,得到初步汇总订单数据;

A3:按照地区分组后组内成员按订单金额排序。

A4-C8:循环A3,取前五名记录,并将超过第五的记录都归入“其他”项,结果写回A3:

A9:结果按地区总额降序排列后返回给报表。

编辑报表模板

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

新建报表参数,并设置默认值:

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

其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的;参数year为报表模板参数,d_year为脚本参数,可以设置二者重名。

编辑报表表达式,直接使用集算脚本返回的结果集,完成报表制作:

对于排名,需要设置B2格左主格为C2,并设置B2显示值表达式if(B2>5,"--")。

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

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

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

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

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

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

时间: 2024-07-28 13:59:48

润乾集算报表非常规统计之组内排序的相关文章

润乾集算报表非常规统计之固定行列交叉表

实际信息系统中很多数据计算是为前端展示而进行的,其中报表是最常见的一种形式.这些计算的实现过程往往并不简单,使用SQL或存储过程实现起来比较困难,从而影响到前端报表设计.像http://bbs.csdn.net/topics/390883416中提的问题,其目的是为了实现一个固定行列的交叉表,用SQL准备好固定行数的数据源很麻烦.而润乾集算报表则有很灵活的计算能力,可以充分利用问题特点应付各种非常规的计算需求.这里就以链接中业务为背景,给出集算报表实现某种固定列交叉报表的方案. 报表背景 源数据

润乾集算报表非常规统计之多重判断

报表在数据源准备阶段往往要根据实际业务进行各种判断计算以后才能得到最终的报表数据源,而使用SQL在这种情况下则难于编写,http://bbs.csdn.net/topics/390938280中提到的考勤问题就是其中之一,这个计算看起来是给财务或人力部门的考勤报表服务的.计算逻辑并不算复杂,但使用SQL却很难做,用存储过程(要取首尾记录)也很麻烦,而一般的报表工具由于不具备强计算能力,常常只能写用Java等写自定义数据源实现. 使用润乾集算报表来做则比较简单,这里以上述链接中的实际业务为例,给出

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

实际信息系统中很多数据计算是为前端展示而进行的,其中报表是最常见的一种形式.这些计算的实现过程往往并不简单,使用SQL或存储过程实现起来比较困难,从而影响到前端报表设计.像http://bbs.csdn.net/topics/390813196中提的问题,其目的往往是为了实现一个供生产或采购部门使用的报表(包含库存覆盖周期,方便生产调度或实施采购任务),用SQL写起来会比较麻烦,一般报表工具又不具备很强的计算能力,也无法直接完成.而润乾集算报表则有很灵活的计算能力,可以充分利用问题特点应付各种非

润乾集算报表非常规统计之集合运算

报表数据源计算中经常会使用到集合运算,SQL对集合运算的支持使得大部分简单的集合运算都能轻松完成.但是,当集合运算比较复杂,需要使用存储过程完成时,由于存储过程对集合运算的支持不够,也无法使用中间结果导致这类运算实现起来非常困难. 像http://bbs.csdn.net/topics/390902711中提到的问题,就是一个比较典型的复杂集合运算问题,这类计算往往都是为前台报表服务的,使用SQL和存储过程都很难完成.而一般的报表工具由于不具备强计算能力,对于这类计算更加无法完成. 使用润乾集算

润乾集算报表非常规统计之补齐数据

实际系统由于历史设计的原因,业务数据有时无法直接满足报表需求,从而需要在报表中补足数据,以满足报表展现需要.像http://bbs.csdn.net/topics/100074605中提到的问题,就是一个比较典型的此类需求. 这类问题使用SQL或存储过程往往复杂度过高,如帖子中贴出的答案:而使用一般报表工具则需要不断地重复遍历进行数据关联,还要借助隐藏格和做大量的条件判断才能完成,实现难度和报表性能都不理想. 而润乾集算报表则在完成这类报表时则比较简单,这里以上述链接中的实际业务为例,给出集算报

润乾集算报表非常规统计之无源规则报表

报表开发中,经常会碰到一些需要进行非常规统计的报表,固定分组.可重复分组.组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源.以及需要对数据源再计算.这些报表本身具备一定的特殊性,使用常规方法往往难于实现. 集算报表完成这类特殊统计报表则非常简单,这里以一个没有数据源,但展现规则的报表为例,说明集算报表的实现过程. 报表说明 某报表系统中有部分报表需要按照一定规则显示数据,如:显示查询日期范围内的奇数日数据,要求数据库中即使无记录该日期也显示(内容为空). 本文重点来实现奇数日期序列,

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

报表开发中,经常会碰到一些需要进行非常规统计的报表,固定分组.可重复分组.组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源.以及需要对数据源再计算.这些报表本身具备一定的特殊性,使用常规方法往往难于实现. 集算报表完成这类特殊统计报表则非常简单,这里通过一个需要完成跨行组计算的报表为例,说明使用集算报表的实现过程. 报表说明 根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比.报表样式如下: 这里应该注意的是比去年同期是指与去年同月份的比值,无对应

润乾集算报表非常规统计之按段分组

报表开发中,经常会碰到一些需要进行非常规统计的报表,固定分组.可重复分组.组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源.以及需要对数据源再计算.这些报表本身具备一定的特殊性,使用常规方法往往难于实现. 对于按段分组报表,各段之间可以有重复,也就可能出现按段可重复的分组报表.集算报表在完成这类特殊统计报表时比较简单,这里通过一个实例说明实现过程. 报表说明 根据员工基本信息表按年龄统计各年龄段区间的人数.奖金等汇总情况.报表样式如下: 这里"30-40岁"和"3

润乾集算报表非常规统计之数据源再计算

有这么一些报表,取数后还需要进行一定计算后才能供报表展现输出,这要求报表工具具有数据源再计算的能力. 传统工具会依赖报表工具自身的计算能力,但报表工具计算能力弱导致很多计算完不成:或者借助存储过程完成(如果数据来源于数据库),且不论存储过程的编写难度,像跨库或数据库文件混合数据源,存储过程根本无法完成:不得已使用高级语言为报表自定义数据源提供数据源再计算,但Java做诸如集合运算的难度并不轻松. 集算报表在完成这类时则比较简单,本文通过一个例子来了解解决办法. 报表说明 根据学生成绩表列出指定班