RSS
StartseiteKnowledge LibraryTop 10Impressum

6.3 Wie erfasse ich Dezimalzahlen in ADO-Recordsets?

VB5-VB6/ADO

Von:  [Home]

In mehreren Newsgroups tauchen immer wieder Fragen zum Thema "Eingeben von Dezimalzahlen in Textboxen die an ein ADO-Recordset gebunden sind" auf.

Textbox.DataField = "FeldName"
Set Textbox.DataSource = Recordset

Ist das Feld "FeldName" z.B. vom Typ Double oder Float, dann werden bereits in der Datenbank vorhandene Dezimalzahlen in der Textbox mit dem Komma als Dezimaltrennzeichen (Ländereinstellung des Client-PC = Deutsch) dargestellt.

Wird jetzt versucht, diese Zahl zu ändern und dabei wieder das Komma als Dezimaltrennzeichen verwendet, so wird bei der Eingabe der geänderten Zahl in die DB das Komma falsch (nicht nach den Regeln der für den PC aktuellen Ländereinstellung) interpretiert. Das gilt auch bei der Eingabe von Zahlen in einen neu anzufügenden Datensatz.

Beispiel:

Zahl in FeldName = 1325.123 - Textbox.Text = 1325,123

Textbox.Text wird geändert auf Textbox.Text = 1325,125 Recordset.Update Zahl in FeldName = 1325125

ADO verwendet offenbar bei der automatischen Typumwandlung des Inhalts von Textbox.Text zu einer Dezimalzahl die Einstellung von Textbox.DataFormat, um festzustellen, welche Zeichen als Dezimaltrennzeichen bzw. als Tausendergruppierungszeichen zu interpretieren sind. Die Eigenschaft DataFormat ist im Normalfall leer (Nothing) und wird in diesem Fall von ADO offensichtlich per Default als Ländereinstellung "USA" interpretiert.

Dies gilt aber merkwürdigerweise nur für die Eingabe (Daten von der Textbox zur Datenbank).

Bei der Ausgabe der Daten (Daten von der Datenbank zur Textbox) erfolgt die Darstellung des Dezimaltrennzeichens nach den Regeln, welche durch die Einstellung "Ländereinstellung" in der Systemsteuerung des Client-PC's vorgegeben sind.

Reichlich unlogisch. Microsoft wird aber vermutlich wieder mal sagen: It's not a bug, it's a feature.

Abhilfe bringt das explizite Setzen der Eigenschaft Textbox.DataFormat:

With Textbox
  .DataFormat.Format = "General Number"
  .DataField = Recordset.Fields("FeldName").Name
  Set .DataSource = Recordset
End With

Mit dem Formatstring "General Number" wird nun auch bei der Dateneingabe das in der Ländereinstellung definierte Dezimaltrennzeichen richtig interpretiert.

Für formatierte Zahlendarstellungen kann z.B. dieses verwendet werden:

With TextBox
  .DataFormat.Format = "#,##0.00" 
  .DataField = Recordset.Fields("FeldName").Name 
  Set .DataSource = Recordset
End With

Für den Formatstring in Textbox.DataFormat.Format gelten die Regeln wie sie in der Online-Hilfe auch für die Funktion Format$() beschrieben sind.

Soll ein DataGrid an ein ADO-Recorset gebunden werden, kann hierbei die Eigenschaft

DataGrid.Columns(x).Numberformat = "FormatString"

verwendet werden, um eine wie auch immer gewünschte Darstellung (Formatierung) der Dezimalzahlen zu erreichen. Auch hier gelten für den FormatString die Regeln wie sie für Format$() beschrieben sind.

Allerdings ist es wegen einer ganzen Reihe von anderen Fehlern kaum möglich, das DataGrid im Zusammenspiel mit ADO Recordsets sinnvoll einzusetzen. Die in der Dokumentation zu DataGrid gemachte Aussage, DataGrid sei mit Ausnahme der fehlenden Unbound-Methoden völlig kompatibel zum bisherigen DBGrid trifft in keiner Weise zu. Kaum eine der DB-spezifischen Eigenschaften und Methoden des DataGrid verhält sich so wie beim DBGrid von VB5. Schlimmer noch, wird ein DataGrid an ein ADO-Recordset gebunden ändert sich in vielen Fällen auch das Verhalten des Recordsets völlig unerwartet (z.B. bei einem Recordset.CancelUpdate verhält sich ein ADO-Recordset völlig anders als normal, wenn ein DataGrid an das Recordset gebunden ist).