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

您可以添加对报表中嵌入的自定义代码的引用,或添加对生成并部署到报表客户端和报表服务器的自定义程序集的引用。 对于自定义常量、复杂的函数,或在一个报表中多次使用的函数,可使用嵌入代码。 可以使用自定义代码程序集在一个位置维护代码,并在多个报表间共享该代码。

对于在运行时计算一次以及希望在整个报表处理期间都保留相同值的时效性计算,请考虑使用报表或组变量。 有关详细信息,请参阅在表达式中使用报表变量和组变量集合引用 (Reporting Services)

自定义代码可包含新的自定义常量、变量、函数或子例程。 可以包含对内置集合(例如,Parameters 集合)的只读引用。 但是,无法将报表数据值集传递给自定义函数;特别要指出的是,不支持自定义聚合。

嵌入代码

若要将嵌入代码添加到某个报表,请使用**“报表属性”对话框的“代码”页。 创建的代码块可以包含多个方法。 嵌入代码中的方法必须采用 MicrosoftVisual Basic 编写,并且必须是基于实例的方法。 对于 System.ConvertSystem.Math 命名空间,报表处理器会自动添加引用。 使用“报表属性”对话框的“引用”**页添加其他程序集引用。 有关详细信息,请参阅如何向报表添加代码 (Reporting Services)如何向报表添加程序集引用 (Reporting Services)

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

=Code.ToUSD(Fields!StandardCost.Value)

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

=Report.Parameters!Param1.Value

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

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 FrameworkStringBuilder 类使用完全限定引用。

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")
      Return strBuilder.ToString()
      Else : Return s
   End If
End Function

有关内置对象集合以及初始化的详细信息,请参阅在表达式中使用全局集合初始化自定义程序集对象

从自定义代码中引用参数的示例

可以通过所提供的报表定义代码块中或自定义程序集中的自定义代码来引用全局参数集合。 该参数集合是只读的,并且没有公共迭代器。 不能使用 Visual BasicFor Each 单步构造该集合。 您需要首先知道在报表定义中定义的参数名称,然后才能在代码中引用该参数。 但是,可以遍历多值参数的所有值。 有关详细信息,请参阅在表达式中使用自定义代码引用 (Reporting Services)

下表包含从自定义代码引用该内置集合 Parameters 的示例:

说明

表达式中的引用

自定义代码定义

将整个全局参数集合传递给自定义代码。

该函数会返回特定报表参数 MyParameter 的值。

=Code.DisplayAParameterValue(Parameters)

Public Function DisplayAParameterValue(

ByVal parameters as Parameters) as Object

Return parameters("MyParameter").Value

End Function

将单个参数传递给自定义代码。

该示例将返回传入的参数值。如果该参数是多值参数,则返回字符串将是所有值的串联。

=Code.ShowParametersValues(Parameters!DayOfTheWeek)

Public Function ShowParameterValues(ByVal parameter as Parameter)
 as String
   Dim s as String 
   If parameter.IsMultiValue then
      s = "Multivalue: " 
      For i as integer = 0 to parameter.Count-1
         s = s + CStr(parameter.Value(i)) + " " 
      Next
   Else
      s = "Single value: " + CStr(parameter.Value)
   End If
   Return s
End Function

自定义程序集

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

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

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

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

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

=Code.m_myDollarCoversion.ToEUR(Fields!StandardCost.Value)
注意注意

在报表设计器中,除非您关闭 Visual Studio,否则一旦加载自定义程序集,就不会卸载该程序集。 如果预览报表后对报表所用的自定义程序集进行更改,然后再次预览该报表,则第二次预览结果中不会体现所做的更改。 若要重新加载程序集,请关闭 Visual Studio,再将其重新打开,然后预览报表。

有关访问代码的详细信息,请参阅通过表达式访问自定义程序集