PDA

Vollständige Version anzeigen : SQL ist leicht (5) - Datentypbehandlung für VBA


ebs17
06.12.2014, 14:40
In einer Datenbank werden Daten geordnet und strukturiert abgelegt. Ehe Daten eingetragen oder dann verarbeitet werden können, müssen zuerst Tabellen und darin Felder definiert werden. Eine der obligatorischen Definitionen ist ein Datentyp pro Feld. Dadurch, dass eben durch Felddefinition und Eigenprüfung z.B. in einem Datumsfeld nur gültige Datumswerte eingetragen werden können und nicht irgendwelche Striche, Punkte, Texte, wird das Ganze erst massentauglich verarbeitbar - durch Regulierung kann man sich schon einmal auf etwas verlassen.

Es ist daher augenscheinlich, dass einem der Begriff DATENTYP und dessen Inhalt als eines der grundlegenden Elemente in der Datenbankarbeit unbedingt auch in der praktischen Anwendung vertraut sein sollten: Die intuitive Unterscheidung zwischen Text (String) und Datum (Date), zwischen Ganzzahl (Long Integer, Integer) und Dezimalzahl (Double, Currency, Single, Decimal) sollte geläufig sein, ebenso der Unterschied zwischen Datentyp und FORMAT (Darstellungsform des Wertes).

Wenn man nun per VBA äußere Werte (aus Variablen, Arrayfeldern, Formularsteuerelementen) in eine SQL-Anweisung einbringen will, hat man nun bei Nichtbeachtung der Datentypen besonders viele Fehler zu erwarten, weil gerade da eine strikte Erwartung an eingesetzte Formate besteht.
Typische Fälle:
xy = DLookup("FeldX", "TabelleY", "FeldZ = " & Me.txtZZ)

Me.RecordSource = "SELECT FeldX FROM TabelleY WHERE FeldZ = " & vZZ

CurrentDb.Execute "INSERT INTO TabelleY(FeldZZ) VALUES(" & arrZZ(0) & ")"
Bei den ersten beiden Fällen (Filterung) gibt es eine Reihe von Hilfsfunktionen bis Klassen, die aber für den dritten Fall (Werteinfügung in Tabelle) i.d.R. keine Lösung anbieten.
Universeller und einfach in der Anwendung ist die folgende Funktion, mit der man solche äußeren Werte SQL-tauglich verarbeiten kann:
Public Function cSql(Expression As Variant, _
Optional VariableType As VbVarType = vbString) As String
If IsNull(Expression) Or Expression = vbNullString Then
cSql = "NULL"
Else
Select Case VariableType
Case vbString
If InStr(1, Expression, "'") <> 0 Then
cSql = "'" & Replace(CStr(Expression), "'", "''") & "'"
Else
cSql = "'" & CStr(Expression) & "'"
End If
Case vbDecimal, vbCurrency, vbDouble, vbSingle, vbLong, vbInteger
If IsNumeric(Expression) Then
cSql = Str(Expression)
Else
cSql = CStr(Expression)
End If
Case vbDate
If IsDate(Expression) Then
If Fix(Expression) = Expression Then
cSql = Format(Expression, "\#yyyy-mm-dd\#")
Else
If Fix(Expression) = 0 Then
cSql = Format(Expression, "\#hh:nn:ss\#")
Else
cSql = Format(Expression, "\#yyyy-mm-dd hh:nn:ss\#")
End If
End If
Else
cSql = CStr(Expression)
End If
Case vbBoolean
If IsNumeric(Expression) Then
If CBool(Expression) Then
cSql = "True"
Else
cSql = "False"
End If
Else
Select Case Expression
Case "Ja", "Wahr", "True", "Yes"
cSql = "TRUE"
Case Else
cSql = "FALSE"
End Select
End If
Case Else
cSql = Expression
End Select
End If
End Function
Die beigefügte Demo-DB verdeutlicht die Anwendung. Viel Spaß bei der Anwendung.