扔掉条子
报表绘制的方法一般有 网格式 和 控件拖拽式 两种,前者采用和EXCEL类似的方案,用网格线围出报表;而后者则是用矩形框等元素拼出报表。国内报表对样式要求非常复杂而且严格,绘制方案是报表工具相当重要的指标,它决定了报表样式的复杂度和绘制效率,特别是对于格线比较多的表。
传统的报表绘制,大多数是呈条带状,用的拖拽式,拿部件拖来拽去。表格线需要靠矩形边框重合摆放拼接出来,常见的复杂多层表头画起来非常繁琐,数据区某些纵向合并格甚至无法绘制出来(或者需要特定程序控制才能实现),拼出的格线还与分辨率相关,屏幕上对齐的表在打印时或在WEB上显示时又可能不整齐。
网格式在这方面有明显的优势,能够画出样式很复杂的报表,绘制效率也比控件拖拽式高出许多。由于MS Excel软件的普及,在大多数人心中画表软件就是Excel,对于Excel软件的操作也都很熟悉。这样也能节省许多学习成本。
所以,类EXCEL的方法明显优于拖拽式,或者说,画报表就应该是用象Excel那样的方法。大概稍有点常识的人,都会拿Excel画表吧。所以,类Excel是必然的方向。
因为Excel很早就已普及了。所以提及报表工具,自然首先都会想到用类Excel方式,而为什么控件拖拽式的报表工具会这么多呢?这是因为Excel虽然具有强大的绘表能力,但数据处理能力非常弱,除非用“A2+B3=D4”这样的公式将单元格联系起来,否则单元格之间是相互独立的,没有任何关系的。如果要从数据库或数据文件中取数,需要程序员一个单元格一个单元格去定义,工作量相当繁重。需要靠程序员编程来实现动态行列报表的制作。
因为报表格式只是报表工具要解决的一部分问题。我们用报表工具的目的,是要能从数据库中读出数据,从而自动产生报表,数据才是报表要解决的核心问题。报表格式用Excel可以解决得很好,但是Excel没有良好的从数据库中进行数据汇总方案,除非编程序往格子里填数据,基本上没法从数据库中读出数据自动产生报表。因此这种报表几乎都只能做静态报表。
而拖拽式的格式虽然解决得一般,但从数据库中取数进行数据统计能力方面要比Excel强得很多,两害相权取其轻,堆框虽费劲,慢慢堆就行了,但统计汇总不行的话那就没办法了。
报表工具软件和其它软件一样都是国外先做出来的,而国外的报表的样式非常规整,没有格线,表头非常简单,没有斜线表头、没有分层分组。一张报表提供的信息有限,如果要看所有信息,就只能几张表对照着看了。因而国外的报表工具采用控件拖拽式能弱化报表样式绘制能力弱的缺点。而国内的报表工具基本上都是学习国外的报表工具模型来设计的。而中国式报表的样式相当复杂,所以很多报表工具都被迫再辅以大量的程序代码来处理中国式报表,这也使得用户在买了报表工具后,做报表的工作量还是很大。
多源分片。
多源是指一个报表的数据来源来自多个物理数据表,甚至是多个物理数据库。这里的“多个”指的两个以上的物理数据库。
传统的报表工具只支持单源报表,即使是数据来自于多个物理数据表或者物理数据库,也需要在报表设计前将多源转化成单源处理。两三个源尚可写SQL语句完成,但多到五六个源以上时,一方面对应的SQL语句过于复杂难以维护,另一方面其运行效率降低,这时常常要编写存储过程或其它代码来准备数据了。这还只是单数据库的情况,如果多源来自多库,则更为复杂,无法直接写出复杂SQL或存储过程,需要架构专门的数据库桥后才可以完成。
某些传统报表工具也声称可支持多源,实际上指的是多数据库支持,只是把数据库桥功能集成进入报表工具中,但真正到报表设计时仍然是单源的。和我们所说的多源有很大差别。
多源往往带来分片,正是由于分片,使得报表设计必须直接基于多源进行,而不能先将多源转成单源进行。有相当一部分分片报表无论如何也不可能换成单源处理,部分能转成单源的报表处理也非常繁琐。
分片是指报表的纵向或横向或双向同时被分成了多个区域,每个区域重复规则不同,而又可能相互运算。
传统工具能够处理的上下格式一致和列方向固定的分片报表(即可由多源转成单源的报表),但会迫使用户编写复杂的SQL(UNION+JOIN)和代码准备数据,导致工作量大且维护困难;而且对于横向分片数较多报表,由于必须采用JOIN方式准备数据,导致运算性能极低,复杂度为O(Nk),k为分片数。
不规则划分
几乎所有的报表工具都支持独立的分组报表格式,即传统的通过一个绑定数据的过程来完成分组报表的设计,这种分组是完全规则划分的,即划分标准一致且有规则(一般都按某个字段或表达式),所有字段都必须出现且只出现一次,分组值次序与原数据记录次序一致。
但是与完全划分相对应的,在报表汇总中却常常需要不规则划分,即划分标准看不出规律(常常只能穷举),所有事实不一定全部出现在分组结果中、个别事实还可能重复出现,次序也与原数据记录无关。固定分组是不规则划分的常见表现。
例如下面这张报表。年龄段的分组就是个不规则划分,划分规律不明确,只能穷举出来;分组不完全,50岁以上的则被整合到一个组内。
这个报表用传统工具实现很困难,虽然报表格式并不复杂,但由于出现了不规则划分,无法直接用报表工具的分组功能完成,只能编程把数据准备成一个单层的二维表数据源,即加大了工作量,又很难体现数据之间的层次关系。
动态格间运算
所有的报表工具都会提供一些计算列的功能,在原始数据基础上再计算出一些别的列值或统计值,这是报表展现中是不可缺少的功能。
传统工具一般只提供同行内的格间运算和针对某组(或全体)的集合运算,对于常见的跨行组运算则相当困难。个别传统工具提供了简单的跨行能力,如可以引用上一行数据,而跨组则无能为力;对于集合运算只提供个别固定的函数,如取第一名、算累计值等,无法组合出的通用集合运算则无计可施,如取第二名、算累计的乘积等。某些带条件的运算更是无法可想,如计算语文成绩在90分以上的同学的数学成绩总和。
除了有规律的跨行组运算外,报表中还可能会有一些随意的独立格运算,其值可能是报表中的任意几个其它格运算出来,甚至还可能会引用到报表外的数据(比如和数据库中的数据再次运算等)。由于传统工具没有很好的运算后报表数据项命名机制(传统工具只能用列名命名设计的数据单元),很难精确描述数据引用关系,只能写出规律性很强的表达式,但随意的独立格运算会就使传统工具无法处理,而报表外的数据引用更是只能借助脚本或外围应用程序,导致代码极为混乱。
下面这张报表是个典型的跨行组运算报表,其中有比上期(跨行)和比去年同期(跨组)运算,这种报表在传统工具中常常又必须编程准备数据。这个报表的样式并不复杂,但这些格间运算会让传统工具非常为难。只能再次依靠程序代码,把数据事先计算好直接往报表里填。
另外,所有以上的讨论中还贯穿了一点,即行列对称。纵方向上拥有的自动复制扩展的能力需要完全实现在横方向上。报表可以横向分组、横向分片,对于横向变化的报表可以定义跨列组运算等。
我们知道,报表的上述复杂性常常是混合在一起的,同一张报表中很可能包含了所有的问题,这要求我们给出完整的解决方案,而不能单独分别处理。当这几种困难交织到一起时,整个问题的复杂度要远比解决几个单个问题的总和要大得多。
由此可见,只有采用支持上述特点的报表工具,才能真正提高制表的效率。
来源:https://www.cnblogs.com/webreport/archive/2007/04/02/697039.html