Reporting Services 中的表达式示例

有些表达式在报表中很常用。其中包括更改报表中的数据外观、更改报表项属性以及影响数据检索方式的表达式。本主题介绍了一些可用于报表中常见任务的表达式。有关详细信息,请参阅在 Reporting Services 中创建表达式

函数

报表中的许多表达式都包含函数。您可以使用这些函数来设置数据格式、应用逻辑和访问报表元数据。您可以编写使用 Visual Basic 运行时库、System.ConvertSystem.Math 命名空间中的函数的表达式。您可以从其他程序集或自定义代码中向函数添加引用。还可以使用 Microsoft .NET Framework 中的类,包括 System.Text.RegularExpressions。有关表达式中所支持的 Visual Basic 函数的详细信息,请参阅 msdn.microsoft.com 上的“Visual Basic 运行时库”。

Visual Basic 函数

您可以使用 Microsoft Visual Basic 函数来处理文本框中所显示的数据,或者处理参数、属性或报表其他区域中所用的数据。本部分举例说明了其中的一些函数。有关 Visual Basic 函数的详细信息,请参阅 Visual Basic 文档。

日期函数

您可以使用 Visual Basic 函数在报表中提供日期信息。

  • 下面的表达式包含提供当前日期的 Today 函数。此表达式可用在文本框中以在报表上显示日期,或用在参数中以根据当前日期筛选数据。

    =Today()
    
  • 若要基于单个参数提供日期范围,可使用 DateAdd 函数。下面的表达式提供 StartDate 参数中的日期之后六个月的日期。

    =DateAdd(DateInterval.Month, 6, Parameters!StartDate.Value)
    
  • 下面的表达式包含显示特定日期所属年份的 Year 函数。您可以使用此表达式将日期组合在一起,或者将年份显示为一组日期的标签。此表达式可以为一组给定的订单日期提供年份。Month 函数和其他函数也可用于日期操作。有关详细信息,请参阅 Visual Basic .NET 文档。

    =Year(Fields!OrderDate.Value)
    

字符串函数

您可以使用 Visual Basic 函数处理报表中的字符串。

  • 您可以使用串联运算符和 Visual Basic 常量来组合多个字段。以下表达式返回两个字段,它们分别位于同一文本框的不同行中。

    =Fields!FirstName.Value & vbCrLf & Fields!LastName.Value 
    
  • 可以使用 Format 函数来设置字符串中日期和数字的格式。下面的表达式以长日期格式显示 StartDateEndDate 参数的值。

    =Format(Parameters!StartDate.Value, "D") & " through " &  Format(Parameters!EndDate.Value, "D")  
    

    如果文本框仅包含日期或数字,则应使用文本框的 Format 属性来应用格式设置,而不应在文本框中使用 Format 函数。

  • RightLenInStr 函数可用于返回子字符串,例如,修整 DOMAIN\username 以便仅返回用户名。下面的表达式从名为 User 的参数返回反斜杠 (\) 字符右侧的字符串部分:

    =Right(Parameters!User.Value, Len(Parameters!User.Value) - InStr(Parameters!User.Value, "\"))
    

    下面的表达式使用 .NET Framework String 类的成员而不使用 Visual Basic 函数,可以得到与上一个表达式相同的值:

    =Parameters!User.Value.Substring(Parameters!User.Value.IndexOf("\")+1, Parameters!User.Value.Length-Parameters!User.Value.IndexOf("\")-1)
    
  • 可以显示多值参数中选定的值。下面的示例使用 Join 函数将参数 MySelection 的选定值串联到单个字符串中,可以将该字符串设置为报表项中的文本框值的表达式。

    = Join(Parameters!MySelection.Value)
    

    如果文本框仅包含日期或数字,则应使用文本框的 Format 属性(而不是在文本框中使用 Format 函数)来应用格式设置。

  • .NET Framework System.Text.RegularExpressions 中的 Regex 函数用于更改现有字符串的格式,例如,设置电话号码格式。下面的表达式使用 Replace 函数将字段中的十位电话号码格式从 nnn-nnn-nnnn 形式更改为 (nnn) nnn-nnnn 形式:

    =System.Text.RegularExpressions.Regex.Replace(Fields!Phone.Value, "(\d{3})[ -.]*(\d{3})[ -.]*(\d{4})", "($1) $2-$3")
    

转换函数

您可以使用 Visual Basic 函数在报表中根据需要转换数据类型。

  • 您可以使用 Visual Basic 函数根据需要转换数据类型。转换函数常用于消除报表中的 #Error 消息或设置这类消息的格式。下面的表达式显示为多值参数 MySelection 选择的值数目。

    =CStr(Parameters!MySelection.Count)
    

决策函数

您可以使用 Visual Basic 函数来计算输入值并根据结果返回另一个值。

  • Iif 函数可根据表达式的计算结果是否为 True 返回两个值中的一个。下面的表达式使用 Iif 函数,在 LineTotal 的值超过 100 时返回布尔值 True,否则返回 False:

    =Iif(Fields!LineTotal.Value > 100, True, False)
    

    下面的表达式使用多个 Iif 函数(也称为“嵌套 Iif 函数”),根据 PctComplete 的值返回三个值中的一个。

    =Iif(Fields!PctComplete.Value >= .8, "Green", Iif(Fields!PctComplete.Value >= .5, "Amber", "Red"))
    
  • 下面的表达式也是根据 PctComplete 的值返回三个值中的一个,不过使用的是 Switch 函数,该函数返回的是与一系列计算结果为 True 的表达式中第一个表达式相关联的值:

    =Switch(Fields!PctComplete.Value >= .8, "Green", Fields!PctComplete.Value >= .5, "Amber", Fields!PctComplete.Value < .5, "Red")
    
  • 下面的表达式测试 ImportantDate 字段的值,如果该值大于一周,则返回“Red”,否则返回“Blue”。此表达式可用于控制报表项中的文本框的 Color 属性。

    =IIF(DateDiff("d",Fields!ImportantDate.Value, Now())>7,"Red","Blue")
    
  • 下面的表达式测试字段 PhoneNumber 的值,以了解该值是否为 null(在 Visual Basic 中为 Nothing),并返回“无值”,而不是空值。此表达式可用于控制报表项中的文本框的值。

    =IIF(Fields!PhoneNumber.Value Is Nothing,"No Value",Fields!PhoneNumber.Value)
    
  • 以下表达式测试 Department 字段的值,并返回子报表名称或 null(在 Visual Basic 中为 Nothing)。此表达式可用于条件性钻取子报表。

    =Iif(Fields!Department.Value = "Development", "EmployeeReport", Nothing)
    
  • 以下表达式测试字段值是否为 null。此表达式可用于控制图像报表项的 Hidden 属性。

    =Iif(IsNothing(Fields!LargePhoto.Value),True,False)
    

报表函数

Reporting Services 还提供了可用于处理报表中的数据的其他报表函数。本部分举例说明了其中两个函数。有关报表函数和示例的详细信息,请参阅在表达式中使用报表函数 (Reporting Services)

  • Sum 函数可以计算某一分组或数据区域中多个值的总计值。此函数可用于表组的组头或组尾中。下面的表达式显示 Order 分组或数据区域中数据的和:

    =Sum(Fields!LineTotal.Value, "Order")
    
  • 在数据区域内的文本框中使用包含 RowNumber 函数的表达式,可以显示该表达式所在的每个文本框实例的行号。此函数可用于为表中的各行编号。还可以用于更复杂的情况,如根据行数插入分页符。有关详细信息,请参阅本主题稍后部分中的“分页符”。
    下面的表达式显示最外面数据区域中从第一行到最后一行的行号。Nothing 关键字表示该函数将从最外面的数据区域中的第一行开始计数。若要从子数据区域开始计数,可使用数据区域的名称。

    =RowNumber(Nothing)
    

报表数据的外观

您可以使用表达式来控制数据在报表中的显示形式。例如,可以在一个文本框中显示两个字段的值,显示报表的相关信息,或设置报表中分页符的插入方式。

报表表头和表尾

在设计报表时,可能需要在报表表尾中显示报表名称和页码。为此,可使用以下表达式:

  • 下面的表达式提供报表的名称及其运行时间。可以将该表达式放置在报表表尾或表体的文本框中。其时间格式为短日期形式的 .NET Framework 格式设置字符串:

    =Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")
    
  • 下面的表达式放置在报表表尾的文本框中,提供报表的页码和总页数:

    =Globals.PageNumber & " of " & Globals.TotalPages
    

您也可以在报表表头或表尾中使用表达式来表示表体中的报表项。下面的示例说明如何在表头中显示页面中的第一个值和最后一个值,类似于目录列表的形式。该示例假定存在一个包含名为 LastName 的文本框的数据区域。

  • 下面的表达式放置在表头左侧的文本框中,提供页面中 LastName 文本框的第一个值:

    =First(ReportItems("LastName").Value)
    
  • 下面的表达式放置在表头右侧的文本框中,提供页面中的 LastName 文本框的最后一个值:

    =Last(ReportItems("LastName").Value)
    

您可以对表头或表尾中的报表项引用应用聚合函数。(不过,不能对表体中的报表项引用应用聚合函数。)下面的示例说明如何显示页总页数。该示例假设存在一个包含名为 Cost 的文本框的数据区域。

  • 下面的表达式放置在表头或表尾中,提供页面上 Cost 文本框中的值的总和:

    =Sum(ReportItems("Cost").Value)
    
    ms157328.note(zh-cn,SQL.90).gif注意:
    对于表头或表尾中的每个表达式,只能引用一个报表项。

分页符

在某些报表中,可能需要在指定行数之后、特定的组或报表项中插入分页符。为此,可以在数据区域中创建组(通常是紧挨着详细信息区域外侧的组),在该组中添加分页符,再添加组表达式以按指定行数分组。

  • 下面的表达式放置在组表达式中,为每 25 行指定一个编号。如果为组定义了分页符,则此表达式会每隔 25 行插入一个分页符。

    =Int((RowNumber(Nothing)-1)/25)
    

属性

表达式不仅用于显示文本框中的数据。还可以用于更改将属性应用于报表项的方式。您可以更改报表项的样式信息,或更改其可见性。

设置格式

您可以使用表达式改变报表中报表项的外观。

  • 如果下面的表达式用于文本框的 Color 属性中,则可以根据 Profit 字段的值更改文本的颜色:

    =Iif(Fields!Profit.Value < 0, "Red", "Black")
    
  • 如果下面的表达式用于数据区域中的报表项的 BackgroundColor 属性中,则可以将每一行的背景色在淡绿色与白色之间变换:

    =Iif(RowNumber(Nothing) Mod 2, "PaleGreen", "White")
    

    如果将表达式用于指定的作用域,则可能必须指明聚合函数的数据集:

    =Iif(RowNumber("Employees") Mod 2, "PaleGreen", "White")
    

可见性

您可以使用报表项的可见性属性来显示和隐藏报表中的项。在诸如表的数据区域中,可以根据表达式中的值在一开始隐藏详细信息行。

  • 如果下面的表达式用于组中详细信息行的初始可见性,则可以在 PctQuota 字段中显示超过 90% 的所有销售的详细信息行:

    =Iif(Fields!PctQuota.Value>.9, False, True)
    
  • 下面的表达式(如果在表的 VisibilityHidden 属性中设置)仅显示至少包含 12 行的表:

    =IIF(CountRows()>12,true,false)
    

报表数据

您可使用表达式来处理报表中所使用的数据。可以引用参数和其他报表信息。甚至可以更改用于检索报表数据的查询。

参数

您可以在参数中使用表达式来更改参数的默认值。例如,可以根据用于运行报表的用户 ID,使用参数筛选特定用户的数据。

  • 下面的表达式如果用作参数的默认值,可以收集运行报表的用户的 ID:

    =User!UserID
    
  • 您可以使用下面的表达式来引用查询参数、筛选器表达式、文本框或其他报表区域中的参数。此示例假定参数的名称为 User

    =Parameters!User.Value
    

自定义代码

您可以在报表中使用自定义代码。自定义代码嵌入在报表中,或存储在报表使用的自定义程序集中。有关自定义代码的详细信息,请参阅在表达式中使用自定义代码引用 (Reporting Services)

  • 下面的示例调用 ToUSD 嵌入代码方法,该方法将 StandardCost 字段值转换为美元值:

    =Code.ToUSD(Fields!StandardCost.Value)
    
  • 下面的示例显示如何定义某些自定义常量和变量。
    [Visual Basic]

    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
    

    尽管自定义常量和变量不会出现在“表达式编辑器常量”视图(仅显示内置常量)中,但是可以从任何表达式向其中添加引用,如下面的示例所示。这些引用被作为变量进行处理。
    [Visual Basic]

    =Code.MyNote
    =Code.NCopies 
    =Code.MyVersion
    =Code.MyDoubleVersion
    
  • 下面的示例调用嵌入代码方法 FixSpelling,该方法将使用 Bicycle 替换 SubCategory.Value 中出现的所有 Bike 文本。

    =Code.FixSpelling(Fields!SubCategory.Value)
    

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

    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
    

请参阅

概念

在表达式中使用报表函数 (Reporting Services)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2006 年 4 月 14 日

更改的内容:
  • 添加了示例:电话号码的正则表达式、自定义常量和变量、文本框颜色、多参数选择和选择计数。
  • 测试 null。

2005 年 12 月 5 日

更改的内容:
  • 添加了自定义代码示例。