写这篇文章的目的是为象我一样想系统研究报表的人做一些概念上的指导,我不会给这些概念下定义,只是尽量用自己的语言解释得清楚些。我的文笔很差,思维也不太连贯,只能时时来BLOG记录一些思想的火花,希望这不断积累的星星之火能成为燎原之势。假如读者有任何感想,请做个简单的评论,帮助我再碰撞出一些火花。
什么是报表
报表这个词在日常生活中,一般是指下级向上级的数据汇报,比如,全国各地疾病控制中心或防疫站会定期向上级汇报传染病发病和死亡情况等,类似的报表,在信息系统中,属于数据采集的部分,具体来说,就是应用中增、删、改、查中增加记录功能。
在我们的IT系统里,我把报表分两类:一是固定格式的,或者是有规范可循的,一般常见于为事业单位做的系统中,比如卫生统计报表,人力资源、税务系统的报表等;二是自由格式的统计分析,一般称为统计分析,是由为方便用户分析数据而开发的模块,有的也提供给用户自定义报表的工具。所以,以后的叙述中,我将把统计分析和报表混为一谈,甚至任何可以用报表工具实现的展示,我都把它归到报表的范畴里。
为什么要使用报表工具
有两个原因:一是为了简化程序员的开发工作,二是为客户提供自定义报表功能。
据我了解,现在仍然有许多项目中的报表模块没有用第三方的报表工具来实现,大部分是因为项目经理还不知道可以利用现成的工具来节省一部分工作,但只要是接触过报表工具的人,都会自觉地在项目中使用。因为工具会把报表的主要工作——格式、计算和输出——都帮你做好,节省你的一些时间。而没使用工具之前,报表的格式,假如是页面上的话,会用HTML的<TABLE>标签来做,计算会写到数据库的存储过程里或业务逻辑代码里,而输出则是用iText、POI之类的库来完成。
其实,报表工具并不如想象得那么万能,一旦碰上复杂的表样和复杂的计算,做起来并不轻松,甚至由于工具本身的限制,根本无法完全实现需求。这时,只能去说服客户更改需求、换其他工具或改回到手工实现。好在这么变态的报表并不是总有机会碰得到,只要你肯动脑筋,大部分都可以解决。
打印
说报表,不能不提到打印。我目前总结出来的解决方案有三种:一是用浏览器的打印功能,虽然这是一直被唾弃的方式,但对于不考虑分页和不是超宽超长的报表,还是可以去尝试说服客户接受的,更何况,假如你的应用只考虑IE的话,可以用脚本去调用一些IE功能来实现比较完美的打印;二是用Applet,虽然有点不怎么流行Applet了,又有一点安全方面的小影响,但你可以在程序里完全控制打印;三是输出为其他格式,如PDF,XLS等,用已安装在客户端机器的插件来打印,现在的报表工具一般都是可以输出这样的格式。另外,有的报表工具在服务器端提供打印支持,这种方式似乎并不是我们想要的。
“中国式”报表
这大概是近来才发展起来的一个词,其中包含了许多的无奈和愤怒以及对中国特色的无处不在的感慨:-)
概括起来,中国式报表一般是指表头复杂的表格式报表,这种表格的列头(表格上端)和行头(表格左端)会分成多个层次,而且还带有大量的总计和小计的计算,样式的复杂导致了计算的复杂,因此做起来异常困难。这类报表的格式一般都来自某种强制性的规范的,比如国家某些部委的统计报表标准等。造成这种复杂格式的原因,一是为了统计分析方便,最大限度地展示数据,二是因为以前MS-Excel普及使用的结果。所以一些类Excel的报表工具被宣传为最适合做中国式报表。也曾听人说过,中国式报表大部分是交叉表,我同意。而且我进一步分析发现,许多这样所谓的交叉表,其实行或列的扩展范围是有限的,也就是说,有可能做成固定数目行或列,固定好行列后,为每个单元格做不同的计算,这样一来,又是Excel的长项了。
报表中计算的处理
报表中除了格式让人头疼外,计算也是挺麻烦的。简单的一些汇总统计,报表工具会支持。但对于一个数据库表中全是基础数据,而统计需要关联多个表来进行,还要根据外部条件来判断,除了整列做汇总外,可能行涉及到其他列参与其中。说得的确很复杂,解决方案可以分为下面三种:
一是把计算放在数据库端,写成存储过程或写到视图里,这样的报表工具只要把记录集拿过来显示一下就OK了。工具的使用只是用来定义显示和输出的。二是把计算写进SQL查询,一般的工具只能支持一条SELECT语句(通过子报表可以支持多个SELECT),要把复杂的计算写出来,很考验SQL的功底,这样做,虽然可以避免把逻辑写到数据库里,移植性好点,但工具仍旧只是用来显示和输出的。三是完全用工具来实现,一般的工具都提供脚本编程的功能,做到对复杂计算的最灵活的控制。
联系客服