CR是一个相当强大的报表制作工具,VS2003中集成了它,不过版本比较低,似乎是8.0,而现在市面上已经有了CR11.0以及RDC,RAS等等。可怜我现在仍然在VS+CR9.0的环境中苦苦挣扎~Crystal Decisons也着实可恶,不仅那么贵,还有很多api若想使用还得向它另行注册,真过分。不提这些了,说主题。
CR的数据提取模式分为pull和push两种。前者是由CR自身实现数据库访问,获得数据并填充报表,大部分比较规则的报表都适用于这种方式;后者则是由开发人员手动建立数据库访问,提取想要的数据填充一个DataSet,由数据集文件xsd描述这个DataSet,而报表则建立在这个xsd文件之上。在设计时,报表仅知道底层的结构而没有真正的数据源,因此无法预览;运行时程序给一个DataSet填充进真正的数据,然后将其作为报表的DataSource而使报表得以显示数据。
使用push模式的缺点当然是程序略为复杂,需要程序员添加更多的控制和精力了。但是好处却很多:
首先,彻底摆脱了CR与数据库的连接,不再局限于任何一个数据源,程序员要提供的仅仅是一个非空的DataSet而已;
其次读取数据的效率大为提高,pull模式读取到的表都是底层数据库中的实际表,其中的信息不一定就是要显示出来的那些,还需要通过公式来进一步转换。而公式是执行得比较慢的,特别是那些基于公式分组,排序的运算尤为明显,而DataSet中的表由于是自定义的,所以可以以最终要直接显示的信息为列,而那些处理都直接放在程序中进行,执行效率是很高的,而且对数据库服务器的访问量降为了最低。
第三,权限控制。特别是在BS结构中,用户是按角色划分的,数据库也是这样。每张表,每个视图都有自己的访问权限,在使用pull模式设计的时候往往会忽略这一点,造成结果莫名其妙的错误,而且此时需要做的改动也往往是数据库那一层的改动(不知道新版本的CR能不能提供更好的安全机制);但是push模式就几乎不存在这个问题了,因为CR的基础仅仅是一张虚拟的表,没有什么权限,所有需要考虑的全部由程序员来完成,这也是天经地义的事情了,是个程序员都会的:)
第四,也是实际使用中发现的。当一个报表中内含几个子报表的时候,他们往往是结构相似,或者数据源相似甚至是一样的。这时候如果使用push模式,则可以针对一个xsd建立多个子报表供使用(在我的程序中干脆建立一个,然后直接复制改名就行了)而同一个DataSet可以同时赋值给多个子报表。如果使用pull模式则需要连接同一个表或者查询多次,非常慢。
第五,在可移植性逐渐成为主流的情况下,使用DataSet可以方便的做到修改程序的同时不影响程序的运行并且无需修改源代码,将数据库连接字符串写进web.config,而后每次只要替换web.config,xxx.xsd,xxx.rpt(或其中的一部分)即可达到修改程序的目的,而完全不影响当前的运行;使用pull模式的话,数据库的连接就已经写死了,无法变通(理论上也可以通过在web.config中预设相关的常量,再使用ReportDocument.Database类进行改变,不过好像不太实用),能修改的仅仅是一个rpt文件而已,作用不大。
由此可见,push模式的好处和作用是非常之大的,但是BestPractice仍然建议尽量使用pull模式,并且连Engine模型都少使用。毕竟报表作为显示信息的工具才是主要用途,而且大部分用户交互CR已经具备了,因此剩下的交互需求并不是很大。但是当遇到不规则的报表,或者数据库信息非常不规范的时候,或是由其他特殊需求的时候,使用push模式绝对是你的首选。
ps:
1. 其实使用CR的大部分情况都是直接用CR Designer设计完供预览或打印即可,即使要嵌在程序中也往往仅需要使一个CR Viewer与报表绑定就行了。所以说本文所说的push模式尽管有效,实际使用的比例并不高。不过作为一个程序员,当面对一个功能强大的组件的时候,我想肯定会更关注于如何对它全面的控制吧。
2.关于CR的入门,可以直接读它的联机文档和Walk-Through,另外有几个网站可供参考
http://aspalliance.com 英文,推荐大部分文章,以系列化的文章step by step指导CR for .Net的进阶
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/crystlmn/html/crconcrystalreports.asp msdn,就不用多说了
http://blog.csdn.net/haibodotnet/category/13322.aspx 没什么原创,都是直接摘引自联机文档或者官方网站等的文章列表,作为一个参考索引还不错。
http://blog.csdn.net/fxsjy/archive/2005/01/21/263252.aspx 一些个人心得体验
http://babyt.cnblogs.com/archive/2005/04/12/135849.html 阿泰的blog
http://www.businessobjects.com/products/reporting/crystalreports/net/default.asp 官方站点
ps:
1. 其实使用CR的大部分情况都是直接用CR Designer设计完供预览或打印即可,即使要嵌在程序中也往往仅需要使一个CR Viewer与报表绑定就行了。所以说本文所说的push模式尽管有效,实际使用的比例并不高。不过作为一个程序员,当面对一个功能强大的组件的时候,我想肯定会更关注于如何对它全面的控制吧。
2.关于CR的入门,可以直接读它的联机文档和Walk-Through,另外有几个网站可供参考
http://aspalliance.com 英文,推荐大部分文章,以系列化的文章step by step指导CR for .Net的进阶
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/crystlmn/html/crconcrystalreports.asp msdn,就不用多说了
http://blog.csdn.net/haibodotnet/category/13322.aspx 没什么原创,都是直接摘引自联机文档或者官方网站等的文章列表,作为一个参考索引还不错。
http://blog.csdn.net/fxsjy/archive/2005/01/21/263252.aspx 一些个人心得体验
http://babyt.cnblogs.com/archive/2005/04/12/135849.html 阿泰的blog
http://www.businessobjects.com/products/reporting/crystalreports/net/default.asp 官方站点
浙公网安备 33010602011771号