中国式报表,从总体来讲,指的一些具有复杂性和任意性的报表。这些报表往往是样式不太规则,数据来自多个不同的地方,并且可能需要对数据在报表中进行一些相对复杂的处理。 FineReport提供了异构数据源模型、Excel+绑定数据列的报表设计模型等,使得行列对称,动态数据处理这些传统工具需要靠编码来实现的常见业务需求,仅通过简单的操作就能实现,轻松制作出复杂的中国式报表。 多源分片 企业想从一个数据表或一个数据库就想选出所有展现所需的数据是不切实际的,中国报表的一个重要特征是分片,与多源相关,但又不完全一样。多源一般都会是分片的,但分片却不一定是多源的。为了解决多源关联分片的问题,许多传统工具引入了子报表的概念。把每个分片做成一个子表,然后再在主表中拼接起来,传统工具理论上是可以通过子表拼接完成,但实际上仍非常烦琐。 FineReport天然支持多数据源(集),同一张报表的数据可同时来自多个数据表,多个不同的数据库,或者多个不同的用户自定义数据视图,然后在报表中可直接相互运算形成最终的报表。 传统报表工具在理论上只支持单数据集,对多集的支持依赖于数据库的运算能力(叉乘与联合、存储过程),这对于较简单的比如两三个表的关联还不是很复杂,如果需要关联的数据表超过五个,则一是SQL语句繁琐,编写和维护都比较困难,再者普通的Union,Join等操作返回的结果执行效率往往很低。这时候一般就需要进行大量的SQL优化工作或者直接编码,用存储过程来实现。当表中数据涉及到多库一般难以支持,逞论多种不同类型数据源了。 另外一种处理方式,就是将多数据源先变相整理成单一数据源,然后再进行其它操作,并不是真正意义上的多数据源。 传统工具分片有以下问题: 1.子表割裂了整表的一致性,一张报表被分成了多个小表,难以统一处理,给维护管理工作带来麻烦。 2.从格式上看,各个子表各自独立,很难将格线统一对齐,某个子表的格式进行了调整,所有其它子表都需要改动,这是极其繁琐的工作。 3.每个子表的大小不固定(可能随数据记录数而变化),由于传统工具的行列不对称。纵向排列的几个子表可以自动摆位,而横向则不行。 4.主子表之间和子表相互之间都无法沟通数据,只能将主表的数据作为参数传递给子表,子表无法带回信息,也无法向其它子表提供信息。这时,整表的混合运算将非常困难,必须单独计算,无法采用子表的中间运算结果,不仅书写复杂,运算效率也很低。 FineReport是纯java报表软件,支持多数据源(集),将一个数据库中不同数据表或者不同数据库中不同数据表的数据取出来展现在一张报表上。 FineReport连接数据源的方式多种多样,支持通过JDBC的方式直接连接数据库,或通过JNDI的方式与应用服务器共享数据连接,也支持通过JCO连接SAP系统。支持的数据库类型如Oracle、 DB2、SQLServer、MySQL等主流的数据库,除此之外,自定义的程序数据源,文本数据源,Excel数据源,XML数据源等等都可以直接作为报表的数据源来进行设计工作,同时数据源还具有无限的扩展性,可以支持WeB/Service, SOA等标准的数据。 报表的分片指的是报表被分成了多个区域,每个区域重复规则不同,而又可能相互运算。传统的工具,大部分是条带状的处理模式,纵向的处理较多,而对于横向的处理能力很弱,仅能通过固定的模型来支持简单的交叉表。 如图,这是一个既有动态扩展数据,又有静态计算数据的分片报表。图中按照背景色的标识报表分为相对规则的四片:最上方的一组为动态横向扩展的表头,表明地区与时间信息,来自订单表;中间左上侧产品来自产品表;红色区域计算数据来自订单明细表;后面的白色背景部分,是动态的数据计算部分,是对所有订单明细的销售数据进行汇总运算;下方左侧客户名字来自于客户表;右侧黄色背景计算数据来自于订单明细表。而所有的订单数据计算都和其下侧的订单明细表通过订单ID关联,通过客户ID与客户表关联,也就是虽然报表分为了多片,但各片的数据之间又并非各自独立,相互之间互有关联沟通。
这样的报表虽然总体上是一个规则的整体,但是实际上却是不规则的数据布局方式,那么也就无法通过将多源整合成单一数据源来实现,那么传统的报表工具对这样的报表,就只有编码这一种解决方案。 虽然像大多数工具也都提供了子报表来解决报表中格式不规则的情况,但是即使是子报表,受数据处理模型所限,也仅限于支持明细和列表结合的报表,如图所示: FineReport界面的自由布局方式,使得报表的样式仅通过几次拖拽就能够完美呈现。而多源支持,则只需要通过单元格中设置关联条件即可将明细区与列表区的数据关联对应起来,全程无需任何的编码。
|