官网https://www.sap.com
一、下载
1、水晶报表有两个必备文件和一个编辑软件
1)CRforVS_13_0_1.exe 这是开发电脑上,为VS2010配套的,安装之后,VS中会自动增加reportViewer工具和rpt文件建立模板,可以在VS中创建和修改RPT报表
2)CRforVS_redist_install_64bit_13_0_1.zip 这是运行环境,开发电脑上不需要安装,安装在服务器上。
3)水晶报表2008(CR2008)这是用来编辑rpt文件的,因为报表制作常常很麻烦,VS2010中编辑器功能有限,就用这个CR2008。这个用得好象较多,我准备使用它
以前用的是水晶报表9,英文版的水晶报表10
要注意:版本可以比VS2010的低,低了大部分能识别,但不能装高版本,
以前系统使用是CR10.0,我制作报表作的是中文版CR9,感觉很好。
2、下载地址:
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_13_0.exe --for VS2010
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_13_0_17.exe --for VS2015
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_13_0_21.exe --for VS2017
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_32bit_13_0.zip --67.5M下载慢
http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_32bit_13_0_1.zip --67.9M下载慢
3、VS与CR的版本对应
VS 2010 - 13.0原始版本和更高版本
VS 2012 - 13.0_7和更高
VS 2013 - 13.0_9和更高
VS 2015rc–13.0_14
VS 2015 - 13.0_15和更高
VS 2017 - 13.0_21和更高
二、安装
VS2010中,可以安装CRforVS_13_0_1,也可以安装CRforVS_13_0
注意:要用管理员来运行安装程序,否则可能报错:错误2753。文件“agent.exe.6ed28686”没有为安装作标记
安装CRforVS_13_0_1.exe之后,VS2010工具箱中自动出现“报表设计”水晶报表工具
CR不支持Visual Studio的Express版本
默认情况下Windows 10没有安装3.5框架,VS的CR仍然需要它。通过“打开或关闭Windows功能”来选择它,并选择这两个选项。(By default Windows 10 does not install the 3.5 framework, CR for VS still needs it. Select it by “Turn Windows feature on or off” and choose both options.)
注意:版本号后边的13_0_1为小版本号,下载时2个文件的小版本号要相同。开发电脑和服务器上安装的版本号要一致。
安装之后显示CRforVS_13_0_1.exe的版号是13.0.1.22 ,web.config文件中使用这个版本号,CR浏览的ASPX文件中会自动生成这个版本号;
CRforVS_13_0.exe的版本号是13.0.0.99
CRforVS_13_0_21.exe的版本号是13.0.21.2533
CRforVS_redist_install_32it_13_0_1.zip、CRforVS_redist_install_64bit_13_0_1.zip这两个版本
网上说VS2010只能安装32位,但我在服务器上直接安装的是64位的,没问题。
三、部署和排错
1、VS2010系统项目中添加引用5个库文件
CrystalDecisions.CrystalReports.Engine 版本13.0.1.22
CrystalDecisions.ReportSource 版本13.0.1.22
CrystalDecisions.Shared 版本13.0.1.22
CrystalDecisions.Web 版本13.0.1.22
ICSharpCode.SharpZipLib.dll 版本0.86替换原来的0.84
前4个都在C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet
如果项目是C/S的程序,引用CrystalDecisions.Windows.Forms来替换CrystalDec主sions.Web
注:VS2017 版本号13.0.21.2533 引用文件也在上面的文件夹中
2、样式文件aspnet_client
安装CRforVS_13_0_1.exe后,C:\inetpub\wwwroot自动生成了aspnet_client文件夹,这里面是水晶报表的样式文件
把aspnet_client复制到项目文件的根目录,没这个样式,水晶报表显示的是一片空白,工具栏按钮都没有。
我的电脑就怪了,复制了这个样式,也没显示,查看网页源文件,才知道有两点不同:
1)项目指定的样式文件夹是aspnet_client不存在的,叫4_6_81,本应是4_0_30319。处理方法:复制4_0_30319,粘贴为4_6_81 。不同的项目,指定的编号不同,有一次服务器补丁后,编号也变了。
2)项目指定的样式文件路径不在项目根目录,而是真指C:\inetpub\wwwroot\aspnet_client\4_6_81
服务器上是指向项目根目录的aspnet_client\4_6_81
3、数据集模式
数据库中直接读表的方式,很容易就实现了水晶报表的功能。
但项目报表不可能这样一成不变,必须选用数据集的模式。这个模式下,把我整得好苦。
最关键的是数据集绑定时的写法必须是:rptDocument.SetDataSource(rptDataSet.Tables[0].DefaultView);
我以前在CR10中运行十多年,用的都是:rptDocument.SetDataSource(rptDataSet);
结果:以前的绑定不能把数据传进RPT,也不显示错误,却显示:您请求的报表需要更多信息,要求登录服务器名、数据库登录信息,而且无法输入登录信息
这个问题困扰我3天3夜,最后是参考了网上一篇文章才实现的:http://blog.csdn.net/jsjpanxiaoyu/article/details/42360659
4、log4net版本错误提示
运行打开水晶报表,报错:log4net要更高版本,可整个系统与log4net没半毛钱关系,log4net是一个日志功能。
实际问题是:VS2008项目转VS2010后,水晶报表浏览页要重做,没有原因,重做了就好
5、乱码问题
水晶报表浏览页出现乱码。这跟上面的问题解决方法是一样的。
6、crystalreportviewer属性设置
1)VS2008下设置的属性不能再用了,会报错;
2)去掉左边的树图:在“设计”视图下单击你的CrystalReportView,点击右上角的小箭头,设置“选择工具面板视图”为“none”
相当于属性中添加 ToolPanelView="None"
3)工具栏添加报表页选择框:
4)无法设置水晶报表浏览器居中:这个问题还没解决
5)VS2008下制作的证书格式(更改RPT显示到HTML中的格式,有些复杂),现在不认了。还没找到解决办法
6)CS中设置属性:
//不显示组树
CrystalReportViewer1.DisplayGroupTree = false;
//不显示徽标
CrystalReportViewer1.HasCrystalLogo = false;
7、RPT文件生成CS文件的错误
在VS2008中,操作RPT文件,会自动生成CS文件,然后整个项目就无法编译了,整个项目都无法识别引用和命名空间。
删除RPT下的CS文件,就没事了。
但删除了,再操作,又生成了,再删除就没事了。
VS2008下做的几个项目,都存在这个问题
项目转到VS2010下,还是一样存在这个问题。没解决掉。
但是,我在VS2010中,新建一个测试项目,却没有这个问题。
8、XSD数据集文件的错误
跟上面的情况一样一样的。
9、数据集绑定数据实现水晶报表的步骤:
1)建数据集:项目中,添加--新建项--数据--数据集,输入一个与RPT文件名称一样的文件名,便于区分;
在新建弹出的界面,右键--添加--数据表,名称可以改成数据集的名称一样的,也可以不改,就用DataTable1
添加列,报表需要的列都添加进去
2)写SQL查询语句,照着数据集的列名,组织SQL语句,要完全对应
3)建RPT文件,不要用向导。生成后,在数据专家中,选择:创建新连接--ADO.NET(XML)--建立新连接,找到刚建的数据集文件,点击“完成”
将此数据集加到“选定的表”,确定。
4)选择“字段资源管理器”,展开数据库字段,把字段拉入RPT文件。
5)绑定数据与RPT文件:定义一个数据集,用SQL语句数据把数据读入数据集,把数据集绑定到水晶报表。
这步实际很简单。但要注意,绑定语句用这个:rptDocument.SetDataSource(rptDataSet.Tables[0].DefaultView);
10、权限问题
水晶报表涉及到文件读写,涉及到的文件夹应当添加 ASP.NET或network service用户的读写权限
11、清除报表缓存:
网上说,水晶报表并发数是5个,这很危险呀。
如果超过,就报错,提示数量受管理员限制。
数据集资源释放:ds.Dispose();
报表内存释放:
protected void Page_UnLoad(object sender, EventArgs e)
{
//建立完页面时,释放报表文档资源
doc.Close();
this.Dispose();
this.ClearChildState();
12、DataSet\SqlDataReader选哪个好(网上的,没测试,我用的是前者)
SqlDataReader优点:读取数据非常快。如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。缺点:直到数据读完才可close掉于数据库的连接
(SqlDataReader 读数据是快速向前的。SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法。它使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据。DataReader需及时显式的close。可及时的释放对数据的连接。)
Dataset是把数据读出,缓存在内存中。缺点:对内存的占用较高。如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。优点:只需连接一次就可close于数据库的连接
*一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较合适.对SqlDataReader和Dataset的选择取决于程序功能的实现。
13、设置宿客户端缓存的问题
为防止不刷新,页面加上:<%@ OutPutCache Location="None"%>
14、打印时出现:出现通信错误 将停止打印
原因:点打印后,报表要重新加载一回,原来放在if(!IsPpstBack){}中的代码不会执行,这样就会缺少一些报表需要的值;
处理方法:把if(!IsPpstBack){}中的代码拿出来。
问题:这个效率太低了:翻页、打印都要重新加载,需要完善。
15、[水晶报表]服务器后台自动生成PDF等档案 http://blog.csdn.net/david_520042/article/details/7044482
如何利用Crystal Report程序来生成PDF版本 http://blog.csdn.net/yanhuaju9/article/details/1576979
使用水晶报表输出PDF文件(类实例)http://blog.csdn.net/zhangjian01361/article/details/986449
三、设计技术点
水晶报表采用Visual Basic 的语句和函数
1、设置页面宽度
节专家--详细资料节--勾选“多列格式化”--布局,设置宽度
对于有子“详细资料”节的,要选择top“详细资料”节才会显示“多列格式化。
2、Split({案卷表.增2},'*')[1]
按分隔符分裁字符段,从1开始,不是从0开始
dim arr1() as string
dim ret as string
dim i as number
dim k as number
k=0
arr1=split({盒表.分类名称},"|")
for i=1 to ubound(arr1)
if k=0 then
ret=arr1(i)
else
ret=arr1(i)+"|"+ret
end if
k=k+1
next i
formula=ret
3、Cstr({盒表.盒号})) 转字符函数
4、if isnull({盒表.专业名称}) 判断空值
if isnull({盒表.BH})=false
5、if Length ({盒表.分类号}) > 6 判断字符长度
6、trim({盒表.专业名称}) 清除空格
7、截取字符
Left ({盒表.分类号}, 4)
Right ({盒表.分类号},Length ({盒表.分类号}) - 6 )
left(Cstr({hos_cureHis_ds.fee_time}),4)+'年'+right(left(Cstr({hos_cureHis_ds.fee_time}),6),2)+'月'+right(left(Cstr({hos_cureHis_ds.fee_time}),8),2)+'日'
8、日期格式化
if Month ({盒表.起始时间})=Month ({盒表.结束时间}) then
cstr(Month ({盒表.起始时间}),0) +"月"
else
cstr(Month({盒表.起始时间}),0)+"-"+cstr(Month({盒表.结束时间}),0)+"月"
参考文章:
0、VS2010下水晶报表的使用总结-从安装到使用到部署,有图有真相
1、VS中创建实例 https://jingyan.baidu.com/article/375c8e1995952c25f2a22986.html
2、VS.NET2010水晶报表安装部署[VS2010]:http://blog.csdn.net/jsjpanxiaoyu/article/details/42360659
3、VS2010中水晶报表应用与部署: https://www.cnblogs.com/dgjack/archive/2011/09/09/2172240.html
4、水晶报表 释放资源|内存:http://blog.csdn.net/a402626926/article/details/5958237
5. 水晶报表打印总多打一张空白页解决办法:https://zhidao.baidu.com/question/1243334808830986979.html
————————————————
原文链接:https://blog.csdn.net/af_fire/article/details/79407317