let it be
行到水穷处 坐看云起时
转载于: http://www.cnblogs.com/lodestar/archive/2007/09/27/907827.html

vs2005中水晶报表使用整理

vs2005中水晶报表实现
 这方面的文章其实非常之多,但因为太多就有些乱,而且CrystalReport的版本不同使用上也有些区别,
前段时间正好需要vs2005下面报表的解决方案,就参考了下网上的资料,整理了一下。

push模式和pull模式
不论是推模式还是拉模式都应使用ReportDocument和ReportViewer两个控件完成报表的数据加载和数据展现。
这样可以将表示层和基础业务逻辑分开,ReportDocument解决报表的封装,CrystalReportView解决报表的展现。
还有一种做法是使用CrystalReportViewer和CrystalReportSource控件
CrystalReportViewer的ReportSourceID属性指定数据的来源
CrystalReportSource控件指定rpt模板,如果模板中设置了过滤参数,可以用ControlID和界面中的数据选择控件
关联,这种方法和sqldatasource很相似,但是这种使用方式会丧失灵活性,逻辑层次也不明确,和对sqldatasource
的态度一样,不太赞成使用。


方式一:拉
ReportDocument.load("模板.rpt");
ReportDocument.SetDatabaseLogon("name","password")
//ReportDocument.SetDataSource()
CrystalReportViewer.ReportSource =ReportDocument
方式二:推
构造sql
根据sql得到datatable
ReportDocument.load("模板.rpt");
ReportDocument.SetDatabaseLogon("name","password")
//这里ds可以是dataset或者datatable也可以,这部也是和方法一的主要区别
ReportDocument.SetDataSource(datatable)
CrystalReportViewer.ReportSource =ReportDocument
报表的数据来源已经不是报表模板使用拉模式获得了,是推模式的一种实现
 这样实现的好处是这里的sql是由页面输入条件动态构造出的,可以实现按条件的动态查询。不使用强类型dataset,用datatable非常方便。
 这种方式和以前用pb构造动态datawindow的方式一样,我使用起来觉的还是很顺手的。
 容易实现的优点从安全性上看就变成了缺点,页面输入拼装sql,安全性不高。

如果涉及多个表,sql很长构造麻烦的情况,使用第二种可能不是很方便。那么在第一种方法下能否实现where条件的动态变化呢
这时可以使用公式筛选记录的方法实现:
ReportDocument.DataDefinition.RecordSelectionFormula = "{**}= " textBox1.Text ;
筛选条件也可以根据页面输入动态构造
我的理解是数据从数据库中拉来后再使用过滤条件进行过滤的方式,性能会不好控制。
当然也可以使用CrystalReportViewer控制过滤,比如
crystalReportViewer1.SelectionFormula = "{**}= " textBox1.Text;
但是按照表示层和基础业务逻辑分开的原则,用ReportDocument更加自然。在vs2005的帮助中有完整的帮助和示例。

要按照使用环境限制,适当选择实现方式。
去年有个多维报表的项目用sqlserver2005的reportservice做的,现在来看水晶报表也完全可以,而且水晶报表也能实现切片和钻取的效果。建立交叉表,两个数据在两个维度变化。尤其是数据源非sqlserver2005的情况下,还是非常好的选择。

技巧:
1.非交叉表实现单元格合并,网上的意见都是无法实现,后来在一个网站上看到了实现方法,虽然自然,但是效果可以出来,如图。
需要合并的单元格都设置为组,并在“节专家”,选择你的组页眉,右边“公用”中选中“延伸到后续节”。设置对象格式,上边框为单线。
在设计时预览都没有问题,但是嵌入网页运行后,不知道为什么线都丢失了。没办法,再插入线,在设计时预览线条会粗些,但是运行时刚好。
这是野路子的实现。

posted on 2007-09-27 17:17  流浪浪  阅读(1853)  评论(0编辑  收藏  举报