Jag har en SQL som skall överföra tal till en Access databas. Följande kod skriven i VB6: Ja det är en djä... soppa. Detta låter inte speciellt roligt!! Det är inte så enkelt för att i själva verket är "talet" en array tal(i) i en nästlad loop. Det kanske inte finns någon enkel lösning på detta problem? Använd något i stil med: >Hur gör jag för att VB och Access skall "prata samma decimalspråk"? mmm... riktigt så enkelt verkar det inte vara. Det här kommer förmodligen också att funka. Martin:s lösning. >Val(Str(talet)) Nja det håller jag inte med på. Testade denna korta snutt. Sven nu skall jag förklara hur det fungerar (om du vill veta) Ok jag köper det.Har aldrig tänkt i dom banorna. Men Jag som är kontrollfreek ! Tack för en intressant diskussion. Jag har testat förslagen men har inte fått någondera att funka. Jag ändrade i Windows nationella inställningar från , (kommatecken) till . (punkt). Detta gjorde att allt fungerade som det skulle men det är frågan vad detta får för konsekvenser i övrigt???? Jag återgår till Niklas lösning den är korrekt. Det här löser problemmet. Tycker du skall återgå till ursprunget och kolla mitt förslag. Gunnar: varför tar du inte och skriver ut variablen SQL så du kan se hur den ser ut innan du skickar den till databasen. <b>dvs om du använder Format så får du decimalkomma. </b> <b>Gunnar: varför tar du inte och skriver ut variablen SQL så du kan se hur den ser ut</b> SVEN: mmm... förstår men Label1.Caption MsgBox mm. skruvar ju om enl implicta konverteringar. Nu har jag suttit i ett par timmar och testat med de olika förslag jag har fått men inget funkar!! Jag har gjort Debug med Breakpoints genom hela beräkningen. talet=inb(i) får kommatecken som avgränsare ex.vis 100,2. Access vill väl ha kommatecken? Det borde funka men det gör det inte. Detta var klurigt värre. SQL (och Access) använder decimalpunkt. Oki Martin Som avslutning, ! Period ;-) Skönt, nu fungerar det. Hade tydligen glömt att testa denna variant även om det kanske var den första man skulle testat: >100.2 skall bli 100,2 när det matas in till Access <b>Borde vara lättare då antalet programmerare som gör det är färre än decimaltal i VB till Access
talet = 100.2
tabell = "lista"
SQL = "INSERT INTO " & tabell & "" _
& "(ingbal)" _
& "VALUES(" & talet & ")"
Set databas = Conn.Execute(SQL)
När jag sätter talet=100 fungerar det (får inget felmeddelande)
Sätter jag talet=100,2 får jag syntax-error
Och vid talet=100.2 får jag Runtime error. Antalet värden i frågan och antalet målfält är olika.
I databasen har jag fältstorleken Double och formatet Standard (ex 100,20). Hur gör jag för att VB och Access skall "prata samma decimalspråk"?
Sv: decimaltal i VB till Access
Felet är att du har (,) komma som decimalavskiljare i dina nationella inställningar.
Som jag ser det är det enklaste att du lagrar talet som en String
När du sedan vill ha tillbaka det i din VB app för matematik får du omvandla igen med Val(talet)
'Edit : Tvärtom skall det vara Så här
<code>
Dim talet As String
talet = "100.2"
talet = Replace(talet, ".", ",") ' byt ev punkt till komma
talet = Cdbl(talet)
</code>Sv:decimaltal i VB till Access
Sv: decimaltal i VB till Access
talet = 100.2
tabell = "lista"
SQL = "INSERT INTO " & tabell & "" _
& "(ingbal)" _
& "VALUES(" & format("0,0", talet) & ")"
Set databas = Conn.Execute(SQL)
Dvs, se till så att "talet" formateras som "100,2". Det gör du lämpligtvis i en testgrej utanför, dvs utan db-kommunikation.Sv: decimaltal i VB till Access
Det finns 2 funktioner "Val" och "Str" som är gjorda för precis detta, använd dem!
"Values(" & Str(talet) & ")"Sv:decimaltal i VB till Access
Håller med Niklas att Format är nog den bästa lösningen eftersom talet från början är av typ Double
Då kan du lösa det efter denna princip innan du läser in talet i Access
Med denna metod behöver Du inte blanda in String
<code>
Dim talet As Double
talet = 100.2
talet = Format(talet, "0. 00")
</code>Sv: decimaltal i VB till Access
<code>
talet = 100.2
tabell = "lista"
SQL = "INSERT INTO " & tabell & "" _
& "(ingbal)" _
& "VALUES(" & Val(Str(talet)) & ")"
Set databas = Conn.Execute(SQL)
</code>Sv:decimaltal i VB till Access
Krångla inte till det Sven. Vi vet att implicit konvertering till sträng är problemet så undvik det.Sv: decimaltal i VB till Access
<code>
Dim talet As Double
talet = 100.2
talet = Val(talet)
MsgBox talet
</code>
Svaret blev då 100 dvs decimaldelen försvann.
Skriver jag så här
<code>
Dim talet As Double
talet = 100.2
talet = Val(Str(talet))
MsgBox talet
</code>
Svaret blir då 100,2 som han förmodligen vill ha det.
Skriver jag <b>"Values(" & Str(talet) & ")"</b> som du vill, så blir talet 1002. Sicken djä... soppa.Sv:decimaltal i VB till Access
<code>
Dim talet As Double
talet = 100.2
talet = Val(talet)
MsgBox talet
</code>
Val tar en sträng som argument, därför får du en implict konevertering från double till sträng vilket använder nationella inställningarna. dvs "100,2"
Uttrycket blir alltså samma som:
talet = Val("100,2")
Detta ger en double med värdet 100 eftersom Val bara fungerar med decimalpunkt.
<code>
Dim talet As Double
talet = 100.2
talet = Val(Str(talet))
MsgBox talet
</code>
Det här är rena rappakaljan. Str gör en explicit konvertering av double till sträng med decimalpunkt, dvs "100.2"
Så första steget blir
Val("100.2")
Val gör sen en explicit konvertering av strängen till en double vilket blir 100 och 2 tiondelar (dvs samma som vi startade med). Anledningen till att du ser "100,2" är att MsgBox tar en sträng som argument så du får en implict konvertering igen (som vi vet använder decimalkomma).
Sluta med implicta konverteringar så försvinner huvuddelen av problemen. Sv: decimaltal i VB till Access
Hur kan jag visualisera att det blir rätt. Ex.
<code>
Dim talet As Double
talet = 100.2
talet = Str(talet) + Str(talet)
</code>
Jag vill se 200.4 eller 200,4Sv:decimaltal i VB till Access
Sv: decimaltal i VB till Access
<code>
talet = 100.2
tabell = "lista"
SQL = "INSERT INTO " & tabell & "" _
& "(ingbal)" _
& "VALUES(" & Format(talet,"0.00") & ")" 'Lägg till fler (0) nollor efter behov
Set databas = Conn.Execute(SQL)
</code>
Niklas skrev <b>Format(talet,"0,0")</b> därför blev hans svar fel dvs (,) felSv:decimaltal i VB till Access
Väntar med spänning på resultatet.Sv:decimaltal i VB till Access
Sven: I dokumentationen till funktionen Format står det (om punkten i formatsträngen)
"The decimal placeholder determines how many digits are displayed to the left and right of the decimal separator. ... <b>The actual character used as a decimal placeholder in the formatted output depends on the Number Format recognized by your system.</b>"
dvs om du använder Format så får du decimalkomma. Sv: decimaltal i VB till Access
mmm... exakt. Om jag fattat rätt så är det just det han vill ha.
Han har (,) komma i sina Nationella inställningar och när han skall lägga in i Tabellen Value
så vill hans Access ha DataTyp Double med (,) som decimalavskiljare.
Så har jag fattat det.Sv:decimaltal i VB till Access
Djä... bra fråga. Hur gör man ?.
Jag körde med MsgBox och Label men det funkar tydligen inte enl Martin.
Jag köper vad Martin skriver om
(Sluta med <b>implicta</b> konverteringar så försvinner huvuddelen av problemen. )
DVS det blir "dubbelstöt"
Hur gör man !? för att se vad som går in i systemet.Sv: decimaltal i VB till Access
I asp skriver man bara response.write sql men i vb vet ja inte, kanske label1.caption sql om man nu har någon sådan.Sv:decimaltal i VB till Access
Phuuuuuuuuuuuuuuuuuuuuuuuuuuu.
Måste nog använda Debug på något vis.Sv: decimaltal i VB till Access
Sv:decimaltal i VB till Access
Använd Str så fungerar det.
>talet=inb(i) får kommatecken
Har du en strängvariabel som heter talet? Låter förvillande tycker jag.
Hursomhelst
Str(inb(i)) ger en sträng med decimalpunkt
Sven:
Det finns två former av explicit konvertering till sträng
Str - ger alltid decimalpunkt
CStr - följer de nationella inställningarna på datorn
Dim x As Double
x = 3.14
MsgBox Str(x) ' "3.14"
MsgBox CStr(x) ' "3,14"
MsgBox x ' Samma som CStr(x)Sv: decimaltal i VB till Access
Nu har jag tagit det.
Det är väl själva fae..... om Vi inte skall lösa Gunnars problem
utan att han skall ställa om Nationell inställningar.
Är det fel på hela SQL satsen ?
100.2 skall bli 100,2 när det matas in till Access
Uhhhhhhhh.Sv:decimaltal i VB till Access
Varför i helvete kan Vi inte komma överens om att (.) Punkt gäller som decimalavskiljare.
Globalt.Sv:decimaltal i VB till Access
talet = Val(inb(i))
tabell = "lista"
SQL = "INSERT INTO " & tabell & "" _
& "(ingbal)" _
& "VALUES(" & talet & ")"
Set databas = Conn.Execute(SQL)
Nu får jag ändra detta på hundratals ställen i projektet.. Helgen är räddad!!!
Tack för allt engagemang och ha en bra helg. Sv:decimaltal i VB till Access
Det har inget med Access att göra. Vad Gunnar gör är att han bygger ihop en SQL sträng som han skickar till Access. SQL använder decimalpunkt. Kommatecken är listseparator.
Om du tittar på det ursprungliga felmeddelandet så var det
>Antalet värden i frågan och antalet målfält är olika.
Detta beror på att resultatet av SQL byggandet
SQL = "INSERT INTO " & tabell & "" _
& "(ingbal)" _
& "VALUES(" & talet & ")"
blir
"INSERT INTO tabellnamn (ingbal) VALUES(100,2)"
Eftersom komma är listseparator tolkas ovanstående som att man vill stoppa in värdena 100 och 2 i tabellen men det är bara en kolumn angiven "ingbal". Därav felemeddelandet att antalet värden (100 & 2) och målfält (ingbal) är olika.
För att det skall fungera så skall man göra så här:
SQL = "INSERT INTO " & tabell & " (ingbal) VALUES(" & Str(talet) & ")"
Eftersom Gunnar säger att detta inte fungerar så misstänker jag att han inte gett oss all information. Det skulle kunna vara så att variabeln talet är en sträng och inte en double. Då uppstår felet tidigare i koden.
Sven, du borde kunna lista ut var felet med följande kod är!
Dim talet As String
talet = 100.2
SQL = "INSERT INTO " & tabell & "" _
& "(ingbal)" _
& "VALUES(" & talet & ")"
>Varför i helvete kan Vi inte komma överens om att (.) Punkt gäller som decimalavskiljare. Globalt.
Eller sluta använda implicita konverteringar. Borde vara lättare då antalet programmerare som gör det är färre än antalet människor som inte använder decimalpunkt.Sv:decimaltal i VB till Access
antalet människor som inte använder decimalpunkt.</b>
Haaa *LOL* observerde in ditt skämt. GULD