水晶报表的使用
查询条件动态生成报表、注册码、打印问题、模式使用示例、C#.Net的WinForm以及Asp.Net中的使用、程序发布与部署
1、水晶报表注册码
在使用Vs.net自带的水晶报表时,请注册,否则只能使用30次,水晶报表注册码如下:
注册号:6707437608
密码:AAP5GKS0000GDE100DS
2、Asp.Net中使用水晶报表
我们采用下面的几步使用Push模式执行水晶报表:
1)设计一个DataSet
右击“解决方案浏览器”,选择“添加”--“添加新项”-->“数据集”,从“服务器资源管理器”中的“SQL Server”中拖放“Stores”表(位于PUBS数据库中)。再将此表拖入数据集中。而 .xsd文件中仅仅包含一个结构图,但是不会有任何数据在里面。
2)创建一个.rpt文件同时将其指定给上一步建立的DataSet。
使用上面的介绍过的方法创建此文件,唯一的不同就是使用数据集来代替前面的直接连接数据。建立.rpt文件之后,右击“详细资料”-->“添加/删除数据库”,在”数据库专家“窗口中,展开”项目数据“(代替以前的OleDb),展开“ADO.Net数据集”--“DataSet1”,选择“Stores”表。将“Stores”表添加到“选定的表”中,点击“OK”。
3)在aspx页面中拖放一个CrystalReportViewer控件同时将其与前面的rpt文件建立联系。
使用PULL模式下的方法,建立一个WebForm,添加一个Crystal Report Viewer 控件,并设定其属性,此处与PULL模式下是一致的。代码如下:
private MyReport oCR;//MyReport为MyReport.aspx.csk中的类名
private void Page_Load(object sender, System.EventArgs e)
{
DataSet1 ds = new DataSet1();
oCR = new MyReport();
SqlConnection MyConn = new SqlConnection(ConfigurationSettings.AppSettings["SqlConn"]);
MyConn.Open();
//直接访问数据表
//string strSel = "select * from tbtree";
//SqlDataAdapter MyAdapter = new SqlDataAdapter(strSel,MyConn);
//MyAdapter.Fill(ds,"tbtree");
//使用存储过程
SqlCommand cmd = new SqlCommand("display", MyConn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter MyAdapter = new SqlDataAdapter(cmd);
MyAdapter.Fill(ds,"tbtree");
oCR.SetDataSource(ds);
this.CrystalReportViewer1.ReportSource = oCR;
this.CrystalReportViewer1.DataBind();
}
注意:在上面的代码中,你得注意一下oRpt是"Strongly Typed"的报表文件。如果你需要使用"UnTyped"报表,你得使用ReportDocument对象,然后再调用报表文件。
4)在代码中访问数据库并把数据存入DataSet
5)将报表文件导出成为其它格式
你能够将报表文件导出成为下列格式:
(1) PDF (Portable Document Format)
(2) DOC (MS Word Document)
(3) XLS (MS Excel Spreadsheet)
(4) HTML (Hyper Text Markup Language – 3.2 or 4.0 compliant)
(5) RTF (Rich Text Format)
使用Pull模式导出报表,当导出使用Pull模式创建的文件时,水晶报表准确地打开所需要的数据,首先在HTML中加入一个<DIV>元素和控件
<DIV id="div_opt" style="Z-INDEX: 102; LEFT: 320px; WIDTH: 360px; POSITION: absolute; TOP: 24px; HEIGHT: 32px" ms_positioning="FlowLayout">
<asp:linkbutton id="lbtn_IEPrint" runat="server">IE打印预览</asp:linkbutton> 格式转换
<asp:dropdownlist id="ddl_FileFormat" runat="server">
<asp:ListItem Value="pdf">Pdf</asp:ListItem>
<asp:ListItem Value="doc">Word</asp:ListItem>
</asp:dropdownlist>
<asp:button id="btn_Change" runat="server" Text="转换"></asp:button>
</DIV>
下面是执行导出功能的代码:
private void lbtn_IEPrint_Click(object sender, System.EventArgs e)
{
if(lbtn_IEPrint.Text == "IE打印预览")
{
CrystalReportViewer1.SeparatePages = false;
CrystalReportViewer1.DisplayToolbar = false;
lbtn_IEPrint.Text = "取消IE打印预览";
}
else
{
CrystalReportViewer1.SeparatePages = true;
CrystalReportViewer1.DisplayToolbar = true;
lbtn_IEPrint.Text = "IE打印预览";
}
}
private void btn_Change_Click(object sender, System.EventArgs e)
{
string filetype = "";
filetype = ddl_FileFormat.SelectedValue;
string contenttype = "";
string myfilename = Request.MapPath(".//")+Session.SessionID+"."+filetype;
CrystalDecisions.Shared.DiskFileDestinationOptions mydiskoptions = new CrystalDecisions.Shared.DiskFileDestinationOptions();
mydiskoptions.DiskFileName = myfilename;
CrystalDecisions.Shared.ExportOptions myExportOptions = oCR.ExportOptions;
myExportOptions.DestinationOptions = mydiskoptions;
myExportOptions.ExportDestinationType = CrystalDecisions.Shared.ExportDestinationType.DiskFile;
switch(ddl_FileFormat.SelectedItem.Value)
{
case "pdf":
contenttype = "application/pdf";
myExportOptions.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.PortableDocFormat;
break;
case "doc":
contenttype = "application/msword";
myExportOptions.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.WordForWindows;
break;
}
oCR.Export();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = contenttype;
Response.WriteFile(myfilename);
Response.Flush();
Response.Close();
System.IO.File.Delete(myfilename);
}
2、C#.Net的WinForm中使用水晶报表
1)在使用自带的水晶报表时,请注册,否则只能使用30次
2)使用CrystalReportViewer进行预览
CrystalReportViewer控件允许在应用程序中查看 Crystal Report。ReportSource 属性用于设置要查看哪个报表。该属性设置之后,报表显示在查看器中。报表源可以是ReportDocument、报表文件的路径,也可以是强类型报表。
(1)打开“工具箱”,并将一个 CrystalReportViewer 拖到窗体上,我们命名为rptVew。
(2)通过拖放操作将 Windows 窗体查看器调整到希望的大小并将其移动到所需位置。
(3)当运行应用程序时,报表将显示在查看器中。
3)创建新报表
(1)指向“添加”,单击“添加新项”。
(2)在“添加新项”对话框中,从“模板”区域选择 Crystal Report,将报表命名为rptClient,单击“打开”。
(3)在 Crystal Report 库中,选择下列选项之一:
A.使用报表专家 -> 指导您完成报表的创建过程,并将您的选择添加到 Crystal Report Designer。
B.作为空白报表 -> 打开 Crystal Report Designer。
C.来自于现有的报表 -> 创建新报表,它与指定的另一报表设计相同。
注意 Crystal Report 库包含许多专家,可以指导您完成数个特定类型报表的创建工作。您可能希望使用专家来创建最初的报表,以确定哪种报表构造方法适合您的需要。
(4)单击“确定”按钮。
如果选择使用“报表专家”,便会出现“报表专家”对话框,并带有数据资源管理器。为每个文件夹选择所需数据,完成“报表专家”选项卡界面上的操作,然后单击“完成”来访问 Crystal Report Designer 和您的报表。
(5)是否需要动态设置数据源?
Crystal Reports 通过数据库驱动程序与数据库连接。每个驱动程序都被编写为可处理特定数据库类型或数据库访问技术。拉和推模型,为了向开发人员提供最灵活的数据访问方法,Crystal Reports 数据库驱动程序被设计为可同时提供数据访问的拉模型和推模型。
拉模型pull:在拉模型中,驱动程序将连接到数据库并根据需要将数据“拉”进来。使用这种模型时,与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理,不需要开发人员编写代码。如果在运行时无须编写任何特殊代码,则使用拉模型。
推模型push:相反,推模型需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。
4)从 ADO.NET 数据集制作报表
从数据库创建数据集对象
(1)在项目中新建一个架构文件:
在解决方案资源管理器中,右击项目名,指向“添加”,然后单击“添加新项”。在“添加新项”对话框的“类别”区域,展开文件夹,然后选择“数据”。 在“模板”区域选择“数据集”。 接受默认名称 Dataset1.xsd。 这就创建了一个新的架构文件 (Dataset1.xsd),以后将用它来生成强类型数据集。该架构文件将显示在 ADO.NET 数据集设计器中。
(2)指定数据库位置:
在服务器资源管理器中,右击“数据连接”并选择“添加连接”。在“数据链接属性”对话框中,单击“提供程序”选项卡,然后选择一个提供程序(例如 Microsoft OLE DB Provider for SQL Server)。 单击“连接”选项卡,然后指定您的数据库所在位置。在所需位置输入服务器和登录信息。 单击“确定”按钮。 此时,您的数据库及其表和字段就出现在服务器资源管理器的“数据连接”节点下面。
(3)在解决方案资源管理器中,双击 Dataset1.xsd (如果它尚不是活动视图)。 Dataset1.xsd 现在应显示在“数据集”选项卡中。
(4)若要为数据集建立架构,请将需要的表从服务器资源管理器中拖动到 Dataset1.xsd 的“数据集”选项卡上。
(5)单击“保存 Dataset1.xsd”来保存“Dataset1.xsd”文件。
(6)在“生成”菜单上,单击“生成”为项目生成数据集对象。
ADO.NET 数据集对象提供数据的描述,从它可以向 Crystal report 添加表。使用 Crystal Report Designer 中的“数据库专家”从 ADO.NET 数据集对象添加表。 请在使用“报表专家”创建新报表时调用“数据库专家”。或者,要从一个已经使用 ADO.NET 建立好的报表中访问“数据库专家”,请在 Report Designer 中右击,指向“数据库”,然后单击“添加/删除数据库”。将报表连接到 ADO.NET 数据集对象
(1)在“数据库专家”中,展开“项目数据”文件夹。
(2)展开“ADO.NET 数据集”文件夹。
(3)选择所需数据集对象。
例如,如果当时使用的是从项目“WindowsApplication1”的架构文件“Dataset1.xsd”中生成的数据集对象,则应该选择“WindowsApplication1.Dataset1”。 选择要向报表中添加的表,和使用其他数据源一样。
5)动态改变数据源的代码
DataSet dsdataSet = new DataSet();
rptClient() oRpt = new rptClient(); //已建立的报表rptClient
OleDbDataAdapter da=new OleDbDataAdapter("select * from TableName",conn);
da.Fill(dsdataSet,"TableName");
//使用“报表引擎”对象模型将填充的数据集,传递给报表
oRpt.SetDataSource(dsdataSet.Tables(0));
//将带有数据的报表对象绑定到 Windows 窗体查看器,rptVew(CrystalReportViewer控件)
rptVew.ReportSource = oRpt;
注意 FillDataSet 方法可连接到指定的数据库,提取数据,然后断开数据库连接。如果您希望将数据库中的多个表添加到报表中,请使用 SQL JOIN 语句将这些表联接在一起;然后在 FillDataSet 方法中指定一个结果表。
6)创建主从报表
在报表中,有许多报表是主从表结构,比如订单与订单商品明细,订单是一个表中的一条记录,而分录是另一个表中的多条记录,两个表通过一个字段关联起来,这种报表可利用其分组功能实现。
(1)新建一个工程
(2)往FORM1中添加一个CrystalReportViewer控件
(3)在服务噐资源管理器中连接到SQL SERVER 2000上的Northwind数据库
(4)添加一个数据集Dataset1,将服务器资源管理器中的Orders和 Order Details加入到数据集中。
(5)添加一个水晶报表,使用报表专家,在项目数据中选择“ADO.NET数据集”,插入表Orders和 Order Details,“链接”中是关联字段的链接,在“字段”中选择要显示的主表和明细表的字段,组中选择分组依据为Orders表OrdersID字段,总计,图表,选择(可进行筛选),样式(可设置报表标题),可自行设置。设置完后,点击完成。
(6)在报表设计器中调整需要显示的字段的位置、宽度等。
(7)在窗口中添加代码。
public PrintForm()
{
InitializeComponent();
OleDbConnection conn=new OleDbConnection("data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa");
Dataset1() ds = new Dataset1();
OleDbDataAdapter da1=new OleDbDataAdapter("select * from orders",conn);
da1.Fill(ds,"orders");
OleDbDataAdapter da2=new OleDbDataAdapter("select * from [Order Details]",conn);
da2.Fill(ds,"Order Details");
CrystalReport1 oCR=new CrystalReport1();
oCR.SetDataSource(ds);
this.crystalReportViewer1.ReportSource = oCR;
}
(8)运行程序
3、水晶报表登陆失败
using CrystalDecisions.Shared;
//声明所需变量。
TableLogOnInfo logOnInfo = new TableLogOnInfo();
//对报表中的每个表依次循环。
for (int i=0;i < Report.Database.Tables.Count-1;i++)
{
//设置当前表的连接信息。
logOnInfo.ConnectionInfo.ServerName = serverNameTxt.Text;
logOnInfo.ConnectionInfo.DatabaseName = dbNameTxt.Text;
logOnInfo.ConnectionInfo.UserID = userNameTxt.Text;
logOnInfo.ConnectionInfo.Password = passwordTxt.Text;
Report.Database.Tables [i].ApplyLogOnInfo (logOnInfo);
}
注意 受密码保护的 Microsoft Access 和 Paradox 等 PC 数据库也使用该方法,但 LogOnInfo.ServerName为数据文件的路径, LogOnInfo.DatabaseName 要保留为空。TableLogOnInfo 是属于CrystalDecisions.Shared 命名空间的成员。要添加引用:using CrystalDecisions.Shared;。
4、水晶报表应用程序的发布
1)安装部署
安装部署时,把水晶报表的msm打进去,注册到服务器,要部署使用 Crystal Reports for Visual Studio .NET 2003 的程序,首先,找到以下7个文件(你可以 'C:/Program Files/Common Files/Merge Modules' 文件夹下找到):
Crystal_Database_Access2003.msm
Crystal_Database_Access2003_chs.msm
Crystal_Managed2003.msm
Crystal_Managed2003_chs.msm
Crystal_regwiz2003.msm
VC_User_CRT71_RTL_X86_---.msm
VC_User_STL71_RTL_X86_---.msm
接着,在解决方案资源管理器中,右击安装项目,指向“添加”,然后单击“合并模块”。在“添加模块”对话框中,选择上面的7个要添加到安装项目的合并模块,然后单击“打开”。
还有,打开解决方案-->右键点击 Crystal_regwiz2003.msm 的属性,在“MergeMouduleProperties”里的“License Key”填入:AAP5GKS0000GDE100DS(这个是你生成Crystal Report是用到的注册号的密码!)
2)部署水晶报表时的常见问题及解决方案
(1)载入报表时报错
问题出在报表发布上。发布使用水晶报表的项目需要包含三种组件:报表(*.rpt)、模块(*.msm)、运行库(*.msm),这些模块文件是在 C:/Program Files/Common Files/Merge Modules/ 目录里面。
A.报表(*.rpt):用户编程时创建的水晶报表文件。
B.模块(*.msm):
Managed.msm 该模块包含了CR for VS .NET 的管理模块,如 CrystalDecisions、CrystalReports.Engine.DLL、CrystalDecisions.Web.DLL, 和 CrystalDecisions.Windows.Forms.DLL……
Managed_chs.msm 是该模块的中文版语言支持。
Database_Access.msm 该模块包含了数据库的驱动、与不同数据库的联结、报表导出为 RTF 和 HTML 格式的文档和图表组件。
Database_Access_chs.msm 是此模块的中文版语言支持。
Regwiz.msm 注册信息模块,非常重要,必需在这个模块输入水晶报表的注册序列号,如果不填,编译的时候就无法通过
C:运行库(*.msm):
如果报表文件使用了 ADO.NET 的 dataset 数据集对象,那么 VC_CRT.msm 和 VC_STL.msm 模块也必须包含在安装工程中。而且这两个模块的文件安装属性的/Module Retargetable Folder/项必须修改成为系统目录。在VS.NET安装工程中,系统检测出来的依赖项只有 dotNETFXRedist_x86_chs.msm 和 Managed.msm这两个模块,其他的模块我们需要手动加入。
(2)部署到 Windows 98 / ME 时,出错:/Load Report Failed/
这是因为查询引擎 DLL(CRQE.dll)在客户计算机上没有正确注册。要解决这个问题,可以在客户计算机上手动注册 CRQE.dll,使用下面的命令:
regsvr32 /C:/program files/common files/Crystal Decisions/1.0/bin/CRQE.dll/
如果 CRQE.dll 没有成功注册,并且问题继续存在,在客户计算机上检查 ATL.dll 的版本。ATL.dll for Windows 98/ME 正确的版本是 3.0.8449。通过使用下面三种方法中的任意一种方法,可以找到并注册正确版本的 ATL.dll。
A.在客户计算机上装 IE6.0。
B.在客户计算机上,手动复制和注册 ATL.dll,然后运行用于 Crystal Reports 分发的安装包。
C.将 ATL.msm 合并模块添加到安装工程,ATL.msm 是 Visual Studio installer 1.1 的一部分,可以去微软的网站http://msdn.microsoft.com/vstudio/downloads/tools/vsi11/download.aspx下载, 添加办法同上。
(3)在Win98的客户端运行提示/该字段名未知/
报表在Win2000的客户端一切正常,在Win98的客户端运行提示/该字段名未知/?是因为报表使用到的 sql server 数据库中的字段名为中文的缘故,将其字段名改名为英文字段名。
(4)分发到客户机时“查询引擎出错”
“安装项目”要包含下列合并模块:VC_CRT.msm ,VC_STL.msm ;此外,确保 Msvcr70.dll 和 Msvcp70.dll 在客户计算机的“系统目录”里。
(5)load crpe32.dll failed
下面是cr9net_deployment.pdf说明中的部署Crystal Report 9的步骤:
打开 Windows 应用程序。 在解决方案资源管理器中,右击 Windows 应用程序解决方案,指向“添加”,然后单击“新建项目”。在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。单击“确定”按钮。
在解决方案资源管理中,右击安装项目,指向“添加”,然后单击“项目输出”。 在“添加项目输出组”中,选择“主输出”,然后单击“确定”。 将自动添加所有依赖项,如 dotnetfxredist_x86_enu.msm和dotnetcrystalreports.msm。需要将dotnetcrystalreports.msm排除在项目之外,在解决方案资源管理器中右击这个模块的右键,选择“排除”。 在解决方案资源管理器中,右击安装项目,指向“添加”,然后单击“合并模块”。 在“添加模块”对话框中,选择下列要添加到安装项目的合并模块,然后单击“打开”:
reportengine.msm, crnetruntime.msm, license.msm
mapping.msm (可选,当在报表中使用了geographic maps时)
VC_CRT.msm、VC_STL.msm( 如果您部署的 Windows 应用程序使用 ADO.NET 数据集,则还需要包括 VC_CRT 和 VC_STL 合并模块)
在解决方案资源管理器中,右击 license.msm 文件,然后选择“属性”。 在“属性”窗口中,展开 MergeModuleProperties,然后在“许可证密钥”属性框中输入一个有效的许可证密钥。 注意 每当部署 Crystal Reports 应用程序时,必须提供许可证密钥。从“生成”菜单中,选择“生成解决方案”以生成应用程序。
(6)在 ASP.NET 程序中加载报表时,出错:/Load Report Failed/
确保 ASPNET 本地用户对报表所在的文件夹有“完全控制”的权限。
(7)部署 .NET 9.1 程序到 Windows 98 时,出错:/Load Report Failed/
是因为查询引擎 DLL(CRQE.dll)在客户计算机上没有正确注册。要解决这个问题,从开发计算机复制 Dbghelp.dll 到客户计算机的/C:Windows/system32/ 文件夹。
在线支持:http://www.kpower.nease.net/main.html
可以通过单独用代码绑定子报表来解决这个问题。
string sConnectionString = ConfigurationSettings.AppSettings["dbCommISMS"];
SqlConnection sqlConn = new SqlConnection(sConnectionString);
SqlCommand sqlComm = new SqlCommand();
SqlDataAdapter dataAdapter = new SqlDataAdapter();
sqlConn.Open();
sqlComm.Connection = sqlConn;
sqlComm.CommandType = CommandType.Text;
dataAdapter.SelectCommand = sqlComm;
Dataset1 dataSet = new Dataset1();
string sSQL = "SELECT * FROM T_REQUEST WHERE APPLI_ID = ‘" + appli_id + "‘";
sqlComm.CommandText = sSQL;
dataAdapter.Fill(dataSet, "T_REQUEST");
sSQL = "SELECT * FROM T_REQUEST_INSPECTION WHERE APPLI_ID = ‘" + appli_id + "‘";
sqlComm.CommandText = sSQL;
dataAdapter.Fill(dataSet, "T_REQUEST_INSPECTION");
sSQL = "SELECT * FROM T_ACCEPT_INSPECTION WHERE APPLI_ID = ‘" + appli_id + "‘";
sqlComm.CommandText = sSQL;
dataAdapter.Fill(dataSet, "T_ACCEPT_INSPECTION");
SubreportObject oSubreport1 = oRpt.ReportFooterSection1.ReportObjects["Subreport1"] as SubreportObject;
ReportDocument oSub1 = oSubreport1.OpenSubreport("Inspection");
oSub1.SetDataSource(dataSet);
SubreportObject oSubreport2 = oRpt.ReportFooterSection2.ReportObjects["Subreport2"] as SubreportObject;
ReportDocument oSub2 = oSubreport1.OpenSubreport("Survey");
oSub2.SetDataSource(dataSet);
SubreportObject oSubreport3 = oRpt.ReportFooterSection2.ReportObjects["Subreport3"] as SubreportObject;
ReportDocument oSub3 = oSubreport1.OpenSubreport("Allonge");
oSub3.SetDataSource(dataSet);
oRpt.SetDataSource(dataSet);
oViewer.ReportSource = oRpt;
oRpt 有三个字报表,dataSet 有三个表。