Wenn Sie eine Datenbank entwickeln, die Sie an einen oder mehrere Kunden weitergeben, enthält diese oft noch Testdaten, Tools, die Sie zur Entwicklung benötigen et cetera. Vielleicht entwickeln Sie sogar Datenbanken für mehrere Zielversionen von Access, die unterschiedliche Anforderungen haben. Oder Sie wollen schnell Versionen mit unterschiedlichen Funktionsumgängen exportieren. Die hier vorgestellte Lösung zeigt einige Techniken, um dies zu bewerkstelligen. Der Vorteil etwa gegenüber den eingebauten Importieren-Funktionen ist, dass Sie hier vollständige Konfigurationen speichern können.
Gerade in der Startphase einer Anwendung, die Sie für einen oder mehrere Kunden oder Arbeitsplätze entwickeln, werden Sie des öfteren neue Versionen mit Erweiterungen oder Fehlerkorrekturen ausliefern. Wenn Sie die Anwendung dabei von Objekten befreien möchten oder diese in verschiedenen Fassungen herausgeben möchten, steht mit jeder neuen Version eine Menge Handarbeit an, um aus der Entwicklungsversion die Version für den Kunden zu extrahieren.
Und es gibt eine ganze Reihe von Anwendungsfällen, die unsere Lösung, deren Benutzeroberfläche etwa wie in Bild 1 aussieht, enthalten könnte:
Bild 1: Der Export-Helfer für Access-Datenbanken
- Auswahl von Tabellen und Angabe, ob diese mit oder ohne Daten exportiert werden sollen
- Auswahl von Abfragen
- Auswahl von Formularen
- Auswahl von Berichten
- Auswahl von Makros
- Auswahl von Modulen
- Suchen und Ersetzen in den Daten von Tabellen in Modulen, um Testdaten zu löschen oder durch Dummy-Daten zu ersetzen
- übertragen von Verweisen
- übertragen von Ribbon-Definitionen
- übertragen von Menüleisten
- Ausführen von SQL-Anweisungen für spezielle Anforderungen, die auf die Zielanwendung angewendet werden sollen
- übertragen von Eigenschaften
- Verschiedene Access-Versionen als Ziel
Nicht alle Funktionen werden in diesem Beitrag beziehungsweise in der mit diesem Beitrag veröffentlichten Lösung umgesetzt.
Art der Lösung
Diese Lösung ließe sich prima als Add-In programmieren und dann von allen Datenbanken aus aufrufen, die exportiert werden sollen. Allerdings beziehen sich die Konfigurationsdaten jeweils auf die eine Datenbank, auf deren Objekte und Eigenschaften der Export zugeschnitten ist – daher haben wir uns entschieden, die Lösung als Satz von Objekten zu programmieren, die Sie in die Zieldatenbank importieren. Dort können Sie in den dazugehörenden Tabellen dann problemlos genau die Konfiguration für die jeweilige Datenbank speichern.
Die Lösung besteht aus einigen Tabellen, Formularen und Modulen, die alle mit dem üblichen Präfix beginnen, dann den Text Export_ und schließlich die eigentliche Bezeichnung des Inhalts enthalten (bei Unterformularen zusätzlich sfm).
Dies sind die Tabellen, die Sie in die Zieldatenbank importieren müssen, um die Lösung darin zu nutzen:
- tblExport_Exporte
- tblExport_Objekte
- tblExport_ObjekteExporte
- tblExport_Objekttypen
- tblExport_Optionen
- tblExport_SQLAnweisungen
- tblExport_SQLAnweisungenExporte
- tblExport_SuchenErsetzen
- tblExport_Verweise
- tblExport_VerweiseExporte
- tblExport_Zielversionen
Und diese Formulare benötigen Sie:
- frmExport_Main
- frmExport_sfmOptionen
- frmExport_sfmAbfragen
- frmExport_sfmBerichte
- frmExport_sfmFormulare
- frmExport_sfmMakros
- frmExport_sfmModule
- frmExport_sfmSQLAnweisungen
- frmExport_sfmSuchenErsetzen
- frmExport_sfmTabellen
- frmExport_sfmVerweise
Außerdem benötigen Sie noch das Modul mdlExport_Tools.
Basis: Die Konfiguration
Die Basis der in der Lösung verwalteten Daten bildet eine einzelne Konfiguration. Eine neue Konfiguration legen Sie mit der Schaltfläche rechts neben dem Kombinationsfeld Bezeichnung an. Vorhandene Konfigurationen wählen Sie mit diesem Kombinationsfeld aus – s. Bild 2. Dieses Kombinationsfeld bezieht seine Daten aus der Tabelle tblExporte_Exporte, deren Entwurf Sie in Bild 3 finden.
Bild 2: Auswahl einer Konfiguration
Bild 3: Entwurf der Tabelle zum Speichern der Konfigurationen
Das Feld Exportbezeichnung dieser Tabelle ist mit einem eindeutigen Index versehen, damit der Benutzer keine Bezeichnung doppelt anlegen kann.
Das Kombinationsfeld cboBezeichnungen verwendet die folgende Abfrage als Datensatzherkunft:
SELECT ExportID, -Exportbezeichnung FROM tblExport_Exporte ORDER BY Exportbezeichnung;
Damit es nur die zweite Spalte des Abfrageergebnisses anzeigt, stellen Sie die Eigenschaft Spaltenanzahl auf den Wert 2 und Spaltenbreiten auf 0cm ein.
Die Schaltfläche rechts vom Kombinationsfeld dient dazu, einen neuen Export und somit einen neuen Eintrag in der Tabelle tblExport_Exporte anzulegen.
Sie löst die folgende Prozedur aus:
Private Sub cmdNeuerExport_Click() ExportAnlegen End Sub
Die hier aufgerufene Funktion ExportAnlegen erledigt die eigentliche Arbeit (s. Listing 1). Sie fragt zunächst mit einer InputBox die Bezeichnung für die neue Exportkonfiguration ab und speichert das Ergebnis in der Variablen strExport. Eine per Execute-Methode ausgeführte INSERT INTO-SQL-Abfrage legt dann einen neuen Datensatz mit der soeben ermittelten Bezeichnung in der Tabelle tblExport_Exporte an. Die folgende Anweisung ermittelt dann mit SELECT @@IDENTITY den Primärschlüsselwert des neuen Datensatzes und schreibt diesen in die Variable lngExportID.
Private Function ExportAnlegen() As Long Dim strExport As String Dim db As DAO.Database Dim lngExportID As Long Set db = CurrentDb strExport = InputBox("Bitte geben Sie eine Bezeichnung für den Export ein.", "Exportbezeichnung", "[Exportbezeichnung]") db.Execute "INSERT INTO tblExport_Exporte(Exportbezeichnung) VALUES(''" & strExport & "'')", dbFailOnError lngExportID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0) Me!cboBezeichnungen.Requery Me!cboBezeichnungen = lngExportID Me.Requery Me.Recordset.FindFirst "ExportID = " & lngExportID End Function
Listing 1: Diese Prozedur fragt die notwendigen Informationen zum Anlegen eines neuen Exports ab.
Dann aktualisiert die Prozedur die Datensatzherkunft des Kombinationsfeldes und stellt dieses auf den neuen Eintrag ein. Auch die Datenherkunft des Formulars wird aktualisiert und entsprechend mit FindFirst auf den neuen Datensatz eingestellt.
Datenherkunft des Formulars
Damit kommen wir zur Datenherkunft des Formulars frmExport_Exporte selbst. Diese besteht schlicht und einfach aus der Tabelle tblExport_Exporte.
Beim Laden des Formulars
Gleich nach dem öffnen des Formulars wird das Ereignis Beim Laden ausgelöst. Die dadurch aufgerufene Prozedur sieht wie folgt aus:
Private Sub Form_Load() If IsNull(Me!ExportID) Then ExportAnlegen End If ObjekteEinlesen Me!cboBezeichnungen = Me!ExportID End Sub
Hier findet sich also ein weiterer Aufruf der Funktion ExportAnlegen, der aber nur aufgerufen wird, wenn das Feld ExportID den Wert Null enthält. Dies ist aber nur der Fall, wenn die Datenherkunft des Formulars noch gar keinen Datensatz enthält – also dann, wenn Sie die Objekte der Lösung frisch in die Zielanwendung importiert haben und die Tabelle tblExport_Exporte leer ist.
Anschließend ruft die Prozedur die Routine ObjekteEinlesen auf, welche – kurz zusammengefasst – alle Objekte der Datenbank ermittelt und in einige weitere Tabellen einträgt.
Schließlich stellt die Prozedur das Kombinationsfeld cboBezeichnungen auf den aktuellen Wert des Feldes ExportID des Formulars ein. Auf diese Weise werden Daten im Formular und im Kombinationsfeld synchronisiert.
Objekte einlesen
Die Prozedur ObjekteEinlesen wird sowohl beim öffnen des Formulars ausgelöst als auch durch eine eigene Schaltfläche im Fuß des Formulars. Dies dient dem Benutzer als Möglichkeit, die im Formular angezeigten Daten etwa nach dem Anlegen oder Löschen von Objekten zu aktualisieren. Die Schaltfläche heißt cmdObjekteAktualisieren und enthält lediglich den Aufruf der Routine ObjekteEinlesen:
Private Sub cmdObjekteAktualisieren_ Click() ObjekteEinlesen End Sub
Die Prozedur ObjekteEinlesen selbst finden Sie in Listing 2. Die Prozedur füllt eine Database-Variable mit einem Verweis auf die aktuelle Datenbank und speichert die ID des aktuell angezeigten Exports in der Variablen lngExportID. Dann beginnt sie mit der Bearbeitung einer Tabelle, die wir bisher noch nicht vorgestellt haben. Sie heißt tblExport_Objekte und erfasst alle in der aktuellen Datenbank enthaltenen Objekte. Den Entwurf finden Sie in Bild 4, die Erläuterungen dazu folgen gleich im Anschluss.
Bild 4: Entwurf der Tabelle zum Speichern der Objekte
Private Sub ObjekteEinlesen() Dim db As DAO.Database Dim lngExportID As Long Set db = CurrentDb lngExportID = Me!ExportID db.Execute "UPDATE tblExport_Objekte AS t1 INNER JOIN " _ & "tblExport_ObjekteExporte AS t2 ON t1.ObjektID = t2.ObjektID " _ & "SET t1.Loeschen = -1 WHERE t2.ExportID = " & Me!ExportID, dbFailOnError TabellenEinlesen db, lngExportID AbfragenEinlesen db, lngExportID FormulareEinlesen db, lngExportID BerichteEinlesen db, lngExportID MakrosEinlesen db, lngExportID ModuleEinlesen db, lngExportID VerweiseEinlesen db, lngExportID db.Execute "DELETE FROM tblExport_Objekte WHERE Loeschen = -1", dbFailOnError Me.Requery Me.Recordset.FindFirst "ExportID = " & lngExportID End Sub
Listing 2: Diese Routine startet das Einlesen aller Objekte der aktuellen Datenbank
Die Prozedur aktualisiert nun zunächst eventuell in der Tabelle enthaltene Datensätze, indem sie den Wert des Feldes Loeschen für jeden Datensatz auf den Wert -1 setzt, was dem Wert True entspricht. Der Hintergrund ist, dass die folgenden Prozeduren ja nicht nur alle vorhandenen Objekte in die Tabelle tblExport_Objekte eintragen sollen, sondern dass eventuell gelöschte Objekte, die aber noch in der Tabelle enthalten sind, dort entfernt werden sollen. Anschließend prüfen die folgenden Methoden, ob ein in der Datenbank enthaltenes Objekt bereits in der Tabelle tblExport_Objekte enthalten ist. Falls ja, wird das Feld Geloescht für dieses Objekt auf den Wert False einstellt, falls nicht, wird ein neuer Datensatz für das Objekt angelegt. Datensätze, die dann noch den Wert True im Feld Geloescht aufweisen, sind offensichtlich nicht mehr in der Tabelle enthalten (oder unter einem anderen Namen gespeichert) und können gelöscht werden.
Schließlich aktualisiert die Prozedur die Datenherkünfte des Formulars und somit auch die der Unterformulare mit der Requery-Methode und stellt das Formular auf den zuletzt aktiven Datensatz ein.
Bei dieser Gelegenheit wird auch das Ereignis Beim Anzeigen ausgelöst, das noch das Kombinationsfeld cboBezeichnungen auf den aktuellen Datensatz des Formulars einstellt:
Private Sub Form_Current() Me!cboBezeichnungen = Me!ExportID End Sub
Tabellen einlesen
Die Prozedur TabellenEinlesen wird von der zuvor beschriebenen Prozedur ObjekteEinlesen aufgerufen und erwartet zwei Parameter – einen Verweis auf die zu untersuchende Datenbank sowie den Primärschlüsselwert für den aktuellen Export (s. Listing 3).
Private Sub TabellenEinlesen(db As DAO.Database, lngExportID As Long) Dim tdf As DAO.TableDef Dim i As Integer Dim strFilter() As String Dim strFilterstring As String Dim bolEinlesen As Boolean Dim lngObjektID As Long strFilterstring = Nz(DLookup("Tabellenfilter", "tblExport_Exporte", "ExportID = " & lngExportID), "*") strFilter = Split(strFilterstring, ",") For Each tdf In db.TableDefs bolEinlesen = False For i = LBound(strFilter) To UBound(strFilter) If tdf.Name Like strFilter(i) Then bolEinlesen = True Exit For End If Next i For i = LBound(strFilter) To UBound(strFilter) If "-" & tdf.Name Like strFilter(i) And Left(strFilter(i), 1) = "-" Then bolEinlesen = False Exit For End If Next i If bolEinlesen = True Then On Error Resume Next db.Execute "INSERT INTO tblExport_Objekte(Objektbezeichnung, ObjekttypID, Loeschen) VALUES(''" & tdf.Name _ & "'', 1, 0)", dbFailOnError If Err.Number = 3022 Then lngObjektID = DLookup("ObjektID", "tblExport_Objekte", "Objektbezeichnung = ''" & tdf.Name _ & "'' AND ObjekttypID = 1") db.Execute "UPDATE tblExport_Objekte SET Loeschen = 0 WHERE ObjektID = " & lngObjektID, dbFailOnError Else lngObjektID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0) End If db.Execute "INSERT INTO tblExport_ObjekteExporte(ObjektID, ExportID) VALUES(" & lngObjektID & ", " _ & lngExportID & ")", dbFailOnError On Error GoTo 0 End If Next tdf End Sub
Listing 3: Einlesen der Tabellen der aktuellen Datenbank und eintragen in die Tabelle tblExport_Objekte
Die Prozedur soll nicht alle Tabellen einlesen, sondern nur solche, die nicht über spezielle Optionen von der Erfassung ausgeschlossen werden sollen – mehr zum Dialog, mit dem Sie diese Optionen festlegen, weiter unten.
Deshalb ermittelt die Prozedur nun zunächst einen entsprechenden Filterstring, der im Feld Tabellenfilter der Tabelle tblExport_Exporte für den Datensatz mit dem entsprechenden Wert im Fremdschlüsselfeld ExportID gespeichert ist. Der Wert, der hier ermittelt und in der Variablen strFilterstring gespeichert wird, könnte etwa wie folgt aussehen (wenn das Feld Tabellenfilter leer ist, wird strFilterstring mit dem Ausdruck * gefüllt):
tbl*,usys*,msysresources,-frmExport_*
Das bedeutet, dass alle Tabellen, die mit tbl und usys beginnen, und die Tabelle msysresources berücksichtigt werden sollen. Die Tabellennamen, die mit einem vorangestellten Minuszeichen versehen wurden, sollen nicht berücksichtigt werden. In diesem Fall sollen also beispielsweise die Tabellen dieser Lösung, deren Namen alle mit tblExport_ beginnen, nicht eingelesen werden.
Die einzelnen Elemente aus strFilterstring werden nun mit der Split-Funktion an der Stelle der Kommata (,) auseinander genommen und jeweils als eigenes Element zum Array strFilter() hinzugefügt.
Die Prozedur durchläuft nun die TableDefs-Auflistung der aktuellen Datenbank in einer For Each-Schleife, wobei die Variable tdf jeweils die aktuelle Tabelle referenziert.
Für jedes Element durchläuft die Prozedur dann in einer untergeordneten For…Next-Schleife alle Einträge des Arrays mit den Filterausdrücken. Stimmt der Name der aktuellen Tabelle mit dem Filterausdruck überein, stellt die Prozedur die Variable bolEinlesen auf den Wert True ein und verlässt die Schleife. Nun kann es sein, dass etwa der Eintrag tblExport_Exporte dem Kriterium tbl* entspricht, aber auch -tblExport_*. Dann durchläuft die Prozedur im nächsten Schritt in einer weiteren Schleife alle Filterausdrücke und stellt dem Tabellennamen diesmal ein Minuszeichen voran (also etwa -tblExport_Exporte). Liegt hier ein Treffer vor, wird bolEinlesen wieder auf False eingestellt und die Schleife wird ebenfalls mit Exit For verlassen.
Die folgende If…Then-Bedingung prüft den Wert von bolEinlesen für dieses TableDef-Objekt. Ist dieser True, versucht die Prozedur, den Tabellennamen in die Tabelle tblExport_Objekte einzutragen – samt dem Wert False im Feld Loeschen. Ist bereits eine Tabelle gleichen Namens vorhanden, bleibt es bei dem Versuch – die resultierende Fehlermeldung wird durch das vorhergehende On Error Resume Next unterbunden. In diesem Fall ermittelt die Prozedur den Primärschlüsselwert für diesen Eintrag und aktualisiert für den gefundenen Datensatz das Feld Loeschen auf den Wert False. Diese Tabelle ist also bereits in tblExport_Objekte gespeichert, es muss nur noch das zuvor auf True eingestellte Feld Loeschen auf False geändert werden, weil die Tabelle ja noch vorhanden ist. War der Eintrag für diese Tabelle noch nicht vorhanden, ermittelt die Prozedur nun den Primärschlüsselwert des neuen Eintrags und speichert diesen in der Variablen lngObjektID.
Möglicherweise fragen Sie sich, warum wir diesen aufwendigen Weg gehen und nicht einfach alle Objekte vor dem erneuten Einlesen löschen. Der Grund ist einfach: Wir sind faul und wollen unnötige Schritte nicht wiederholen, und wir gehen davon aus, dass dies auch bei Ihnen der Fall ist. In diesem Fall wird ja später festgelegt, welche Objekte mit welcher Exportkonfiguration verknüpft werden. Damit wir diese Information nicht nach jedem Einlesen erneut angeben müssen, werden vorhandene Objekte beibehalten und nur nicht mehr vorhandene Objekte aus den Konfigurationstabellen gelöscht.
Den Wert von lngObjektID verwendet die Prozedur, um einen neuen Eintrag zur Tabelle tblExport_ExporteObjekte hinzuzufügen. Dabei erhält das Feld ExportID den in lngExportID enthaltenen Wert und ObjektID den soeben ermittelten Wert der Variablen lngObjektID. Auf diese Weise wird der Eintrag für das Objekt der aktuell im Formular ausgewählten Export-Konfiguration zugeordnet.
Die übrigen Tabellen werden auf die gleiche Weise erfasst und gegebenenfalls zur Tabelle tblExport_Objekte hinzugefügt.
Objekte und Exporte
Die Tabelle tblExport_ExporteObjekte haben wir uns noch nicht angesehen. Der Zweck dieser Tabelle ist es, für jede Export-Konfiguration der Anwendung festzulegen, welche Objekte exportiert werden sollen. Da wir eine Tabelle namens tblExport_Exporte zum Speichern der Exportkonfigurationen verwenden und eine weitere namens tblExport_Objekte (s. Bild 5), welche die Daten zu Tabellen, Abfragen et cetera speichert, benötigen wir noch eine Möglichkeit, diese Daten miteinander zu verknüpfen. Da jedes Objekt mit jeder Export-Konfiguration verknüpft werden soll, ist eine Verknüpfungstabelle zur Herstellung einer m:n-Beziehung gefragt.
Bild 5: In der Tabelle tblExport_Objekte gespeicherte Objekte
Diese sieht im Entwurf wie in Bild 6 aus und enthält die beiden Fremdschlüsselfelder ObjektID und ExportID, für die ein zusammengesetzter, eindeutiger Index festgelegt ist – schließlich soll jedes Objekt jeder Exportkonfiguration nur einmal zugeordnet werden können. Das Feld Exportieren ist ein Ja/Nein-Feld, das festlegt, ob dieses Objekt in der angegebenen Exportkonfiguration berücksichtigt wird. Bei den Tabellen kann der Benutzer zusätzlich festlegen, ob er diese mit oder ohne Daten exportieren möchte. Dies stellt er, ebenfalls konfigurationsabhängig, im Feld MitDaten der Tabelle tblExport_ExporteObjekte ein.
Bild 6: Entwurf der Tabelle tblExport_ExporteObjekte
Nach dem Aufruf der Prozeduren zum Einlesen der Objekte sieht diese Tabelle in der Datenblattansicht etwa wie in Bild 7 aus.
Bild 7: Daten der Tabelle tblExport_ExporteObjekte
Abfragen einlesen
Die Prozedur AbfragenEinlesen ist prinzipiell wie die Prozedur TabellenEinlesen aufgebaut – daher wollen wir diese hier nicht ausführlich beschreiben.
Die Unterschiede liegen im Wesentlichen darin, dass diese Prozedur ihren Filter aus dem Feld Abfragefilter der Tabelle tblExport_Exporte bezieht und die QueryDefs-Auflistung zur Ermittlung der Abfragen durchläuft.
Außerdem stellt sie beim Eintragen der Abfragen in die Tabelle tblExport_Objekte für das Feld ObjekttypID den dem Objekttyp entsprechenden Wert ein.
Formulare und Berichte einlesen
Das Einlesen der Formulare und Berichte verläuft ebenfalls so ähnlich wie das der Tabellen und Abfragen. Allerdings gibt es ein paar Unterschiede, die Sie auch in Listing 4 ablesen können. Die dort dargestellte Prozedur FormulareEinlesen verwendet den Filterausdruck aus dem Feld Formularfilter. Um die richtigen Objekte zu ermitteln, verwendet diese Prozedur allerdings keine Auflistung der DAO-Bibliothek wie TableDefs oder QueryDefs, sondern diesmal die AllForms-Auflistung des CurrentProject-Objekts. Beim Eintragen der Daten in die Tabelle tblExport_Objekte verwendet die Prozedur für das Feld ObjekttypID den Wert 3. Die Werte für den Objekttyp beziehungsweise für das Fremdschlüsselfeld ObjekttypID stammen übrigens aus der Tabelle tblExport_Objekttypen, die Sie in Bild 8 finden. Das Einlesen der Berichte erfolgt analog zu den Formularen, Gleiches gilt für die Makros und Module.
Bild 8: Die Tabelle tblExport_Objekttypen
Verweise einlesen
Neben den Objekten sollen auch die Verweise der aktuellen Datenbank eingelesen werden. Dies erledigt die Prozedur VerweiseEinlesen, welche die gleichen Parameter erwartet wie die zuvor beschriebenen Prozeduren (s. Listing 5).
Private Sub VerweiseEinlesen(db As DAO.Database, lngExportID As Long) Dim ref As VBIDE.Reference Dim lngVerweisID As Long Dim lngID As Long db.Execute "UPDATE tblExport_Verweise SET Loeschen = True", dbFailOnError For Each ref In VBE.ActiveVBProject.References On Error Resume Next db.Execute "INSERT INTO tblExport_Verweise(Verweisname, VerweisGUID) VALUES(''" & ref.Name & "'', ''" _ & ref.GUID & "'')", dbFailOnError If Err.Number = 3022 Then db.Execute "UPDATE tblExport_Verweise SET Loeschen = False WHERE Verweisname = ''" & ref.Name & "''", dbFailOnError lngVerweisID = db.OpenRecordset("SELECT VerweisID FROM tblExport_Verweise WHERE Verweisname = ''" _ & ref.Name & "''").Fields(0) Else lngVerweisID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0) End If On Error GoTo 0 On Error Resume Next db.Execute "INSERT INTO tblExport_VerweiseExporte(VerweisID, ExportID, Major, Minor) VALUES(" _ & lngVerweisID & ", " & lngExportID & ", " & ref.Major & ", " & ref.Minor & ")", dbFailOnError If Err.Number = 3022 Then On Error GoTo 0 lngID = DLookup("VerweisExportID", "tblExport_VerweiseExporte", "ExportID = " & lngExportID _ & " AND VerweisID = " & lngVerweisID) db.Execute "UPDATE tblExport_VerweiseExporte SET Major = " & ref.Major & ", Minor = " & ref.Minor _ & " WHERE VerweisExportID = " & lngID, dbFailOnError End If On Error GoTo 0 Next ref db.Execute "DELETE FROM tblExport_Verweise WHERE Loeschen = True", dbFailOnError End Sub
Listing 5: Einlesen der Verweise der aktuellen Datenbank und eintragen in die Tabelle tblExport_Verweise
Die Prozedur stellt zunächst den Wert des Feldes Loeschen der Tabelle tblExport_Verweise auf den Wert True ein. Hier wird gleich deutlich: Die Verweise speichern wir nicht gemeinsam mit den übrigen Objekten in der Tabelle tblExport_Objekte, sondern in einer eigenen Tabelle. Diese sieht im Entwurf wie in Bild 9 aus. Sie enthält neben dem Feld Verweisname, für das übrigens wieder ein eindeutiger Index definiert ist, noch ein weiteres Feld namens VerweisGUID. Dieses ist wichtig, wenn Sie die Verweise zur Zieldatenbank hinzufügen. Schließlich finden Sie auch hier das Feld Loeschen, mit dem zu löschende Verweise markiert werden.
Bild 9: Die Tabelle tblExport_Verweise
Die Prozedur VerweiseEinlesen durchläuft in einer For Each-Schleife alle Elemente der Auflistung References für das mit dem Objekt ActiveVBProject referenzierte Projekt der aktuellen Anwendung. Der jeweilige Verweis landet in der Variablen ref. Innerhalb der Schleife versucht die Prozedur, einen Datensatz mit den entsprechenden Informationen zur Tabelle tblExport_Verweise hinzuzufügen. Gelingt dies nicht, weil es bereits einen Eintrag mit gleichem Verweisnamen gibt, aktualisiert die Prozedur diesen Eintrag, indem sie den Wert des Feldes Loeschen von True auf False ändert.
Sie ermittelt in beiden Fällen den Wert des Primärschlüssels des betroffenen Eintrags, um einen entsprechenden Eintrag zur Verknüpfungstabelle tblExport_ExporteVerweise hinzuzufügen (den Entwurf dieser Tabelle finden Sie in Bild 10). Diese Tabelle hat den gleichen Zweck wie die Tabelle tblExport_ExporteObjekte: Sie soll festlegen, welcher Verweis für die entsprechende Exportkonfiguration verwendet werden soll. Auch hier werden nur noch nicht vorhandene Datensätze neu angelegt, für bereits vorhandene Kombinationen aus ExportID und VerweisID aktualisiert die Prozedur lediglich die Version der Verweise in den beiden Feldern Major und Minor.
Bild 10: Die Tabelle tblExport_VerweiseExporte
Damit haben wir soweit alle Informationen gesammelt, die sich auf die Objekte und Verweise beziehen.
Objekte für den Export auswählen
Im Formular frmExport_Main lassen sich diese Daten natürlich nicht direkt darstellen – dazu benötigen wir einen Rutsch Unterformulare. Da auch diese nicht alle gleichzeitig in einem Formular abgebildet werden sollen, fügen Sie dem Formular frmExport_Main ein Registersteuerelement namens regObjekte hinzu. Dieses nimmt für jeden Objekttyp eine eigene Seite auf, also beispielsweise pgeTabellen, pgeAbfragen, pgeFormulare und so weiter. Später kommen noch weitere hinzu.
Für jeden Objekttyp legen Sie ein eigenes Unterformular an. Das Unterformular für die Anzeige der Tabellen heißt beispielsweise frmExport_sfmTabellen und verwendet die Abfrage aus Bild 11 als Datenherkunft.
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