webreport

博客园 首页 新随笔 联系 订阅 管理
  163 Posts :: 0 Stories :: 749 Comments :: 37 Trackbacks

公告

         上次从一个小小的序号开始了web报表开发技术专题,这回来讲一讲web报表开发工具的核心---数据集的变换。

       1 为什么说web报表开发工具的核心是数据集的变换

       数据集的变换,即报表的数据运算变换的能力。

         一个报表由两部分组成:数据及样式。数据一般都是从数据集而来的。样式无非就是一些静态的文字线条图片而已。对于一个web报表开发工具来说,实现样式是比较单一的。而数据方面则大有门道。报表上的数据流程一般是先由SQL语句或一个程序来得到数据集,然后将数据集中的数据展现到含有静态样式的报表文件上,从而得到一个真正的报表。如何设计将变换后的数据集中的数据展现到含有静态样式的报表文件上,是每一个web报表开发工具首先必须考虑好的问题。这是web报表开发工具的主框架。它设计的好坏将直接影响web报表工具的开发效率。所以说:web报表开发工具的核心是数据集的变换。

        2 数据集变换的相关问题有:

       A 多数据集时是否必须要设置之间的关联关系

              一般来说在一个报表上常需要多个数据集给数,当一个报表上有多个数据集时是否必须要设置这多个数据集之间的关联关系,如需要设置关联关系,哪么在web报表开发工具的内部程序就好做了,只需要根据关联关系来将多个子数据集中的数据展现到含有静态样式的报表文件上,这种方式不好的地方在于当报表内容和数据库物理表中的数据差异大时,往往需要写复杂的SQL语句或编程来准备数据集中的数据。而如果不需要设置这多个数据集之间的关联关系,则需要web报表开发工具内部协调好多数据集在报表上的展现。

       B 数据集中的数据在报表上展开时能否变换(排序,过滤)

              当一个数据集中的数据在报表上展开时是否可以再排序,设置条件过滤,以及一个数据集中的数据是否可以在报表上多次展开(当然是在不同的位置)。

       C 数据集的运算函数.(带条件的sum等)

              一般来说,肯定需要提供全面的数据集的运算函数,如对某个字段sum,同时应可以加上条件。

       D 报表计算的主流程是以数据集中的记录来循环计算还是以单元格上的公式来循环计算?

              大凡写过报表开发工具的人都清楚,报表计算的过程是必须最先确定清楚的问题。这个也是评判一个web报表工具的能力的最重要的一点。以数据集中的记录来循环计算的好处是实现起来简单,报表计算的速度快;但坏处是牺牲了报表计算这一块的柔性化能力,将应对复杂报表的重担全压在生成数据集中的数据这一块了。以单元格上的公式来循环计算实现起来复杂,要处理好单元格的引用关系以及计算次序。但这种计算模式有利于应对复杂的中国式报表。

       E 数据集中的数据在报表上如何放置?

              显然是希望数据集中的数据可以在报表上随心所欲地放置。但要达到此点需要web报表工具内部要做很多的协调工作。自然就希望将数据集中的数据限制在某些区域放置,实际上就是把报表分成明细区,分组区,标题区等等,但显然这样会大大限制web报表工具的开发能力。

       F 数据集中的数据在报表上的展开次序。

              一种做法是标识好哪个是主数据集(即最先展开)?哪个是子数据集(即跟随主数据集而展开)。这是条带状报表工具的常用做法。另一类做法是数据集中的数据随所在的单元格展开。而在单元格上设置主单元格,子单元格。这个是新一代web报表开发工具---润乾报表finereport( for java)e(for .net)的做法。

       3 现有报表工具的做法

      早期的报表工具在数据处理手段上相当单一,一般做法都是依赖于SQL语句或者存储过程,将需要的数据返回给报表系统,而报表系统能够做的仅仅是一些简单的四则运算,或通过固定函数取最大最小值等。

      近年来,一些报表开发工具在数据集的变换方面进行一些改良。比如数巨报表就加上了数据微引擎技术,以应对复杂的中国式报表。这种做法是在数据集上增加一层运算层,以提高数据的柔性化能力。其实质是对传统的条带状的报表工具的改良。

      象润乾报表finereport ( for java)以及e(for .net),是采用全新的数据处理模式。下面详细地介绍一下e表的报表运算原理。

 

下面演示一个简单列表的扩展过程,为了说明方便,去掉单元格的样式部分的同步:

A 准备开始计算时如下图:

 

B 计算了 ds1.get(semployeeid) 公式后。

 

即将semployeeid的值算出来了,同时复制了多行。

C 计算ds1.semployeename 公式后。

 

D 以此类推,直到整个表都计算出来。

下面演示一个分组报表的扩展过程,为了说明方便,去掉单元格的样式部分的同步:

A 准备开始计算时,如下图:

 

 

B 计算了 ds1.group(sarea,false) 公式后。

 

如图所示将B3单元格的值计算出来了,同时在B3单元格中会保留一个当前组的指针,通过它能得到整个组的数据。如第一个是上海组,即ds1数据集中sarea=上海的数据。(注意:一个组的数据是指一个二维表的数据,不光是一行的数据)同时也复制了多行。

C 计算一个 ds1.get(id) 公式后

 

如图所示,第一个 ds1.get(id) 就计算出来了,它的计算过程和简单数据列表的示例中的get函数的计算过程一样,只是指取sarea=上海 这一组的合同号来扩展,纵向扩展时左边的单元格拉大。

D 以此类推,就得到了如下的报表。

 

      由上述可以看出,e表的报表运算主流程是以单元格上的公式来循环计算的,而不是以数据集中的记录来循环计算的。它采用多个单元格自由扩展而得到报表的思路,大大的增强了数据集的变换能力。使报表运算的柔性化能力达到了全新的高度。

4 示例.

       上述都是些报表运算原理方面的设计问题。下面还是来看看两个示例吧!

 

      这是一个动静相结合的横向分片的报表示例,它要web报表开发工具具有支持分片能力,即一个报表无论多复杂,都可以分成一片片来分别处理,片数的增加报表的工作量不能呈指数增加。

 


      上述这个员工简历如果去掉下边的主要工作经历的话,就是一个标准的主从表了。但现在因为有两个从表同时循环展开。这就要求数据集在报表上展开时能够再进行数据的处理了。

       想详细看看这两个示例的朋友可以到北京方成公司的网站上在线试用或下载到本地试用。

        5 一个梦想

       比如拿到一个报表,先看看分哪几块,每一块的数据来源如何,块与块之间的联系。能象人脑的思维一样来设置报表文件,定义数据集,设置简单的公式便可做出报表,只有这样的报表开发工具才能真正地把程序员解放出来。

       6 小结

              本专题主要讲web报表开发工具的数据运算原理,即数据集的变换。大凡原理一类东西,总难免大而空。但它又确实是一个web报表开发工具的核心所在。按个人的感觉,基于条带状的报表开发工具必将慢慢的退出中国市场。

相关链接

web报表开发技术专题一:序号问题

 web报表开发技术专题三:不规则分组和跨行组运算

posted on 2007-07-09 11:42 web报表 阅读(...) 评论(...) 编辑 收藏