webreport

博客园 首页 新随笔 联系 订阅 管理
  38 Posts :: 0 Stories :: 237 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报表 阅读(4350) 评论(15)  编辑 收藏 网摘

Feedback

#1楼 2007-07-09 12:05 birdshome      
这东西看起来还挺不错,市场怎么样呢?有人会单独买报表系统来用吗
  回复  引用  查看    

#2楼 2007-07-09 15:57 李众      
现在表单做的太多了.
我做表单是以图形对象化来实现.这样就可以不只绑定在表单一个产品上,比如做仿真,监控系统之类的都可以实现,面就宽了.
这样的控件可以建造基于图形的界面、制作各种图形元件、实现图形管理、图形建模、制作监控系统、表单系统、流程设计。提供功能非常强大的ActiveX控件,和其他流行的编程语言共同工作,弥补这些语言在图形处理方面的不足。也可以嵌入IE浏览器中,实现网上图形编辑和控制。

http://www.visual-graph.com/down/vg.zip" target="_new">http://www.visual-graph.com/down/vg.zip

  回复  引用  查看    

挺好的,带有打印功能吗?
如果有的话我们会考虑购买的。

  回复  引用  查看    

#4楼[楼主] 2007-07-09 21:29 web报表      
@金色海洋(jyk)
e表带有先进的打印功能。到时会针对报表的打印技术写一个专题。

  回复  引用  查看    

#5楼 2007-07-10 15:38 lizhong
www.visual-graph.com

我的报表当然有打印功能 呵呵

我的qq:4764403445

  回复  引用    

#6楼 2007-12-28 18:01 eros1234[未注册用户]
web报表的长处不在于数据处理,而在于用户对数据的快速消费,即快速获得数据展示信息。这在分析报表中尤为突出。

眼界决定世界,对企业的信息的集成与共享的理解决定了一个产品的方向和市场,以及生命力。

用户的需求是什么?使用web的多数是终端用户还是专业用户?报表消费者开始报表开发者?

  回复  引用    

#7楼 2008-08-04 15:04 jolboy      
做了一个试验,在设计器上,设计好需要的模板之后,在该表格后面多添加了几列,并合并了一下。发现,这个单元格也被拉伸了。

例如:B2单元格有个group方法,占2行,C1单元格的rowspan是3.说明跨了3行,B2也在其跨行范围之内,所以,C1也被拉伸了。此时,虽然从设计界面看,C1单元格在B2的后面,实际上,C1是属于第一行的第三个单元格。按照树干和叶子的排序来讲,属于group方法所在单元格之前,并且跨度范围包含了该单元格,所以最终被拉伸。

由此可见,什么单元格能够被拉伸,只要是跨度范围包含了这个执行函数所在的单元格,并且,排序在它之前,就需要被拉伸!


  回复  引用  查看    

#8楼 2008-08-04 15:09 jolboy      
并且,如果合并的单元格越多,计算时候也就会越慢。个人猜想,虽然页面上看,函数所在格子叫B2,但如果出现了合并单元格现象,到了后台,将其转换成树干和叶子的时候,那个函数所处的位置已经变化了。显示的时候,显示的是第二行第二列,但是,后台读取到的,只知道它是第二行第一列而已。因为第一行第一列有跨行,第二行被吃掉了一列。

所以,我觉得,要想获得初始页面上那些函数的所处位置,如果不是秘密把这些位置作为参数传入后台,那么就是将这个初始状态的表格进行复原,根据每个单元格的跨行跨列的数值,进行复原操作,回复成一张原始的二维数据表。然后才能准确的获取到具体的位置!

  回复  引用  查看    

#9楼 2008-08-04 15:16 jolboy      
并且,有时候会出现函数所在单元格的之前所有单元格与该函数都只有跨度交叉,而没有跨度上的包含关系,这个时候,为了保证在显示的时候,复制出的单元格与设计状态时的位置保持一致,楼主根据数据条数,根据函数所处单元格的跨行跨列数,填充出了大量的没有格式的空格子。来补足页面!不知我说的是否准确!
  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 810968




相关文章:

相关链接: