随着报表工具的不断完善和成熟,报表展现的功能逐步强大,支持的报表样式越来越丰富。同时,报表开发中的有些环节却逐渐成为了瓶颈,比较明显的两个方面是:1、复杂业务逻辑报表的数据准备和计算;2、异构的多样性数据源报表的开发。集算器可以很好的解决这两个瓶颈问题,进一步降低报表开发的难度,提高效率。
第一个瓶颈,我复杂业务逻辑报表的数据准备和计算问题。
在实际项目中,报表开发人员需要编写一些很长很复杂的SQL语句(或存储过程),来为报表计算和准备数据。这种情况形成的原因可能是:
1、原始数据库结构一般为交易系统设计,不适合统计报表直接展现,导致从原始数据得到报表数据的业务逻辑非常复杂。
2、即使是已经过数据整理的数据仓库,其结构也不能适合所有的报表,特别是项目后期出现的新报表,一般都要在数据仓库的基础上做进一步复杂计算才能提交给报表工具来展现。
报表开发人员会发现,使用SQL(或存储过程)实现复杂统计运算非常困难,特别是与序和集合有关的运算,如计算每月销售额都排进前10名的产品、连续五天上涨的股票等为报表准备数据的SQL过于复杂,可能长达数十行甚至数百行。
我们可以看一下SQL的实际列子。下面的语句以Oracle为例,其中使用了窗口函数。对于其他数据库而言,对窗口函数的支持一般都不如Oracle,写出的SQL可能会更长。
例子1:计算每个月的销售额都在前10名的客户。
select Client from( select * from( selectB.*,row_number() over(partition by month order by SumValuedesc) rown from( selectto_char(SellDate,'mm')month,Client,sum(Quantity*Amount) SumValue from contract whereSellDate>=to_date('2012-01-01','yyyy-mm-dd') andSellDate<=to_date('2012-12-31','yyyy-mm-dd') group byto_char(SellDate,'mm'),Client order by month,client ) B )C whererown<=10 )D group by Client havingcount(Client)=( select count(distinct(to_char(SellDate,'mm'))) from contract whereSellDate>=to_date('2012-01-01','yyyy-mm-dd') andSellDate<=to_date('2012-12-31','yyyy-mm-dd') )
例子2:连续五天上涨的股票。
select max(连续日数) from (select count(*) 连续日数 from (select sum(涨跌标志) over(order by 交易日) 不涨日数 from (select 交易日, case when 收盘价>lag(收盘价) over(order by 交易日) then 0 else 1 end涨跌标志 from 股价表) ) group by 不涨日数)
这两个例子还是相对简单的计算,对于更复杂的业务逻辑,会出现多层嵌套、众多窗口函数的SQL语句,可以达到几十甚至上百行。这些复杂SQL不符合自然思维习惯,不仅编写调试困难,也难以维护,时间长了即使作者也需要花费较多时间重新理解。
而且,复杂SQL执行起来一般都比较慢,会出现最终用户长时间等待报表的情况。因为难以完整指定数据库的执行路径,报表开发人员想人工优化这些复杂SQL的时候也会发现很难入手。
集算器可以很好地解决这个瓶颈问题。
首先,集算器代码更符合自然思维习惯,解决同样问题会比SQL短数倍,易于调试和维护;而且由程序员决定执行过程,易于优化。
同样是上边的两个例子,我们来看一下用集算器实现的代码:
例子1:计算每个月的销售额都在前10名的客户。
例子2:连续五天上涨的股票。
同时,集算器对外提供标准JDBC接口,报表工具可以和以前访问数据库一样,简便、无缝的连接集算器,并且获得集算器计算的结果集。
第二个瓶颈,异构的多样性数据源报表。
有很多复杂报表的数据来自多个异构数据库、非关系型数据库甚至是文件系统。一个比较典型的例子是工资报表:报表中的员工基本信息来自于人事系统数据库,工资信息来自于财务系统数据库,而考勤数据则记录在文本文件中。
主流数据库都能支持整合异构数据源的功能,但实际使用时会发现,数据库在这方面的功能均不够实用,即使勉强支持其性能也很糟糕。
还可以使用报表工具来整合异构数据源,不过有相当一部分报表工具不支持多数据源关联;个别报表工具即使能支持,其关联运算能力也较为初级,而且数据量稍大时性能也不佳,这时仍然需要程序员自行编写代码整合数据。
然而,用于为报表工具开发自定义数据源的普通高级语言(Java,C#)缺乏针对批量数据计算的类库,编写此类计算非常繁琐,完成简单的过滤汇总都要写几十行代码,费时费力,代码的可读性非常差。
集算器可以读取各类异构数据库、非关系型数据库和文件,其完备的计算能力将轻松完成多数据源关联运算,代码长度比Java短数倍至十数倍。
例如,有一个“项目付款进度报表”,其数据来源于项目管理系统(Oracle)的项目信息表--project、财务管理系统(SQL Server)的付款信息表--payProcess和合同管理系统(SQL Server)的合同信息表―contract。
使用传统的方法,通过项目编号--projectNo来连接三个不同数据库中的这三张表,是非常困难的。但是,使用集算器就可以非常简单了的解决。从下图中的脚本可以看到,通过三个jdbc连接―oracledb、mssqlFin、msssqlCon,将三个数据库中的数据读入之后,使用集算器提供的join和new函数,可以非常简单明了的实现三张表的关联。
应该说明的是,因为集算器的计算能力并不依赖数据库或者其他第三方引擎,所以无论数据从哪里来,只要通过读入集算器后,就可以凭借丰富的计算函数和类库来完成统一的计算。
综上所述,集算器可以顺利解决报表开发中出现的两大瓶颈问题,能显著提高报表开发效率。