引言
本文节选了 Brian Larson 所著的 Microsoft SQL Server Reporting Services 一书。学习如何通过参数化 MDX 查询将 Analysis Services 多维数据集用作数据源,以及如何本地化报表中的标签字符串。要查看本文中的所有示例代码,请访问此处。
Galactic Delivery Services
此节选中的示例报表以名为 Galactic Delivery Services (GDS) 公司的业务需求为基础。为加深对这些示例报表的理解,下面提供了一些有关 GDS 的背景资料。
公司背景
GDS 在附近星系区域的若干个行星系之间提供包裹递送服务。该公司专营速递服务,特色服务包括同日达、次日达以及昨日达。后者通过其新 Photon III 飞行器得以实现,该飞行器的飞行速度超过了光速。具备超过光速的能力使得 GDS 能够利用广义相对论的威力,竟然可以在寄送包裹的前一天送达包裹。
尽管 GDS 的递送服务很独特,却有着与任何更传统的包裹递送服务相同的数据处理需求。当包裹从一个行星间中心转移到另一个行星间中心时,GDS 使用 SQL Server 数据库来跟踪包裹。它还使用一个 SQL Server Analysis Services 数据库来承载用于业务智能应用程序的数据集市。此外,还使用 SQL Server Reporting Services 来创建和管理来自两个数据存储的报表。
返回页首
创建递送分析报表
此报表所突显的功能
“递送分析报表”的创建过程中突显了 Microsoft SQL Server Reporting Services 的下列功能:
业务需求
Galactic Delivery Services 的长期规划委员会正从事公司未来成长设备及人员需求的预测工作。他们需要能够显示每季度按客户划分的递送次数和平均递送重量的报表。此外,他们还希望能够选择数据是否包括次日达、同日达、昨日达或这三种服务的某种组合。此报表的数据应来自由 Microsoft SQL Server Analysis Services 承载的 GalacticDeliveriesDataMart 多维数据集。
委员会成员来自许多行星。大多数成员讲英语,但委员会中也的确有讲西班牙语的成员。(我知道这会让遥远星系中的人们感到相当陌生,但由于你们当中的大多数人未在 Windows 中加载 Borlaronese 和 Noxicomian 语言,因此英语和西班牙语使用起来要简便得多。)
任务概述
通过完成下面两项任务来创建“递送分析报表”:
任务1
任务2
递送分析报表,任务1
注意您需要下载 GalacticOLAP 项目并将其部署到 SQL Server Analysis Services 服务器上,然后才能完成此报表。
任务1说明
“MDX 查询设计器”的操作几乎完全通过拖放来进行。从“Metadata Browser”(元数据浏览器)窗格拖动度量值、维度和层次结构,然后将它们放置在“Results”(结果)窗格中以创建查询。还可以定义计算成员并将它们添加到“Results”(结果)窗格中。
正在查询的多维数据集名称位于“Metadata”(元数据)窗格顶部。要选择其他多维数据集,请单击 … 按钮,然后从出现的“Cube Selection”(选择多维数据集)对话框中进行选择。
请注意,在设计器的工具栏中有两个刷新按钮。左侧的刷新按钮用于刷新“Datasets”(数据集)窗口中此数据集的字段。右侧的刷新按钮用于刷新多维数据集中的元数据。带镐的工具栏按钮用于从“MDX 查询设计器”切换到“DMX 查询设计器”。带 x 轴和 y 轴的工具栏按钮用于切换回“MDX 查询设计器”。“MDX 查询设计器”用于在 Analysis Services 数据库中查询多维数据集,而“DMX 查询设计器”用于在 Analysis Services 数据库中查询数据挖掘模型。由于同一 Analysis Services 数据库可能既包含多维数据集又包含数据挖掘模型,仅通过检查数据库“报表设计器”可能无法告知您需要哪个查询设计器。因此,有必要找到在两者之间切换的方法。
“Show Empty Cells”(显示空单元)工具栏按钮用于在“Results”(结果)窗格中于显示和隐藏空单元之间进行切换。空单元格是某些维度和层次结构成员的组合,这些成员每种度量值(计算或其他类型)在“Results”(结果)窗格中的值都为空值。如果空单元在“Results”(结果)窗格中是隐藏的,则它们在最终报表查询中也将是隐藏的。“Design Mode”(设计模式)工具栏按钮让您可以在 MDX 查询的设计视图和查询视图之间切换。如果熟悉 MDX 查询语法,可能希望在查询视图中键入查询,而不是通过设计视图的拖放编程方法来创建它们。“Auto Execute”(自动执行)工具栏按钮用于在查询设计器中切换自动执行模式。启用自动执行模式后,每次在“Results”(结果)窗格中添加项目或从中删除项目,都将重新查询多维数据集并更新“Results”(结果)窗格。
“Filters”(筛选器)窗格让我们可以在设计时硬编码筛选表达式,或让我们可以使用报表参数,以供用户在运行时做出选择。选中“Parameters”(参数)复选框时,将创建参数化筛选器。参数化筛选器添加到查询中后,第一次从“Data”(数据)选项卡转移到“Layout”(布局)选项卡时,会引发若干个事件。发生事件时,“报表设计器”会为参数化筛选器中正在使用的每个项目创建新数据集。此数据集包括该项目的所有有效成员。
除数据集外,还将为每个参数化筛选器创建新报表参数。数据集用于为这些报表参数填充可用的值。报表参数为多值参数。通过使用这种机制,用户可以选择报表执行时将在参数化筛选器中使用的一个或多个有效成员。
递送分析报表,任务2
3.
将文本框的内容设置为下列表达式:
=ReportUtil.Localization.LocalizedString("DeliveryReportTitle",User!Language)
4.
在报表主体中放置一个矩阵。
5.
展开“DeliveryInfo”数据集并将“DeliveryQuarter”拖动到“Columns”(列)单元中。单击工具栏中的“Bold”(加粗)按钮和“Center”(居中)按钮。
6.
将“CustomerName”拖动到“Rows”(行)单元中。单击工具栏中的“Bold”(加粗)按钮。
7.
将“Delivery_Count”拖动到“Data”(数据)单元中。
8.
将“AvgWeight”拖动到放置“Delivery_Count”的同一单元中。将其拖动到单元的右侧。这会在第一个数据列的右侧创建第二个数据列。
9.
在包含“Delivery”(递送)的文本框中输入下列表达式:
=ReportUtil.Localization.LocalizedString("DeliveryCountColHead",User!Language)
10.
在包含“AvgWeight”的文本框中输入下列表达式:
=ReportUtil.Localization.LocalizedString("AvgWeightColHead",User!Language)
11.
打开“Report Parameters”(报表参数)对话框。您会看到“ServiceTypeDescription”报表参数,创建该参数是为了与参数化筛选器配合使用。
12.
输入 Select Service Types 作为“Prompt”(提示)。
13.
单击“OK”(确定)退出“Report Parameters”(报表参数)对话框。
14.
选择“Preview”(预览)选项卡。在“Select Service Types”(选择服务类型)下拉列表中选中“All”(全部),然后单击“View Report”(查看报表)。报表如图 3 所示。
图 3. 递送分析报表
15.
从工具栏中选择“Save All”(全部保存)。
任务2说明
您可能注意到我们未在报表中为报表标题和两个列标题键入文本字符串。而是使用了调用 ReportUtil 程序集中 Localization 类 LocalizedString 方法的表达式。(本地化是指将报表或计算机程序以特定地区语言显示的过程。)此方法需要两个参数:要本地化的字符串的名称和应本地化成的目标语言。字符串名称在每个表达式中采用硬编码形式。语言来自 User!Language 全局变量。该全局变量由请求报表的客户端应用程序的语言进行填充。
ReportUtil 程序集使用多个资源文件来管理本地化。ReportUtil 必须支持的每种语言都对应于一个资源文件。在为此示例提供的演示代码中,ReportUtil 只有两个资源文件:一个用于英语,另一个用于西班牙语。要支持其他语言,只需添加其他资源文件,然后重新生成项目。
我们使用 LocalizedString 方法获得报表标题和两个列标题的本地化版本。报表内容的其余部分不是专有名称,就是数字。这两种内容都不需要进行翻译。如果您目光敏锐,会注意到报表参数提示和报表参数下拉列表中的项目尚未本地化。由于无法为这两种项目使用表达式,因此将不能使用功能强大的 LocalizedString 方法。
由于下拉列表内容是从数据库中选择的,因此数据的部分本地化可作为查询的一部分来完成。报表参数是一个更大的问题。实际上,Reporting Services 的当前版本并没有令人满意的方法可以解决此问题。
返回页首
使用 .NET 程序集上载报表
现在,让我们来看一下将引用 .NET 程序集的报表移动到 Report Server 所需的步骤。
将 .NET 程序集复制到 Report Server
要使报表能够访问 .NET 程序集,它必须位于 Report Server 的应用程序文件夹中。此步骤并不需要执行复杂的部署、上载或安装例程。只需将程序集的 DLL 文件复制到相应的目录。可以使用“递送分析报表”及其 .NET 程序集 ReportUtil.dll 尝试一下。下面是需要遵循的步骤:
代码访问安全性
由于 Reporting Services 是一个 .NET 应用程序,因此它使用代码访问安全性来确定每个程序集拥有的执行权限。代码访问组会将程序集与特定权限相关联。代码访问组中的成员身份标准由安全类决定,而权限由命名权限集决定。
图 4 提供了对代码访问安全性的图解说明。仅当满足安全类指定的条件时,.NET 程序集或 Web 服务方可进入代码访问组。.NET 程序集或 Web 服务被允许进入代码访问组后,即可使用与该代码访问组关联的命名权限集获得权限。这些权限让 .NET 程序集或 Web 服务可以在计算机上执行任务。可将许多不同类型的权限包括在命名权限集中。
图 4:代码访问安全性
代码访问组可相互嵌套。.NET 程序集或 Web 服务可被允许进入父组并获得其权限;它随后便可尝试在子代码访问组获得成员身份以累积更多权限。代码访问组可以是第一个匹配的代码组,在这种情况下 .NET 程序集或 Web 服务只能在一个代码访问组(即与它匹配的第一个代码访问组)中获得成员身份。代码访问组也可以是一个联合代码组,在这种情况下,由于已将每个组的权限联合在一起,因此 .NET 程序集或 Web 服务被允许在多个代码访问组中获得成员身份。
安全类
安全类说明 .NET 程序集或 Web 服务进入代码访问组所需满足的条件。我们为 ReportUtil.dll 程序集使用 StrongNameMembershipCondition 安全类。
UrlMembershipCondition 安全类表示从指定 URL 执行的任何程序集或 Web 服务都将包括在特定代码访问组中。必须匹配的 URL 使用 UrlMembershipCondition 安全类在每个代码访问组中列出。例如,MyServer 代码访问组可能使用 UrlMembershipCondition 并将 http://MyServer/* 指定为必须匹配的 URL。任何在 MyServer 上运行的 Web 服务都将包括在此代码访问组中。
StrongNameMembershipCondition 安全类使用与程序集关联的强名称来标识程序集。强名称是作为程序集唯一标识的十六进制数字长字符串,在程序集创建时分配给程序集。StrongNameMembershipCondition 安全类是一种确保只有预期程序集才被允许进入代码访问组的好方法。
您可在 Report Server 安全性配置中看到几个其他安全类。AllMembershipCondition 安全类可在所有 .NET 程序集和 Web 服务中使用。ZoneMembershipCondition 安全类只能在源于特定区域的 .NET 程序集和 Web 服务中使用。例如,MyComputer、Intranet 和 Internet 这些区域。
命名权限集
命名权限集将由代码访问组分配的权限组合起来。由 Report Server 使用的安全性配置包含以下三个命名权限集:
修改 Report Server 的安全性配置
由于您已对代码访问安全性有了基本的了解,我们可以开始修改 Report Server 的安全性配置,以使 ReportUtil.dll 能够运行。
警告在对服务器安全性进行任何更改之前,请咨询您的网络或服务器管理员。
我们需要对 Report Server 的安全性配置进行一些补充,以为我们的自定义程序集提供执行所需的权限。Report Server 的安全性配置位于 rssrvpolicy.config 文件中。该文件的默认路径为:
C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer。
此文件将代码访问安全性信息包含在 XML 结构中。
警告在对其进行任何修改之前,请创建 rssrvpolicy.config 文件的备份副本。如果意外创建了无效的 XML 结构或因其他原因导致安全性配置出现问题,Report Server 将无法执行任何报表。
rssrvpolicy.config 文件中的 XML 结构可分为以下三部分:安全类、命名权限集和代码组。我们只需修改该文档的“代码组”部分。下面是需要执行的步骤:
部署报表
我们希望报表所需的每个唯一连接都只有一个共享数据源。这一小组共享数据源应置于一个中央位置。上载每个报表后,我们仍需手动执行将每个报表指向中央共享数据源组的任务。
报表项目的“Property Pages”(属性页)对话框中有一个属性,它指定将共享数据源部署到的文件夹路径。让我们尝试在从“报表设计器”部署“递送分析报表”时利用这个属性。尝试执行以下操作:
本地化略述
您可能还记得我们曾使用 ReportUtil.dll 程序集以英语和西班牙语显示报表标签。我们将 User!Language 参数传递给 LocalizedString 方法以使用所需的语言检索报表标签。User!Language 参数包含请求报表的应用程序的语言设置。当我们使用“报表管理器”时,浏览器就是那个应用程序。
让我们尝试更改浏览器的语言设置,看一看本地化是否能够正常进行。(下列说明适用于 Microsoft Internet Explorer。)
ReportUtil.dll 程序集中有英语和西班牙语的资源文件。英语为默认语言。如果传递给 LocalizedString 方法的参数是西班牙语的任何文化变体语言,此方法将使用西班牙语资源文件来查找报表标题或列标题的文本。如果传递给 LocalizedString 方法的是任何其他内容,将使用英语资源文件。
返回页首
相关书籍
Microsoft SQL Server Reporting Services
Delivering Business Intelligence with Microsoft SQL Server (通过 Microsoft SQL Server 实现业务智能)
Microsoft SQL Server 2000 Reporting Services