阿泰的软件实用主义

水晶报表/BOE

博客园 首页 新随笔 联系 订阅 管理
  176 Posts :: 9 Stories :: 2046 Comments :: 38 Trackbacks

最近一段收到的反馈中,有几位是问到在应用程序中使用水晶报表时,大数据量情况下因为等待时间过长,给用户的感觉不好
所以想增加一个进度条,给用户一个比较直观的印象。
本文针对此问题而生,但是并没有一个像样的解决方法,因为到目前可能还没有很好的方法,或者是我们所不不知道。
所以提出来,希望得到更多有价值的信息

在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。
所以要不断监视这个属性的返回值,来判断加载的结束。

当然,我个人认为这种方法其实不咋的,可能实现起来也不方便,所以还是让他快点显示出来比较好

posted on 2008-02-26 14:37 阿泰 阅读(544) 评论(10)  编辑 收藏 网摘 所属分类: CR我的原创A_CR答疑区

Feedback

#1楼 [楼主] 2008-02-26 14:39 阿泰      
补一下,在CR2008中,这个isbusy属性似乎没有了。。
  回复  引用  查看    

阿泰兄,最近可好!最近忙着做报表,几乎没有时间上网呀!
我用水晶报表生成一张饼图 ,我想点击饼图不同区域链接到不同报表请高手指点
用”组“深化 好像不能达到我的效果 请阿泰兄指点!!
  回复  引用    

#3楼  2008-02-26 17:23 oggg [未注册用户]
谢谢回复,加快报表读取的速度确实是解决问题的最好方式,但有的时候很难。
isbusy属性能暂时解决我的问题了。
因为是公司内部系统,要求并不那么严格,只要在展示的时候能把报表导出就能满足我的需要了。原来的现象是数据读了一些后,CRViewer上就已经有展示了,但不能进行其他的操作,直至读完所有数据。
这样,我就每间隔一段时间,查询isbusy属性,然后展示。
但是我在CR10上没有找到这个属性,555555!
我再用vs2003自带的CR9看看。
  回复  引用    

#4楼 [楼主] 2008-02-27 11:06 阿泰      

@Richard lee

我觉得水晶报表可能实现不了这个功能。。。

  回复  引用  查看    

#5楼  2008-02-28 09:42 oggg [未注册用户]
阿泰,你好!
请问你用的是什么开发工具?我用VS2003自带的CRViewer,在C#工程下没有找到isbusy属性,也没有自带的进度条。
还是说需要单独安装的CR9版本里才有?
目前已试过的版本
Crystal Reports 10 for Visual Studio .NET(10.0.3300.0)
Crystal Reports for Visual Studio .NET(9.1.5000.0)
(括号里是C#引用控件显示的版本号)
谢谢!
  回复  引用    

#6楼 [楼主] 2008-02-28 09:47 阿泰      
@oggg

我用的都是独立安装版本的CR9.2和CR11.5,都有这个属性
但是CR11.5没有进度条
我在用VS2008带的CR Basic的时候发现也没有这个属性
不知道是不是内嵌版本都没有。。

  回复  引用  查看    

#7楼  2008-04-20 15:45 三断笛 [未注册用户]
感谢阿泰 每次都能学到不少东西
  回复  引用    

#8楼  2008-11-13 11:13 workflow [未注册用户]
楼主你好,不知道你处理过类似的问题吗?
当报表一次显示的数据量过大的时候,会提示 'logon failed'
这里没有用单独的的报表应用服务器对象模型(RAS)而是用vs自带的 .NET 对象模型(集成在vstudio中的).这个时候报表对象所消耗的内存都在IIS(xp下是aspnet_wp.exe windows server2003下是w3wp.exe)这个进程中,这样这个进程一旦达到一定的值后,就会造成logon failed.我想知道像这种情况该如何处理?难道真的要做一个单独的的报表应用服务器对象模型,让处理报表的进程何IIS的进程分开吗?
  回复  引用    

#9楼 [楼主] 2008-11-13 11:43 阿泰      
@workflow(8楼)
不知道你处理的数据有多少,不过我觉得即使分离进程,也难以达到效果。

我记得最多曾经拉过80万条记录,除了响应非常慢之外,在temp目录下生成了一个近10G的临时文件。不过并没有出现logon faild的提示。可能是进程占用系统资源太多,导致其他进程异常终止了吧。
我觉得解决这个问题的根本方法不是技术问题,而是技巧问题。
对于这个大数据量,我这么去理解。有两种可能,一是打印清单,这个最好处理,比如有100万条,每页显示50行,那么就将数据拆成100w/50份,每次取一页数据塞到报表里进行打印。然后自己模拟掉工具条的事件就可以了。
不过对于这么大的数据量,一般也没人看,所以只要写打印事件就差不多了。
另一种是对数据进行分组汇总,像这种汇总的情况,事先在数据库汇总好,比如说拿到的数据是 select a,b from xx,那么就更改一下,不要直接操作表,用SQL命令, Select count(a) ,sum(b) from xx group a 这样去压缩数据再传给水晶报表。


  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: