大数据量下水晶报表的实现及显示过程中的进度条显示讨论
最近一段收到的反馈中,有几位是问到在应用程序中使用水晶报表时,大数据量情况下因为等待时间过长,给用户的感觉不好
所以想增加一个进度条,给用户一个比较直观的印象。
本文针对此问题而生,但是并没有一个像样的解决方法,因为到目前可能还没有很好的方法,或者是我们所不不知道。
所以提出来,希望得到更多有价值的信息
在CR9的浏览控件上是有进度条的,
但是到了CR10以后就不见了踪影,当然,大家需要的进度条也不是这个进度条,而是希望自己在程序上能完全控制的一个进度条。
不过我觉得这个是太容易实现的。只是如果界面上本来就有,可能感觉会好一先。
按照现在的水晶报表模型
CR目前没提供输出的接口,那么我们就不能知道当前的进度如何。
但是有一点是肯定的,如果在同样的数据量下(假设数据量很大),那么如果报表内使用的公式(或者组、样式效果)越多,那么报表展现就越慢。
而对同一报表,数据量越大就越慢,这个似乎是废话,呵呵。
不过我想说得是,如果我们现在不能实现进度条,那么我们让报表尽可能的快一点:
(请参考http://www.cnblogs.com/babyt/archive/2008/01/12/1036450.html中的第2条)
1)返回尽可能少的记录数给报表,
我们比较常见的是明细表,有时候用户不限定条件,哗啦上来选个一年的,几百万条数据就出来了。
但是这个有什么意义呢,用户不会打印也不会去一页一页看,但是这个操作足以让你的程序崩溃了。
水晶报表呈现时会生成临时文件,几百万条数据可能生成几G的临时文件
所以策略一就是限定用户的操作范围。有时候用户不理解,他可能会觉得一年和一个月有什么区别呢?所以要沟通好。
再来就是做统计的,那么百万条的记录就不算什么了。但是你不可以把百万条记录都丢到水晶报表里去让报表去做统计!
这个时候有两种方法,一是使用中间汇总表,这个是很常见的,我们平时可能有日报、周报、月报、季报、年报以及多年度的数据比较分析
如果直接从明细表里取那么不仅仅是程序受不了的问题了,所以使用汇总表压缩数据是最好的解决方法。
平时在系统压力较小的时候使用数据库的计划任务完成这个操作即可
另外一种方法就是使用SQL命令在数据库端完成汇总,而不是放到数据库里去,当然,这种情况水晶报表的压力虽然小了,但是数据库的压力却大了。
2) 如果使用了上述方法返回的数据仍然很多,那么就尽量减少报表中的公式(特别是针对详细资料节数据的效果)、样式
好了,说完了,这个,我们再来说说这个进度条。
一般来说在程序中使用水晶报表有四个步骤。
1) 从数据库抽取数据到记录集
2)加载水晶报表模板
3)把记录集赋给水晶报表对象
4)放到浏览器CRViewer呈现
那么我们可以大致估计一下各个步骤的占用时间,完成一个步骤后进度条就进多少。(注意,是估计,而不是确切的时间...)
开始的时候CRViewer设置为隐藏,等全部加载结束后再把CRViewer显示出来。
于是重要的问题就是如何判断报表再CRViewer中呈现完毕
再CRViewer中提供了一个isbusy属性,返回的是true/false。
所以要不断监视这个属性的返回值,来判断加载的结束。
当然,我个人认为这种方法其实不咋的,可能实现起来也不方便,所以还是让他快点显示出来比较好