Beim Basteln an einer parallen Struktur eines "ConditionStringBuilders" ist mir folgendes aufgefallen:
Mit der VBA-Klasse erstelle ich eine Bedingung folgendermaßen:
- Code: Alles auswählen
With New FilterStringBuilder
.Add "TextField", SQL_Text, "abc", SQL_Equal
.Add "NumericField", SQL_Numeric, 133.45, SQL_Equal
.Add "DateField", SQL_Date, Date, SQL_Equal
.Add "BoolField", SQL_Boolean, True, SQL_Equal
Debug.Print .ToString
End With
Mit der DotNet-Variante sieht das (im Test) so aus:
- Code: Alles auswählen
With ACLib.DaoSql
.Where "TextField", RelationalOperators_Equal, "abc"
.Where "NumericField", SQL_Equal, 133.45
.Where "DateField", SQL_Equal, Date
.Where "BoolField", SQL_Equal, True
Debug.Print Replace(.ToString, "Where ", vbNullString)
End With
Anm.: Reihenfolge der Parameter sollen erstmal egal sein.
Problem: Da in der Net-Variante nicht der Ziel-Datentyp übergeben wurde, wird das Datum falsch in Text konvertiert.
Was ist nun für die DotNet-Variante sinnvoller:
- Den String-Wert weiterhin in Abhängigkeit des übergebenen Datentyps ermitteln (und Sonderfälle wie Date() extra abfragen
- Einen Parameter für den gewünschten Datentyp (so wie in der oben gezeigten VBA-Variante) ergänzen (Optional mit Standard-Einstellung ... Typ aus Value)
- Die Field-Schnittstelle erweitern und den Datenyp des Datenfeldes dort einstellbar machen (in der VBA-Schnittstelle wird das im Prinzip zwar wieder ein zusätzlicher Parameter werden, aber der würde dann auf das Feld zielen - oder man verwendet den Field-Generator)
Ich tendiere zur letzten Variante.
- Code: Alles auswählen
.Add "TextField", FieldDataType.Text, "abc", SQL_Equal
oder
- Code: Alles auswählen
.Add FieldGenerator("TextField", FieldDataType.Text), "abc", SQL_Equal
mfg
Josef