设计
--------------------------------------------------------------------------------
简介
本文介绍了一种WEB报表设计工具的实现思路和解决办法,该工具可以同数据库连接,让用户自己设计报表,报表的数据从数据库中获取,用户修改后的数据可以存回到数据库中。该工具可以实现任意形式(规整、不规整)的报表设计;不仅可以作为最终产品提交给用户使用,对于开发人员来说,也可以作为报表和数据库的设计工具来开发自己的产品。一个目的:让开发人员(至少是本人)不再做“报表苦力”。
前言与问题的提出
本人在C/S结构和B/S结构的软件开发过程中,碰到大量的设计报表的工作。用户有大量各式各样的报表需要实现,并且在系统验收后用户还会有一些报表需要实现。在开发C/S结构报表时使用PB,EXCEL,FORMULA ONE等工具埋头画表,在开发B/S机构的报表时使用ASP,XML/XSL等一个格一个格产生表;好半天完成了报表的样式设计,以为可以歇口气了,但还不行,还需要设计数据库,设计产生报表的方法函数,还要设计修改报表的接口、保存数据的函数;每一张报表都得开发人员亲自完成;好不容易提交用户测试了,用户又说:某某表的格式不对、某某表的公式不对、某某表的大小不对、帮忙增加几份新表……搞得人昏头涨脑,刚刚才有的一点成就感、一丝轻松又被叹气、唉声给冲跑了……要是能让用户自己去做这些污七八糟的事就好了!
正好接到一个金融系统的WEB办公系统项目,要实现的报表就有厚厚的一大摞,这还只是初步的需求,干脆,就设计一个“报表设计工具”,希望能解放以后的报表工作;当然,是在WEB上实现。
做报表设计工具,我以前做C/S结构的系统时就做过,也实现了(用PB6),用户用的也挺好。但是有缺点:一是不好移植在WEB上使用,二是只能显示报表,不能修改报表中的数据,当然更不能增加数据了。在WEB上又该如何实现呢?
实现的方式
要做WEB报表设计工具,必须先要知道报表什么东西?是如何产生和实现的?先理一理思路。
报表是什么?这个好说,就是把一些数据放在固定格式的固定位置上的表格。既然是表格,那么就有“表”有“格”,先要一个“格”一个 “格” 地“拼”出一“行”或一“列”来,再要一“行(列)”一“行(列)”地“拼”出一个“表”来。
虽然同样是由格子“拼”出来的,但有的表就好画,有的不好画,如下图1和图2所示:
图1
图2
明显地图1所示的报表比图2所示的报表要好“画”,我们将图1类型的表称作“规整报表”,而将图2类型的报表称作“不规整报表”。
说了半天废话,那么报表到底是如何产生和实现的呢?本人认为不外乎两种方式:“画”和“填”。
“画表”就是产生一格的同时也将数据按格式放在格子内,就是格式数据同时产生,这样整个表格画完了,表中的数据也有了,报表就生成了。这种方式适合于用来产生规整的报表,这样才可以逐行或逐列的画出该报表。这种方式的优点是产生报表快(成批处理数据)、处理程序简单(一个循环语句就可以了)。
“填表”与“画表”完全不同,他是必须先有表格格式,然后将指定的数据填在指定的表格位置中就可以了。这种方式既适合于用来产生不规整的报表,也适用于产生规整报表。这种方式的优点当然就是适用范围广,但缺点也有,就是速度慢,因为它要先获取表样,然后一个一个地取出数据,再一个一个地填在格中。
那么应该采取哪种实现方式呢?有两种解决方案:
1.分开处理:让用户在设计报表时确定报表是否规整(这是很简单的事),如果规整就让该报表采用“画表”方式产生,否则采用“填表”方式产生。
2.统一处理:全部采用“填表”方式产生。
本人觉得现在计算机的速度仍然在飞快的提高,硬件的“快”可以消除软件的“慢”,但主要是为了简化软件的设计和处理,采用了第二种实现方式:填表。
决定了实现的方式,开始考虑一些细节和技术上的事情了:要实现这个WEB报表设计工具,需要考虑哪些方面的事情,需要解决一些什么问题呢?
需要解决的问题
现在要考虑如何实现了。刚开始,初略一想,不就解决这几个问题吗:
1.如何画表即如何产生表样?必须是在浏览器内实现哟!
——简单:使用DHTML就行,结合使用XML/XSL。
2.如何保存表样?
——简单:都存在数据库的TEXT字段中
3.如何与数据库连接?
——简单:专门定义一个属性来与表示
4.如何显示数据?
——简单:使用DHTML技术、结合XML/XSL就可以实现
5.如何修改数据?
——简单:检测事件不就可以了吗!
6.如何保存数据?
——简单:写在数据库中就行。
仔细一想,才发现这里面问题多多:
7.怎么画表?用什么画?特别是必须在浏览器内实现。
8.如何设计表格样式?如粗体、下划线、斜体、小数字数、合并表格、删除表格等等样式设计操作。
9.表样如何保存?以什么格式保存?存在哪儿?
10.数据显示的位置如何定义?怎样定义?定义的结果如何保存?存在哪儿?又如何填数据?
11.单个数据显示的格式如何定义?怎样定义?定义的结果如何保存?存在哪儿?
12.报表如何与数据库连接?如何获取报表数据?获取数据的条件如何定义?怎样定义?定义的结果如何保存?存在哪儿?
13.用户要新增一张报表,又没有现成的数据库表对应,该如何让用户来设计数据库?数据库又该如何设计?
14.用户如何知道数据库定义的含义?如何知道某个格应该取数据库表中的哪个字段、哪个记录?
15.如何知道用户修改(增加)了报表数据?该数据如何与数据库表中的字段对应?如何才知道哪些格中的数据合起来是数据库表中的一条完整记录?又怎样才能知道用户输入的数据足够组成一条完整记录?怎样保存这些修改(增加)的数据呢?
16.有些根本不需要单独建立数据库表来保存的数据,又该如何保存?
17.报表的数据平衡关系设计?又如何定义?定义的结果如何保存?存在哪儿?
18.自动计算公式如何实现?又如何定义?定义的结果如何保存?存在哪儿?
19.如何从其它报表中提取数据来产生新报表?如何定义?定义的结果如何保存?存在哪儿?
20.如何定义报表的汇总(由分支机构的数据产生总机构的数据)?定义的结果如何保存?存在哪儿?
21.如何实现数据的上报----即数据格式的转换?转换程序如何设计?如何保存?存在哪儿?
……
越想问题越多,就越觉得麻烦,干脆放弃算了——苦力就做苦力吧,象本人这种手脚慢的人,也许设计完这个工具的时间,一大堆报表早就做完了。
回头看看为设计这个报表工具写的笔记和收集的资料,心有不甘;再掂掂报表的份量,太重又太多——难道老做苦力吗?不行!为自己的将来现在麻烦一点也值!可是这么多的问题需要解决,千头万绪一团糟,该如何开头呢?关键的问题是什么?
问题的关键
看看窗外的风景,等到静下心来,再看看这些罗列的问题,一个问题一个问题逐个进行衡量和比较,才发现首先要解决的问题就是“表样设计工具”该如何实现。因为报表的设计、显示、修改、保存等全部操作都是在该工具环境中实现的,数据库的连接、表样的保存等等工作都得围绕该工具的表现形式和接口形式来实现和调整。
既然找到了工作的头绪,那么开始设计吧!不要忙,“工具”的设计方案还没有定呢!
几种方案的比较
要在WEB上实现表样的设计有很多种方案可供选择:
1.使用XML/XSL/DHTML/HTML技术来实现
2.利用IE的WebBrowser ActiveX 控件来实现
3.自己写ActiveX控件
4.自己写Java Applet来实现
5.借用现成的第三方控件实现
那么哪种方案对本人来讲是比较好的呢?
先来了解各个方案的特点,将结果列表如下:
如果能够获取免费的第三方软件,无疑是第5种方案最好。找找看,有没有。还真找到了,就是Microsoft Office Web Components 中的SheetSpace控件,虽然不是免费的(必须要MS Office2000+支持),但用户都有使用MS Office,不仅开发成本降了,用户操作也习惯,就选他了——Microsof