Skriv ut tal som text

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}

SSAS: The connection either timed out or was lost (vid deploy)

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.

SSMS: The system cannot find the file specified / Det går inte att hitta filen (SQLEditors)

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

Saving changes is not permitted i SQL Server

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

Byta jämförelse-verktyg i Visual Studio

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.

"Performance counter registry hive consistency check" failed

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]_

Parameter object is improperly defined. Inconsistent or incomplete information was provided.

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.

Tags:

SQL Server