Aktueller Aufbau:
- Code: Alles auswählen
SqlString = SqlTools.SqlGenerator.From("TableA") _
.Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
.GroupBy("F1", "F2") _
.Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
.OrderBy("F2", "F1") _
.ToDaoString() <------------------- hier wird Dao.SqlConverter genutzt
Wenn man nun weitere SQL-Dialekte einbauen will, müsste man die Klasse SqlGenerator um eine Methode aufstocken.
Kann man das von "außen" machen?
Oder sollten wir auf so einen Aufbau wechseln:
- Code: Alles auswählen
SqlString = ToDaoString.Generator.From("TableA") _
.Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
.GroupBy("F1", "F2") _
.Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
.OrderBy("F2", "F1")
bzw.
- Code: Alles auswählen
SqlString = DaoGenerator.From("TableA") _
.Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
.GroupBy("F1", "F2") _
.Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
.OrderBy("F2", "F1").ToString()
=> Mit diesen Varianten könnte je weiterem Dialekt eine eigene dll verwendet werden, die die "Basisdll" mit dem SqlGenerator nutzt.
Grundaufbau: SqlConverter des jeweiligen Dialkete nutzt SqlGenerator. (Aktuell nutzt der SqlGenerator die SqlConverter.)
Weitere Möglichkeit:
Man übergibt beim Instanzieren des SqlGenerator eine Converter-Instanz.
Beispiel-Code in VBA:
- Code: Alles auswählen
Private m_DaoSqlGenerator As ACLibSqlTools.SqlGenerator
Private m_TsqlSqlGenerator As ACLibSqlTools.SqlGenerator
Public Property Get DaoGenerator() As ACLibSqlTools.SqlGenerator
If m_DaoSqlGenerator Is Nothing Then
Set m_DaoSqlGenerator = SqlTools.SqlGenerator(Libs.DaoSqlTools.CreateObject("DaoSqlConverter"))
End If
Set DaoGenerator = m_DaoSqlGenerator
End Property
Public Property Get TsqlGenerator() As ACLibSqlTools.SqlGenerator
If m_TsqlSqlGenerator Is Nothing Then
Set m_TsqlSqlGenerator = SqlTools.SqlGenerator(Libs.TsqlSqlTools.CreateObject("TsqlSqlConverter"))
End If
Set TsqlGenerator = m_TsqlSqlGenerator
End Property
Ein Aufruf würde folgendermaßen aussehen:
- Code: Alles auswählen
SqlString = DaoGenerator.From("TableA") _
.Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
.GroupBy("F1", "F2") _
.Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
.OrderBy("F2", "F1").ToString()
bzw.
- Code: Alles auswählen
SqlString = TsqlGenerator.From("TableA") _
.Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
.GroupBy("F1", "F2") _
.Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
.OrderBy("F2", "F1").ToString()
Diese Variante halte ich derzeit am sinnvollsten.
LG
Josef