查询条件动态生成报表、注册码、打印问题、模式使用示例、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 >& nbsp;格式转换
< 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\ 文件夹。
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 >& nbsp;格式转换
< 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\ 文件夹。