您的位置:首页 > 编程语言

MicrosoftReportingServicesinAction:用自定义代码扩展Microsoft2000ReportingServic…

2008-04-28 12:51 369 查看

自定义代码扩展MicrosoftSQLServer2000ReportingServices

Microsoft在2004年初发布了MicrosoftSQLServer2000ReportingServices(ReportingServices),以便为开发人员提供一个完整的报表平台,无论目标平台或开发语言是什么,它都可以轻松地与所有类型的应用程序集成。ReportingServices最显著的功能之一是它的可扩展特性,这是包括我在内的许多开发人员所欣赏的。您可以扩展或替换ReportingServices的几乎任何方面,包括数据、传递、性以及报表呈现功能。例如,扩展您的报表功能的一个方法是将它们与您或其他人编写的自定义代码集成在一起。
在本文中,我将为您展示如何利用ReportingServices独特的可扩展体系结构来增强您的报表功能。首先,我将说明嵌入式和自定义代码选项是如何工作的。其次,我将为您展示您可以如何利用自定义代码来编写带有销售预测功能的高级报表。
我将假定您已经具有关于ReportingServices的基础知识,并且知道如何用表达式编写报表。如果您还不熟悉ReportingServices,请访问其官方站点。本文中讨论的代码示例和示例报表均包含在文章源代码中。示例报表将AdventureWorks2000用作其数据源,该数据库可以从ReportingServices安装程序中安装。


返回页首

编写嵌入式代码

顾名思义,嵌入式代码保存在报表定义(RDL)文件中;它的作用范围在报表层。您只能在Microsoft.NET中编写嵌入式代码。一旦代码准备好,您就可以使用全局定义的Code成员在报表表达式中调用它。例如,如果您编写了一个名为GetValue的嵌入式代码函数,就可以使用下列语法从您的表达式中调用它:
=Code.GetValue()
除了共享方法外,您的嵌入式代码可以包含任何与VisualBasic.NET兼容的代码。实际上,如果您将嵌入式代码视为项目中的私有类,就差不多了。您可以声明类级别的成员和常数、私有或公共方法等。
您可以编写嵌入式代码来创建可重用的实用函数,它们可以从报表的几个表达式中调用。例如,请考虑图1中所示的TerritorySalesCrosstab报表。

[b]图1.您可以使用嵌入式代码来实现作用范围在报表层的有用实用函数。[/b] 当数据缺失时(给定的行列组合中没有报表数据),该报表会使用一个名为GetValue的嵌入式函数来显示“N/A”。此外,GetValue还将缺失数据与NULL值区分开来。当基础值为NULL时,嵌入式代码会将其转换为零。
使用代码编辑器
要编写自定义嵌入式代码,您可以使用报表器代码编辑器—您可以在ReportProperties对话框的Code选项卡上找到它,如图2所示。

[b]图2.使用用于编写嵌入式代码的代码编辑器。编辑器中所示的GetValue函数可确定某个值是缺失还是NULL。[/b] 诚然,上述函数可以很容易地由一个基于Iif的表达式替换。但是,将逻辑封装在嵌入式函数中有两点优势。首先,它将表达式的逻辑集中在一个地方,而不是在报表中的每个字段都使用Iif函数。其次,它使报表具有更好的可维护性,这是因为如果您决定对函数进行逻辑更改,将不必跟踪并更改报表中的每个Iif函数。
报表设计器将嵌入式代码保存在报表定义文件的<Code>元素下。执行此操作时,报表设计器将对文本进行URL编码。如果您出于某些原因决定直接更改Code元素,就需要注意这一点。
处理缺失值
一旦GetValue函数可以区分报表中的NULL和缺失数据,我们就能以下列表达式作为交叉表报表的txtSalestxtNoOrders数据字段的基础:分别为
=Iif(CountRows()=0,"N/A",Code.GetValue(Sum(Fields!Sales.Value)))

=Iif(CountRows()=0,"N/A",Code.GetValue(Sum(Fields!NoOrders.Value)))

CountRows函数是ReportingServices所提供的几个原生函数之一,它可以返回指定范围内的行数。如果没有指定范围,它将默认为最里面的范围,这在我们的示例中解析为在数据单元格中定义值的静态组。两个表达式都会先使用1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: