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
17. September 2010 16:39
Vid deploy från SSAS 2008/2005 får man ett felmeddelande som säger _The connection either timed out or was lost_.
Detta kan bero på att servern är inställd på kerberos-autentisering. För att komma runt detta, gå till Project Properties, kolla deployment server och lägg på ";SSPI=NTLM" på slutet. Dvs om du tidigare hade server "MyServer" ska det nu stå "MyServer;SSPI=NTLM" istället.
by Martin
14. September 2010 15:47
En morgon när jag kom till en av mina kunder och skulle använda SQL Server Management Studio (SSMS) fick jag följande felmeddelande när jag försökte ändra utseende på en tabell (design table):
[image:http://www.martinfranson.se/image.axd?picture=2010%2f9%2fSQLEditors.PNG]
(På engelska är felmeddelandet _The system cannot find the file specified_)
Efter lite googlande på problemet och sen test så upptäckte jag att följande löser problemet:
* Öppna Registerditorn (regedit.exe)
* Leta upp följande nyckel:
{{
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
}}
* Lägg till ett nytt expanderbart strängvärde (Expandable String Value) med namnet _AppData_ och med värdet _%userprofile%\Application Data_
* Testa ändra din tabellayout igen
by Martin
8. September 2010 11:04
Från och med SQL Server 2008 har man i SQL Server Management Studio infört en funktion som hindrar ändringar av en tabell som gör att tabellen måste skapas om, t ex lagt till en kolumn mitt i tabellen.
Gör man det får man nedanstående felmeddelande:
[image:http://www.martinfranson.se/image.axd?picture=2010%2f9%2fSavingIsNotPermitted.png]
I grunden är det en bra funktion, framför allt om man har stora tabeller som kan ta en väldig tid att skapa om.
Om man är medveten om vilka konsekvenser det medför så går det dock bra att stänga av funktionen. Gör då följande:
# Gå in i _Tools_-menyn
# Klicka på _Options..._
# Expandera alternativet _Designers_ i trädvyn till vänster
# Kryssa ur alternativet _Prevent saving changes that require table re-creation_
# Klicka _OK_
Nedanstående kan innebära att en tabell behöver skapas om:
* Lägga till en kolumn mitt i en tabell
* Ta bort en kolumn
* Ändra null-inställningen (nullability) på en kolumn
* Ändra ordningen på kolumnerna i en tabell
* Byta datatyp på en kolumn
by Martin
7. September 2010 13:54
Alla som använt Visual Studios Compare-funktion för att göra jämförelser med t ex källkodshanteringssystem vet ju att den inte är det roligaste att använda. Det går dock byta till bättre alternativ. Gör följande för att byta:
# Gå in i _Tools_-menyn
# Klicka på _Options_
# Expandera _Source Control_ i trädvyn till vänster
# Klicka på knappen _Configure User Tools..._
# Klicka på _Add-knappen
Sedan fyller du i dialogen med passande information. Personligen gillar jag [url:WinMerge|http://winmerge.org] och då ska dialogen fyllas i enligt följande:
[image:http://www.martinfranson.se/image.axd?picture=2010%2f9%2fwinmerge.png]
Under _Command_ skriver du sökvägen till progammet du vill använda för jämförelsen.
Under _Arguments_ står det som följer (så slipper du skriva av)
{{
/x /e /ub /wl /dl %6 /dr %7 %1 %2
}}
Vill du använda WinMerge även för ihopslagningar (merge) så byter du till _Merge_ under _Operation_ och fyller i _Arguments_ enligt nedan istället:
{{
/x /e /ub /wl /dl %6 /dr %7 %1 %2 %4
}}
Värt att notera är att du måste klicka på _Spara_ i WinMerge för att spara de ändringar du gör (om du nu gör några) för att dessa ska slå igenom.
by Martin
6. September 2010 14:37
Vid installation av SQL Server 2008 R2 fick jag ovanstående fel under fasen "Setup Support Rules".
Efter att ha surfat runt mycket hamnade jag slutligen [url:här|http://www.microtom.net/?p=500].
För att kunna gå vidare måste du först ta reda på vilken Locale ID som din Windowsinstallation körs på. Det är i korthet vilket språk du installerat. Det kan du enkelt göra genom att skapa ett console-projekt i Visual Studio och klistra in följande kod:
{code:c#}
string st=string.Format("{0,3}", CultureInfo.InstalledUICulture.Parent.LCID.ToString("X")).Replace(" ", "0");
System.Console.WriteLine(st);
System.Console.ReadLine();
{code:c#}
I mitt fall fick jag _009_ och jag kör engelskt Windows.
Jag laddade sedan ner [url:denna fil|http://www.martinfranson.se/file.axd?file=2010%2f9%2fPerflib.zip] (en zippad .reg-fil) och ändrade på rad 9 så istället för texten
{{
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\007]
}}
står det
{{
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009]
}}
_009_ är då mitt Locale ID som jag tog reda på tidigare.
Efter att ha lagt in detta i windows-registret så gick det utmärkt att fortsätta installationen.
_Källa: [url:http://www.microtom.net/?p=500]_
by Martin
3. September 2010 09:22
Vid ett försök att använda Excel-makron för att anropa procedurer i SQL Server stötte jag på nedanstående felmeddelande
{{
Parameter object is improperly defined. Inconsistent or incomplete information was provided.
}}
Den kod jag försökte köra var ungefär följande:
{code:vb.net}
oCmd2.CommandText = "sp_addextendedproperty"
oCmd2.ActiveConnection = oCon.ConnectionString
oCmd2.CommandType = adCmdStoredProc
' Hämta parametrar
oCmd2.Parameters.Refresh
' Sätt parametrar
oCmd2.Parameters("@name").Value = sExProp
oCmd2.Parameters("@value").Value = CVar(sValue)
oCmd2.Parameters("@level0type").Value = "SCHEMA"
oCmd2.Parameters("@level0name").Value = sSchema
oCmd2.Parameters("@level1type").Value = "TABLE"
oCmd2.Parameters("@level1name").Value = sTable
oCmd.Parameters("@level2type").Value = vbNull
oCmd.Parameters("@level2name").Value = vbNull
oCmd2.Execute
If Err.Number <> 0 Then
Debug.Print Err.Description
End If
{code:vb.net}
Det tog lång tid för mig att förstå vad problemet egentligen var. Slutligen visade det sig att det hade med parametern @value att göra. Den var nämligen av datatypen sql_variant men i ADO översattes den till typen adVarBinary.
Lösningen blev att hårt ändra den till adVarWChar istället och sätta en lämplig längd på den.