且行且珍惜

书到用时方恨少非君子
posts - 2, comments - 12, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
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  官方站点

Feedback

#1楼  回复 引用 查看   

2005-08-09 11:54 by 蛙蛙池塘      
看看

#2楼  回复 引用 查看   

2005-08-09 12:00 by idior      
欢迎, 不过似乎很多人开始不用cr了。

#3楼  回复 引用 查看   

2005-08-09 12:03 by 阿泰      
作水晶报表怎么可以错过我的日志,呵呵

不过非常可惜我几乎没开发过基于Asp.Net的水晶报表
莫有机会~~

一篇类似的文章,不过更浅显点
http://babyt.cnblogs.com/archive/2005/04/12/135849.html

#4楼  回复 引用 查看   

2005-08-09 12:06 by 蛙蛙池塘      
海波的站点你有没有推荐呀,还有这个CR是不是对浏览器有限制呀,或者需要客户端装插件什么的,我感觉你说的这个push方式也不错,可以把dataset用webserivieces传递,客户端随便设计去吧,这样耦合性也小了就

#5楼[楼主]  回复 引用 查看   

2005-08-09 12:36 by Sunus's Blog      
to:蛙蛙池塘
应该是没有限制的,根据他的联机文档,只要使用了Engine模型,则它会自动将报表转换成纯html页面,所以客户端是没什么特殊要求的

#6楼[楼主]  回复 引用 查看   

2005-08-09 12:38 by Sunus's Blog      
to: 阿泰
呵呵,网络何其大如何能尽之,不过亡羊补牢为时未晚,已经把你的也加进列表了:)

#7楼[楼主]  回复 引用 查看   

2005-08-09 12:42 by Sunus's Blog      
to idior:
好像是有这个趋向,不过我觉得并不是因为CR不好,而是不符合中国国情,尤其是做电子政务的,报表是必备的,但是那些不规整的表样,以及错综复杂的数据库信息,有时候真觉得还不如直接用单元格工具好呢

#8楼  回复 引用 查看   

2005-08-09 12:45 by idior      
不用CR不是不用报表。CR因为复杂不方便使用受到不少批评。

#9楼[楼主]  回复 引用 查看   

2005-08-09 12:59 by Sunus's Blog      
啊?我怎么觉得CR上手挺容易的呀~~~不过没法全面的控制是一个大问题,比如说无法在运行时手工创建一个新报表(使用那个api需要另行向CrystalDecisions注册license)
我的意思是CR不符合中国国情,因此现在需要报表的时候逐渐会考虑使用国产报表软件,听说晶格(音近,听说过没见过,不知道是哪两个字)就做得很不错

#10楼  回复 引用   

2005-08-10 10:45 by haozidong
我也写过一点。