前一段时间,公司需要做一个在线的调查投票系统,目的是统计公司能力等级指数,统计的能力级别分三大类,分别为一级能力要素,二级能力要素,三级能力要素,不同的一级能力要素下面分若干的二级能力要素,每一项二级能力要素下面又分许多三级能力要素,结果是要根据三级能力要素进行复杂的运算后形成二级能力要素的值, 然后再根据得到的二级能力要素的值和投票的人员的不同的级别和不同的岗位情况进行统计(具体怎么统计就不多说拉),然后把所有的结果用柱状图显示出来行政的人员需要具体的每种结果的图表情况,并且要求能导出.
首先第一想法是用ProEssentials控件,主要是因为前一段时间跟日本做项目,被指定使用此控件,查了一圈资料,但是发现在中国,貌似没有几个人用过,但是最后还是搞定了,不过是在winform上做的,不是在web上,尝试了几次,没有成功,而且行政的催的急,所以斗胆使用我从来没有用过的传说中很强大的水晶报表(Crystal Report).
因为一直没用接触过,更别提使用了,尽管一直都没有做过web图表方面的工作,但是工作积累下来的面对问题的自信让我觉得应该是个小CASE,结果真的是个小CASE.
扯了那么多,现在转入正题.
水晶报表(Crystal Report)是微软的图表合作商,因为专业,所以优秀,尽管微软有(Microsoft Chart),但是水晶报表还是被作为一种自带的控件由Visual Studio 2005随之附带.
水晶报表包含两种模式,一种是Pull模式,一种是Push模式.下面句先具体的谈谈两种模式的区别.
Pull模式是一种直接把数据从数据库里面拉出来的模式,所以很形象的叫做Pull,Pull模式主要是要跟数据库建立连接,从数据库里面把数据拉出来并且显示在报表上面.Pull模式的好处就是根本不用你写一行代码,就可以完成报表数据的读取和报表的制作.
Push模式相对于pull模式来说是一种比较高级的模式,Push模式所要得到的数据是需要用到ADO.NET来获取数据,然后在报表上面显示出来.Push模式可以实现数据的自定义获取,这样可以实现功能自定义的最大化,但是相对来说需要编写一定程度的代码(即获取数据).
Pull模式和Push模式总的说来感觉只是获取数据的方式不同,不管用那种方式,数据获取完成之后只需要把获取的数据和制作的水晶报表联系起来就OK了.
下面就具体的两种模式获取数据做相关的说明:
一.pull模式
先要从工具箱的水晶报表工具栏里面分别拖出CrystalReportSource控件和CrystalReportViewer控件.CrystalReportSource控件和其他的数据源控件的功能类似,就是与已经制作好的相关的报表建立连接.CrystalReportViewer控件是用来在WEB上面显示水晶报表的,它的主要作用是跟已经与水晶报表建立了联系的CrystalReportSource建立联系,以方便让用户在WEB上面能够查看水晶报表,所以CrystalReportViewer又叫做水晶报表查看器,两者缺一都是在Pull模式下不能正常显示水晶报表的.CrystalReportSource需要指定一个水晶报表文件,如果还没有水晶报表的化,可以通过CrystalReportSource的向导创建一个新的水晶报表,在创建的过程中指定为空白报表,报表创建好之后就会在左侧出现一个字段资源管理器,右键点击数据库字段并且选择数据库专家就会弹出一个数据库专家的对话框,在创建新连接里面选择OLE DB(ADO)选项,因为我的是SQL SERVER 2005 数据库,所以我在弹出的数据源配置里面选中SQL Native Client,点击下一步,依次的输入服务器名,用户名,密码,数据库,然后点确定就发现在左侧的数据库字段里面出现了数据库里面包含的所有字段,这样一个Pull模式的数据连接就算成功了,然后就是根据我们需要的水晶报表的样式创建具体的水晶报表(具体怎么做下此再写一篇),在这里提示一下,如果是要显示数据库里面的信息的话,只需要把字段拖放到水晶报表里面就可以了.最后,把CrystalReportViewer的数据源指定为配置了的CrystalReportSource.基本上一个Pull模式水晶报表的建立就完成了.
二.push模式
Push模式主要显示自定义的数据,首先需要在项目里面建立一个DataSet,具体的方法是在项目里面添加一个数据集,具体方法是右键选中解决资源管理器里面的项目的根目录,选中添加新项,选择数据集并且命名为MyDataSet.XSD,创建好数据集后有两种方式填充数据,第一就是可以直接从服务器资源管理器里面拖动相关的数据字段到数据集合里面,第二就是自己创建数据集里面的字段,在数据填充的时候通过ADO.NET来实现数据的填充,不过填充的DataSet是我们自己定义的MyDataSet,其实在我们填充的MyDataSet里面可以有很多张我们自己根据需要定义的表和字段,这样可以实现我们的数据自定义最大化,数据填充以后就是关于水晶报表数据源的配置问题,在Push模式的方式下,我们右键点击水晶报表字段资源管理器里面的数据库字段,并且选中项目数据下面的ADO.NET数据集.然后我们可以清楚的看到在ADO.NET数据集下面有我们自定义的MyDataSet数据集,选中里面我们自己定义的数据集下面自己定义的表并且把表加入到右侧的栏目中,这样我们就可以像Pull模式一样来使用相关的字段建立起水晶报表了.
以上就是两种模式的区别和具体的实践。
下面谈谈关于碰到的一些问题.
关于使用次数的问题.水晶报表作为一种商业的专业图表不可能给你免费使用,安装Visual Studio 2005时自带的水晶报表只能使用30次,就是说你在用ASP.NET Development Server进行调试的时候只能用30次,如果还要继续使用的话就要停止ASP.NET Development Server并且要重新生成,同样,对于部署在iis上面并且装有.net framework 2.0的部署项目也是一样的,只能用三十次就不能用了,怎么办呢?好办,打开注册表,找到HKEY-LOCAL-MACHINE->Crystal Decisions->10.2->Report Application Server->InProServer下面的键PrintJobLimit并且把值改为1000,然后寻找到HKEY-LOCAL-MACHINE->Crystal Decisions->10.2->Report Application Server->Server下面的键PrintJobLimit并且也把值改为1000,这样就完全可以满足的你要求拉.
然后就是部署的问题,因为不是部署在本机,而是部署在其他的机器上面,而部署的机器也是装有Visual Studio 2005的,但是出现了一个问题,就是部署以后水晶报表的图表居然不可见,而且一些打印和导出的功能都不能使用了.解决的方法是找到在部署机器上面找到aspnet_client文件夹,并且把这个文件夹拷贝到发布网站的文件夹里面,ok,一切搞定!
总结使用水晶报表的使用,感觉水晶报表还是很方便的,而且对于相关的图表也有很强的支持,对于开发人员来说可以大大的降低开发所需要花费的时间成本.以上只是简要的介绍了一些关于水晶报表的使用心得,如果各位朋友有疑问,希望随时联系我,欢迎讨论!下面附一张效果图!
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)