Samstag, 25. Oktober 2014

TM-SmartSqlString: Grundlegende Implementierung

Mit der Klasse TM-SmartString hat sich gezeigt, wie einfach es ist, einen eigenen Datentyp zu erstellen und mit Leben zu füllen. Auf der Konferenz Access Day im Herbst 2013 stellte Armin Stein ein Modul mit dem Namen JStreetSQLTools vor. Dieses Modul enthält Methoden, um die Where-Klausel, die Having-Klausel oder die OrderBy-Klausel eines SQL-String zu ersetzen oder anzupassen.

Noch während der Konferenz notierte ich mir den Gedanken, einen eigenen Datentyp für SQL-Strings zu erstellen. Dieser Beitrag zeigt die wesentlichen Schritte der Implementierung.

Grundsätzliche Implementierung:
Die grundsätzliche Implementierung dieser Klasse ist gleich zu TM-SmartString.
1:  Private m_SQLString As TM_SmartString  
2:    
3:  Public Property Let Value(ByVal Text As String)  
4:    m_SQLString = Text  
5:    Call SplitUpSqlString(m_SQLString)  
6:  End Property  
7:    
8:  Public Property Get Value() As String  
9:    Value = ConcatSqlString()  
10:  End Property
In Zeile 1 wird eine private Variable für den SQL-String deklariert. Die Property Value ist wieder als Standardmethode implementiert. Wie das geht habe ich bei TM-SmartString beschrieben.

Bei der Zuweisung eines neuen SQL-Strings wird dieser mit der Methode SplitUpSqlString in seine Bestandteile zerlegt. Beim Abruf der SQL-Strings werden die einzelnen Bestandteile mit der Methode ConcatSqlString wieder zusammengesetzt.

SplitUpSqlString:
Diese Methode zerlegt den SQL-String in seine Bestandteile.
1:  Private Sub SplitUpSqlString(ByVal strSQL As String)  
2:    
3:    'Variablen deklarieren  
4:    Dim posSelect As Long  
5:    Dim posFrom As Long  
6:    Dim posWhere As Long  
7:    Dim posGroupBy As Long  
8:    Dim posHaving As Long  
9:    Dim posOrderBy As Long  
10:    
11:    'Initialisieren  
12:    posSelect = InStr(1, strSQL, "Select")  
13:    posFrom = InStr(1, strSQL, "From")  
14:    posWhere = InStr(1, strSQL, "Where")  
15:    posGroupBy = InStr(1, strSQL, "Group By")  
16:    posHaving = InStr(1, strSQL, "Having")  
17:    posOrderBy = InStr(1, strSQL, "Order By")  
18:    
19:    'Select  
20:    m_SelectPart = Mid$(strSQL, posSelect + 7, posFrom - posSelect - 7)  
21:    
22:    'From, Where, Group By, Having und Order By  
23:    ....  
24:    
25:  End Sub  
Im ersten Schritt wird die Position der Schlüsselworte ermittelt. Im weiteren werden dann die einzelnen Bestandteile an Hand der Positionen der Schlüsselworte ermittelt und den jeweiligen privaten Variablen zugewiesen.

ConcatSqlString:
Diese Methode setzt den SQL-String aus seinen einzelnen Bestandteilen zusammen.
1:  Private Function ConcatSqlString() As String  
2:    
3:    'Variablen deklarieren  
4:    Dim sql As String  
5:      
6:    sql = "SELECT " & m_SelectPart & " "  
7:      
8:    sql = sql & "FROM " & m_FromPart & " "  
9:      
10:    If Len(m_WherePart) > 0 Then  
11:      sql = sql & "WHERE " & m_WherePart & " "  
12:    End If  
13:      
14:    If Len(m_GroupByPart) > 0 Then  
15:      sql = sql & "GROUP BY " & m_GroupByPart & " "  
16:    End If  
17:      
18:    If Len(m_HavingPart) > 0 Then  
19:      sql = sql & "HAVING " & m_HavingPart & " "  
20:    End If  
21:      
22:    If Len(m_OrderByPart) > 0 Then  
23:      sql = sql & "ORDER BY " & m_OrderByPart & " "  
24:    End If  
25:      
26:    ConcatSqlString = Trim$(sql)  
27:      
28:  End Function  
Es wird Schlüsselwort für Schlüsselwort geprüft, ob dieses Text enthält. Im Erfolgsfall wird der SQL-String um das Schlüsselwort und den zugehörigen Inhalt erweitert.

Zugriff auf Bestandteile:
Um auf die einzelnen Bestandteile des SQL-Strings zugreifen zu können, wurde jeweils eine Get- und eine Let-Property angelegt.
1:  Public Property Let SelectPart(ByVal strText As String)  
2:    m_SelectPart = strText  
3:  End Property  
4:  Public Property Get SelectPart() As String  
5:    SelectPart = m_SelectPart  
6:  End Property  
Hier sind beispielhaft die Properties für den SelectPart dargestellt.


Mit dieser Implementierung steht die grundsätzliche Funktion der neuen Klasse bereit. Wie man diese Klasse einsetzt, zeige ich in einem folgenden Beitrag.

Die neue Version 2.36.17 steht (wie immer) auf meiner Webseite zum Download bereit.

Keine Kommentare: