Reporting Services 中的運算式範例
某些運算式會經常用於報表中,這些包括變更報表中的資料外觀、變更報表項目的屬性以及影響如何擷取資料的運算式。本主題將描述可用於報表中一般工作的某些運算式。如需詳細資訊,請參閱<在 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 函數對於變更現有字串的格式 (例如,格式化電話號碼) 很有用處。下列運算式使用 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 函數轉換資料類型,轉換函數通常是用來刪除或格式化報表中的「#錯誤」訊息。下列運算式會顯示針對多重數值參數 MySelection 所選的值數目。
=CStr(Parameters!MySelection.Count)
決策函數
您可以使用 Visual Basic 函數來評估輸入值,並根據結果傳回另一個值。
Iif 函數會根據運算式是否評估為 True,傳回兩個值之中的一個。如果 LineTotal 的值超過 100,則下列運算式會使用 Iif 函數來傳回 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";這個運算式可用來控制報表項目中文字方塊的色彩屬性。
=IIF(DateDiff("d",Fields!ImportantDate.Value, Now())>7,"Red","Blue")
下列運算式會測試 PhoneNumber 欄位的值,看看它是否為 null (Visual Basic 中則為 Nothing),並傳回 "No Value",而不是 Null 值;這個運算式可用來控制報表項目中文字方塊的值。
=IIF(Fields!PhoneNumber.Value Is Nothing,"No Value",Fields!PhoneNumber.Value)
下列運算式會測試 Department 欄位的值,然後傳回子報表名稱或 null (Visual Basic 中的 Nothing)。此運算式可用於條件式鑽研子報表。
=Iif(Fields!Department.Value = "Development", "EmployeeReport", Nothing)
下列運算式會測試欄位值是否為 Null。此運算式可用來控制影像報表項目的 [隱藏] 屬性。
=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)
附註: 在頁首或頁尾中,每個運算式只能參考一個報表項目。
分頁符號
在某些報表中,除了在群組或報表項目上放置分頁符號以外,您也可能會需要在指定資料列數目的結尾處放置分頁符號。若要這樣做,請在資料區域中建立一個群組 (通常是在詳細資料外面立即建立一個群組),將分頁符號加入群組中,然後依指定的資料列數目將群組運算式加入群組中。
下列運算式放在群組運算式中,每 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)
下列運算式設定在資料表的 [可見性]、[隱藏] 屬性中時,只有當此資料表有 12 個以上的資料列時,才會顯示:
=IIF(CountRows()>12,true,false)
報表資料
您可以使用運算式來操作用於報表中的資料。您可以參考參數和其他的報表資訊。您甚至可以變更用來擷取報表資料的查詢。
參數
您可以在參數中使用運算式,以更改參數的預設值。例如,您可以使用參數,根據用來執行報表的使用者識別碼來篩選特定使用者的資料。
使用下列運算式做為參數的預設值時,收集執行報表之人員的使用者識別碼:
=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
雖然自訂常數和變數不會出現在運算式編輯器的 [常數] 檢視中 (這個檢視只會顯示內建常數),但是您可以從任何運算式加入參考,如下列範例所示,這些常數和變數會視為 Variant。
[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)
說明及資訊
變更歷程記錄
版本 | 歷程記錄 |
---|---|
2006 年 4 月 14 日 |
|
2005 年 12 月 5 日 |
|