# Double mit Komma oder Punkt ?



## nerddestroyer (2. Mai 2007)

Servus Leute,

hab ein Problem mit dem Datentyp double. Manche Datenbanken verlangen zur trennung der Dezimalstellen ein Punkt, manche ein Komma.

Wie kann ich das am geschicktesten VB6 sagen, was er wählen soll?

Danke!


----------



## ronaldh (2. Mai 2007)

Das Zahlenformat in VB hat doch immer den Punkt als Dezimaltrennzeichen. Nun ist es abhängig davon, welcher Art die Datenbankzugriffe sind, die Du machst. Wenn Du Zahlenfelder über SQL-Befehle, ADO, ODBC oder was auch immer direkt im VB durchführst, wird dies durch die ADO, ODBC usw. Treiber automatisch gehandled. Das sollte wirklich keine Probleme geben.

Probleme entstehen nur, wenn Du Textdateien erzeugst, die Du dann z.B. mit Excel öffnest. Im Excel kann man beim Import von Textdateien das verwendete Dezimaltrennzeichen einstellen, wenn sich die von den Ländereinstellungen im Windows unterscheidet.

Auf welche Weise greifst Du denn auf Datenbanken zu, welche Datenbank nutzt Du?

Gruss
ronaldh


----------



## nerddestroyer (2. Mai 2007)

Per ADODB. Und dann entweder auf einen MySQL oder MSSQL Server.

Muss ich bei ADODB was spezielles einstellen, damit das automatisch geregelt wird?


----------



## ronaldh (2. Mai 2007)

Wenn Du als Feldtyp Zahlenfelder hast, kann es da meiner Kenntnis nach keine Probleme geben.

Wenn im nachstehenden Beispiel ein Feld "Umsatz" als Double in der Datenbank vorhanden ist, sollte das Beispiel auch funktionieren.


```
Dim Rc as new adodb.recordset
   Dim x as Double
   rc.Addnew
   rc.Fields("Umsatz").Value = x
   rc.Update
```

Etwas anderes ist es, wenn Du die Zahlenwerte z.B. über Textboxen im VB eingeben lässt, und jemand dort das Komma als Dezimalzeichen benutzt. Das musst Du dann in einen Punkt konvertieren, da VB intern den Punkt als Dezimalzeichen benutzt. Und vorher natürlich alle eventuell vorhandenen anderen Punkte entfernen (falls der Anwender Tausender-Trennpunkte eingegeben hat).


----------



## Alex F. (2. Mai 2007)

ronaldh hat gesagt.:


> Wenn Du als Feldtyp Zahlenfelder hast, kann es da meiner Kenntnis nach keine nach keine Probleme geben.



Leider doch, nämlich wenn du die Daten über ein SQL aktualisierst. Dies ist in der Regel schneller.
Das Problem ist nämlich, das bei der Umwandlung in einen String die Länderkonventionen angewandt werden und so wird aus der double 0.5 der string 0,5 was in einem Sql zu dem Fehler führt, dass die Anzahl der Felder nicht stimmt also musst du im Falle eines Sql-Befehls 
deine Double am besten von Hand konvertieren 

```
Replace ( Replace(deinedouble,",","."),",","")
```

Das 1. Replace mache ich wegen evtl. Tausenderpunkte 

Grüsse bb


----------



## ronaldh (2. Mai 2007)

> Leider doch, nämlich wenn du die Daten über ein SQL aktualisierst.



Sorry, aber dieses Problem hatte ich noch nie. Ich arbeite nahezu ausschließlich über SQL, mit schnellen Rechnern und Servern und komplexen Datenbanken, aber dass die Zahlenkonvertierung in einen String nicht funktioniert, und da ein Komma statt Punkt kommt, habe ich wirklich noch nie erlebt. 

Die Erstellung des SQL-Strings entsteht ja ohnehin zunächst im VB. Dass dabei gerade bei Zahlen aus Textboxen ggf. eine Zeichenkonvertierung erforderlich ist, ist logo. Aber dass dieser String hinterher falsch beim SQL Server ankommt, halte ich für sehr unwahrscheinlich.


----------



## Alex F. (2. Mai 2007)

Dann erklär mir das 


```
Private Sub test()
    Dim x As Double
    Dim sql As String
    
    x = 0.5
    
    sql = "update Tabelle1 set Wert = " & x
    
    Call MsgBox(sql)

End Sub
```
ergibt bei mir 

```
update Tabelle1 set Wert = 0,5
```

was auf den mir bekannten sql systemen einen Fehler hervor ruft. 


Grüsse bb


----------



## ronaldh (2. Mai 2007)

Ok, ich nutze niemals die Verkettung mit "&" bei unterschiedlichen Datentypen. Das führt in VB unter vielen Umständen zu unerwarteten Ergebnissen, weil VB hier eine interne Typ-Konvertierung durchführen muss, und dies nicht immer so abläuft, wie man will.

Soviel ich mich erinnern kann, arbeitet der &-Operator mit dem Datentyp Variant, falls die übergebenen Ausdrücke nicht Strings sind. Mit der str() Funktion wird ein echter String hergestellt.

Sauberer ist dann wohl doch folgender Weg:


```
Option Explicit

Private Sub Command1_Click()
   Dim x As Double
   Dim sql As String
   x = 0.5
   sql = "update Tabelle1 set Wert = " & Str(x)
   Call MsgBox(sql)
End Sub
```

Da kommt als Ergebnis raus:

update Tabelle1 set Wert = .5

Und dann klappt es auch mit der Datenbank.


----------

