Reporting Services 2005 101 使用Web客户端






4.11/5 (14投票s)
2006 年 9 月 15 日
18分钟阅读

108183

726
一个循序渐进的教程,演示了使用 ASP.NET Web 客户端进行本地处理的 Reporting Services 的强大功能。
图片:1
引言
您最喜欢的 GUI 客户端是什么?这是一个很难回答的问题,对吧,尤其是在我们有 Windows/Web 等选择的情况下,
正如我在之前的文章中演示了如何使用 Windows Forms 托管 MS Reporting Services 2005,这次我将展示类似的技术,不过,我将选择 ASP.NET Web 客户端。
我假设读者对 Visual Studio 2005 IDE 有基本的了解,并且能够熟练使用 C# 编写代码(如果您想查看 Access 数据库示例,则使用 VB.NET)。您不必了解 MS Reporting Services 即可理解本文;尽管如此,任何以前的报表编写经验都将有助于您快速上手。
虽然我将这篇文章称为 101,但我的目的是采用应用的方法,而不是讨论与报告服务相关的每一个主题。我将涉及报告设计中最常见的方面和最常用的控件。我强烈建议您查阅 MSDN 文档以获取更详细的信息。
您可以在此处找到我之前的文章
https://codeproject.org.cn/useritems/rswin101.asp
Web 客户端报告,没什么大不了的!
请看图 1。为 Web 客户端创建这样的报告就像设计网页一样简单。相信我,只需几次拖放和更改一些属性即可!结果是一个简单的报告,列出了所有产品信息,并带有标准的页眉、正文和页脚。
报表输出将包含来自数据源 NorthWind->Products (SQL Server 2000) 的数据;如果您无法连接到 SQL Server,您始终可以使用 Access 来尝试本教程(请参阅单独的代码以使用 Access 数据库)。
我确信你们中的许多人已经尝试过使用 VS 2005 创建 ASP.NET 网站;如果没有,请不用担心,我们将在第 1 步中完成。让我们开始为我们的报表创建 Web 客户端。
步骤 1:创建 ASP.NET 网站
请按照以下步骤创建 ASP.NET 网站
- 选择“文件”菜单 -> “新建” -> “网站”。
- 从“位置”中选择“文件系统”。
- 从“语言”中选择“Visual C#”。
- 在“模板”窗格中,选择 ASP.NET 网站。
在“文件系统”下拉列表旁边,输入项目名称,包括路径(我将其命名为 C:\mySites\rsWeb101),或者您可以使用默认提供的名称,或者单击“浏览”按钮导航到它。完成后,您会发现网页 default.aspx 已创建并以设计器方式打开,焦点设置在 HTML 源上。
提示:如果您此时尝试在调试模式下运行应用程序,将弹出一个对话框询问您是否启用调试,只需单击“确定”按钮即可。
请更新 default.aspx 页面的以下属性
<title>Reporting Services 2005 101 using Web Client</title>
请随意根据您的要求更改 default.aspx 的任何其他属性。
步骤 2:向页面添加报表查看器
报表查看器是 Visual Studio 2005 提供的客户端报表组件的另一半。对于所有不熟悉报表编写的人来说,我想说,报表查看器为您的报表赋予了生命。
它不仅可以预览您的输出,还可以方便您以各种流行格式(PDF、Excel 等)生成信息。您还可以在查看输出时打印报表的硬拷贝。
请执行以下操作以在页面上设置报表查看器控件
- 确保页面 default.aspx 当前已选中,焦点在设计模式下。
- 拖动工具箱 -> 数据 -> ReportViewer 并将其放到页面上。此步骤将创建一个名为 reportViewer1 的 ReportViewer 新实例。您可以随意命名,我这次将坚持使用 reportviewer1。
- 通过设置 reportViewer1.Widht = 100%,报表查看器将填充整个页面以显示报表。
提示:请确保 reportViewer1.ProcessingMode = Local,否则在渲染报告时会因源不可用而出现错误。
在步骤 1 和步骤 2 之后,您的项目应该如图 2 所示。
图片:2
步骤 3:向项目添加 DataSet
好的,我们已经准备好带有正确放置的查看器控件的页面;现在是时候开始从源获取数据并用它来创建报告了。我们将使用 ADO.NET 类型化 DataSet;用于保存来自数据源的原始数据并使用架构设计报告。
需要执行以下步骤才能将 DataSet 添加到项目
- 从“解决方案资源管理器”中选择“添加”->“新建项”->“DataSet”。将名称从 DataSet1 更改为 dsProduct,然后单击“添加”按钮;它会询问您是否将数据集放置在“App_Code”文件夹中,单击“是”按钮确认。请取消 TableAdapter 配置向导;我们将使用 DataSet 设计器添加 DataTable。
让我们向新创建的 DataSet 添加 DataTable。DataTable 对于加载报告数据至关重要;我们将在设计报告时使用 DataSet/DataTable 中的信息。
要将 DataTable 添加到 DataSet(dsProduct),需要执行以下步骤
- 双击解决方案资源管理器中的 dsProduct;它将打开设计器视图。右键单击设计器表面并选择“添加”->“DataTable”。请单击标题并将名称更改为 dtProductList。请参阅图 3。
图片:3
让我们开始向 DataTable (dtProductList) 添加列。您的设计器屏幕应如图 4 所示。右键单击 dtProductList 并选择“添加”->“列”以开始向 DataTable 添加列。
图片:4
请对以下列重复此操作
- ProductName(字符串)
- QuantityPerUnit(字符串)
- UnitPrice(双精度)
- UnitsInStock(双精度)
- UnitValue(双精度)- 基于 UnitsInStock * UnitPrice 的计算字段
当您添加列时,默认的数据类型是字符串。请在选择列后转到属性窗口将其从字符串更改为整数或双精度。
请参阅图 5。您的 DataTable 应该看起来一样。此外,您可以在属性窗口中更改数据类型。
图片:5
步骤 4:将报表添加到项目
好的,到目前为止,我们已经创建了项目;添加了报表查看器和数据集。现在是时候处理节目的明星了!让我们创建那个简洁的报表。
需要执行以下步骤才能获得报表 (rptProductList.rdlc)
- 从解决方案资源管理器中选择“添加”->“新建项”->“报表”。将名称从 Report1.rdlc 更改为 rptProductList.rdlc,然后单击“添加”按钮完成操作。
通常,添加操作完成后,您的屏幕应类似于图 6。当报表添加到项目后,它就可以使用 DataSet 进行设计了。
图片:6
无论这是您的第一个报表,还是您像我一样是报表狂热者;我们都必须处理报表编写最基本的组成部分:页眉、正文和页脚。
通常,报表是根据特定的页面大小和布局设计的。我们的报表是信纸大小和纵向布局。您可以通过右键单击开放设计器表面上的任意位置并选择属性来探索与报表布局相关的各种属性。
在开始设计之前,始终建议在纸上绘制报表的原型。正如您在图 1 中看到的,我们在页眉部分有报表名称和报表日期。正文部分包含产品列表信息以及汇总总计;页脚包含页码。
让我们开始处理页面标题
当新报表添加到项目时,默认情况下,您在报表设计器中只会看到正文部分。右键单击报表设计器表面(非正文部分),然后选择“页面页眉”。这将向报表添加页眉。随意调整页眉和正文部分的高度。请参阅图 7,我已减小正文的高度并增加页眉的高度。
图片:7
在报表设计器中,如果您探索工具箱,您会看到各种可用于设计报表的控件。对于我们的示例,我们将使用 TextBox、Line 和 Table 控件。如果您需要所有可用控件的详细信息,我建议您查阅在线文档。
标题部分
让我们开始设计标题。我们将从拖动两个 TextBox 并将其放到标题部分开始。Texbox 可以显示静态数据和动态数据。Line 控件用于将标题与正文部分分开。
将控件放到报表设计器表面后,您可以通过更改相关属性来控制其外观。我们将指定一个 TextBox 用于显示报表标题,另一个用于显示当前日期。我们可以通过选择 TextBox 控件并开始在其中键入来直接输入静态文本。
请更改标题 TextBox 的以下属性
值 = “产品列表”
颜色 = 紫色(你也喜欢标题用紫色,对吧?)
请更改日期文本框的以下属性
值 = ="运行数据: " & Today
颜色 = 紫色(你也喜欢标题用紫色,对吧?)
请注意日期文本框的 Value 属性以“=”号开头。这不是一个简单的静态文本,而是一个表达式。此表达式是字符串“运行日期”和 VB.NET 脚本关键字 Today(获取当前系统日期)的结果。
您可以为报表中的所有对象指定所需的名称;我选择保留大多数控件的默认名称,但是,为了演示目的,我为标题文本框指定了“txtTitle”。
请参考图 8;您完成的页眉设计应该大致相同。
图片:8
正文部分
正文部分,也称为详细信息部分,是报表中最重要的部分。正如您所看到的,当我们向项目添加报表时,正文部分是自动为我们添加的。我们所要做的就是开始在其中放置控件。
通常,正文部分用于显示详细信息(在我们的示例中是产品信息),通常是多行信息。正文部分可以根据报告数据的增长而扩展。报表通常设计为具有一个物理页面(信纸/A4 等)输出;在这种情况下,正文部分仍然可以用于显示信息。
在 Table、Matrix 和 List 这三种最常用的正文部分控件中,我们将使用 Table 控件作为示例。这三种控件都可以重复信息;Matrix 更进一步,甚至可以生成透视输出。
让我们将 Table 控件拖放到报表设计器表面的正文部分。如果您注意到,此操作将生成一个具有三行三列的表。您可能还注意到,中间列也已标记为:标题、详细信息和页脚。
现在,如果我告诉您 Table 控件不过是一堆连接在一起的 TextBox,请不要惊讶!是的,Table 中的每一个单元格都像 TextBox,这意味着您既可以在其中键入静态文本,也可以指定动态表达式。
在我们开始设计正文部分之前,让我们再添加两列(记住我们的报表总共有五列)。添加列很简单;请执行以下操作将新列添加到报表
- 选择正文部分内的表格控件
- 点击最右侧的列标题(假设我们正在右侧添加新列)
- 右键单击标题并选择 -> 在右侧插入列
确保您的报告与图 9 相似。请随意根据数据长度调整列宽。
图片:9
我敢肯定我们大多数人都用过 Excel 或类似的东西;将其视为表格控件的小型工作表。我们可以应用边框、更改单个单元格的字体等等。所以,您所要做的就是思考所需的格式主题并开始应用它。
从第一列到最后一列,请点击每个列标题单元格并键入以下文本
标题 1:“产品名称”
标题 2:“包装”
标题 3:“单价”
标题 4:“库存单位”
标题 5:“库存价值”
让我们继续对详细信息部分进行同样的操作,这里需要知道的是,我们必须输入表达式,而不是文本,这些表达式是 dsProduct.dtProductInfo 中的列。您可以直接输入表达式,也可以简单地从数据源工具栏(参见图 7 左侧)拖放列。
如果您决定手动输入,请从第一列到最后一列,单击每个列的详细信息单元格并输入以下文本
详细信息 1:“=Fields!ProductName.Value”
详细信息 2:“=Fields!QuantityPerUnit.Value”
详细信息 3:“=Fields!UnitsInStock.Value”
详细信息 4:“=Fields!UnitPrice.Value”
详细信息 5:“=Fields!UnitsInStock.Value * Fields!UnitPrice.Value”
请注意详细信息 5:它是通过将库存单位和单位价值相乘计算出的输出。
提示:如果您将列拖放到 Table 控件的详细信息部分,如果列标题为空,它将尝试自动添加列标题。
最后,让我们在表格控件的页脚部分添加汇总总计。请确保选择正文部分中第 4 列和第 5 列的页脚单元格,然后输入以下文本:
单元格 4:“总价值:”
单元格 5:“=SUM(Fields!UnitsInStock.Value * Fields!UnitPrice.Value)”
请检查单元格 5 中的表达式;我正在使用内置函数 SUM() 来找出报告中列出的所有产品的总库存价值。
页脚部分
在我们开始编写一些酷炫的 C# 代码来让我们的报表变得生动之前,让我们先完成报表页脚部分。就像我们之前添加报表页眉一样,同样地,我们必须右键单击打开的报表设计器表面并选择“页面页脚”(参见图 7)。
将 Line 和 TexBox 控件拖放到页脚部分。请在 TextBox 中输入以下表达式:
值:="页码: " & Globals!PageNumber & "/" & Globals!TotalPages
正如您所看到的,我使用了 PageNumber 和 TotalPages,它们都是由报表引擎维护的全局变量。
提示:请确保您输入的所有表达式都必须以“=”开头。
请确保您的报表看起来与图 10 所示相同。正如您所看到的,我添加了一些颜色并对数字数据进行了右对齐等操作。请随意尝试所有不同的格式选项,只需将表格控件视为带有列和行的迷你电子表格,现在您就可以尝试所有可以对其进行的格式设置。
图片:10
表达式生成器
表达式生成器是 Reporting Services 的一个非常强大的功能。正如您在图 11 中所看到的,库存值是借助 SUM 函数计算出来的。DataSet 中的所有字段都可以通过“Fields!”关键字访问。
图片:11
步骤 5:C# 接口代码
从解决方案资源管理器中,选择 default.aspx。右键单击页面表面并选择“查看代码”。
使用 System.Data.SqlClient;
使用 Microsoft.Reporting.WebForms;
确保 Page_Load 事件具有以下代码
protected void Page_Load(object sender, EventArgs e)
{
//声明连接字符串
string cnString = @"Data Source=(local); Initial
Catalog=northwind;" + "User Id=northwind;Password=northwind";
/*如果您使用标准安全性,请使用以下代码
string cnString = @"Data Source=(local);Initial
Catalog=northwind; Integrated Security=SSPI"; */
//声明连接、命令及其他相关对象
SqlConnection conReport = new SqlConnection(cnString);
SqlCommand cmdReport = new SqlCommand();
SqlDataReader drReport;
DataSet dsReport = new dsProduct();
try
{
//打开连接
conReport.Open();
//准备连接对象以通过
//读取器获取数据并填充到数据集中
cmdReport.CommandType = CommandType.Text;
cmdReport.Connection = conReport;
cmdReport.CommandText = "Select TOP 5 * FROM Products
Order By ProductName";
//从命令对象读取数据
drReport = cmdReport.ExecuteReader();
//ADO.NET 的新酷功能... 直接加载数据
//从读取器到数据集
dsReport.Tables[0].Load(drReport);
//关闭读取器和连接
drReport.Close();
conReport.Close();
//向查看器提供本地报表信息
ReportViewer1.LocalReport.ReportPath =
Server.MapPath("rptProductList.rdlc");
//准备报表数据源
ReportDataSource rds = new ReportDataSource();
rds.Name = "dsProduct_dtProductList";
rds.Value = dsReport.Tables[0];
ReportViewer1.LocalReport.DataSources.Add(rds);
ReportViewer1.LocalReport.Refresh();
}
catch (Exception ex)
{
//错误处理例程
}
finally
{
//检查连接是否仍然打开,如果打开则尝试关闭
if (conReport.State == ConnectionState.Open)
{
conReport.Close();
}
}
}
我在 select 查询中使用了“TOP 5”;原因是我想限制输出,以便在图 1 中向您显示汇总总计。
提示:ReportDataSource 对象的 Name 属性应始终为“DataSet_DataTable”。
使用 VB.NET 脚本的 Access 数据库示例
同样的报表可以使用 Access 数据库或任何其他数据源完成。ASP.NET 2.0 的一个酷炫之处在于,每个单独的页面都可以使用您选择的脚本语言创建。
我收到了一些请求,因为我之前的文章要求展示使用 VB.NET 的代码。因此,我认为这是一个好主意,用 VB.NET 脚本展示 Access 示例。我在项目中添加了一个名为 vbPage.aspx 的页面,您可以查看它以了解如何使用 VB.NET 实现代码。
通常,Northwind 数据库随 Access 数据库安装一起提供;如果您没有,可以从这里获取
http://www.microsoft.com/downloads/details.aspx?FamilyID=C6661372-8DBE-422B-8676-C632D66C529C&displaylang=EN
修改后的代码应如下所示
Imports System.Data.OleDb
Imports System.Data
Imports Microsoft.Reporting.WebForms
Partial Class vbPage
继承 System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
Dim cnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=c:\nwind.mdb;User Id=admin;Password=;"
Dim conReport As OleDbConnection = New
OleDbConnection(cnString)
Dim cmdReport As OleDbCommand = New OleDbCommand
Dim drReport As OleDbDataReader
Dim dsReport As DataSet = New dsProduct()
试试
conReport.Open()
cmdReport.CommandType = CommandType.Text
cmdReport.Connection = conReport
cmdReport.CommandText = "Select TOP 5 * FROM
Products Order By ProductName"
drReport = cmdReport.ExecuteReader
dsReport.Tables(0).Load(drReport)
drReport.Close()
conReport.Close()
ReportViewer2.LocalReport.ReportPath =
Server.MapPath("rptProductList.rdlc")
Dim rds As ReportDataSource = New ReportDataSource
rds.Name = "dsProduct_dtProductList"
rds.Value = dsReport.Tables(0)
ReportViewer2.LocalReport.DataSources.Add(rds)
ReportViewer2.LocalReport.Refresh()
Catch ex As Exception
'错误处理代码
最后
If conReport.State = ConnectionState.Open Then
conReport.Close()
End If
End Try
End Sub
End Class
结论
正如您所看到的,我们现在不必依赖 HTML 编码或任何其他报表工具或报表解决方案;Microsoft 在 Visual Studio 2005 中提供了开箱即用的 Reporting Services,做得非常棒。
我知道为初级读者写作总是比为专家读者写作更具挑战性。我一直依靠您的反馈/建议来改进自己;所以,请继续给我发送您的想法。您可以写信给我:asif.blog at gmail dot com。
感谢您的阅读;我真诚地希望这篇文章能通过我的应用方法帮助您更好地了解报表服务。