version=1.0.0
vdate=27.03.2017
fname=cast_tosqlstr.bas
ns=%NAMESPACE%
fpath=/vba/cast
====== [VBA] toSqlStr() ======
//Wandelt einen Wert in die SQL-Scrheibweise. Gut für Filter und Where-Bedinungen einer Abfrage//
==Version %%version%% %%vdate%%==
{{%%fname%%|Download %%fname%% (V-%%version%%)}}
Diese Funktion castet verschiedene Typen in das SQL-Format. Im Gegensatz zu [[https://msdn.microsoft.com/en-us/library/office/ff845070(v=office.15).aspx|BuildCriteria()]] von VBA, wird hier kein Vergleichsfeld benötigt.
===== Definition =====
Public Function toSqlStr( _
ByVal iDataType As DataTypeEnum, _
ByVal iItem As Variant, _
Optional ByVal iParams As sqlStrParams = sqlStrParams.[_Default], _
Optional ByVal iNullDefault As Variant = Null _
) As String
***iDataType** Type des Feldes
***iItem** Wert oder Array von Werten
***iParams** Nur zuDebugzwecken zu empfehlen. Im Fehlerfall belicht der Parser stehen
***iNullDefault** Wert, falls iItem Null ist und sspNullToEmpty nicht gesetzt ist
***Return** Formatierter Wert oder eine Liste mit den Formatierten Werten
==== Enumerators ====
Public Enum sqlStrParams
sspIsNullable = 2 ^ 0 'Das Feld darf Null sein
sspNullToEmpty = 2 ^ 1 'Im Null-Fall Emptyverwenden
sspOnErrorAssert = 2 ^ 5 'Bei einem Fehler den Code unterbrechen
sspOnErrorReturnError = 2 ^ 6 'Bei einem Fehler diesen als Wert ausgeben
sspOnErrorReturnNull = 2 ^ 7 'Bei einem Fehler den Wert als Null behandeln
[_Default] = sspOnErrorReturnError + sspIsNullable
End Enum
===== Beispiele =====
==== Einfache Bespiele ====
?toSqlStr(dbText, "ABC")
'ABC'
?toSqlStr(dbNumeric, 123)
123
==== Datumbeispiele ====
Vergleich der verschiedenen Datumsausgaben
' Nur das Datum
?toSqlStr(dbDate, now)
#03/27/2017#
' Datum & Zeit
?toSqlStr(dbTimeStamp, now)
#03/27/2017 12:43:22#
' Nur die Zeit
?toSqlStr(dbTime, now)
#12:43:22#
==== Zahlenbeispiele ====
Wenn man nicht einfach dbNumber nimmt sondern sich spezifisch festlegt, wird eine Konvertierung mit möglichen Fehlern ausgeführt
' Einfache Nummer
?toSqlStr(dbNumeric, 123456.78)
123456.78
'als Long. DieNachkommastellen gehen verloren (analog zu cLng())
?toSqlStr(dbLong, 123456.78)
123457
'Die Nummer ist zu gross für einen Integer
?toSqlStr(dbInteger, 123456.78)
#Overflow
==== Null Behandlung ====
Null ist immer wieder ien Spezialfall. Standardmässig wird Null in den Text Null gewandelt.
Um den Unterschied zu zeigen verwende ich hier die Ausgabe über [[vba:functions:print_r:]].
' So sieht die Ausgabe von print_r für Null aus
d Null
'toSqlString wandelt das in den Text NULL, der so von SQL verstanden wird
d toSqlStr(dbNumeric, Null)
'NULL'
'Mit wird definiert, dass anstelle von 0 Empty verwendet werde soll
? toSqlStr(dbNumeric, Null, sspNullToEmpty)
0
? toSqlStr(dbText, Null, sspNullToEmpty)
''
Wird ein iNullDefault mitgegeben, dann übersteuert dieser die Parameters,
Das funktioniert dann analog zu einem NZ()
? toSqlStr(dbNumeric, 99,, 11)
99
? toSqlStr(dbNumeric, Null,, 11)
11
'sspNullToEmpty wird ignoriert, da ein iNullDefault gesetzt ist
? toSqlStr(dbNumeric, Null, sspNullToEmpty, 11)
11
==== Boolean ====
Für Boolean wird cBool zum Konvertieren verwendet
d toSqlStr(dbBoolean, 1=1)
'TRUE'
d toSqlStr(dbBoolean, "False")
'FALSE'
==== Array ====
Bei einem Array wird das Format auf alle Elemente angewendet und das Result erscheint als List, die in einem SQL für IN() verwendet werden kann
? toSqlStr(dbLong, array(13,14,"16"))
13,14,16
? toSqlStr(dbText, array("a", "b", "c"))
'a','b','c'
? toSqlStr(dbDate, array(now, now+1))
#03/27/2017#,#03/28/2017#
? toSqlStr(dbLong, array(13,"ABC","16", NULL))
13,#TypeMismatch,16,NULL
==== Fehlerhandling ====
Als Standard wird einFeulertext ausgegeben
? toSqlStr(dbLong, "abc")
#TypeMismatch
'sspOnErrorReturnError ist der Default-Parameter
? toSqlStr(dbLong, "abc", sspOnErrorReturnError)
#TypeMismatch
'Es kann auch einfach der Wet durch Null ersetzt werden.
? toSqlStr(dbLong, "abc", sspOnErrorReturnNull)
Null
'Beim folgenden Aufruf wird die Verarbeitung angehalten und der es wird in den Debug-Mode gewechselt
? toSqlStr(dbLong, "abc", sspOnErrorAssert)
==== Beipiel in einem SQL-String in VBA ====
Und jetzt mal angewendet:
Dim sql As String
Dim fromDate As Date, toDate As Date
Dim flags() As Variant
fromDate = Now - 10
toDate = Now
flags = Array("a", "u", "k")
sql = "SELECT * FROM myTable WHERE " & _
" flag in (" & toSqlStr(dbText, flags) & ") " & _
"AND my_date BETWEEN " & toSqlStr(dbDate, fromDate) & " AND " & toSqlStr(dbDate, toDate)
Debug.Print sqlSELECT * FROM myTable WHERE flag in ('a','u','k') AND my_date BETWEEN #03/17/2017# AND #03/27/2017#
===== Code =====