by Martin
27. September 2010 11:27
En fd kollega till mig stötte på ett problem där han ville skriva ut ett tal i textform, ungefär som det brukar stå på presentkort osv, t ex så 112 etthundraelva.
Han googlade lite, hittade [url:en blogg där någon skrivit en kodsnutt för det i SQL|http://www.novicksoftware.com/udfofweek/Vol2/T-SQL-UDF-Vol-2-Num-9-udf_Num_ToWords.htm], men valde sedan att konvertera det till att använda i Reporting Services istället. Klistra in koden nedan under Custom code och anropa sedan koden i rapporten enligt följande:
{{
=Code.ExpandPrice(Fields!Amount.Value,",")
}}
Kod:
{code:vb.net}
Shared suffixes As String() = _
{"Tusen", "Miljoner", "Miljarder", "Biljoner", "Biljard", "Triljon", "Triljard"}
Shared units As String() = _
{"", "Ett", "Två", "Tre", "Fyra", "Fem", "Sex", "Sju", "Åtta", "Nio"}
Shared tens As String() = _
{"Tjugo", "Trettio", "Förtio", "Femtio", "Sextio", "Sjuttio", "Åttio ", "Nittio"}
Shared digits As String() = _
{"Tio ", "Elva ", "Tolv ", "Tretton ", "Fjorton ", "Femton ", "Sexton ", "Sjutton ", "Arton ", "Nitton"}
Shared expr As New _
System.Text.RegularExpressions.Regex("^-?\d+(\,\d{2})?$", _
System.Text.RegularExpressions.RegexOptions.None)
Public Function ExpandPrice(ByVal Price As Double, Optional ByVal pSeparator As String = ".") As String
Dim pPrice As String
pPrice = FORMAT(Price, "##############.00")
Dim temp As New System.Text.StringBuilder()
If expr.IsMatch(pPrice) Then
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) & "Kronor")
ElseIf CDbl(dollars) = 0 Then
temp.Append(ExpandIntegerNumber(dollars) & "Noll Kronor")
End If
If CDbl(cents) >= 1 Then
temp.Append(" och ")
temp.Append(ExpandIntegerNumber(cents) & " Öre")
End If
End If
Return temp.ToString()
End Function
Function ExpandIntegerNumber(ByVal 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(ByVal 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)) & "Hundra")
End If
End If
temp1.Append(GetNumberUnder100Str(Right("0" & pNumber, 2)))
Return temp1.ToString()
End Function
Function GetNumberUnder100Str(ByVal 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:vb.net}
by Martin
21. June 2010 10:01
Ibland vore det smidigt att kunna skriva ut på en rapport från vilken dator en användare skapade den, t ex om användaren Lisa exekverade rapporten från hennes arbetsstation kallad CorpComp1.
Det finns ingen inbyggd funktion för detta i Reporting Services. Däremot finns ju alltid möjligheten att nyttja Custom Code. Följande kod skulle kunna användas:
{code:vb.net}
Public Function GetClientIP() As String
Dim result as String
result = System.Web.HttpContext.Current.Request.ServerVariables("REMOTE_ADDR")
return result
End Function
Public Function GetClientHostName() As String
Dim result as String
result = System.Net.Dns.GetHostEntry(System.Web.HttpContext.Current.Request.ServerVariables("remote_addr")).HostName
return result
End Function
{code:vb.net}
Där du då vill skriva ut användarens datornamn skriver du följande uttryck (expression)
{{
=Code.GetClientHostName()
}}
Vill du istället skriva ut IP-adressen så görs det med följande uttryck (expression)
{{
=Code.GetClientIP()
}}