在表达式中使用自定义代码引用 (Reporting Services)

更新日期: 2006 年 4 月 14 日

您可以向报表添加自定义函数,或添加对外部程序集中存在的函数的引用。对于 Microsoft.VisualBasicSystem.ConvertSystem.Math 程序集,报表服务器会自动添加引用。对于其他程序集,可以使用**“报表属性”**对话框或在报表定义中使用 CodeModules 元素进行引用。

**“报表属性”**对话框也可以用于定义新的自定义函数。若要在报表定义中定义自定义函数,请使用 Code 元素。但是,无法向函数传递数据值集;特别要指出的是,不支持自定义聚合。

您可以编写自定义代码,在整个报表内的表达式中使用。可以采用以下两种方法执行此操作:在报表中嵌入代码或引用自定义程序集中的方法。对于复杂的函数,或在一个报表中多次使用的函数,可使用嵌入代码。若要在一个位置维护代码,或在多个报表间共享代码,则可以使用代码程序集。

嵌入代码

若要在报表中使用代码,可向报表中添加代码块。代码块可以包含多个方法。嵌入代码中的方法必须采用 Microsoft Visual Basic 编写,并且必须是基于实例的方法。

有关如何在报表中添加代码的详细信息,请参阅如何向报表添加代码(报表设计器)

嵌入代码中的方法可通过全局定义的 Code 成员使用。您可以通过引用 Code 成员和方法名称来访问这些方法。下面的示例调用 ToUSD 方法,该方法将 StandardCost 字段中的值转换为美元值:

=Code.ToUSD(Fields!StandardCost.Value)

若要引用自定义代码中的全局集合,请包含对内置 Report 对象的引用:

=Report.Parameters!Param1

下面的示例显示如何定义某些自定义常量和变量。

Public Const MyNote = "Authored by Bob"
Public Const NCopies As Int32 = 2
Public Dim  MyVersion As String = "123.456"
Public Dim MyDoubleVersion As Double = 123.456

尽管自定义常量不会出现在“表达式编辑器常量”视图(仅显示内置常量)中,但是可以从任何表达式向其中添加引用,如下面的示例所示。在表达式中,自定义常量被视为 Variant

=Code.MyNote
=Code.NCopies
=Code.MyVersion
=Code.MyDoubleVersion

下面的示例包括函数 FixSpelling 的代码引用和代码实现,该函数用 Bicycle 替换 SubCategory 字段值中出现的所有 Bike 文本。

=Code.FixSpelling(Fields!SubCategory.Value)

嵌入报表定义之后,以下代码显示 FixSpelling 方法的实现。此自定义代码首次运行时,消息框将显示已替换的文本。此示例显示了如何引用 Microsoft .NET Framework StringBuilder 类和 System.Windows.Forms.MessageBox 类。您需要为 System.Windows.Forms 向报表属性添加引用。有关详细信息,请参阅如何向报表添加代码(报表设计器)如何向报表添加程序集引用(报表设计器)

Dim firstTime As Boolean = True 
Public Function FixSpelling(ByVal s As String) As String
   Dim strBuilder As New System.Text.StringBuilder(s)
   If s.Contains("Bike") Then
      strBuilder.Replace("Bike", "Bicycle")
      If firstTime Then
        System.Windows.Forms.MessageBox.Show(strBuilder.ToString())
'       or MsgBox(strBuilder.ToString())
        firstTime = False
      End If
      Return strBuilder.ToString()
      Else : Return s
   End If
End Function

有关全局对象集合以及初始化的详细信息,请参阅在表达式中使用全局集合Initializing Custom Assembly Objects

自定义程序集

若要在报表中使用自定义程序集,您必须先创建程序集,使其可供报表设计器使用,然后在报表中添加对该程序集的引用,最后在报表中使用表达式来引用该程序集中包含的方法。如果报表部署到报表服务器,您还必须向报表服务器部署该自定义程序集。

有关创建自定义程序集并使其可供 Reporting Services 使用的信息,请参阅 Using Custom Assemblies with Reports。有关如何在报表中添加引用的说明,请参阅如何向报表添加程序集引用(报表设计器)

若要在表达式中引用自定义代码,您必须调用自定义程序集中某个类的成员。调用方式取决于该方法是静态方法还是基于实例的方法。自定义程序集中的静态方法可在报表内全局使用。您可以在表达式中通过指定命名空间、类和方法名称来访问静态方法。下面的示例调用 ToGBP 方法,该方法将 StandardCost 的值从美元转换为英镑:

=CurrencyConversion.DollarCurrencyConversion.ToGBP(Fields!StandardCost.Value)

基于实例的方法可通过全局定义的 Code 成员使用。您可以通过先引用 Code 成员,再引用实例和方法名称,来访问这些方法。下面的示例调用实例方法 ToEUR,该方法将 StandardCost 的值从美元转换为欧元:

=Code.m_myDollarCoversion.ToEUR(Fields!StandardCost.Value)
ms155798.note(zh-cn,SQL.90).gif注意:
在报表设计器中,除非您关闭 Visual Studio,否则一旦加载自定义程序集,就不会卸载该程序集。如果预览报表后对报表所用的自定义程序集进行更改,然后再次预览该报表,则第二次预览结果中不会体现所做的更改。若要重新加载程序集,请关闭 Visual Studio,再将其重新打开,然后预览报表。

请参阅

其他资源

在 Reporting Services 中使用表达式

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2006 年 4 月 14 日

新增内容:
  • 添加了示例。

2005 年 12 月 5 日

新增内容:
  • 添加了对全局集合的报表对象的引用。