Reports入门
Rick Dobson
Reporting Services 是一个集成了 Visual Studio .NET 2003 和 SQL Server 2000 的企业级系统,有利于基于数据的报表的创作、发布、管理和用户访问。它是 Microsoft 提供的 SQL Server 2000 的免费附加组件,其升级版本可能会成为 SQL Server 2005 的一个内置组件。Rick Dobson 概述了 Reporting Services 并说明如何开始用其创作报表。Reporting Services 联机丛书已经做好,它提供了该产品的完整概述。本文重点介绍了在用 Reporting Services 创作报表时 Visual Studio .NET 所扮演的主要角色,从而补充了内置文档。
![*](http://img.microsoft.com/library/gallery/templates/MNP2.Common/images/3squares.gif)
虽然 Reporting Services 需要 SQL Server 2000,但它并不局限于只处理 SQL Server 数据。您可以基于 OLE DB、ODBC 和 Oracle 数据源来创作报表,也可以用 SQL Server 数据库中的数据来创作。作为一个 Visual Studio .NET 专业人员,您很可能会遇到有关 Reporting Services 的问题,这是因为它的报表设计器是通过 Visual Studio .NET 实现的。Reporting Services 支持用于定义报表的 XML 语法,因此您最终能够使用第三方产品来创作报表,不过报表的默认设计器是 Visual Studio .NET。
Reporting Services 概述
在过去几年里,我的大多数经验都与 Visual Basic .NET 和 SQL Server 有关,在那之前我用 Access、SQL Server 和 VBA 进行数据库开发。虽然 Access 通常用于报表生成,但是 SQL Server Reporting Services 却提供了完全不同的感觉。Access 使部门开发人员和最终用户只需要很少或者不需要 IT 部门的参与就能够生成报表。Reporting Services 确实值得引起 SQL Server 和 Windows 系统管理员的关注。Reporting Services 的最初版本是通过基于角色的安全性来管理报表访问和创作的。角色的权限以独占方式应用于 Windows 用户和组。
Reporting Services 在功能方面极其丰富。它支持多种报表格式和对象。您可以使用标准表格式,也可以使用交叉表报表的矩阵对象。作者还可以在其报表中包含图表和子报表。您可以对报表中的值有选择地启用向下追溯功能,并通过参数值使报表变为动态。您甚至可以从一个报表向下追溯到另一个报表。还有一种将数据作为窗体显示的自由形式格式。您可以用多种格式发布报表,包括 HTML、Excel、以逗号分隔的文本、PDF、TIFF、Office Web 组件和 XML。
令 Visual Studio .NET 开发人员关注 Reporting Services 的一个重要原因是:Visual Studio .NET 实现了报表设计器。安装 Reporting Services 之后,在选择用 Visual Studio .NET 启动一个新项目时,您将注意到一个新的项目类型。Business Intelligence Projects 类型包含两个模板。使用报表项目向导模板就生成了一组自动进行报表创作的屏幕。使用报表项目模板生成一个您可以手动设置格式的空白报表。使用 Visual Studio .NET,您可以连接到数据源、开发查询、基于该查询设置报表的格式,以及将完成的报表部署到报表服务器上。
Microsoft 创建了一个包含许多资源的 Reporting Services 站点 (www.microsoft.com/sql/reporting/default.asp),以帮助您迅速掌握这个强大的新功能。您可以在装有 SQL Server 2000 的任何计算机上安装 Reporting Services。您还需要在用于报表创作的所有计算机上安装 Visual Studio .NET 2003。Reporting Services 是作为一个 Web 服务实现的,用户和管理员可以连接到此 Web 服务的站点 http://hostsitename/reports。这个服务可以自动公开对调查、访问和管理报表等任务有利的报表管理器 UI。通过这个 UI 公开的功能范围取决于与通过报表管理器连接到报表服务器的 Windows 用户角色相关联的权限。
启动报表项目
您可以借助于报表向导来创建报表,也可以通过启动空白报表来手动撰写报表。在任一种情况下,您都需要首先使用 Visual Studio .NET 创建一个新项目。选择 Business Intelligence Projects,然后单击两个报表模板图标之一。图 1 显示了在名为 HCVSReporting 的项目中选择使用报表向导。
无论是用向导还是手动创建报表,您都需要指定数据源、指定查询、对报表布局设置格式、预览报表、编辑报表直至其满足您的要求,并最终将报表部署到报表服务器上。您可以用创建报表的任一方法来实现这些目标,但是报表向导对于入门来说尤为方便。
创建一个列示客户的报表
显示欢迎屏幕之后,报表向导将允许您指定一个报表数据源连接。通过单击“编辑”按钮,您可以打开向导屏幕顶端的“数据链接属性”对话框来选择一个数据源。您可以使用“数据链接属性”对话框最初指定一个报表数据源,或者在退出向导之前编辑一个数据源。这个向导可以有选择地允许报表作者键入或复制一个数据库的连接信息。图 2 显示了一个“数据链接属性”对话框,它连接到使用集成安全性的本地 SQL Server 上的 Northwind 数据库。
下一个向导屏幕可让您指定一个基于数据源的查询来填充报表。您可以使用 Microsoft 的常用图形查询设计器,或者只键入一个 SQL 字符串。图 3 显示了一个从 Northwind 数据库的 Customers 表中返回四列的查询。
其他向导屏幕可让您设置报表布局的格式。例如,本部分的客户清单报表使用了一个表在连续的行中显示客户数据。您可以使用内置的报表带区,也可以添加自己的带区来定位报表的数据。在客户清单报表中,所有列值都显示在内置的详细信息带区中。该规范指定:所有列值都显示在表的每一行上。倒数第二个向导页面可让您指定一个报表服务器以及该服务器上的文件夹,以便承载项目的报表。项目的后续报表都存储在该服务器的同一文件夹中。最后的向导页面可让您重写报表的默认名称并汇总您的选择。在单击“完成”以创建报表之前,您可以从这个最终页面返回到前面的屏幕并编辑您的选择。
在报表向导中单击“完成”之后,重点又回到了 Visual Studio .NET。图 4 显示了 CustomerList 报表的“布局”选项卡。请注意,有两个附加的选项卡可为您提供可选的报表视图。通过选择“预览”选项卡,您可以用一种看起来与浏览器显示报表相似的方法来显示报表。“数据”选项卡显示报表查询的图形视图。您可以从这个选项卡编辑查询,以选择报表的其他信息。
图 4 显示了报表布局视图右侧的解决方案资源管理器和“属性”窗口。您可以看到 CustomerList.rdl 文件在解决方案资源管理器中被选中。该文件包含报表的 XML。右键单击 CustomerList.rdl 的图标,并选择“查看代码”来显示定义报表的 XML。“属性”窗口显示用选定的属性设置选定的 Report 对象。Report 对象是一个包含其他对象(如 Body、Table 和用于显示标签和列值的 TextBox 实例)的顶级对象。您可以通过在“布局”选项卡上单击单个对象来选择它们,也可以从“属性”窗口顶端的下拉列表中选择它们。该功能允许作者通过编辑选定对象的属性设置来修改报表的格式设置。
在微调一个报表以使其用您喜欢的方式显示后,就可以部署报表了。起初,您可以将整个项目部署到报表服务器,这个报表服务器是您最初选择 Build | Deploy Solution 指定报表时指定的。这将在报表服务器上为与项目关联的报表创建一个文件夹。该文件夹与项目具有相同的名称。您可以用报表管理器查看报表文件夹的内容。要在运行报表服务器的计算机上打开报表管理器,请从 Windows“开始”按钮选择“所有程序 | Microsoft SQL Server | Reporting Services | Report Manager”。图 5 显示了 cab233a 报表服务器上 Home 文件夹的 HCVSReporting 文件夹中的 CustomerList 报表。我在办公室里的 cab233a 计算机上安装了 Reporting Services。Home 文件夹和 HCVSReporting 文件夹的路径突出显示在报表管理器的顶端,报表显示在报表管理器底端的窗口中。
顾名思义,报表管理器可让您管理报表服务器上的报表。例如,您可以在报表上方的“选择格式”下拉框中为报表选择 Excel 格式,然后以 .xls 文件的形式导出报表。
创建分组报表
报表设计器包含了许多简化报表格式设置的功能。本部分建立在前一部分之上,它重点介绍了如何创建一个将查询中的行分组的报表。此外,对报表准备的讨论阐释了如何将一个专用格式应用到一列值,即,一种货币格式。
创建一个新项目或打开一个现有 Visual Studio .NET 项目后,您仍然可以从解决方案资源管理器中调用报表向导。在解决方案资源管理器中右键单击报表,然后选择“新建报表”。这将打开报表向导的欢迎屏幕。本文的第二个示例报表使用了这一方法来启动一个基于到 Northwind 数据库连接的新报表。对报表的查询(如下面的代码所示)将获取 Customers 和 Orders 表以及 Order Subtotals 视图。
SELECT Customers.CustomerID, Customers.CompanyName, [Order Subtotals].OrderID, [Order Subtotals].Subtotal FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID INNER JOIN [Order Subtotals] ON Orders.OrderID = [Order Subtotals].OrderID
该查询将返回 Customers 表的 CustomerID 和 CompanyName 列值,以及 Order Subtotals 视图的 OrderID 和 Subtotal 列值。尽管该查询会返回重复 OrderID 每个唯一对的 CustomerID 和 CompanyName 列值和 Subtotal 列值的结果集,但 Order Subtotals 视图的两个列会嵌套在 Customers 表的两个列中。本部分的示例报表通过将某一客户的 CustomerID 和 CompanyName 列值中的 OrderID 和 Subtotal 值分组,来突出显示这个嵌套关系。
报表向导的“设计表格”页面使报表作者能够在其查询中的列值之间指定报表中的分组关系。图 6 显示选择 CustomerID 和 CompanyName 作为将一个或多个 OrderID 和 Subtotal 列值分组的列。
遗憾的是,分组框中的列是按层次嵌套的。因此,尽管两个列在同一分组级别上,但 CompanyName 会嵌套在 CustomerID 中。您可以在报表的“布局”选项卡中手动解决这个不恰当的嵌套。窍门是将 CompanyName 字段移到与 CustomerID 字段相同的分组级别上,然后删除向导为 CompanyName 生成的分组级别。
因为 Subtotal 列值是货币值,所以您可以通过将货币格式应用于列值来明确地转译报表值。您可以通过右键单击“布局”选项卡中的 Subtotal 字段来完成此操作。在“文本框属性”对话框中,从“标准”列表框中选择“货币”。然后单击“确定”。图 7 显示了报表在“预览”选项卡中的外观。
在设计报表后,您通常需要部署它。如果您只有一个报表要部署到先前已存在于一个项目的报表服务器中的文件夹,则可以在解决方案资源管理器中右键单击该报表。然后,选择“部署”以将此报表分发到报表服务器上。选择 Build | Deploy Solution 以将多个报表(可能还有其他对象)部署到报表服务器。
创建并使用共享数据源
上述两个报表都使用了各自的自定义数据源。如果项目包含一个报表集合,其中每个报表都连接到不同的数据库,那么使用自定义数据源尤为适合。但是,如果一个项目中的多个报表连接到同一数据库,那么创建一个共享数据源,并在多个报表中重复使用此共享数据源将更为高效。您可以从 Visual Studio .NET 项目中创建一个共享数据源,然后将其指定给用报表向导创建的新报表或者您手动创建的报表。共享数据源可以像报表一样部署到报表服务器上。报表管理器管理员可以将已部署报表的数据源从自定义数据源编辑为共享数据源,反之亦然。
通过在解决方案资源管理器中右键单击“共享数据源”并选择“添加新数据源”,您可以轻松地将一个共享数据源添加到项目中。这将打开一个“数据链接属性”对话框,这与报表向导打开的那个是一样的。您可以从对话框中进行选择,然后单击“确定”以将一个共享数据源添加到项目。您可以使用区分上下文的“重命名”菜单命令或数据源的“属性”窗口来编辑数据源的名称。右键单击数据源并选择“部署”,以将数据源从项目复制到报表服务器。或者,选择 Build | Deploy Solution 以将对象从项目分发到其报表服务器。您可以从报表管理器中将一个已部署的共享数据源指定给报表。在本文的示例项目中,我创建并部署了一个名为 Northwind 的共享数据源。该共享数据源指定了一个到具有集成安全性的 Northwind 数据库的连接。
要将 Northwind 共享数据源指定给一个报表,请从 Windows“开始”按钮打开报表管理器,方法是选择“所有程序 | Microsoft SQL Server | Reporting Services | Report Manager”。在报表管理器中单击项目的文件夹,然后单击报表的名称(如 GroupedReport)以接收新的数据源分配。这将显示报表。接下来,选择报表的“属性”选项卡,然后在左侧标题上选择“数据源”项。这将显示一个将新数据源指定给报表的页面。
图 8 显示了编辑为使用 Northwind 共享数据源之后的“数据源属性”页面。回想一下本文中名为 HCVSReporting 的示例项目,报表管理器将同一名称指定给文件夹,以便保存从项目部署的对象。“数据源属性”窗口显示了选中的共享数据源单选按钮。共享数据源的名称以一条斜杠开头,后跟文件夹名称、第二条斜杠,然后是共享数据源的项目名称。单击页面底部的“应用”,以便用随后创建的共享数据源替代报表向导为报表创建的自定义数据源。
用表格手动创建报表
要将一个新报表添加到项目中而不使用报表向导,请选择 Project | Add New Item,在“模板”窗格中突出显示“报表”图标,然后指定一个报表名称,如 ManualReportWithTable。在设置这个报表的格式之前,您需要指定一个数据源并查询该数据源。Reporting Services 使用名称 dataset 来引用查询,但是术语 dataset 不指定 ADO.NET DataSet 对象。相反,Reporting Services 中的术语 dataset 指定一个从数据源返回行集合的 SQL 语句。
在您安装 Reporting Services 时,可以选择安装 SQL Server AdventureWorks2000 数据库。为了向您展示这个示例数据库,手动报表示例使用了它。您可以应用上述示例的准则来为 AdventureWorks2000 数据库创建共享数据源。将一个新的空白报表添加到项目后,您必须首先为它分配一个数据集。这个任务实际上涉及两个步骤。第一,您必须指定一个数据源,如 AdventureWorks2000 数据库的共享数据源。第二,您必须指定一个 SQL 语句,它可返回一个带有您需要用于报表的列值的行集合。
图 9 显示了用于指定数据源和为 ManualReportWithTable 报表指定 SQL 字符串的“数据集”对话框。该查询将返回 CustomerID 和店铺名称,以及商店联系人的全名和电话。此外,店铺名称的第一个字母作为行的分组变量返回,它由店铺名称排序。
在为报表指定数据后,您就可以开始设置报表的格式了。“布局”选项卡可以公开一个工具箱,该工具箱具有保存报表数据的项,如 Table 控件。这个表是一个带区对象,它具有一组内置的表格标题、详细信息和表格页脚带区。您可以为选定的字段添加分组带区。“字段”窗口包括一列字段名称,您可以用 View | Fields 命令来显示它。您可以从“字段”窗口拖动字段名称来填充表的带区内的表单元格。通过右键单击一个列或一个带区边框,您可以添加额外的列或分组带区。图 10 显示了 ManualReportWithTable 报表,其 Table 控件和一些字段被拖动到内置带区中。此外,您还可以看到 FirstLetter 字段的分组带区。设置报表格式的整个过程是在布局 Windows 窗体和 Access 报表之间交叉进行的。
小结
Reporting Services 为 SQL Server 2000 提供了一项新功能。通过这个新的 SQL Server 功能创作报表主要依赖于 Visual Studio .NET。因此,掌握 Reporting Services 的 Visual Studio .NET 开发人员能够培训客户创建他们自己的特殊报表,以及为他们的客户创建高级的报表生成和管理功能。无论如何,Reporting Services 都提高了 Visual Studio .NET 的价值,同时也提高了那些知道如何将其用于具有报表需求的组织的开发人员的价值。