在一個報表中顯示服務器名稱或IP地址
當報表數據是運行在幾個報表服務器上時,用戶經常會搞錯。你可能有一個測試和開發環境,但是你不知道你的報表數據是來自于哪個服務器。
很明顯,解決這個問題的一個方法是在報表中顯示報表服務器名稱或它的IP地址。不幸的是,沒有直接的函數或方法來獲取服務器名稱。但是有這個工作環境。
在報表服務中,有一個全局參數叫做ReportServerUrl,它可以顯示報表URL。這個值的開始部分是來自于C:Program FilesMicrosoft SQL ServerMSSQL.#Reporting ServicesReportServer 文件夾下的RSReportServer.config 文件。在這個文件里,有叫做URLRoot 的結點。它是http://{IPAddress}/reportserver或http://{Server Name}/reportserver。你需要找到方法來提取這個IP地址或服務器名稱,你可以使用下面的表達式:
| Mid(Globals!ReportServerUrl,8,InStr(9,Globals!ReportServerUrl,"/") - 8) |
這個表達式所做的,是提取從//位置后的字母到/位置后的字母間的名稱,這是服務器的服務器名稱或IP地址。
將數字類型轉化為文本
這是在SSRS論壇上經常看到的問題,因為許多用戶需要將數字類型的數據顯示為文本。盡管在水晶報表中有一個函數,但是在SSRS中沒有函數。不過,你可以在SSRS中自己寫個函數。
讓我們用下面的查詢來舉個例子:
| SELECT Sales.SalesPerson.SalesPersonID AS SalesPerson, SUM(Sales.SalesOrderDetail.OrderQty * Sales.SalesOrderDetail.UnitPrice) AS Amount FROM Sales.SalesOrderDetail INNER JOIN Sales.SalesOrderHeader ON Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID INNER JOIN Sales.SalesPerson ON Sales.SalesOrderHeader.SalesPersonID = Sales.SalesPerson.SalesPersonID GROUP BY Sales.SalesPerson.SalesPersonID |
為了使用這個例子,讓我們假設我們需要顯示銷售人員的id和數量,數量要以文本形式顯示。
按照下面的步驟來創建一個報表。
1. 創建一個SSRS項目。
2. 添加新報表到這個項目中。
3. 添加一個數據源,它的數據庫指向adventureworks。
4. 用上面的查詢創建一個數據集。
5. 從工具箱拖拉一個表來進行顯示,并拖拉字段到這個表上。
下一步是創建一個函數來轉換數字類型為文本。
到報表菜單選項中選擇報表屬性。選擇對話框中的代碼標簽頁并復制和黏貼下面的代碼:
|
' Source SHARED units AS String() = _ SHARED tens AS String() = _ SHARED digits AS String() = _ SHARED expr AS NEW _ PUBLIC Function ExpandPrice(Price AS Double, _ Dim temp AS New System.Text.StringBuilder() If CDbl(cents) > 1 Then Function ExpandIntegerNumber(pNumberStr AS String) AS String Function GetNumberUnder1000Str(pNumber AS String) AS String Function GetNumberUnder100Str(pNumber AS String) AS String |
上面的代碼是從網站上代碼片段那里得到的。
接下來,你需要在你的表中調用這個函數。你需要在你需要轉換你的數字為文本的字段輸入下面的函數調用。
| =Code.ExpandPrice(Fields!Amount.Value,".") |
最后,你將看到下面的屏幕。
以選擇的顏色顯示網格#p#副標題#e#
在SSRS中,沒有直接以選擇的顏色來顯示網格的方法(以可選擇的顏色顯示網格會提高報表的可讀性。在Excel 2007中你可以很容易地做到,但是在SSRS中卻不行)。
通過將背景顏色中的一個表達式和RowNumber函數結合起來,你可以添加選擇顏色到你的報表中。RowNumber(無)返回當前記錄的記錄編號。對于每個文本框的背景屬性,你需要給出下面的表達式。
| =iif(RowNumber(Nothing) Mod 2, "LightBlue", "SkyBlue") |
由上面的函數,偶數編號的記錄會顯示為淡藍色,而奇數編號的記錄會顯示為天藍色,如下所示:
每頁顯示給定數目的記錄
如果你想只在每頁顯示一組記錄,那么這不是簡單的工作,因為記錄數目將依賴于字體大小和其它的打印機默認設置。除了這個問題,還有如果一行的記錄長度太長,那么它會移到另一行,而這會擾亂你報表中記錄的數目。所以有必要添加一些代碼來添加這個功能到你的報表中。假設你想每頁顯示20行,那么添加一個組到你的報表中,它具有以下表達式:
| =int((RowNumber(Nothing)-1)/20) |
然后為這個組選擇page break at the end選項。
阻止向下鉆取矩陣中總列數
當你在報表中有個矩陣時,你可以像下面這樣顯示總行數和列數:

如果你想在你點擊任何詳細單元時導航到另一個報表,那么你可以配置導航標簽。但是,這個配置的問題是這個配置使得用戶可以點擊總列數并鉆取到導航報表。你不能通過使用表達式來阻止,因為總列數可以看作是一個其它字段。
下面是我們將用于上面這個例子的查詢:
| SELECT YEAR(Sales.SalesOrderHeader.OrderDate) AS Year, Production.Product.Name AS Name, SUM(Sales.SalesOrderDetail.LineTotal) AS Amt FROM Sales.SalesOrderDetail INNER JOIN Sales.SalesOrderHeader ON Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID INNER JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID WHERE ( Production.Product.Name LIKE 'HL R%' ) AND ( YEAR(Sales.SalesOrderHeader.OrderDate) IN ( 2001, 2002 ) ) GROUP BY Production.Product.Name, YEAR(Sales.SalesOrderHeader.OrderDate) ORDER BY YEAR, Name |
注意,我包含了where以便可以很容易地看到總列數。
為了解決上面的問題,我們要做的是在查詢里包含總的值而不是從報表服務中獲取這個值。
| SELECT ISNULL(YEAR(Sales.SalesOrderHeader.OrderDate), '9999') AS YEAR, ISNULL(Production.Product.Name, 'Total') AS Name, SUM(Sales.SalesOrderDetail.LineTotal) AS Amt FROM Sales.SalesOrderDetail INNER JOIN Sales.SalesOrderHeader ON Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID INNER JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID WHERE ( Production.Product.Name LIKE 'HL R%' ) AND ( YEAR(Sales.SalesOrderHeader.OrderDate) IN ( 2001, 2002 ) ) GROUP BY Production.Product.Name, YEAR(Sales.SalesOrderHeader.OrderDate) WITH CUBE ORDER BY YEAR, Name |
CUBE操作器將為你提供一年的總值和產品名稱。這個查詢的問題是我們不能有一個“總”標簽用于年和總值,因為年是整數。因此,在上面的查詢中包括了一個隨意的9999。
對于總值,你可能需要寫一個簡單的表達式,例如IIF(Fields!Year.Value="9999","Total",Fields!Year.Value)。
這時你將獲得的與上面相同的輸出。

接下來是編寫一個表達式用于導航。
| =SWITCH(Fields!Year.Value <>9999 AND Fields!Name.Value<>"Total","SubReport") |
在上面的表達式中,檢查了年和名稱總值,以便它不會導航到子報表。





