国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

SQL Server報表服務中的一些常見小問題
2008-08-14   IT專家網

SQL Server報表服務(SSRS)對于開發人員和用戶來說是一個非常有用的設計和瀏覽報表的工具。但是,有些特性是在SSRS中沒有提供為直接可以使用的。 這些特性是開發人員和用戶經常需要的。

  在一個報表中顯示服務器名稱或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
' http://cc.msnscache.com/cache.aspx?q=72465960679242&mkt=en-US&lang=en-US&w=577f5001&FORM=CVRE8
SHARED suffixes AS String() = _
{"Thousand ", "Million ", "Billion ", "Trillion ", _
"Quadrillion ", "Quintillion ", "Sextillion "}

SHARED units AS String() = _
{"","One ", "Two ", "Three ", "Four ", "Five ", _
"Six ", "Seven ", "Eight ", "Nine "}

SHARED tens AS String() = _
{"Twenty ", "Thirty ", "Forty ", "Fifty ", "Sixty ", _
"Seventy ", "Eighty ", "Ninety "}

SHARED digits AS String() = _
{"Ten ","Eleven ", "Twelve ", "Thirteen ", "Fourteen ", _
"Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen"}

SHARED expr AS NEW _
System.Text.RegularExpressions.Regex("^-?d+(.d{2})?$", _
System.Text.RegularExpressions.RegexOptions.None)

PUBLIC Function ExpandPrice(Price AS Double, _
Optional pSeparator AS String = ".") _
AS String
Dim pPrice As String
pPrice = FORMAT(Price,"##############.00")

Dim temp AS New System.Text.StringBuilder()
If Not expr.IsMatch(pPrice) Then
' temp.Append(pPrice) or whatever you want to do here
Else
Dim parts AS String() = pPrice.Split(pSeparator)
Dim dollars AS String = parts(0)
Dim cents AS String = parts(1)
If CDbl(dollars) > 1 Then
temp.Append(ExpandIntegerNumber(dollars) & "Dollars ")
If CInt(cents) > 0 Then
temp.Append("And ")
End If
ElseIf CDbl(dollars) = 0 Then
temp.Append(ExpandIntegerNumber(dollars) & "Zero Dollars ")
If CInt(cents) >= 0 Then
temp.Append("And ")
End If
ElseIf CDbl(dollars) = 1 Then
temp.Append(ExpandIntegerNumber(dollars) & "Dollar " )
End If

If CDbl(cents) > 1 Then
temp.Append(ExpandIntegerNumber(cents) & "Cents")
ElseIf CDbl(cents) = 0 Then
temp.Append(ExpandIntegerNumber(cents) & "Zero Cents ")
ElseIf CDbl(cents) = 1 Then
temp.Append(ExpandIntegerNumber(cents) & "Cent " )
End If
End If
RETURN temp.ToString()
End Function

Function ExpandIntegerNumber(pNumberStr AS String) AS String
Dim temp2 AS New System.Text.StringBuilder()
Dim number AS String = _
StrDup(3 - Len(pNumberStr) Mod 3, "0") & pNumberStr
Dim i AS Integer, j AS Integer = -1
Dim numPart AS String
For i = Len(number) - 2 To 1 Step -3
numPart = Mid(number, i, 3)
If Clng(numPart > 0) Then
If j > -1 Then
temp2.Insert(0,suffixes(j),1)
End If
End If
temp2.Insert(0,GetNumberUnder1000Str(numPart),1)
j += 1
Next
RETURN temp2.ToString()
End Function

Function GetNumberUnder1000Str(pNumber AS String) AS String
Dim temp1 AS New System.Text.StringBuilder()
If Len(pNumber) = 3 Then
If CLng(Left(pNumber, 1)) > 0 Then
temp1.Append(GetNumberUnder100Str(Left(pNumber, 1)) & "Hundred ")
End If
End If
temp1.Append(GetNumberUnder100Str(Right("0" & pNumber, 2)))
RETURN temp1.ToString()
End Function

Function GetNumberUnder100Str(pNumber AS String) AS String
If pNumber > 19 Then
RETURN tens(Left(pNumber, 1) - 2) & units(Right(pNumber, 1))
ElseIF pNumber >= 10 and pNumber <= 19 Then
RETURN digits(Right(pNumber, 1))
Else
RETURN units(Right(pNumber, 1))
End If
End Function

  上面的代碼是從網站上代碼片段那里得到的。

  接下來,你需要在你的表中調用這個函數。你需要在你需要轉換你的數字為文本的字段輸入下面的函數調用。

=Code.ExpandPrice(Fields!Amount.Value,".")

  最后,你將看到下面的屏幕。

 

SQL Server報表服務中的一些常見小問題

  以選擇的顏色顯示網格#p#副標題#e#

  在SSRS中,沒有直接以選擇的顏色來顯示網格的方法(以可選擇的顏色顯示網格會提高報表的可讀性。在Excel 2007中你可以很容易地做到,但是在SSRS中卻不行)。

  通過將背景顏色中的一個表達式和RowNumber函數結合起來,你可以添加選擇顏色到你的報表中。RowNumber(無)返回當前記錄的記錄編號。對于每個文本框的背景屬性,你需要給出下面的表達式。

=iif(RowNumber(Nothing) Mod 2, "LightBlue", "SkyBlue")

  由上面的函數,偶數編號的記錄會顯示為淡藍色,而奇數編號的記錄會顯示為天藍色,如下所示:

SQL Server報表服務中的一些常見小問題

  每頁顯示給定數目的記錄

  如果你想只在每頁顯示一組記錄,那么這不是簡單的工作,因為記錄數目將依賴于字體大小和其它的打印機默認設置。除了這個問題,還有如果一行的記錄長度太長,那么它會移到另一行,而這會擾亂你報表中記錄的數目。所以有必要添加一些代碼來添加這個功能到你的報表中。假設你想每頁顯示20行,那么添加一個組到你的報表中,它具有以下表達式:

=int((RowNumber(Nothing)-1)/20)

  然后為這個組選擇page break at the end選項。

SQL Server報表服務中的一些常見小問題

  阻止向下鉆取矩陣中總列數

  當你在報表中有個矩陣時,你可以像下面這樣顯示總行數和列數:

SQL Server報表服務中的一些常見小問題

  如果你想在你點擊任何詳細單元時導航到另一個報表,那么你可以配置導航標簽。但是,這個配置的問題是這個配置使得用戶可以點擊總列數并鉆取到導航報表。你不能通過使用表達式來阻止,因為總列數可以看作是一個其它字段。

 下面是我們將用于上面這個例子的查詢: 

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)。

  這時你將獲得的與上面相同的輸出。

SQL Server報表服務中的一些常見小問題

  接下來是編寫一個表達式用于導航。

=SWITCH(Fields!Year.Value <>9999 AND Fields!Name.Value<>"Total","SubReport")

  在上面的表達式中,檢查了年和名稱總值,以便它不會導航到子報表。

熱詞搜索:

上一篇:使用Avocent iKVM 交換機管理Dell刀片服務器
下一篇:熟悉的陌生人 Vista帳戶

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
久久女同性恋中文字幕| 日本伊人色综合网| 五月天激情小说综合| 国产成人啪免费观看软件| 在线免费观看日本欧美| 久久一日本道色综合| 亚洲午夜羞羞片| 成人黄色综合网站| 久久久久国色av免费看影院| 亚洲在线视频一区| av在线播放一区二区三区| 精品久久一区二区| 日韩av在线发布| 欧美在线一区二区三区| 国产精品国产三级国产三级人妇| 久久精品国产**网站演员| 欧美色老头old∨ideo| 亚洲欧洲99久久| 国产成人精品一区二区三区四区 | 亚洲精品福利视频网站| 国产综合色在线| 这里只有精品免费| 亚洲一区二区三区四区在线| 白白色亚洲国产精品| 国产蜜臀97一区二区三区| 久久99国产精品免费| 91精品麻豆日日躁夜夜躁| 亚洲风情在线资源站| 欧美三级电影网站| 亚洲一区二区不卡免费| 色婷婷综合五月| 亚洲精品欧美激情| 91碰在线视频| 一区二区三区四区在线播放| 91色.com| 一区二区日韩av| 欧美性三三影院| 亚洲一区二区三区中文字幕在线| 99久久婷婷国产综合精品电影| 中文字幕一区av| 91麻豆免费观看| 亚洲资源中文字幕| 欧美高清你懂得| 精品在线免费视频| 国产女人水真多18毛片18精品视频| 韩日av一区二区| 中文字幕一区二区三区在线不卡| 99re热这里只有精品免费视频| 日韩美女啊v在线免费观看| 91在线高清观看| 亚洲午夜一二三区视频| 日韩久久久精品| 成人晚上爱看视频| 夜夜嗨av一区二区三区中文字幕 | 亚洲aⅴ怡春院| 欧美一区二区三区视频| 美女视频黄久久| 国产欧美精品一区| 欧美性猛交xxxxxx富婆| 美美哒免费高清在线观看视频一区二区| 日韩精品一区二区三区四区| 国产激情91久久精品导航| 亚洲视频1区2区| 日韩午夜小视频| 成人app在线观看| 石原莉奈一区二区三区在线观看| 精品久久久久久久久久久久久久久 | 色噜噜夜夜夜综合网| 亚洲午夜国产一区99re久久| 欧美一级理论片| 99这里都是精品| 久久精品国产一区二区三区免费看 | 亚洲一区二区在线免费看| 欧美日韩国产大片| 国产精品一级黄| 亚洲国产wwwccc36天堂| 久久久久久久综合日本| 欧日韩精品视频| 国产福利一区在线| 日韩国产精品久久久| 国产精品美女久久久久久久网站| 91论坛在线播放| 国模冰冰炮一区二区| 玉足女爽爽91| 久久精品人人做| 欧美区一区二区三区| 成人性色生活片| 日本aⅴ精品一区二区三区| 国产精品久久久久久福利一牛影视 | 成人小视频免费观看| 爽好久久久欧美精品| 中文字幕一区二区不卡| 久久嫩草精品久久久精品| 欧美乱妇15p| 本田岬高潮一区二区三区| 麻豆精品视频在线观看| 亚洲六月丁香色婷婷综合久久| 日韩精品一区二区三区swag | 成人国产精品免费| 国产美女一区二区| 全国精品久久少妇| 亚洲成人手机在线| 亚洲激情中文1区| 国产精品久久久99| 国产区在线观看成人精品| 欧美成人女星排行榜| 91麻豆精品久久久久蜜臀| 在线观看区一区二| 色综合天天综合网国产成人综合天| 国产成人午夜99999| 久久精品国产成人一区二区三区| 偷拍日韩校园综合在线| 亚洲国产一区二区三区青草影视| 成人欧美一区二区三区在线播放| 国产精品免费人成网站| 欧美—级在线免费片| 国产午夜精品理论片a级大结局| 日韩午夜在线影院| 久久综合色8888| 久久蜜桃av一区精品变态类天堂 | 亚洲综合在线第一页| 亚洲精品乱码久久久久久| 亚洲精品国产一区二区三区四区在线| 国产精品三级在线观看| 国产精品久久久久婷婷二区次| 国产欧美一区二区精品仙草咪| 久久精品在这里| 国产精品伦一区| 自拍偷自拍亚洲精品播放| 亚洲六月丁香色婷婷综合久久| 伊人婷婷欧美激情| 日日夜夜精品免费视频| 久久国产精品免费| 国产高清精品网站| 91久久精品一区二区三区| 欧美亚洲国产一区二区三区| 欧美日韩亚洲丝袜制服| 欧美一区二区精品在线| 久久婷婷一区二区三区| 中文天堂在线一区| 亚洲精品大片www| 日韩精品一二三四| 成人黄色小视频| 欧美日韩国产在线观看| wwwwww.欧美系列| 综合网在线视频| 视频在线观看一区| 国产精品原创巨作av| 91麻豆免费在线观看| 日韩精品自拍偷拍| 最新日韩在线视频| 美女性感视频久久| 97精品国产97久久久久久久久久久久| 欧美三级资源在线| 中文字幕免费不卡在线| 亚洲国产精品综合小说图片区| 久久99国产精品尤物| 色婷婷国产精品综合在线观看| 精品少妇一区二区| 亚洲一级电影视频| 国产麻豆成人传媒免费观看| 色噜噜夜夜夜综合网| 久久精品在线免费观看| 日日噜噜夜夜狠狠视频欧美人 | 日本免费在线视频不卡一不卡二| 高清日韩电视剧大全免费| 欧美日韩国产综合一区二区| 中文字幕av资源一区| 日本欧美在线观看| 欧美艳星brazzers| 国产精品色婷婷| 韩国理伦片一区二区三区在线播放| 91猫先生在线| 国产精品欧美一区喷水| 开心九九激情九九欧美日韩精美视频电影 | 久久男人中文字幕资源站| 亚洲亚洲精品在线观看| 国产91精品一区二区| 欧美xxxxx牲另类人与| 婷婷丁香久久五月婷婷| 色偷偷成人一区二区三区91 | 欧美日韩精品欧美日韩精品| 中文字幕不卡在线| 国产精品996| 久久综合中文字幕| 男女视频一区二区| 91.com在线观看| 亚洲国产一区二区三区| 91搞黄在线观看| 亚洲人快播电影网| 不卡一区二区在线| 国产精品福利在线播放| 成人一二三区视频| 国产午夜亚洲精品不卡| 国内精品不卡在线| 久久久精品2019中文字幕之3| 精品午夜久久福利影院| 精品福利视频一区二区三区| 日韩av一级电影| 91精品婷婷国产综合久久|