Microsoft Reporting Services 实战






4.80/5 (23投票s)
2005年1月5日
54分钟阅读

438492
Introducing Microsoft Reporting Services.
|
|
Introducing Microsoft Reporting Services
- 1.1 什么是 RS?
- 1.2 RS 概览
- 1.3 RS 架构
- 1.4 理解报表处理
- 1.5 交付报表
- 1.6 什么是报表生命周期?
- 1.7 RS 实战
- 1.8 评估 RS
- 1.9 总结
- 1.10 资源
信息太多,时间太少……如果蝙蝠侠的故事发生在今天的企业中,毒藤女可能会这么说。
我们都知道,.com泡沫已成往事,曾经挥霍的 IT 预算也早已不在。在经济复苏的低迷时期,企业倾向于花钱精简内部流程以获得竞争优势。根据微软的说法,如今的信息工作者将多达 80% 的时间花在收集信息上,只有 20% 的时间用于分析和决策。在许多组织中,这类需求会消耗大量的 IT 和开发资源。如今,Excel 电子表格常常是首选的报表工具,而手动输入数据或“划痕”是导致数据不准确和错误决策的主要原因之一。微软深知这些问题,因此在千禧年初启动了 Microsoft SQL Server 2000 Reporting Services 项目,并怀揣着“让组织中的所有员工都能实现商业智能的承诺,从而促进更好的决策”的宏大愿景。
本章将为您提供 Reporting Services (RS) 的全景视图。在本书的其余部分,我将交替使用“Reporting Services”和“RS”这两个术语。您将看到
- 为什么 RS 是企业报表的引人注目的选择。
- RS 架构的主要组成部分。
- 报表生成过程和报表生命周期。
- 创建您的第一个 RS 报表的步骤。
1.1 什么是 RS?
无论您每天都会听到多少新出现的术语和缩写,它们可能已经成为您 IT 词汇的一部分——例如 BI(商业智能)、OLAP(联机分析处理)、数据挖掘、DSS(决策支持系统)、EIS(执行信息系统)、数字仪表盘、企业门户和企业数据总线——但企业报表的最终目的仅仅是“输出”那些“输入”进去的东西。因此,对于许多应用程序来说,报表是 IT 管道的最后、也是通常最重要的一环。
为了澄清最后一点,让我们考虑一个 RS 可以有效解决的典型场景。假设一个组织建立了一个在线订单提交的门户网站。随着业务的增长,同一个组织可能需要实施一个报表基础结构来分析销售数据并了解其业务,例如,找出最畅销的产品、客户人口统计数据等等。为了实现这一目标,该组织可以利用 RS。
我们使用“报表”一词来指代标准的纸质报表的网络版或已保存到文件的版本。例如,一个组织可能希望为其客户提供在线生成各种报表的选项——例如,订单历史报表。传统上,Web 报表难以实现。将报表导出为不同文件格式则更难。RS 优雅地解决了这两个问题,原因有二。首先,开箱即用的 RS 支持 Web。其次,大多数流行的导出格式都得到原生支持。
1.1.1 为什么我们需要 RS?
讽刺的是,尽管报表在当今的企业中扮演着重要角色,但创建和分发报表历来是一项艰苦而繁琐的工作。为了理解为什么我们需要 RS,让我们分析报表的问题空间。
表 1.1 列出了一些围绕报表领域最紧迫的问题,以及 RS 如何解决它们。
表 1.1 Microsoft RS 如何处理报表问题空间
报表需求 | RS 如何解决? |
报表创作可能非常耗时。 | 使用强大的报表设计器,您可以像使用 Microsoft Access 一样轻松地创作报表。 |
需要集中管理报表。 | RS 使您能够将报表保存在一个报表存储库中。 |
报表需要分发到各种目的地。 | RS 支持按需和基于订阅的报表。可以通过 WinForm 和基于 Web 的应用程序按需请求报表。或者,报表可以分发给订阅者列表。 |
报表经常需要导出为不同的电子格式。 | RS 开箱即用地支持许多流行的导出格式。 |
报表工具的专有性质不允许您扩展它们。 | RS 具有灵活的体系结构,允许您通过编写自定义代码来扩展 RS 的功能。 |
报表需要安全。 | RS 提供了一个全面的安全模型,管理员可以利用该模型,通过将用户分配到角色来强制执行对报表的安全访问。当默认的基于 Windows 的身份验证不适合时,可以将其替换为自定义的安全实现。 |
企业报表解决方案可能成本高昂。 | 为了最大限度地降低成本,RS 已与 SQL Server 一起打包和许可。如果您拥有 SQL Server 2000 的许可副本,您可以在同一服务器上运行 RS,而无需额外的许可费用。 |
根据您的具体情况,您可能会发现其他有说服力的理由选择 RS 作为您的首选报表平台。我们将在本章中重新回顾 RS 的功能。
支持的报表类型
您的报表要求可能需要创作各种复杂程度不同的报表。例如,您的用户可能要求一个大型报表包含一个文档映射以方便导航。RS 允许您设计各种报表类型,如表 1.2 所列。
表 1.2 RS 支持各种报表类型
报表 | 类型 | 用途示例 |
表格 | 以表格形式显示数据,具有固定行数和列数。 | Excel 类型报表。 |
自由格式 | 数据区域由报表作者任意放置在页面上。 | 发票 - 发票详情报表。 |
图表 | 以图形方式呈现数据。 | 员工绩效图。 |
交叉表(矩阵) | 数据被旋转以将行数据作为列。 | 显示行上产品、列上时间的报表。 |
下钻 | 包含可展开的节。 | 一个公司绩效交叉表报表,其中产品可以按类别和品牌展开。 |
钻透 | 通过单击超链接生成。 | 客户订单历史记录,订单标识符包含超链接,可显示订单详情报表。 |
交互式 | 包含交互式功能,如文档映射、超链接、可见即时节等。 | 左侧带有文档映射的 Adobe Acrobat 类型报表。 |
虽然大多数流行的报表工具都支持表 1.2 中列出的许多报表类型,但 RS 使报表创作过程与使用 Microsoft Access 报表功能一样容易。例如,报表作者可以通过拖放项目来定义报表的外观。
现在我们已经了解了 RS 是什么,让我们看看它如何融入 Microsoft BI 的愿景。
1.1.2 RS 如何实现?
Microsoft 于 2004 年初发布了 RS 1.0 版本,作为 Microsoft SQL Server 2000 的附加组件。从非常高的层面来看,RS 可以定义为一个基于服务器的平台,用于创作、管理和分发报表。我们稍后将更详细地讨论 RS 架构。现在,请注意 RS 已与多个其他 Microsoft 产品集成并需要它们,包括
- Windows 2000 或更高版本作为服务器操作系统。
- Microsoft SQL Server 2000(含 Service Pack 3a)及更高版本。
- Internet Information Server (IIS) 5.0 或更高版本。
- .NET Framework 1.1。
- Visual Studio .NET 2003 用于报表创作和测试。
有关安装 RS 的更多信息,请参阅附录 A。
RS 版本
为了满足不同的用户需求,RS 提供多种版本,如表 1.3 所示。
表 1.3 RS 支持版本以满足各种报表需求
版本 | 选择时… |
标准版 | 您需要在一台计算机上安装 RS。标准版不支持集群部署以实现多 RS 实例的负载均衡。 |
企业版 | 您需要所有 RS 功能,包括负载均衡。 |
开发版 | 您需要将 RS 与客户端应用程序集成,或通过编写 .NET 代码来扩展其功能。开发版支持与企业版相同的功能集,但仅用于测试和开发系统,而非生产服务器。 |
评估版 | 您需要评估 RS。评估版在 120 天后过期。 |
有关 RS 版本之间差异的更多信息,请参阅产品文档或RS 官方网站上的“Reporting Services 功能比较”部分。有关 RS 许可要求的信息,请访问“如何许可 Reporting Services”页面。
1.1.3 RS 与 Microsoft BI 平台
RS 被定位为 Microsoft 商业智能 (BI) 平台的组成部分。该平台是一个多产品产品,其目标是解决许多组织每天面临的最常见的数据管理和分析挑战,例如分析大量数据、趋势发现、数据管理,当然还有全面的报表。
在 2004 年 1 月 27 日的 RS 正式发布演示会上,微软企业服务高级副总裁 Paul Flessner 概述了 RS 在 Microsoft BI 平台产品中的位置,如图 1.1 所示。
表 1.4 概述了 Microsoft BI 平台中主要构建块的目的。
图 1.1 Microsoft BI 平台由多个产品组成,这些产品构建在 SQL Server 数据库引擎之上,并满足各种数据管理和报表需求。
表 1.4 关键 Microsoft BI 平台组件
组件 (Component) | 目的 |
Microsoft SQL Server | 用于存储数据的关系型数据库。 |
Analysis Services | 分析处理(OLAP)引擎。 |
Data Transformation Services | 用于提取、转换和加载数据的工具。 |
Reporting Services | 用于报表创作、管理和交付的基于服务器的报表平台。 |
Replication Services | 将数据复制到异构数据源。 |
Microsoft Office | 用于数据分析和报表的桌面应用程序。 |
SharePoint Portal Server | 商业智能协作。 |
Visual Studio .NET | 用于创建基于 .NET 的应用程序的开发工具,包括分析和报表解决方案。 |
在座的各位很可能过去使用过不止一种这些产品来解决您的数据管理和分析需求。事实上,其中许多产品已经存在一段时间了。缺失的是一个用于创作、管理和生成报表,并且可以轻松集成到各种应用程序中的产品。RS 完美地填补了这一空白。
在向您介绍 RS 之后,让我们对其功能进行全景扫描,以了解为什么它会成为企业报表如此引人注目的选择。
1.2 RS 概览
即使在其第一个版本中,RS 也提供了广泛的功能,可以满足各种报表需求。
- 信息工作者可以利用 RS 来创作标准(“固定”)报表和具有交互式功能的报表。此处,我们将“标准”一词用于显示静态数据的报表。RS 的一个有趣之处在于,您的报表可以包含各种提供用户交互性的功能。例如,最终用户可以显示或隐藏报表中的项目,并单击启动其他报表或网页的链接。
- 第三方供应商可以以 RS 为目标,将报表打包作为其应用程序的一部分。例如,如果客户安装了 RS,供应商安装程序可以将报表文件上传到报表服务器。您将在第 2 章中看到这一点。请注意,下一版本的 RS 预计将包含独立的控件,用于直接从报表文件生成报表,而无需安装 RS。
- 组织可以使用 RS 为其业务对业务 (B2B) 或业务对消费者 (B2C) 应用程序启用报表功能。例如,一个组织可以有选择地以报表的形式向其业务合作伙伴公开部分数据。您将在第 11 章中看到类似集成场景的示例。
现在让我们概览一下 RS 的格局,并观察 RS 中一些最显著的地标。如果您觉得还没有看到全局,请不要担心。在第 1.3 节中,我们将更详细地了解 RS 架构的主要组成部分。
1.2.1 创作功能
作为报表作者,使用 RS,您有几种创建报表的选择。我们将在第 2 章中详细讨论每个选项。现在,我们想向您介绍报表设计器;这很可能是您在报表创作中最常使用的选项。
介绍报表设计器
使用报表设计器的图形环境,您可以创建不同类型的报表,例如如图 1.2 所示的交叉表下钻报表。RS 不会将您的报表创作选项限制在静态的纸质报表中。相反,您可以通过添加可展开节、超链接和文档映射等交互式功能,使报表更具通用性和易用性。鉴于其与 Visual Studio.NET 集成开发环境 (IDE) 的紧密集成,报表设计器为您提供了访问所有报表设计功能以及源代码管理等团队开发功能。
关于报表定义语言
此时,您可能想知道基于 RS 的报表文件是什么样的,以及它是如何存储的。RS 将报表保存为可扩展标记语言 (XML) 文件,该文件在一个称为报表定义语言的模式中进行了描述。
图 1.2 使用 RS,您可以创建各种类型的报表,包括如下的下钻交叉表报表。
定义 报表定义包含报表数据检索和布局信息。报表定义在一个称为报表定义语言 (RDL) 的 XML 模式中进行了描述。
将报表另存为基于 XML 的报表定义文件提供了两个主要优势
- 它使报表格式开放且可扩展。使用基于 XML 的 RDL 格式有利于实现应用程序和供应商之间的互操作性。微软正在与其他行业领导者合作,推广 RDL 作为报表定义的基于 XML 的标准。访问 RS 官方网站(请参阅资源部分获取链接)可查看微软 RS 合作伙伴列表。
- 它使报表可移植。例如,您可以轻松地将报表保存到文件并将其上传到另一个报表服务器。在第 2 章中,您将看到第三方报表工具如何利用此功能进行即席报表。
如果您使用报表设计器创建报表,其定义将自动为您生成。但是,正如您不必使用 Visual Studio .NET 来编写 .NET 应用程序一样,您也可以使用您选择的编辑器(如记事本)编写报表定义,或者以编程方式生成它(如您将在第 2 章中看到的那样)。当然,报表设计器使报表创作变得更加容易。迟早会出现第三方工具来提供替代的 RDL 编辑器。
1.2.2 管理功能
RS 通过将报表及其相关项存储在中央报表目录中来促进报表管理。要部署和管理报表,您需要将其上传到报表目录。发生这种情况时,它就成为一个受管理的报表。
定义 在本书的其余部分,我们将交替使用“报表目录”和“报表存储库”这两个术语来指代 RS 配置数据库。有关此数据库的更多信息,请参阅第 1.3.2 节。
受管理的报表是指已上传到报表目录的报表。
对于 .NET 开发人员来说,“受管理”一词与 .NET 受管理代码无关,尽管模式相同。而 .NET 受管理代码在 .NET 公共语言运行时 (CLR) 的控制下运行,受管理的报表则在报表服务器的控制下生成。
您可能想知道当报表上传到报表目录时实际发生了什么。在发布时,报表服务器会解析报表定义(RDL),生成一个 .NET 程序集,并将该程序集存储在报表服务器配置数据库中。RDL 文件将不再使用。当报表被处理时,该程序集将被加载并由报表服务器执行。
报表可能包含其他项,例如图像和与数据源相关的信息。这些报表相关项也存储在报表目录中。最后,报表目录捕获有关报表的其他信息,称为元数据。例如,就像您可以将物理文件组织在文件夹中一样,RS 允许您将报表组织在文件夹中。
定义 报表元数据描述了与报表关联的额外配置信息,例如安全权限、父文件夹等。
RS 提供集中式报表管理,管理员将对此表示赞赏。为了简化报表目录的管理,RS 提供了一个名为报表管理器 (Report Manager) 的工具。报表管理器实现为一个基于 Web 的应用程序,因此易于访问。此工具使您能够管理报表存储库的几乎所有方面,包括
- 报表信息和元数据,例如文件夹结构和报表属性。
- 报表将从中提取数据的报表数据源。
- 报表参数(用于参数化报表)。
- 安全性。
1.2.3 交付功能
托管在 RS 下的报表可以通过按需(“拉取”)交付或订阅(“推送”)交付方式进行交付。更常见的情况是按需交付,用户明确请求报表。作为报表作者,您无需做任何特殊操作即可使报表支持 Web,因为一旦报表上传到报表目录,RS 就会为您完成此操作。
仅“推送”交付选项就足以证明实施 RS 的合理性。此选项允许最终用户订阅报表,因此当某个特定事件触发时,报表就会发送给他们——例如,当定时事件触发时,对于基于计划的报表订阅。再举一个例子,一家金融机构可以允许其客户选择订阅某些感兴趣的报表,例如月度银行对账单。然后,在月末,银行对账单报表可以生成并通过电子邮件发送给用户。
我们将在第 1.5 节中更详细地讨论报表交付过程。
1.2.4 可扩展性功能
RS 等所有面向企业的产品的关键特征之一是它必须易于扩展。简单地说,可扩展性是指系统能够容纳基于旧功能构建的新功能的能力。我最喜欢 RS 的一点是它通过开放灵活的架构所包含的可扩展性功能。开发人员可以轻松地使用他们偏好的 .NET 语言编写 .NET 代码来扩展 RS。具体来说,您可以在以下领域扩展 RS
- 自定义 .NET 代码 — .NET 开发人员可以通过编写 .NET 自定义代码以编程方式增强报表。第 6 章演示了如何通过使用预打包代码(以 .NET 程序集的形式)为报表添加预测功能。
- 数据处理扩展 — 开箱即用的 RS 可以连接到具有 ODBC 或 OLE DB 提供程序的任何数据源。此外,您可以编写自己的自定义数据扩展来报送其他数据结构,如第 15 章所示。
- 交付扩展 — 开箱即用的订阅报表可以通过电子邮件或文件共享交付扩展进行交付。开发人员可以编写自己的交付扩展,将报表交付到其他目的地,例如 Web 服务,如第 15 章所示。
- 安全扩展 — 默认情况下,RS 使用基于 Windows 的安全模型来强制执行对报表目录的安全访问。如果基于 Windows 的安全模型不可行,您可以将其替换为自定义的安全实现。在第 15 章中,我们将实现面向 Internet 的报表的自定义身份验证和授权,您将看到一个如何这样做的示例。
- 呈现扩展 — 通过编写自定义呈现扩展,可以生成非原生支持的导出格式的报表。有关支持的导出格式的更多信息,请参阅第 1.4.2 节。
1.2.5 可伸缩性功能
可伸缩的应用程序在负载增加时响应良好。RS 可以纵向和横向扩展,以满足大型组织的高吞吐量报表需求。它从头开始设计,旨在高效地处理报表。例如,它支持多种报表缓存选项,如报表执行缓存、快照和报表会话,如我们在第 7 章中所述。
Reporting Services Enterprise Edition 支持集群部署,您可以使用它在多台计算机上实现多个 RS 服务器的负载均衡。这使得具有高可伸缩性需求的企业组织能够横向扩展 RS 并提供容错能力。RS 性能是第 16 章的主题。
1.2.6 安全功能
RS 从头开始设计,提供了一个安全的运行环境。它提供了一个全面的报表访问安全模型,该模型利用 Windows 身份验证。此模型将用户 Windows 帐户或组映射到角色,而角色描述了用户访问报表目录中项目的权限。报表管理员可以将 Windows 用户添加到预定义的角色或创建新角色。同样,当默认的基于 Windows 的安全模型不可行时,您可以将其替换为自定义安全扩展形式的自定义身份验证和授权实现。
为了促进可信计算,RS 利用基于 .NET 代码的安全机制,“沙箱化”基于可配置安全策略的自定义代码。我们将在第 8 章中讨论 RS 安全模型。
1.2.7 部署功能
由于 RS 是基于服务器的,因此在集成客户端应用程序方面,它无需任何部署要求。因此,任何类型的客户端应用程序都可以以 RS 为目标,而不仅仅是基于 .NET 的应用程序。因为您可以通过两种最流行的 Web 协议(HTTP-GET 和简单对象访问协议 (SOAP))访问 RS,所以任何支持 Web 的应用程序都可以与 RS 集成,无论其目标平台和开发语言如何。
定义 超文本传输协议 (HTTP),互联网的基础,有两种形式:HTTP-GET 和 HTTP-POST。HTTP-GET 在 URL 中传递请求参数,而 HTTP-POST 则将它们作为名/值对传递到实际消息中。
简单对象访问协议 (SOAP) 是一种轻量级的、基于 XML 的协议,它构建在 HTTP 之上,用于在 Web 上交换结构化和类型化信息。近年来,SOAP 已成为与 Web 服务通信的行业标准协议。
将您的应用程序与 RS 集成需要对 RS 的架构有深入的了解。下一节将概述 RS 的主要构建块。
1.3 RS 架构
RS 架构的一个重要特征是它是面向服务的,而不是面向对象的。Don Box,一位专注于下一代 Web 服务的微软杰出架构师,概述了面向服务架构的以下四个特征
- 边界是明确的。跨应用程序通信使用显式消息传递,而不是隐式方法调用。
- 服务是自主的。面向服务应用程序的生命周期不受其客户端控制。
- 服务共享模式和契约,而不是类。面向服务应用程序使用基于 XML 的模式向外部世界宣传其功能。
- 服务兼容性取决于策略。通过使用策略,面向服务应用程序指示哪些条件必须为真,服务才能正常运行。
您可能过去使用过面向对象的报表工具,其中报表使用者实例化报表提供程序的某个对象实例。此模型的一个特征是报表使用者和报表提供程序实例共享相同的进程空间。例如,要呈现 Microsoft Access 报表,您需要实例化一个类型为 Access.Application
的对象。然后,您使用 OLE 自动化指示 Access 打开报表数据库并呈现报表。
您可能会同意,尽管面向对象模型很有用且应用广泛,但它也存在一些众所周知的缺点。例如,使用者和提供程序通常安装在同一台机器上。因此,报表提供程序托管的报表不容易被地理上分散的客户端访问。例如,只有支持 COM 的客户端才能与 Microsoft Access 交互。
第二个缺点涉及应用程序的相互依赖性。面向对象的应用程序通常作为一个单元进行部署。例如,所有 Microsoft Access 客户端都需要在本地安装 Access 类型库才能建立对它的引用。
为了解决这些缺点,RS 彻底放弃了面向对象的范例。在报表方面,RS 面向服务的架构提供了两个明显的优势
- 管理员可以将报表存储和管理集中在一个地方,并且
- 它促进了应用程序的互操作性——报表使用者可以通过标准 Web 协议(如 HTTP-GET 和 SOAP)请求报表。
RS 面向服务的架构可以在三层应用程序部署视图的上下文中得到更好的解释,如图 1.3 所示。
图 1.3 报表使用者将报表请求提交给报表服务器,报表服务器查询数据源以检索报表数据并生成报表。
RS 架构包括以下主要组件
- 报表服务器,其主要任务是生成报表。
- 报表服务器配置数据库(报表目录),它充当集中式报表存储库。
- 报表管理器,一个用于管理报表目录和请求报表的基于 Web 的工具。
让我们更详细地解释每个组件的作用,从报表服务器开始。
1.3.1 报表服务器
RS 架构的核心是报表服务器引擎。报表服务器执行以下主要任务
- 处理报表使用者发送的报表请求。我将使用“报表使用者”一词来描述任何从报表服务器请求报表的客户端应用程序。同样,这可以是任何应用程序,无论其编写语言或运行平台如何。
- 执行处理报表所需的所有任务,包括执行和呈现报表,我们稍后将详细讨论。
- 提供附加服务,如快照和报表缓存、授权和安全策略执行、会话管理、调度和订阅交付。
定义 我们将使用“报表请求”一词来指代报表使用者为了成功生成报表而必须传递给报表服务器的一组输入参数。报表请求至少必须指定报表的路径和报表名称。其他参数可以作为报表参数传递,包括呈现格式、报表是否应包含标准工具栏等。
查看图 1.3,您可以看到报表服务器包含几个组件,包括报表处理器、Windows 服务和扩展。从实现的角度来看,描述报表服务器的最佳方法可能是说它实现为位于 C:\Program Files\Microsoft SQL Server\MSSQL\RS\ReportServer\bin 文件夹中的一组 .NET 程序集。
注意 有趣的是,报表服务器 100% 是用 C# 代码编写的。据我所知,这使其成为第一个真正的 .NET 服务器。不,遗憾的是,未提供源代码。此外,报表服务器程序集被混淆以防止逆向工程、重用和滥用。
您知道,报表服务器的主要作用是生成报表。为了实现这一点,服务器从报表目录中检索报表定义,将其与数据源中的数据结合,并生成报表。
图 1.3 和产品文档表明,报表处理器组件负责报表处理。本文撰写时尚未披露处理器的实现细节,但其大部分功能很可能封装在 Microsoft.ReportingServices.Processing.dll 程序集中。在本书的其余部分,我们将交替使用“报表处理器”和“报表服务器”这两个术语。
第 1.4 节解释了报表服务器组件各自的作用,并展示了它们与报表处理的关系。
从集成角度来看,也许您需要从图 1.3 中得出的最重要观察是,报表服务器有两个基于 Web 的通信接口,它们将其功能暴露给外部客户端:HTTP 处理程序,它通过 HTTP-GET 接受基于 URL 的报表请求;以及 Web 服务(在图 1.3 中显示为 RS WS),它处理 SOAP 请求。您将在第 1.5 节中看到这些接口如何影响报表交付过程。
1.3.2 报表服务器数据库
当您安装 RS 时,安装程序会创建报表服务器数据库。该数据库实现为两个物理 SQL Server 2000 数据库:Reporting Services 配置数据库 ReportServer,它托管报表目录和元数据。在本节中,我们将仔细审视每个数据库。
Reporting Services 配置数据库
Reporting Services 配置数据库 ReportServer 托管报表目录和元数据。正如我们前面提到的,为了使报表可供最终用户使用,必须将其报表定义文件上传(发布)到目录。
如果您在 SQL Server Enterprise Manager 中打开此数据库,您将能够推断出其大多数表的作用。例如,Reporting Services 配置数据库在 Catalog 表中保存目录项,在 Data-Source 表中保存数据源信息,依此类推。请注意,微软不建议直接查询报表目录。相反,推荐的访问报表目录的方法是通过报表服务器 API。微软还建议您不要直接对目录进行数据更改。这样做的原因是,微软将来可能会更改目录架构,但会通过报表服务器 API 维护向后兼容性。
您可能还记得,RS 可以部署在负载均衡的集群环境中。在此部署模型中,报表服务器数据库由集群的所有节点共享。
Reporting Services 临时数据库
RS 安装程序还创建第二个数据库 ReportServerTempDB,RS 用于缓存目的。例如,报表执行后,报表服务器会将报表的副本保存在 ReportServerTempDB 数据库中。
定义 报表缓存描述了报表服务器在一定时间内将报表中间格式保留在报表服务器数据库中的功能。
我们将在第 7 章中回到报表缓存的话题。
Adventure Works 2000 示例数据库
最后,如果您安装了 RS 示例,安装程序会安装一个名为 AdventureWorks2000 的示例数据库。此数据库也由其他 Microsoft 产品使用,如 Commerce Server 和 Notification Services。
AdventureWorks2000 数据库比 SQL Server 示例数据库 Northwind 或 Pubs 包含更“真实”的销售订单数据库模型。通过查看 60 多个表格中的数据,您将很快意识到这一点。我们将在第 1.7 节中使用这个示例数据库,届时您将有机会使用 RS 创建一个报表。
1.3.3 报表管理器
报表管理器实现为一个 ASP.NET Web 应用程序,它执行两项主要任务:报表管理和报表请求。您可以将报表管理器视为一个与报表服务器通过报表服务器 API 进行通信的应用程序接口。从报表服务器的角度来看,报表管理器与其他任何客户端应用程序没有区别。
报表管理
熟悉 SharePoint Portal Server 的用户会发现报表管理器在用户界面和目的上都与该产品相似。就像使用 SharePoint 一样,您可以使用报表管理器创建文件夹、上传资源、管理订阅和设置安全。
例如,图 1.4 显示我使用报表管理器导航到一个名为 AWReporter 的文件夹,并获取该文件夹下目录项的列表。您可以单击报表链接来运行报表,或者访问和修改报表属性。
如果您想知道图 1.4 中显示的项来自哪里,我们将在接下来的几章中讨论报表创作过程时创建它们。
请记住,在 RS 中,您使用的是虚拟文件夹。文件夹和报表定义文件实际上并不存在于文件系统中。相反,它们存在于报表服务器数据库中作为元数据,但当您通过报表管理器访问报表服务器时,它们会显示为文件夹和项。
请求报表
有时,构建一个报表应用程序可能会过度。或者小型公司可能没有 IT 资源来快速完成,或者根本负担不起这项工作。在这种情况下,报表管理器可以用作报表工具。用户可以导航到报表管理器门户并即时请求报表,如图 1.5 所示。
更妙的是,用户可以使用报表服务器自动生成的方便的工具栏来执行各种与报表相关的任务,包括为接受参数的报表指定参数值(更多内容将在第 3 章中介绍)、分页、缩放以及将报表导出为不同格式。
图 1.4 用户可以使用报表管理器门户来生成或管理报表。
图 1.5 不需要创建报表启用应用程序的组织可以使用报表管理器请求报表。此图显示了以 HTML 格式生成的 Employee Sales Freeform with Chart 报表。
现在我们已经对 RS 的主要构建块进行了 100 英尺的概览,让我们深入了解一下,看看它是如何处理、呈现和交付报表的。
1.4 理解报表处理
报表处理包括报表服务器为生成报表而执行的所有活动。为了理解报表服务器如何处理报表,让我们看看当按需请求报表时会发生什么。
图 1.6 描绘了当报表使用者请求托管在报表服务器下的报表时发生的情况。首先,使用者向报表服务器提交(1)报表请求。
一旦报表请求被报表服务器拦截,它就会被转发(2)到报表处理器。报表处理器解析请求并从报表服务器数据库检索(3)报表定义和元数据。报表处理器检查用户是否被授权访问此报表。如果是,报表处理器将处理报表,这包括两个阶段:执行和呈现。
让我们更深入地了解每个阶段,从执行阶段开始。
图 1.6 您可以通过使用两个 Web 通信接口:HTTP 处理程序和 RS Web 服务来集成您的应用程序。
1.4.1 执行阶段
报表执行阶段开始于报表服务器开始处理报表,并在报表准备好呈现时结束。为简单起见,我们假设报表是第一次被请求。
生成原始报表
如前所述,当报表发布时,报表服务器会解析其报表定义 (RDL),生成一个 .NET 程序集,并将该程序集保存在报表的目录中。在执行阶段,报表服务器加载并执行该程序集。回顾图 1.6,您可以看到报表服务器使用数据扩展(4)查询(5)数据源以检索报表数据,将结果数据集与报表布局信息结合起来,并以一种称为中间格式 (IF) 的原始形式生成(6)报表。
在报表呈现之前将其生成为中间格式,在性能方面是有益的。它允许报表服务器重用相同的 IF,而无论请求的导出格式如何。熟悉 .NET 中间语言 (IL) 代码执行模型的开发人员可以类似地看待 IF。IL 抽象了代码执行所在的平台,而 IF 抽象了呈现格式。例如,一个报表使用者可以请求 HTML 格式的报表,而另一个使用者可以请求相同的报表作为 PDF。在任何一种情况下,报表服务器都已经有了原始报表;唯一剩下的就是将其转换为最终的表示格式。在呈现阶段,报表服务器加载报表 IF,并使用呈现扩展以请求的格式呈现(7)报表。
一旦生成报表 IF,它就会被保存在(缓存)报表服务器临时数据库中。请注意,如果报表被缓存,对于后续请求,报表执行阶段可能会完全绕过,因为报表服务器决定使用缓存的 IF。我们将推迟到第 7 章讨论报表缓存。
1.4.2 呈现阶段
如图 1.6 所示,报表呈现阶段代表报表处理管道中的第二个(也是最后一个)阶段。在报表服务器拥有报表 IF 后,它将根据用户请求的导出格式,以最终表示格式呈现报表。您将惊喜地发现报表可以导出到大量的原生支持格式。我最喜欢的是 HTML 和 PDF。例如,如图 1.7 所示,我已将报表导出为 PDF 文件并在 Adobe Acrobat 中加载。
报表服务器将报表呈现过程委托给呈现扩展。RS 附带各种呈现扩展,它们对应于支持的导出格式。如果报表使用者没有明确指定导出格式,则报表将根据浏览器功能以 HTML 3.2 或 4.0 格式呈现。表 1.5 列出了开箱即用的 RS 支持的每种呈现格式。
如前所述,当支持的格式不够用时,您可以编写自己的呈现扩展。
图 1.7 使用 RS,您可以将报表导出为多种格式,包括 Adobe Acrobat PDF。在此,我已将此报表导出为 Adobe PDF 并加载到 Adobe Reader 中。
表 1.5 报表呈现选项
呈现扩展 | 描述 |
HTML | HTML 4.0(Internet Explorer 5.0 及更高版本),Netscape(6.2 及更高版本),否则为 HTML 3.2。 |
HTML with Office Web Components | HTML 4.0 配合 Office Web Components (OWC)。图表使用 OWC 图表控件呈现,矩阵使用 OWC 数据透视表呈现。 |
MHTML | MIME 封装的聚合 HTML 文档标准,它将图像、文档或其他二进制文件等资源嵌入到报表内的 MIME 结构中。这是最小化浏览器和服务器之间获取资源的往返次数的好选择。MHTML 在通过电子邮件发送报表时最为有用,正如我们在第 14 章中所见。 |
Adobe Acrobat 文件。 | |
Excel | 在 Excel 工作簿中创建报表的视觉表示,并在可能时转换 Excel 公式。用户可以在 Excel 中打开报表进行修改。 |
XML | 创建一个包含报表中信息的 XML 文档。生成的 XML 文档的模式由报表的内容和布局确定。用户可以使用报表设计器中的“数据输出”选项来控制元素的渲染方式。 |
CSV | 逗号分隔值文件,无格式。 |
Image |
将报表呈现为位图或图元文件,包括 GDI+ 支持的任何格式 BMP、EMF、GIF、JPEG、PNG、RIFF 和 WMF。 默认情况下,图像以 TIFF 格式呈现,可以用图像查看器显示。 图像呈现可确保报表在每个客户端上看起来都一样。呈现发生在服务器上;报表中的所有字体都必须安装在服务器上。 |
一旦报表生成,它就准备好传输到最终目的地:报表用户。RS 在分发报表方面为您提供了极大的灵活性,如下一节所示。
1.5 交付报表
如前所述,RS 支持按需(拉取)和订阅(推送)报表交付。要按需查看报表,用户会显式地从报表服务器请求报表。或者,用户可以选择订阅报表。通过此选项,当报表数据刷新或按指定计划时,报表会被推送到订阅者。
让我们更仔细地看看每种交付选项。
1.5.1 按需交付
在集成 RS 报表到应用程序时,您需要做出的最重要的决定之一是应用程序将如何访问报表服务器以请求报表。虽然在某些情况下系统设计可能决定集成选项,但有时选择不会那么直接,您可能需要仔细评估应用程序需求以确定最佳方法。我们将在第 9 章中更详细地回顾按需交付选项。现在,请注意可以通过两种方式按需请求报表:URL 访问和 Web 服务。
基于 URL 的报表访问
报表使用者通过提交 HTTP-GET 请求到报表服务器来通过 URL 请求报表。URL 访问的优点是其简单性和更好的性能。在最简单的情况下,使用者可以将报表 URL 嵌入到超链接中。
例如,一个基于 Web 的应用程序可以有一个下拉式报表菜单,其中每个链接都指向一个 RS 报表。使用 URL 访问选项,报表参数作为查询参数在报表 URL 中传递。例如,假设您已安装书中源代码附带的示例报表,以下 URL 将运行 Territory Sales Crosstab 示例报表,开始日期为 2003 年 3 月 1 日,结束日期为 2003 年 4 月 30 日。
https:///ReportServer?/AWReporter/Territory
Sales Crosstab&StartDate=3/1/2003&EndDate=4/30/2004
Web 服务
使用 RS,还可以通过向报表服务器 Web 服务提交基于 SOAP 的请求来请求报表。此服务的主要优点是其功能集远远超出了报表呈现。它还包含一组全面的方法来管理报表服务器的所有方面,例如上传报表、检索报表目录中的资源列表以及保护 RS。
您可以将报表服务器 Web 服务视为报表服务器的接口,它允许 RS 与各种平台集成。例如,如果您正在构建企业应用程序集成 (EAI) 解决方案,BizTalk 计划可能会调用 Web 服务 Render()
方法,获取报表的 XML 表示形式,从中检索一些数据,然后将其传递给另一个应用程序。或者,如果您的报表应用程序面向 B2B 并且您的合作伙伴拥有 Web 服务,您可以将其报表结果以 XML 格式发送给它。
在某些情况下,报表使用者将使用这两种访问选项的组合来与 RS 集成。例如,报表使用者可以使用 RS Web 服务来了解报表需要哪些参数。然后,应用程序表示层可以向用户显示这些参数,以便用户可以输入参数值。当用户提交报表请求时,应用程序可以使用 URL 访问将请求发送到报表服务器。
1.5.2 订阅交付
在“推送”报表交付场景中,报表由报表服务器自动生成并交付给交付目标。报表也可以在预定时间交付。例如,一家金融机构可以设置一个投资组合余额报表,使其在每个月末通过电子邮件生成并交付给其客户。
报表服务器 Windows 服务 (ReportingServicesService.exe) 与 SQL Server Agent 服务协同工作,以生成和交付订阅的报表。
注意 SQL Server Agent 是 Microsoft SQL Server 的组件,它负责运行计划的 SQL Server 任务。
例如,如果报表需要按照设定的计划生成,SQL Server Agent 将创建一个作业,并在时间到了时将订阅移动到 Subscriptions 表。RS Windows 服务会定期轮询报表配置数据库,以了解是否有新的订阅作业。如果是这种情况,Windows 服务将拾取作业,生成报表,并通过交付扩展将其交付给最终用户。
开箱即用的 RS 提供了两种交付扩展:电子邮件交付扩展和文件共享交付扩展。电子邮件交付扩展通过电子邮件交付报表。报表可以交付给订阅用户(选择加入订阅)或数据驱动的收件人列表。文件共享扩展将报表交付到网络共享。当这两个选项不足时,您可以编写自定义交付扩展。
请注意,报表服务器 Windows 服务不通过 HTTP 处理程序或 Web 服务接口与报表服务器通信。相反,由于它安装在与报表服务器相同的计算机上,因此 Windows 服务直接加载并调用报表服务器程序集。这有两个好处。第一个好处与可用性有关。即使 IIS 服务器关闭,Windows 服务仍然可以执行计划任务并向订阅者交付报表。另一个好处是性能更高——Web 接口完全被绕过。
报表服务 Windows 服务负责的另一个任务是执行后台数据库完整性检查以及其他管理任务。
在 RS 实战之前,全面了解报表生命周期可能会很有益。这一点很重要,因为本书的其余章节都遵循相同的流程。
1.6 什么是报表生命周期?
到目前为止,您可能已经意识到报表服务器是一个复杂的报表平台,其功能集远远超出了桌面报表工具。为了最大程度地减少学习曲线,本书遵循基于报表生命周期的逻辑路径。报表生命周期是您通常用于处理报表的过程,它包括三个阶段:创作、管理和交付。图 1.8 描绘了报表生命周期阶段。
在报表创作阶段,您通过使用报表创作工具创建 RDL 文件。例如,您可以使用 Visual Studio .NET 报表设计器来布局报表。请记住,报表数据检索和布局信息都包含在 RDL 文件中。我们将在第 2-6 章中讨论报表创作阶段的更多细节。
在报表管理阶段,您管理报表目录。您还记得,报表目录存储在 Reporting Services 配置数据库中。报表目录保存报表及其所有相关项。典型的管理任务包括在文件夹中组织报表、上传报表以及授予用户运行报表的权限。我们将在第 7 章和第 8 章中更详细地探讨报表管理。
报表交付阶段涉及将报表分发到其最终目的地,包括最终用户、打印机或归档文件夹。受管理的报表可以按需交付,也可以推送到订阅用户。报表交付在第 9-14 章中进行了详细讨论。
图 1.8 报表生命周期阶段包括报表创作、管理和交付。在报表创作阶段,您布局报表。在报表管理阶段,您部署和管理报表。最后,RS 为您提供了多种分发报表到最终目的地的方法。
理论够了!让我们将到目前为止学到的知识付诸实践,并开始使用 RS。
1.7 RS 实战
本节有两个主要目标。首先,我们介绍一个虚构的公司 Adventure Works Cycles (AWC),该公司将在本书的其余部分中引用。我们将讨论 AWC 面临的各种假设的报表挑战,并实施解决方案来解决这些挑战。
其次,我们将动手实践,使用 Visual Studio .NET 报表向导和 AdventureWorks2000 示例数据库创建我们的第一个报表。诚然,这将是一个简单的表格风格报表,但即使它很简单,它也展示了报表生命周期的所有阶段。我们还将在接下来的三章中使用此报表作为实际示例来扩展我们对 RS 的知识。
1.7.1 关于 Adventure Works Reporter
让我们从一个假设的问题陈述开始。您是 AWC 的一名开发人员,AWC 制造并销售商品给个人和零售商。该公司在过去几年中取得了巨大的成功。销售额呈指数级增长,客户群也在快速增长。今天,AWC 在美国和海外都有客户。它已经实施了一个基于 Web 的在线事务处理 (OLTP) 系统来在线捕获销售订单。
然而,成功并非没有代价。数据不准确和决策缓慢是销售经理抱怨最多的问题之一。通常,数据以 Excel 电子表格的形式捕获和整合。需要的是一个报表系统,以一种易于理解和分析的格式向公司呈现数据,并允许 AWC 的管理层发现趋势并了解公司的业绩。您已被指定为新 Adventure Works (AW) Reporter 系统的首席开发人员。您对 Microsoft SQL Server 2000 RS 感到着迷,并决定以此为基础构建您的报表系统。
注意 在现实世界中,出于性能原因,您应该避免从 OLTP 数据库进行报表。顾名思义,OLTP 系统必须能够处理大量事务并支持数百甚至数千用户。报表应用程序通常会提交查询来检索和分析大量数据,这会对数据库中的许多记录施加数据锁定。这会严重影响您的 OLTP 系统性能。因此,报表和 OLTP 通常是两种互斥的选项。典型的解决方案是整合 OLTP 数据,然后将其上传到针对报表进行优化和指定的数据仓库数据库。我们将在第 12 章中详细讨论 OLAP 和数据仓库。
1.7.2 您的第一个报表
AW 管理层可能希望了解的一个关键信息是按区域划分的年产品销售额。有了这样的报告,管理者就可以确定 AW 在每个销售区域的表现如何。为了满足这一要求,让我们创建“按区域销售情况”报告。图 1.9 展示了我们将在此部分创建的报告的最终版本。
图 1.9 我们的第一个报告是“按区域销售情况”。
这只是本书中我们将设计的众多示例报告之一。在后续章节中,我们将使用“按区域销售情况”报告来演示其他 RS 功能。
表 1.6 列出了我们需要完成的任务,以按照报告生命周期阶段组织报告。
表 1.6 创建第一个报告的任务图
阶段 | 任务 | 描述 |
创作 | 创建 BI 项目。 | 在 Visual Studio .NET 中创建新的 BI 项目。 |
创建报告数据源。 | 使用 Report Designer 的“数据”选项卡配置与 AdventureWorks2000 数据库的数据库连接。 | |
设置报告数据集。 | 定义数据集查询以检索报告数据。 | |
布局报告。 | 使用 Report Wizard 和 Report Designer 创作报告。 | |
测试报告。 | 使用 Report Designer 的“预览”选项卡预览和测试报告。 | |
管理 | 部署报告。 | 使用 Visual Studio .NET 将报告部署到 Report Server 目录。 |
交付 | 确保按需报告交付。 | 使用 Report Manager 导航和呈现报告。 |
您会记得,报告生命周期的第一个阶段是报告的创作。
创作报告
让我们使用 Report Designer 开发我们的第一个报告。为此,我们需要创建一个新的 Visual Studio .NET 商业智能 (BI) 项目。
任务:创建商业智能项目
要创建项目,请完成以下步骤(参见图 1.10)
- 步骤 1 打开 Visual Studio .NET,选择“文件”->“新建”->“项目”。
- 步骤 2 在“项目类型”中,选择“商业智能项目”。
- 步骤 3 在“模板”中,选择“报告项目”。
- 步骤 4 在“位置”字段中,输入 AWReporter,指定一个位置,然后单击“确定”。
- 步骤 5 项目创建后,右键单击“解决方案资源管理器”窗口中的 AWReporter 项目节点,然后选择“属性”。将出现“属性页”对话框,如图 1.11 所示。
- 步骤 6 验证 TargetFolder 设置是否为 AWReporter。这指定了项目中定义的所有报告将被部署到的报告目录中的文件夹名称。
- 步骤 7 在 TargetServerURL 字段中,输入 Report Server URL。如果 RS 安装在您的本地计算机上,并且您在设置过程中接受了默认值,则 Report Server 的 URL 应该是 https:///ReportServer。单击“确定”关闭“属性页”对话框。
图 1.10 使用 Visual Studio .NET 创建新的 BI 项目。
图 1.11 使用报告属性页设置项目属性。
任务:创建报告数据源
接下来,我们创建一个指向 AdventureWorks2000 示例数据库的共享数据源。如果共享数据源的概念不清楚,请不要担心。到第 3 章,一切都会变得清晰。
- 步骤 1 右键单击“解决方案资源管理器”中的“共享数据源”节点,然后选择“添加新数据源”。熟悉的“数据链接属性”对话框将出现,如图 1.12 所示。
切换到“提供程序”选项卡,并验证是否选择了 Microsoft OLE DB Provider for SQL Server(我们将连接到 SQL Server 数据库)。回到“连接”选项卡,指定
- 您用于安装 RS 的 SQL Server 的名称。在本例中,数据库安装在本地,因此数据源名称为“.”。
- 一个有效的用户名和密码组合,该 SQL Server 帐户具有查询 AdventureWorks2000 数据库中表的权限。选择“允许保存密码”复选框。
- 从“选择服务器上的数据库”下拉列表中选择 AdventureWorks2000 数据库。单击“测试连接”按钮测试连接。如果一切正常,请单击“确定”。
图 1.12 使用“数据链接属性”对话框设置指向 AdventureWorks2000 数据库的数据源。
- 步骤 2 默认情况下,RS 会使用与数据库相同的名称来命名数据源。由于我们将在此书中对大多数示例报告使用此数据源,因此让我们为其指定一个更具描述性的名称。
双击 AdventureWorks2000.rds 文件。将出现“共享数据源”对话框,如图 1.13 所示。
将数据源的 Name 属性更改为 AW2000 Shared DS,然后单击“确定”。可选地,在“解决方案资源管理器”中,将数据源文件重命名为 AW2000 Shared DS.rds。
现在是时候创作报告了。我们将使用方便的 Report Wizard 来节省时间。
任务:设置报告数据集
- 步骤 1 右键单击“解决方案资源管理器”中的“报告”节点,然后选择“添加新报告”。
- 步骤 2 在“报表向导”欢迎屏幕上,单击“下一步”。
- 步骤 3 在“选择数据源”屏幕上,确保选择了“共享数据源”单选按钮,并且“共享数据源”下拉列表中显示了 AW2000 Shared DS。单击“下一步”。
- 步骤 4 在“设计查询”屏幕上,单击“编辑”按钮。熟悉的查询设计器窗口将出现。
图 1.13 设置指向 AdventureWorks2000 数据库的共享数据源。
- 步骤 5 在查询窗格中输入以下 SQL 语句
SELECT ST.Name AS Territory, PC.ProductCategoryID, PC.Name AS ProductCategory, SUM(SOD.UnitPrice * SOD.OrderQty) AS Sales FROM SalesOrderDetail SOD INNER JOIN Product P ON SOD.ProductID = P.ProductID INNER JOIN SalesOrderHeader SOH ON SOD.SalesOrderID = SOH.SalesOrderID INNER JOIN SalesTerritory ST ON SOH.TerritoryID = ST.TerritoryID INNER JOIN ProductSubCategory PSC ON P.ProductSubCategoryID = PSC.ProductSubCategoryID INNER JOIN ProductCategory PC ON PSC.ProductCategoryID = PC.ProductCategoryID WHERE DATEPART(YY, SOH.OrderDate) = DATEPART(yy, GETDATE()) GROUP BY ST.Name, PC.Name, PC.ProductCategoryID ORDER BY ST.Name, PC.Name
此查询按区域和产品类别检索产品销售订单。AW 数据库按子类别对产品进行分组,然后汇总到产品类别。为了此报告的目的,我们按产品类别汇总销售数据,因为这代表了产品层级中最集中的级别,这正是高层管理人员感兴趣的。销售金额从 SalesOrderDetail 表中检索。此外,查询还会筛选出当前年份创建的订单。在第 3 章中,我们将使报告成为参数驱动的,允许用户传递任意日期。此时,单击“下一步”。
任务:布局报告
要布局报告,请执行以下步骤
- 步骤 1 在“选择报告类型”屏幕上,将报告类型保留为“表格”。单击“下一步”。
- 步骤 2 在“设计表格”屏幕上,选择除 ProductCategoryID 之外的所有字段,然后单击“详细信息”,使字段显示在报告详细信息部分,如图 1.14 所示。单击“下一步”。
- 步骤 3 在“选择表格样式”屏幕上,单击“Corporate”,然后单击“下一步”。
- 步骤 4 最后,在“完成报表向导”屏幕上,将“按区域销售情况”输入为报表的名称。单击“完成”,我们就大功告成了!
Visual Studio 将显示 Report Designer,并选中“布局”选项卡,如图 1.15 所示。
与 Visual Studio .NET Report Designer 的集成使您无需离开 Visual Studio .NET IDE 即可轻松预览和测试您的报告。
图 1.14 在“设计表格”步骤中,您选择要在报告中显示的字段以及如何对数据进行分组。
图 1.15 使用 Report Designer 布局选项卡来布局您的报告。
任务:测试报告
让我们做一些美化方面的更改,以增强我们的报告。
- 步骤 1 单击“报表设计器预览”选项卡,查看报告的 HTML 表示形式。注意顶部的报告工具栏,它允许您缩放、打印和以不同格式保存报告。Sales 字段需要一些格式化工作。
- 步骤 2 再次单击“布局”选项卡以返回设计模式。
- 步骤 3 右键单击“Sales”文本框,选择“属性”。指定格式设置,如图 1.16 所示。单击“确定”关闭“文本框属性”对话框。
- 步骤 4 增加“Territory”和“Product Category”列的宽度;在报告宽度允许的范围内将它们拉伸。
- 步骤 5 再次右键单击“Territory”文本框,进入字段属性。
- 步骤 6 单击“高级”按钮,然后在“字体”选项卡中,将字体粗细更改为粗体,样式更改为斜体。单击“确定”。
- 步骤 7 回到“文本框属性”对话框,通过选中“隐藏重复项”复选框来隐藏重复的区域名称,如图 1.17 所示。
再次预览报告。现在它应该看起来像图 1.9 中显示的报告。仍然不是非常赏心悦目,但对于几分钟的工作来说,这已经很不错了!
图 1.16 使用“文本框属性”页设置格式。
图 1.17 选中“隐藏重复项”复选框以隐藏区域名称重复项。
报表管理
一旦您对报告满意,您可能需要将其部署,以便所有用户都可以访问。这是一项报告管理任务,您可以通过 Report Manager 来完成。但是,如果您的 Windows 帐户在安装了 Report Server 的计算机上具有本地管理员权限,则可以直接从 Visual Studio .NET 中部署报告。让我们就这样做。
任务:部署报告
- 步骤 1 保存您的更改。
- 步骤 2 在“解决方案资源管理器”中,选择 Sales by Territory.rdl 节点,右键单击,然后选择“查看代码”。Visual Studio .NET 将显示报告的报告定义。请注意,报告 RDL 包含报告查询和布局信息。由于我们选择创建共享数据源,因此数据源信息不包含在报告 RDL 中。
- 步骤 3 在“解决方案资源管理器”中,右键单击 Sales by Territory.rdl,然后选择“部署”。这将编译报告并将报告上传到报告目录。
报告交付
一旦报告被提升为托管报告,它就可以交付给最终用户了。让我们看看用户如何通过使用 Report Manager 这个快速便捷的报告交付工具来按需请求报告。
任务:按需报告交付
- 步骤 1 打开浏览器并导航到 Report Manager URL,默认情况下是 http://
/reports 。注意,在“Report Manager 主页”文件夹下方有一个新文件夹 AWReporter,其名称与您在报告项目设置中指定的 TargetFolder 设置匹配。 - 步骤 2 单击 AWReporter 文件夹链接以查看其内容。您应该会找到 AW2000 Shared DS 数据源和 Sales by Territory 报告链接。
- 步骤 3 单击 Sales by Territory 报告链接以使用 Report Manager 请求报告。
正如您所见,使用 RS 创作、管理和交付报告非常简单。此时,您可能会决定将 RS 与您过去使用过的其他报告工具进行高层次的比较。下一节将讨论 RS 如何与竞争对手抗衡。
1.8 评估 RS
到您阅读本书时,微软和其他来源可能已经提供了比较图表,以显示 RS 与其他流行报告工具的比较。例如,本章结尾的“资源”部分列出了一个关于 RS 和 Crystal Reports 之间详细功能比较文档的链接。
根据我集成应用程序与第三方报告包的经验,我认为 RS 作为一个初版,功能非常丰富。我最喜欢的十大功能,我认为 RS 在这些方面表现出色,如下所示:
- 作为 Web 服务本地公开 — RS 报告可广泛访问,您无需执行任何特殊操作即可将报告发布为 Web 服务,因为它们托管在 Report Server 下,Report Server 提供 Web 服务外观。
- 支持大量导出格式 — 您可能会欣喜地发现,开箱即用地提供了将报告导出为 PDF 和 Excel 的功能。此外,报告还可以以许多其他流行格式交付,包括 Web 格式(HTML)、流行图像格式(如 TIFF 和 JPEG)以及数据格式(Excel、XML、CSV)。
- 按需和订阅报告交付 — 另一个巨大的优点是订阅报告交付选项,它允许开发人员在其应用程序中实现选择加入的报告功能。
- 记录的报告定义格式 — 开发人员可以使用支持 RS XML RDL 的 Microsoft 或第三方设计工具创建要发布到 Report Server 的报告。
- .NET Framework 集成 — 在可扩展性方面,您会欣赏您不会在编程方面受限。如前所述,当内置功能不够时,您可以利用 .NET Framework 的强大功能,将您的报告与 .NET 代码集成。此外,Report Services 编程模型是 100% 基于 .NET 的。
- 可扩展的架构 — RS 架构是完全可扩展的,允许开发人员插入自己的安全、数据、交付和呈现扩展。
- 零部署 — 凭借其面向服务的架构,RS 没有客户端足迹,并为所有应用程序类型提供真正的零部署。
- 可伸缩性 — RS 可以更好地伸缩,因为它从一开始就被设计成在 Web 场环境中进行伸缩。
- Visual Studio .NET 集成 — 报告作者将在设计和测试报告时享受熟悉的 IDE 环境。
- 成本 — 从成本角度来看,很难在 bundled-with-the-SQL-Server RS 定价模型之外找到更好的选择,特别是与第三方报告工具的五位数价格标签相比。
当然,没有什么是完美的,Report Services 也有其自身的缺点,其中一些我想在这里提一下。作为一名 .NET 开发人员,我希望看到 RS 的未来版本能与 Visual Studio .NET 进行更紧密的集成。理想情况下,处理 BI 项目应该与处理 .NET 代码项目(例如 Windows Forms)没有什么不同。将来,我期望 RS 会发展并添加以下功能:
- 允许开发人员在其报告中添加代码隐藏文件。
- 支持所有 .NET 兼容语言来编写表达式和报告特定代码,而不仅仅是 Visual Basic .NET。
- 使用 Visual Studio .NET 代码编辑器而不是类似 Notepad 的自定义代码编辑器。
- 支持事件;目前,开发人员无法编写事件处理程序来响应运行时条件。例如,Microsoft Access 自首次发布以来就一直拥有带有事件的报告对象模型。由于 RS 生成过程不是事件驱动的,因此使用 Report Services 实现运行时代码自定义的唯一选择是使用表达式。
- 包括更灵活的对象模型,例如动态创建报告元素,以及从自定义代码引用和更改报告项。
- 将报告从 Microsoft Access 以外的报告工具进行转换。
我希望上述缺点能在 RS 的未来版本中得到解决,从而使该工具成为企业报告更具吸引力的选择。
1.9 总结
本章带您快速浏览了 RS 平台。我们讨论了它在 Microsoft BI 计划中的作用,以及它的特性和高层架构。您甚至有机会使用 RS 并基于 AdventureWorks2000 示例数据库创建了一个简单的报告。现在您对它的功能有了全面的了解,您可以开始使用 RS 来为您的应用程序添加报告功能。到目前为止,您应该已经理解了 RS 的主要组成部分及其在报告生命周期中的作用。此外,您应该看到了面向服务的、支持 Web 的 RS 架构所提供的优势。
也许最重要的是,您应该熟悉报告生命周期的三个阶段:报告创作、管理和交付。其余章节将按此顺序探讨每个阶段。在下一章中,我们将讨论创建 RS 报告的不同方法。
1.10 资源
- Microsoft RS 网站 — 获取 RS 最新信息的首选。
- Microsoft 商业智能平台网站 — Microsoft BI 门户主页。
- RS 与 Crystal Reports 的功能比较 — Ceria 的商业智能团队开发了一份详细的功能比较文档,概述了 Microsoft RS 如何与 Crystal Enterprise 相媲美。
- 使用 Indigo 开发和运行连接系统的指南 — 在第 1.3 节中,我强调了 RS 面向服务的编程模型的作用。请阅读 Don Box 的文章以获取有关 SOA 的更多信息。
要向本文作者提问并与他的书的读者进行热烈讨论,请访问 Manning.com 上的作者在线论坛。