Power BI 报表生成器分页报表中表达式中的自定义代码

适用于: Power BI Report Builder Power BI Desktop

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

注意

Power BI 上的分页报表不支持自定义程序集。 请考虑将逻辑从自定义程序集转换为嵌入式代码。 有关要考虑的替代项的示例,检查程序集替代项

重要

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

包括对常用函数的引用

使用“表达式”对话框查看内置到报表生成器的常见函数分类列表。 展开“常见函数”并选择一个类别后,“”窗格将显示表达式中包括的函数的列表。 常用函数包括 .NET Framework MathConvert 命名空间中的类,以及 Visual Basic 运行时库函数。 为方便起见,您可以在 “表达式” 对话框中查看最常用的函数,这些函数按以下类别排列:文本、日期和时间、数学函数、检查函数、程序流函数、聚合函数、财务函数、转换函数和杂项函数。 不太常用的函数未显示在列表中,但仍然可以用在表达式中。

若要使用内置函数,请双击“项”窗格中的函数名称。 “说明”窗格中显示该函数的说明,“示例”窗格中显示函数调用的示例。 在“代码”窗格中,在左圆括号 ( 后键入函数名称时,IntelliSense 将帮助显示函数调用的各项有效语法。 例如,若要计算表中一个名为 Quantity 的字段的最大值,首先将简单表达式 =Max( 添加到“代码”窗格,然后使用智能标记查看该函数调用的所有可能的有效语法。 若要完成本示例,请键入 =Max(Fields!Quantity.Value)

有关每个函数的详细信息,请参阅 MathConvert和 MSDN 中的 Visual Basic 运行时库成员

包括对不太常用函数的引用

若要包括一个对不太常用的 CLR 命名空间的引用,必须使用完全限定引用,例如 StringBuilder。 对于这些不太常用的函数, “表达式” 对话框的“代码”窗格不支持 IntelliSense。

有关详细信息,请参阅 Visual Basic Runtime Library Members (Visual Basic 运行时库成员)。

包括嵌入代码

若要将嵌入代码添加到某个报表,请使用 “报表属性” 对话框的“代码”选项卡。 创建的代码块可以包含多个方法。 嵌入代码中的方法必须以 Microsoft Visual Basic 编写,并且必须基于实例。 对于 System.Convert 和 System.Math namespaces 命名空间,报表处理器会自动添加引用。

嵌入代码中的方法可通过全局定义的 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 Framework StringBuilder 类使用完全限定的引用。

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

有关内置对象集合的详细信息,请参阅内置全局和用户引用(Power BI 报表生成器)

包括对代码中参数的引用

可以通过报表定义的“代码”块中的自定义代码引用全局参数集合。 该参数集合是只读的,并且没有公共迭代器。 不能使用 Visual Basic For Each 构造来逐步执行该集合。 您需要首先知道在报表定义中定义的参数名称,然后才能在代码中引用该参数。 但是,可以遍历多值参数的所有值。

下表包含从自定义代码引用该内置集合 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

后续步骤