上个月,一直忙于开发报表,虽说自己写报表的经验不是很多,也就是从最近才开始的,之前也只是修改一下现有的报表,但经过这段时间,对报表的开发已经有了一些认识。
首先,要弄清楚报表中统计的每个字段的来源(字段是从哪个表里查出来的)、含义(有些字段是经过加减乘除运算的出来的,比如:平均值、比例、合计等)。明白报表的查询条件是什么,比如:时间条件、和业务上的一些条件。基本上可以限定,这个报表中用到了几个表,表之间的关联关系是什么(外键关系)。
对于简单的报表,可以通过一条SQL查出来结果集,再做一些简单的加减乘除,把运算好的结果封装到一个集合中(一般是list),然后在页面上显示即可。
但是一般的报表都比较复杂。我试过两种方式去写。
第一种,是使用SQL直接查出结果,结果用list接收,在页面显示。没错,所有的运算啊、什么的都通过SQL。SQL查出来之后,不需要对结果再处理。这样不是一个好办法。最初之所以用这种方式实现,是因为迫于当时时间紧急。当时,每个报表都有已经写好的SQL,为了尽快开发报表,以一天开发两个报表的速度,就用这种方式做了。
这种方式,首先写SQL的难度比较大。需要用到的表通常很多,七八个都是正常的,SQL也比较复杂,比较长,写SQL花费的时间也会长一些。而且测试的时候发现,表之间的关系稍有不慎,报表的结果就不准了,需要修改SQL。
然后,在上线之后,发现了一个比较严重的问题。8个报表中,有2个上线之后,直接报错。但是明明测试的没问题啊。只好拿SQL去生产的数据库里执行,报错如下:
上网查,说是因为temp表空间不足造成的。这两个报表的SQL并不是所有报表中最复杂的,而且也经过了一些优化,没有特别多余的语句,我也不明白为什么会这样。
之后通过对报表的维护,发现,SQL若有任何一点失误的地方,对SQL的改动就比较大,SQL动的时候要小心,因为可能会改错。所以我的感觉就是,维护的难度有点大。
然后就会想到用第二中方法来开发报表。
第二种:
用Java分步骤的查询、运算出来要用的数据,拼到一起,凑成结果集,在页面显示。或者直接在后台加上<table>、<tr>、<td>这些,和结果拼成字符串,传到前台,直接显示table,就是报表的样子。