65.9K
CodeProject 正在变化。 阅读更多。
Home

创建基于 Web 的非类型化 Crystal Reports 应用程序

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.73/5 (9投票s)

2005年10月5日

4分钟阅读

viewsIcon

79475

downloadIcon

1369

本文介绍了如何构建一个通用的、基于数据的 Web Crystal Reports 服务器。

引言

.NET Crystal Reports 引擎支持两种类型的报表:强类型报表和非强类型报表。强类型报表在设计时通过数据集类将报表绑定到可执行的二进制文件,运行时不需要报表文件。非强类型报表在运行时绑定报表,设计时应用程序不包含数据集类,但在运行时需要报表文件与二进制程序集一起存在。

虽然每种类型的报表都有其优缺点,但非强类型报表有两个优势。首先,它提供了更高的可扩展性和灵活性。由于应用程序不将数据集类编译到可执行文件中,因此当添加新报表时,只需创建一个新的报表文件并将其放入报表服务器即可。同时,由于报表设计和创建与报表应用程序分离,可执行程序集可以保持“静态”和通用的报表文件。维护、部署和更新应用程序的成本和工作量可以大大降低。

使用代码

创建一个简单的报表文件

  1. 创建一个简单的 Windows 应用程序项目。(Visual Studio .NET 不允许在不先创建项目的情况下创建 Crystal Reports 文件)。
  2. 在对话框中选择“添加新项”,然后选择 Crystal Reports,将报表文件命名为“Report1.rpt”,然后单击“打开”。
  3. 在 Crystal Reports Gallery 对话框中,选择“空白报表”,然后单击“确定”。
  4. 右键单击报表工作区,然后从上下文菜单中选择“数据库”->“添加/删除数据库…”。然后,在 OLEDB (ADO) 对话框中选择 OLEDB (ADO),然后选择 SQL Server 的 OLEDB 提供程序,并输入所需的信息。
  5. 在 Database Expert 对话框中,从“Pubs/Database/Tables”树中选择“Titles”表。
  6. 在报表设计屏幕上选择字段,然后保存报表文件。

创建基于 Web 的报表应用程序

下一步是创建一个 ASP.NET 应用程序来处理和显示此报表。

  1. 创建一个新的 ASP Web 应用程序,将项目命名为 MyReport。将默认的“webform1.aspx”重命名为“main.aspx”(如果您愿意,也可以保留默认名称)。
  2. 从 Solution 视图中将 CrystalDecisions 添加到项目引用中。
  3. 将 `main.aspx` 的 `Page_Load` 部分中的代码放入您的 `Page_Load` 事件部分,然后生成解决方案。

所有代码都包装在 `Page_Load` 事件中。它执行以下操作:

  1. 创建 Crystal Reports 对象实例,从 QueryString 解析报表名称,并将报表文件加载到 Report 对象中。
  2. 将登录信息应用于 Report 对象。
  3. 将来自 QueryString 的其他参数(如果有)传递给 Report 对象。
  4. 将报表导出为 PDF 格式(或其他格式),并写回客户端浏览器。

加载报表的代码如下:

String reportFile=Request.QueryString.Get("Report") +".rpt";
String appPath=MapPath(".");
String reportPath = appPath + "\\" + reportFile;
ReportDocument theReport=new ReportDocument();
theReport.Load (reportPath);

加载报表后,我们可以将登录信息应用于 Report 对象。

CrystalDecisions.Shared.ConnectionInfo conn=new ConnectionInfo();
CrystalDecisions.CrystalReports.Engine.Table myTable; 
CrystalDecisions.Shared.TableLogOnInfo myLog;
conn.ServerName="My-Sql-Server";
conn.DatabaseName="pubs";
conn.UserID ="sa";
conn.Password="password";
for(inti=0;i<theReport.Database.Tables.Count;i++)
{
    myTable=theReport.Database.Tables[i];
    myLog = myTable.LogOnInfo;
    myLog.ConnectionInfo= conn;
    myTable.ApplyLogOnInfo(myLog);
    myTable.Location= myLog.TableName;
}

将报表文件导出为 PDF(或其他格式)并写回客户端浏览器非常简单。

System.IO.MemoryStream m;
m= (System.IO.MemoryStream)theReport.ExportToStream(
    CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
theReport.Close();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType="Application/pdf";
Response.Buffer="true";
Response.BinaryWrite(m.ToArray());
Response.End ();

现在将 `report1.rpt` 文件放在与 ASP 页面相同的目录中。我们可以使用类似以下的 URL 来测试 Web 应用程序:

https:///Myreport/main.aspx?Report=report1

带参数的报表

为了说明带参数的报表,我们创建一个名为“Get_Title1”的存储过程,其代码如下:

Create procedure Get_Title1(@price float ,@pubdate datetime)
As
set nocount on
select Title, type, price, notes, pubdate from titles
where price<=@price and pubdate<=@pubdate
go

然后我们创建一个新的报表文件 `report2.rpt`。它应该与 `report1.rpt` 相同,只是它将使用存储过程“Get_title1”作为表名。在报表设计屏幕上,当选择了“Get_title1”时,参数 `@price` 和 `@pubdate` 也会显示出来。

在 Web `Page_Load` 事件中,我们需要代码来处理参数,如下所示:

String paramName,paramValue;
CrystalDecisions.Shared.ParameterValues pList = new  ParameterValues()
CrystalDecisions.Shared.ParameterDiscreteValue pV=new ParameterDiscreteValue ();
for( int i=0;i<theReport.DataDefinition.ParameterFields.Count;i++)
{
    paramName=theReport.DataDefinition.ParameterFields[i].Name;
    paramValue=Request.QueryString.Get(paramName); 
    pV.Value =paramValue;
    pList.Add(pV);
    theReport.DataDefinition.ParameterFields[paramName].ApplyCurrentValues(pList);
}

要运行带参数的报表,使用的 URL 如下:

https:///Myreport/main.aspx?report=report2&@price=15&@pubdate='1/1/2000'

动态 SQL 语句作为参数

预定义的参数并不总是能满足复杂查询的需求。虽然在设计时 Crystal Reports 可以创建派生自 SQL 命令的报表,但它不允许在运行时访问和修改 SQL 命令。为了解决这个问题,我们可以利用 SQL Server 执行动态 SQL 语句的功能来生成报表,然后通过 URL 传递 SQL 字符串来运行报表。

首先,让我们创建一个存储过程来执行动态 SQL 语句:

Create procedure Get_Title2(@sqlstring varchar(2000))
As
set nocount on
create table #temp
(title_id char(6),title varchar(80),type char(12),
pub_id char(4),price money,advance money,
royalty int,ytd_sale int, notes varchar(200), pubdate datetime)
insert into #temp
exec(@sqlstring)
select * from #temp
drop table #temp
go

然后创建派生自存储过程 'Get_title2' 的 `report3.rpt`。保存它并运行如下 URL:

https:///myreport/main.aspx?report=report3&@sqlstring=select * from 
titles where type='business' and price<20 and upper(title) like '%COMPUTER%'
© . All rights reserved.