Tweaks in SQL Server Reporting Services

SQL Server Reporting Services (SSRS) is very valuable tool for developers and users to design and view reports. However, there are few features which are not available directly in SSRS. These features are frequently required features for developers and users. Display Server Name or IP Address in a Report
Often users will be mislead with report data when it is running on several reporting severs. You may have a test and a production environment and you do not know from which server your report is taken from.
Obvious one way you can tackle this issue is by displaying the report server name or its IP address in the report. Unfortunately, there is no direct function or a method to retrieve the server name. However there is a workaround. In Reporting Services, there is a global parameter called ReportServerUrl which will display the report URL. The initial part of this value is taken from the RSReportServer.config file in the C:Program FilesMicrosoft SQL ServerMSSQL.#Reporting ServicesReportServer folder. In this file, there is node called URLRoot. It can be either http://{IPAddress}/reportserver or http://{Server Name}/reportserver. You need to find a way to extract the IP Address or ServerName, which you can do by using the following expression: Mid(Globals!ReportServerUrl,8,InStr(9,Globals!ReportServerUrl,”/”) – 8) What this expression does is, it will extract the name from the next character position of // to the next character position of /, which will be either the server name or the IP address of the server. Convert Numeric Values into Words
This is very common question that you can find in SSRS forums as many users needs to display numeric data in words. Although there is a function in Crystal Reports, there is no function in SSRS. Nevertheless, you can do this in SSRS by writing your own function. Lets us do this by an example using the following query: 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 For the sake of the example, let us assume that we need to display sales person id along with the amount and amount in words. Follow the below steps to create a report. 1. Create a SSRS project.
2. Add new report the project.
3. Add a data source in which database is pointed to adventureworks.
4. Create a data set with the above query.
5. Drag and drop a table to layout from the toolbox and drag and drop the fields to the table. The next step is to create a function to convert numeric values into words. Go to the Report menu option and select report properties. Select the Code tab in that dialog box and copy and paste the following code: ‘ Source

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
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
End If
End If
j += 1
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))
RETURN units(Right(pNumber, 1))
End If
End Function


Leave a comment

Your email address will not be published.