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 sql SELECT * FROM myTable WHERE flag in ('a','u','k') AND my_date BETWEEN #03/17/2017# AND #03/27/2017# ===== Code =====