报表应用的计算中间层

在传统的报表应用中,源数据的计算一般有三种方式:1、报表工具直接连接数据库取数,源数据的计算是提交SQL由数据库完成的;2、报表工具利用自身的计算能力(单元格函数或格间计算),实现部分数据计算;3、报表工具通过API调用Java程序实现数据计算。

下面,我们比较一下这三种方式,并探讨最佳方案。

首先,来看数据库计算。

数据库计算的优势是:数据一致性较好,安全性较高。

但是,采用数据库计算报表源数据的问题也比较多:1、报表工具从数据库中取出数据时,要通过JDBC,因为需要做数据流的对象转换,所以关系数据库的JDBC都比较慢,这是一个始终没有解决的问题;2、简单SQL语句执行的速度较快,但复杂SQL则不容易优化。如果是存储过程中用for循环来fetch计算的话有可能要比Java慢;3、数据库是扁平结构,不能以多级目录的形式来管理数据,只适合管理数量较少的表。数据库计算会产生大量相互关联的中间表,出现很多容易混淆的表名,可管理性较差。4、Sql存在:不支持分步计算、集合化不彻底、缺乏有序集合、不支持对象引用的问题。这就造成SQL和存储过程不符合自然思维习惯,编程比较困难。5、数据库的建设和维护成本都比较高。

第二,来看报表工具计算。

由于数据库计算方案的上述不足,很多报表程序员会直接利用报表工具的单元格函数和格间计算等方式来实现源数据计算。报表工具计算的不足是:1、为了完成计算,报表不得不采取隐藏行列的方式储存中间结果,会增加内存消耗,降低性能;2、报表单元格除了存储单元格值,还保留了很多显示格式属性(比如:字体、大小、背景色等等),带着这些属性计算,也会降低性能;3、有些复杂计算是报表工具本身无法完成的,比如:不规则运算、需要多个步骤完成的计算等。

第三,来看Java程序计算。

Java程序计算的优势是在数据库和报表工具之间形成了中间计算层,好处是:1、可以访问文件中的数据,并采用多线程计算,能够提升报表性能和容量;2、支持多样性数据源;3、有效减轻数据库负担;4、实现T+0大数据实时查询,可以在报表中看到最新产生的数据。但是,由于Java程序在结构化和半结构化计算方面的类库较少,实现上述计算很复杂。而且,Java程序和报表模板是分离的,在代码管理上也很麻烦。如果是对数据集的少量调整计算,也要折腾Java的开发环境、代码管理、打包部署等,就太麻烦了。

因此,Java程序计算实际上形成了报表应用的计算中间层,是三个方式中比较具备优势的。但是,Java程序计算问题也还是很多。

可以考虑采用润乾集算报表的源数据计算方案,可以在报表应用和数据库之间形成显式的计算中间层,具备上面所说的Java程序的4个优势。同时,集算报表又解决了Java程序计算的不足,体现在:1、集算脚本提供了大量的结构化和半结构化计算类库,特点是:分步计算、完全的集合运算、有序集合运算和对象引用机制等,更接近自然思维,编程更简单,代码量更少。2、集算脚本可以直接在报表文件中编写,也可以保存为dfx文件和报表文件成对存放在目录中,代码管理简单。3、集算脚本是解释执行的,无需编译、打包。4、集算脚本封装了Java的多线程编程,化繁为简,提高了开发效率。

润乾集算报表和传统方案的结构对比示意图如下:

时间: 2024-11-25 13:19:24

报表应用的计算中间层的相关文章

用Jasper report来实现交叉报表的增长率计算

来源:     http://community.jaspersoft.com/questions/847490/how-get-annual-growth-rate-crosstab 交叉表的每一列都是动态生成的,进行列间计算时需要动态引用,用Jasper脚本实现此类需求有一定难度,用集算器在数据准备阶段实现则相对简单,下面用例子来说明. 数据库表store存储着多种产品在2014.2015年的销售量,需要用交叉表呈现每种产品每年的销售量,并计算出各产品的年增长率.部分源数据如下: 集算器代码

实现报表数据外置计算

在报表应用中,针对历史数据查询的报表占比很大,这类报表的特点是:第一,数据变化小,查询的历史数据几乎不会发生变化:第二,数据量大,而且还会随时间不断增加.如果这些历史数据始终存放在数据库中,由于大多数数据库的 JDBC 性能都很低下(取数过程的数据对象转换比从文件中读取数据慢一个数量级),当涉及数据量较大或并发较多的时候,报表的性能会急剧下降.显然,如果能将这些变化不大的历史数据移出数据库,采用文件系统存储,就可以获得比数据库高得多的 IO 性能,从而提高报表的整体性能. 但是,报表并不能直接使

集算器实现报表中零散的不规则计算

报表中存在的不规则计算往往给报表开发带来很大的困难,使用报表工具往往很难甚至无法直接实现.这里的不规则计算是指报表中存在特殊条件的统计项(计算),如:销售订单金额统计中计算前5名销售金额的合计和占比:学生成绩统计中总成绩排名前10的学生中语数外都超过90分的人数:用户充值统计中充值金额超过充值总额一半的用户数量等. 通过集算器可以很方便完成这类报表的开发,我们通过两个例子来了解一下具体的做法. 1.实例一 1.1 .报表描述 根据员工与订单表统计各销售人员的销售情况,并在报表中计算列出订单总额.

关联跨行计算报表的制作

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

报表的数据组织:文件还是数据库?

在报表开发项目中,报表的源数据可以放置在数据库中,也可以放在文件里.比如,一个互联网公司的网站运营报表系统,公司注册用户的基本信息来自于网站系统,使用的是Oracle数据库:用户操作数据来自于网站系统的日志文件,是文本文件.一般的做法是将用户操作数据从文本文件中导入到Oracle中,再用SQL语句去提取和计算数据. 那么,将报表的数据全部放到数据库中是否是最佳做法?可不可以把报表的数据全部或者部分放到文件系统中呢?这两种做法各有什么优缺点呢? 这里我们比较一下,报表工具结合Java程序访问数据文

报表工具的二次革命之集算器的作用

之前的文章已经大致给大家介绍过大数据计算引擎-润乾集算器了.想必很多人心里还是存在疑惑,集算器作为大数据分析系统,到底它能做些什么?这篇文章,就为大家详细介绍. 降低报表开发难度 降低开发难度从而提高开发效率是集算器的设计初衷,是最容易理解的作用,前面已有粗略介绍. 这方面的细节内容太多,我们会再做一个专门话题详细讲述集算器如何解决报表开发中的各种具体难题以及与常规手段的对比.在这里只做总结性地阐述. 比Java和SQL更易写 如前所述,集算器的设计目标是为了解决报表的数据准备,而目前这个工作一

报表工具与报表性能的关系

在选择报表工具时,性能指标一向是用户非常关心的,但是,报表工具的性能和整个报表系统的性能会有多大关系呢? 要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,其中有哪些环节容易出现性能问题,如何优化这些环节. 一.报表处理的一般过程分析 1.用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库. 2.数据层负责读取.计算和返回数据.数据层一般都是传统关系数据库:如Oracle.DB2等. 3.数据层通过JDBC等接口将结果数据

灵活数据源的固定行列交叉报表的制作

论坛里,http://bbs.csdn.net/topics/390883416中提的问题,其目的是为了实现一个固定行列的交叉表,用SQL准备好固定行数的数据源非常麻烦.而润乾集算报表则有非常灵活的计算能力,能够充分利用问题特点应付各种非常规的计算需求. 这里就以链接中业务为背景,给出集算报表实现某种固定列交叉报表的方案. 报表背景         源数据例如以下: 现须要在报表中显演示样例如以下内容: 这里要求依照分类统计总记录数.并将每月的记录数分别填充到1-12月中.当中无数据的记录显示为

报表分片运算调度控制台

CREATE OR REPLACE PACKAGE qms_rpt_operating_station_pub AS /****************************************************************************** NAME: qms_rpt_operating_station_pub PURPOSE: 报表分片运算调度控制台 REVISIONS: Ver Date Author Description --------- -----