vs2005中水晶报表使用整理

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

本文转自
http://liujace.itpub.net/post/4284/403447

你可能感兴趣的:(报表)