Temporäre Datenbanken in der Praxis

In der letzten Ausgabe haben Sie erfahren, wie einfach es ist, die Basis für die Verwendung von temporären Tabellen zu schaffen. Durch Parameter und ein paar Zeilen Code erstellen Sie eine Datenbank, die bei jedem Start Ihrer Anwendung automatisch erzeugt wird. Dieser Artikel soll Ihnen nun die Anwendung temporärer Datenbanken in der Praxis demonstrieren.

Der Hintergrund für den Einsatz einer temporären Datenbank ist, in Frontend-Backend-Szenarios oft verwendete, aber selten geänderte Daten – etwa zum Füllen von Kombinationsfeldern – für die Dauer einer Sitzung auf den lokalen Rechner zu kopieren. Dabei soll nicht nur eine temporäre Tabelle, sondern direkt eine temporäre Datenbank helfen, weil dies das Aufblähen des eigentlichen Frontends verringert.

Im Beitrag Temporäre Datenbanken (Shortlink 461) haben Sie erfahren, wie Sie mit einem geeigneten Formular die dafür anzulegende temporäre Datenbank konfigurieren. Der vorliegende Beitrag zeigt, wie Sie diese Lösung in der Praxis einsetzen und die Tabellen der temporären Datenbank mit den gewünschten Daten füllen.

Anwendungsgebiet “Referenztabellen”

Die Daten in Kombinations- oder Listenfeldern zur Anzeige von Kundennamen, Zahlungsbedingungen etc. holt Access normalerweise bei jedem öffnen des Formulars aus den Tabellen des Backends.

Warum also nicht, um die Belastung des Backends zu verringern, diese “statischen” Daten einfach beim Start Ihrer Anwendung in den Pool der temporären Datenbank überführen und anschließend die Listenfelder durch die Einträge aus den Tabelle der temporären Datenbank füllen

Zur Demonstration dieser Vorgehensweise soll das nachfolgende Beispiel dienen: Das Backend enthält eine Tabelle mit Bundesländern, Kreisstädten und Gemeinden. Die Struktur dieser Tabelle entnehmen Sie Tab. 1.

Feldname

Datentyp

Länge

Tab. 1: Struktur der Datenquelle

Das zu füllende Kombinationsfeld benötigen Sie zur Auswahl des Bundeslandes bei der Erfassung einer Adresse.

Konfiguration der temporären Datenbank

Starten Sie den Konfigurator (frm_app_Konfigurator) und geben Sie dort den Datenbankpfad und den Namen der zu erstellenden temporären Datenbank an (siehe Bild 1). Dann müssen Sie die temporäre Tabelle namens tbl_ref_Bundeslaender im Konfigurator anlegen (genaue Informationen zum Konfigurator siehe Shortlink 461).

pic001.tif

Bild 1: Konfigurieren Sie die erste Tabelle für den Gebrauch als Referenztabelle.

Haben Sie den Namen festgelegt, müssen Sie noch die Felder für die neue Tabelle bestimmen. Dazu klicken Sie auf das Register Felder und wählen die Tabelle tbl_ref_Bundeslaender aus dem Kombinationsfeld aus (siehe Bild 2).

pic002.tif

Bild 2: Konfiguration der benötigten Felder für die Referenztabelle

tbl_ref_Bundeslaender

Die Feldgröße der Felder für die temporäre Tabelle leiten sich von der Struktur der Ausgangsdatenquelle ab. Wie in Tab. 1 beschrieben, enthält die temporäre Tabelle lediglich zwei Felder vom Datentyp Text mit den passenden Feldgrößen.

Zu guter Letzt legen Sie noch zwei Indizes für die temporäre Tabelle an (siehe Bild 3).

pic003.tif

Bild 3: Indizes der temporären Tabelle

Der Index PrimaryKey verhindert redundante Daten im Primärschlüssel während der zweite Index SortOrder dazu verwendet wird, die Ausgabe der Bundesländer in sortierter Form zu beschleunigen.

Lassen Sie, nachdem Sie die Konfiguration fertig gestellt haben, die temporäre Datenbank für einen ersten Testlauf erstellen. Sollten keine Fehler auftauchen, werden Sie über den Erfolg informiert und die verknüpfte Tabelle erscheint im Datenbankfenster.

Wie kommen die Daten in die Tabelle

Nun gut – die Datenbank und damit auch die konfigurierte Tabelle wurden erfolgreich erstellt. Aber wie bekommen Sie nun die Daten aus dem Backend in diese Tabelle Ziel ist es, alle Bundesländer aus der Tabelle tbl_app_LaenderKreiseGemeinden der Backend-Datenbank in die temporäre Tabelle zu transferieren. Bundesländer sind diejenigen Datensätze mit dem Feldinhalt L im Feld Type (siehe Bild 4).

pic004.tif

Bild 4: Bundesländer sind durch eine eindeutige Typen-kennzeichnung charakterisiert.

Datenübertragung mittels DAO und JET

Die erste Möglichkeit besteht darin, die Quelldaten in einem RecordSet zu speichern und zu durchlaufen. Jeder Datensatz, der dem Kriterium für die temporäre Datenquelle entspricht, wird anschließend mittels VBA-Code in diese Tabelle eingetragen (s. Listing 1).

Listing 1: Import von Daten in die temporäre Tabelle via DAO

Private Sub StartDAOImport()
     On Error GoTo ErrorHandler:
     Call DoCmd.Hourglass(True)
     Set db = DBEngine(0)(0)
     Set rstSource = db.OpenRecordset("tbl_app_LaenderKreiseGemeinden", dbOpenForwardOnly)
     Set rstTarget = db.OpenRecordset("tbl_ref_Bundeslaender", dbOpenDynaset)
     While Not rstSource.EOF
         If rstSource!Type = "L" Then
             rstTarget.AddNew
             rstTarget!Schluessel = rstSource!Gemeindeschluessel
             rstTarget!BundesLand = rstSource!RegionName
             rstTarget.Update
         End If
         rstSource.MoveNext
     Wend
ExitCode:
     On Error Resume Next
     Set rstSource = Nothing
     Set rstTarget = Nothing
     Set db = Nothing
     Call DoCmd.Hourglass(False)
     Exit Sub
ErrorHandler:
     Select Case Err.Number
         Case 3022: Resume Next
         Case Else: MsgBox Err.Description, vbInformation, "Fehler: " & Err.Number
     End Select
 Resume ExitCode
End Sub

Im obigen Code werden zwei Recordsets initialisiert und geöffnet. Das Recordset rstSource enthält die Datenmenge der zu übertragenden Daten, während das Recordset rstTarget die temporäre Tabelle tmp_app_BundesLaender abbildet.

In einer kopfgesteuerten Schleife wird im Anschluss die Datenquelle durchlaufen. Sobald die Bedingung [Type] = “L” erfüllt ist, versucht die Routine, den gefundenen Datensatz in die Zieltabelle einzutragen. Da Sie nicht ausschließen können, dass eventuell bereits ein Datensatz mit gleichem Primärschlüsseleintrag in der Zieltabelle vorhanden ist, wird in der Fehlerroutine auf eine mögliche Schlüsselverletzung (Fehler 3022) reagiert und die Quelle einfach weiter durchlaufen.

Datenübertragung mittels SQL

Eine elegantere Lösung stellt die Verwendung einer passenden gespeicherten SQL-Abfrage für das Füllen der Zieltabelle dar.

Ziel soll es auch hier sein, alle Bundesländer aus der Tabelle tbl_app_LaenderKreiseGemeinden in die temporäre Tabelle tbl_ref_Bundeslaender zu übertragen. Im Gegensatz zur codebasierten Lösung muss das SQL-Statement selbst berücksichtigen, dass eventuelle Daten in der Zieltabelle vorhanden sind. Der Lösungsansatz ist ein OUTER JOIN, der die Quell- und die Zieltabelle miteinander über ihre Schlüsselfelder verbindet. Bevor Sie das komplette SQL-Statement verwenden, schauen Sie sich zunächst das SQL-Statement für die Ermittlung der Daten an (siehe Bild 5). Die Quelltabelle tbl_app_LaenderKreiseGemeinden und die Zieltabelle tbl_ref_BundesLaender sind über die Felder Gemeindeschluessel und Schluessel miteinander verknüpft.

pic005.tif

Bild 5: Ein OUTER JOIN für die Ermittlung der benötigten Daten

Die Besonderheit dieser Verbindung ist die Richtung des unscheinbaren Pfeils. Bei dieser Art der Verbindung handelt es sich um einen OUTER JOIN, der Folgendes ausdrückt: “Zeige alle Daten aus tbl_app_LaenderKreiseGemeinden an, unabhängig davon, ob es in der Tabelle tbl_ref_BundesLaender Datensätze mit gleichem Schlüsselwert gibt.”

Schauen Sie sich anschließend die Abfragekriterien an, dürfte Ihnen die Erklärung für die Einschränkungen leicht fallen. Die Zieltabelle soll ausschließlich mit den Bundesländern gefüllt werden; somit muss als erstes Kriterium die Einschränkung auf das Feld Type gesetzt werden. Das zweite Kriterium definiert, dass ausschließlich Daten aus der Quelle angezeigt werden sollen, die noch nicht in der Zieltabelle vorhanden sind. Sofern sich in der Zieltabelle bereits Daten befinden, werden diese Daten durch die Abfrage ausgeschlossen. Angezeigt werden ausschließlich die Felder Gemeindeschlüssel und RegionName.

Mit Hilfe einer Anfügeabfrage lassen sich nun die durch diese Abfrage ermittelten Daten in die Zieltabelle übertragen. Das vollständige SQL-Statement sieht dann wie folgt aus:

INSERT INTO tbl_ref_BundesLaender
(Schluessel, BundesLand)
SELECT Gemeindeschluessel, RegionName
FROM tbl_app_LaenderKreiseGemeinden LEFT JOIN tbl_ref_Bundeslaender
ON (tbl_app_LaenderKreiseGemeinden.Gemeindeschluessel = tbl_ref_Bundeslaender.Schluessel)
WHERE Type="L" AND Schluessel Is Null

Sowohl die Auswahl- als auch die Anfügeabfrage sind in der Beispieldatenbank vorhanden. Wenn Sie sich den Code für die Ausführung der Abfrage anschauen, werden Sie feststellen, dass er nicht so kompliziert und auch leichter zu pflegen ist (s. Listing 2). Letztendlich wird der eigentliche Aufruf auf zwei Zeilen reduziert. Zunächst wird eine Instanz des Datenbankobjektes referenziert, um anschließend über dieses Datenbankobjekt die eigentliche Abfrage qry_Append_Bundeslaender auszuführen.

Listing 2: Import von Daten in die temporäre Tabelle via gespeicherter Abfrage

Private Sub StartSQLImport()
     On Error GoTo ErrorHandler
     Call DoCmd.Hourglass(True)
     SQLStartTime = Now()
     Set db = DBEngine(0)(0)
     db.Execute "qry_Append_BundesLaender", dbFailOnError
ExitCode:
     On Error Resume Next
     Set db = Nothing
     SQLFinishTime = Now()
     Me.Recalc
     Call DoCmd.Hourglass(False)
     Exit Sub
ErrorHandler:
     MsgBox Err.Description, vbInformation
     Resume ExitCode
End Sub

Hinweise zu den
Ausführungsgeschwindigkeiten

Bei den Tests mit den einzelnen Varianten war besonders interessant, welche Variante die schnellere ist. Letztendlich waren die Zeitunterschiede gering. Sofern Sie Wert darauf legen, Ihren Anwendern durch Aktivitäten auf dem Bildschirm den Fortschritt der übertragung anzuzeigen, sollten Sie die erste Variante verwenden. Sie lässt mehr Spielraum für Interaktivität.

Anwendungsgebiet “Ergebnis-/Zwischentabellen”

Sicherlich haben Sie auch schon das eine oder andere Mal einen Bericht erstellt, für den Zwischenergebnisse erzeugt und angewendet werden müssen. Auch für diesen Anwendungsbereich bieten sich temporäre Tabellen an.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar