些運算式在報表中很常用。其中包括更改報表中的資料外觀、更改報表專案屬性以及影響資料檢索方式的運算式。本主題介紹了一些可用於報表中常見任務的運算式。有關詳細資料,請參閱在 Reporting Services 中建立運算式。
函數
報表中的許多運算式都包含函數。您可以使用這些函數來設定資料格式、應用邏輯和訪問報表中繼資料。您可以編寫使用 Visual Basic 執行階段程式庫、System.Convert 和 System.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 函數來設定字串中日期和數位格式。下面的運算式以長日期格式顯示 StartDate 和 EndDate 參數的值: 複製代碼
=Format(Parameters!StartDate.Value, "D") & " through " & Format(Parameters!EndDate.Value, "D")
如果文字框僅包含日期或數字,則應使用文字框的 Format 屬性(而不是在文字框中使用 Format 函數)來應用格式設定。
- Right、Len 和 InStr 函數可用於返回子字串,例如,修整 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
函數用於更改現有字串的格式,例如,設定電話號碼格式。下面的運算式使用“替換”函數將欄位中的十位電話號碼格式從 425-555-8080
形式更改為 (425) 555-8080 形式: 複製代碼=System.Text.RegularExpressions.Regex.Replace(Fields!Phone.Value, "(/d{3})[ -.]*(/d{3})[ -.]*(/d{4})", "($1) $2-$3")
轉換函式
您可以使用 Visual Basic 函數在報表中根據需要轉換資料類型。
決策函數
您可以使用 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)
- 以下運算式測試“部門”欄位的值,並返回子報表名稱或 null(在 Visual Basic 中為 Nothing)。此運算式可用於條件性切入子報表。 複製代碼
=Iif(Fields!Department.Value = "Development", "EmployeeReport", Nothing)
- 以下運算式測試欄位值是否為空白。此運算式可用於控製圖像報表專案的 Hidden 屬性。 複製代碼
=Iif(IsNothing(Fields!LargePhoto.Value),True,False)
報表函數
Reporting Services 還提供了可用於處理報表中的資料的其他報表函數。本部分舉例說明了其中兩個函數。有關報表函數和樣本的詳細資料,請參閱在運算式中使用報表函數 (Reporting Services)。
報表資料的外觀
您可以使用運算式來控制資料在報表中的顯示形式。例如,可以在一個文字框中顯示兩個欄位的值,顯示報表的相關資訊,或設定報表中分頁符的插入方式。
報表表頭和表尾
在設計報表時,可能需要在報表表尾中顯示報表名稱和頁碼。為此,可使用以下運算式:
- 下面的運算式提供報表的名稱及其已耗用時間。可以將該運算式置於報表表尾或表體的文字框中。其時間格式為短日期形式的 .NET Framework 格式設定字串:
複製代碼=Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")
- 下面的運算式位於報表表尾的文字框中,提供報表的頁碼和總頁數: 複製代碼
=Globals.PageNumber & " of " & Globals.TotalPages
您也可以在報表表頭或表尾中使用運算式來表示表體中的報表專案。下面的樣本說明如何在表頭中顯示頁面中的第一個值和最後一個值,類似於目錄列表的形式。該樣本假設存在一個包含名為 LastName 的文字框的資料區域。
您可以對錶頭或表尾中的報表專案引用應用彙總函式。(不過,不能對錶體中的報表專案引用應用彙總函式。)下面的樣本說明如何顯示頁總頁數。該樣本假設存在一個包含名為 Cost 的文字框的資料區域。
分頁符
在某些報表中,可能需要在指定行數之後、特定的組或報表專案中插入分頁符。為此,可以在資料區域中建立組(通常是緊挨著詳細資料地區外側的組),在該組中添加分頁符,再添加組運算式以按指定行數分組。
屬性
運算式不僅用於顯示文字框中的資料。還可以用於更改將屬性應用於報表專案的方式。您可以更改報表專案的樣式資訊,或更改其可見度。
格式
您可以使用運算式改變報表中報表專案的外觀。
- 下面的運算式如果用於文字框的 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)
- 下面的運算式(如果在表的“可見度”、“隱藏”屬性中設定)僅顯示至少包含 12 行的表: 複製代碼
=IIF(CountRows()>12,true,false)
報表資料
您可使用運算式來處理報表中所使用的資料。可以引用參數和其他報表資訊。甚至可以更改用於檢索報表資料的查詢。
參數
您可以在參數中使用運算式來更改參數的預設值。例如,可以使用參數,根據用於運行報表的使用者識別碼 篩選特定使用者的資料。
- 下面的運算式如果用作參數的預設值,可以收集運行報表的使用者的 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