Mittwoch, 29. Oktober 2014

TM-SmartSqlString: So wird die Klasse eingesetzt

Mit der Klasse TM-SmartSqlString besteht die Möglichkeit, einen SQL-String in einer eigenen Klasse zu verwalten. Die Klasse bietet dabei Möglichkeiten, die speziell auf ein SQL-Statement zugeschnitten sind. So wird bei Zuweisung eines SQL-Statements dieses in seine Bestandteile zerlegt.

Wenn das Statement erst einmal in seine Bestandteile zerlegt ist, ist es ganz leicht, einzelne Bestandteile, wie z.B. die Where-Klausel auszutauschen.

Bisheriges Vorgehen:
Stellen wir uns folgendes Szenario vor: In einer Datenbank existiert ein Bericht. Für diesen Bericht können in einem Formular die gewünschten Kriterien ausgewählt werden. Vor dem Öffnen des Berichts wird die Abfrage, die dem Bericht als Datenquelle dient, mit einem angepassten SQL-Statement gefüllt. Der Code dafür sieht ungefähr so aus:
1:  Private Sub BerichtAnzeigen()  
2:    
3:    Dim strSQL As String  
4:    Dim strStartdatum As String  
5:    Dim strEnddatum As String  
6:    Dim lngKunde As Long  
7:      
8:    strStartdatum = Me!strEnddatum  
9:    strEnddatum = Me!strStartdatum  
10:    lngKunde = Me!cboKunde  
11:      
12:    strSQL = "SELECT Bestelldetails.[Artikel-Nr], " & _  
13:      "Bestellungen.[Bestell-Nr], Bestellungen.Bestelldatum, " & _  
14:      "Bestellungen.Versanddatum, Bestellungen.[Kunden-Code], " & _  
15:      "Bestelldetails.Anzahl, Bestelldetails.Einzelpreis, " & _  
16:      "Bestelldetails.Rabatt, 'Verkauf' AS Transaktion, " & _  
17:      "[Erweiterte Kunden].Firma AS Firma, Bestelldetails.[Status-Nr]," & _
18:      "[Erweiterte Kunden].ID FROM ([Erweiterte Kunden] " & _ 
19:      "INNER JOIN Bestellungen ON [Erweiterte Kunden].ID = " & _  
20:      "Bestellungen.[Kunden-Code]) INNER JOIN Bestelldetails " & _  
21:      "ON Bestellungen.[Bestell-Nr] = Bestelldetails.[Bestell-Nr] " & _  
22:      "WHERE (((Bestellungen.Bestelldatum) Between " & _  
23:      "#" & strStartdatum & "# And #" & strEnddatum & "#) " & _  
24:      "AND (([Erweiterte Kunden].ID)=" & lngKunde & ")) " & _  
25:      "ORDER BY Bestellungen.Bestelldatum;"  
26:    
27:    CurrentDb.QueryDefs("Artikelbestellungen").SQL = strSQL  
28:    
29:    DoCmd.OpenReport "Artikelumsatz nach Kunde", acViewPreview  
30:      
31:  End Sub  
Es wird schnell deutlich, das im VBA-Code sehr viele Zeilen für den Zusammenbau des SQL-Statements verwendet werden müssen. Das gesamte SQL-Statement existiert im VBA-Code.

Künftige Vorgehen:
Durch den Einsatz der Klasse TM-SmartSqlString kann der Code deutlich verkürzt werden.
1:  Private Sub BerichtAnzeigen()  
2:    
3:    Dim SQL As New TM_SmartSqlString  
4:    Dim strWhere As String  
5:      
6:    SQL = CurrentDb.QueryDefs("Artikelbestellungen").SQL  
7:      
8:    strWhere = "WHERE (((Bestellungen.Bestelldatum) Between " & _  
9:      "#" & Me.Startdatum & "# And #" & Me.Enddatum & "#) " & _  
10:      "AND (([Erweiterte Kunden].ID)=" & Me.Kunde & ")) "  
11:    
12:    SQL.WherePart = strWhere  
13:    
14:    CurrentDb.QueryDefs("Artikelbestellungen").SQL = SQL  
15:    
16:    DoCmd.OpenReport "Artikelumsatz nach Kunde", acViewPreview  
17:      
18:  End Sub  
Als erstes wird der SQL-String aus der Abfrage ausgelesen und der Klasse zugewiesen. Im nächsten Schritt wird die Where-Klausel gemäß der Auswahl im Formular zusammengebaut. Jetzt kommt der entscheidende Unterschied. Dem SQL-String wird eine neue Where-Klausel zugewiesen. Am Ende wird das SQL-Statement der Abfrage zugewiesen und der Bericht geöffnet. Fertig.

Vorteile:
Beim bisherigen Vorgehen erstreckte sich der Code für das SQL-Statement über 14 Zeilen. Beim künftigen Vorgehen werde nur 3 Zeilen für die Anpassung der Where-Klausel benötigt. Der VBA-Code ist insgesamt deutlich kürzer.
Durch die Verkürzung gewinnt der VBA-Code an Übersicht. Es ist schneller erkennbar, was passiert.
Außerdem kann das SQL-Statement beim künftigen Vorgehen weiter im Abfrageeditor gepflegt werden. Eine Übernahme des angepassten Statements und die damit einhergehenden Fehler entfallen.

Keine Kommentare: