{"id":55000939,"date":"2014-06-01T00:00:00","date_gmt":"2020-05-22T21:21:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=939"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenbankexport","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/","title":{"rendered":"Datenbankexport"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/1717c9b163544b68aced827104972939\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie eine Datenbank entwickeln, die Sie an einen oder mehrere Kunden weitergeben, enth&auml;lt diese oft noch Testdaten, Tools, die Sie zur Entwicklung ben&ouml;tigen et cetera. Vielleicht entwickeln Sie sogar Datenbanken f&uuml;r mehrere Zielversionen von Access, die unterschiedliche Anforderungen haben. Oder Sie wollen schnell Versionen mit unterschiedlichen Funktionsumg&auml;ngen exportieren. Die hier vorgestellte L&ouml;sung zeigt einige Techniken, um dies zu bewerkstelligen. Der Vorteil etwa gegen&uuml;ber den eingebauten Importieren-Funktionen ist, dass Sie hier vollst&auml;ndige Konfigurationen speichern k&ouml;nnen.<\/b><\/p>\n<p>Gerade in der Startphase einer Anwendung, die Sie f&uuml;r einen oder mehrere Kunden oder Arbeitspl&auml;tze entwickeln, werden Sie des &ouml;fteren neue Versionen mit Erweiterungen oder Fehlerkorrekturen ausliefern. Wenn Sie die Anwendung dabei von Objekten befreien m&ouml;chten oder diese in verschiedenen Fassungen herausgeben m&ouml;chten, steht mit jeder neuen Version eine Menge Handarbeit an, um aus der Entwicklungsversion die Version f&uuml;r den Kunden zu extrahieren.<\/p>\n<p>Und es gibt eine ganze Reihe von Anwendungsf&auml;llen, die unsere L&ouml;sung, deren Benutzeroberfl&auml;che etwa wie in Bild 1 aussieht, enthalten k&ouml;nnte:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_001.png\" alt=\"Der Export-Helfer f&uuml;r Access-Datenbanken\" width=\"700\" height=\"665,45\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Der Export-Helfer f&uuml;r Access-Datenbanken<\/span><\/b><\/p>\n<ul>\n<li>Auswahl von Tabellen und Angabe, ob diese mit oder ohne Daten exportiert werden sollen<\/li>\n<li>Auswahl von Abfragen<\/li>\n<li>Auswahl von Formularen<\/li>\n<li>Auswahl von Berichten<\/li>\n<li>Auswahl von Makros<\/li>\n<li>Auswahl von Modulen<\/li>\n<li>Suchen und Ersetzen in den Daten von Tabellen in Modulen, um Testdaten zu l&ouml;schen oder durch Dummy-Daten zu ersetzen<\/li>\n<li>&uuml;bertragen von Verweisen<\/li>\n<li>&uuml;bertragen von Ribbon-Definitionen<\/li>\n<li>&uuml;bertragen von Men&uuml;leisten<\/li>\n<li>Ausf&uuml;hren von SQL-Anweisungen f&uuml;r spezielle Anforderungen, die auf die Zielanwendung angewendet werden sollen<\/li>\n<li>&uuml;bertragen von Eigenschaften<\/li>\n<li>Verschiedene Access-Versionen als Ziel<\/li>\n<\/ul>\n<p>Nicht alle Funktionen werden in diesem Beitrag beziehungsweise in der mit diesem Beitrag ver&ouml;ffentlichten L&ouml;sung umgesetzt.<\/p>\n<p><b>Art der L&ouml;sung<\/b><\/p>\n<p>Diese L&ouml;sung lie&szlig;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 &#8211; daher haben wir uns entschieden, die L&ouml;sung als Satz von Objekten zu programmieren, die Sie in die Zieldatenbank importieren. Dort k&ouml;nnen Sie in den dazugeh&ouml;renden Tabellen dann problemlos genau die Konfiguration f&uuml;r die jeweilige Datenbank speichern.<\/p>\n<p>Die L&ouml;sung besteht aus einigen Tabellen, Formularen und Modulen, die alle mit dem &uuml;blichen Pr&auml;fix beginnen, dann den Text <b>Export_ <\/b>und schlie&szlig;lich die eigentliche Bezeichnung des Inhalts enthalten (bei Unterformularen zus&auml;tzlich <b>sfm<\/b>).<\/p>\n<p>Dies sind die Tabellen, die Sie in die Zieldatenbank importieren m&uuml;ssen, um die L&ouml;sung darin zu nutzen:<\/p>\n<ul>\n<li><b>tblExport_Exporte<\/b><\/li>\n<li><b>tblExport_Objekte<\/b><\/li>\n<li><b>tblExport_ObjekteExporte<\/b><\/li>\n<li><b>tblExport_Objekttypen<\/b><\/li>\n<li><b>tblExport_Optionen<\/b><\/li>\n<li><b>tblExport_SQLAnweisungen<\/b><\/li>\n<li><b>tblExport_SQLAnweisungenExporte<\/b><\/li>\n<li><b>tblExport_SuchenErsetzen<\/b><\/li>\n<li><b>tblExport_Verweise<\/b><\/li>\n<li><b>tblExport_VerweiseExporte<\/b><\/li>\n<li><b>tblExport_Zielversionen<\/b><\/li>\n<\/ul>\n<p>Und diese Formulare ben&ouml;tigen Sie:<\/p>\n<ul>\n<li><b>frmExport_Main<\/b><\/li>\n<li><b>frmExport_sfmOptionen<\/b><\/li>\n<li><b>frmExport_sfmAbfragen<\/b><\/li>\n<li><b>frmExport_sfmBerichte<\/b><\/li>\n<li><b>frmExport_sfmFormulare<\/b><\/li>\n<li><b>frmExport_sfmMakros<\/b><\/li>\n<li><b>frmExport_sfmModule<\/b><\/li>\n<li><b>frmExport_sfmSQLAnweisungen<\/b><\/li>\n<li><b>frmExport_sfmSuchenErsetzen<\/b><\/li>\n<li><b>frmExport_sfmTabellen<\/b><\/li>\n<li><b>frmExport_sfmVerweise<\/b><\/li>\n<\/ul>\n<p>Au&szlig;erdem ben&ouml;tigen Sie noch das Modul <b>mdlExport_Tools<\/b>.<\/p>\n<p><b>Basis: Die Konfiguration<\/b><\/p>\n<p>Die Basis der in der L&ouml;sung verwalteten Daten bildet eine einzelne Konfiguration. Eine neue Konfiguration legen Sie mit der Schaltfl&auml;che rechts neben dem Kombinationsfeld <b>Bezeichnung <\/b>an. Vorhandene Konfigurationen w&auml;hlen Sie mit diesem Kombinationsfeld aus &#8211; s. Bild 2. Dieses Kombinationsfeld bezieht seine Daten aus der Tabelle <b>tblExporte_Exporte<\/b>, deren Entwurf Sie in Bild 3 finden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_002.png\" alt=\"Auswahl einer Konfiguration\" width=\"650\" height=\"147,3445\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Auswahl einer Konfiguration<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_003.png\" alt=\"Entwurf der Tabelle zum Speichern der Konfigurationen\" width=\"650\" height=\"493,5185\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurf der Tabelle zum Speichern der Konfigurationen<\/span><\/b><\/p>\n<p>Das Feld <b>Exportbezeichnung <\/b>dieser Tabelle ist mit einem eindeutigen Index versehen, damit der Benutzer keine Bezeichnung doppelt anlegen kann.<\/p>\n<p>Das Kombinationsfeld <b>cboBezeichnungen <\/b>verwendet die folgende Abfrage als Datensatzherkunft:<\/p>\n<pre>SELECT ExportID, -Exportbezeichnung \r\nFROM tblExport_Exporte \r\nORDER BY Exportbezeichnung;<\/pre>\n<p>Damit es nur die zweite Spalte des Abfrageergebnisses anzeigt, stellen Sie die Eigenschaft <b>Spaltenanzahl <\/b>auf den Wert <b>2 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0cm <\/b>ein. <\/p>\n<p>Die Schaltfl&auml;che rechts vom Kombinationsfeld dient dazu, einen neuen Export und somit einen neuen Eintrag in der Tabelle <b>tblExport_Exporte <\/b>anzulegen.<\/p>\n<p>Sie l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuerExport_Click()\r\n     ExportAnlegen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die hier aufgerufene Funktion <b>ExportAnlegen<\/b> erledigt die eigentliche Arbeit (s. Listing 1). Sie fragt zun&auml;chst mit einer <b>InputBox <\/b>die Bezeichnung f&uuml;r die neue Exportkonfiguration ab und speichert das Ergebnis in der Variablen <b>strExport<\/b>. Eine per <b>Execute<\/b>-Methode ausgef&uuml;hrte <b>INSERT INTO<\/b>-SQL-Abfrage legt dann einen neuen Datensatz mit der soeben ermittelten Bezeichnung in der Tabelle <b>tblExport_Exporte <\/b>an. Die folgende Anweisung ermittelt dann mit <b>SELECT @@IDENTITY <\/b>den Prim&auml;rschl&uuml;sselwert des neuen Datensatzes und schreibt diesen in die Variable <b>lngExportID<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ExportAnlegen()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strExport<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>lngExportID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strExport = InputBox(\"Bitte geben Sie eine Bezeichnung f&uuml;r den Export ein.\", \"Exportbezeichnung\", \"[Exportbezeichnung]\")\r\n     db.Execute \"INSERT INTO tblExport_Exporte(Exportbezeichnung) VALUES(''\" & strExport & \"'')\", dbFailOnError\r\n     lngExportID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n     Me!cboBezeichnungen.Requery\r\n     Me!cboBezeichnungen = lngExportID\r\n     Me.Requery\r\n     Me.Recordset.FindFirst \"ExportID = \" & lngExportID\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Diese Prozedur fragt die notwendigen Informationen zum Anlegen eines neuen Exports ab.<\/span><\/b><\/p>\n<p>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 <b>FindFirst <\/b>auf den neuen Datensatz eingestellt.<\/p>\n<p><b>Datenherkunft des Formulars<\/b><\/p>\n<p>Damit kommen wir zur Datenherkunft des Formulars <b>frmExport_Exporte <\/b>selbst. Diese besteht schlicht und einfach aus der Tabelle <b>tblExport_Exporte<\/b>.<\/p>\n<p><b>Beim Laden des Formulars<\/b><\/p>\n<p>Gleich nach dem &ouml;ffnen des Formulars wird das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st. Die dadurch aufgerufene Prozedur sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!ExportID)<span style=\"color:blue;\"> Then<\/span>\r\n         ExportAnlegen\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ObjekteEinlesen\r\n     Me!cboBezeichnungen = Me!ExportID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier findet sich also ein weiterer Aufruf der Funktion <b>ExportAnlegen<\/b>, der aber nur aufgerufen wird, wenn das Feld <b>ExportID <\/b>den Wert <b>Null <\/b>enth&auml;lt. Dies ist aber nur der Fall, wenn die Datenherkunft des Formulars noch gar keinen Datensatz enth&auml;lt &#8211; also dann, wenn Sie die Objekte der L&ouml;sung frisch in die Zielanwendung importiert haben und die Tabelle <b>tblExport_Exporte <\/b>leer ist.<\/p>\n<p>Anschlie&szlig;end ruft die Prozedur die Routine <b>ObjekteEinlesen <\/b>auf, welche &#8211; kurz zusammengefasst &#8211; alle Objekte der Datenbank ermittelt und in einige weitere Tabellen eintr&auml;gt.<\/p>\n<p>Schlie&szlig;lich stellt die Prozedur das Kombinationsfeld <b>cboBezeichnungen <\/b>auf den aktuellen Wert des Feldes <b>ExportID <\/b>des Formulars ein. Auf diese Weise werden Daten im Formular und im Kombinationsfeld synchronisiert.<\/p>\n<p><b>Objekte einlesen<\/b><\/p>\n<p>Die Prozedur <b>ObjekteEinlesen<\/b> wird sowohl beim &ouml;ffnen des Formulars ausgel&ouml;st als auch durch eine eigene Schaltfl&auml;che im Fu&szlig; des Formulars. Dies dient dem Benutzer als M&ouml;glichkeit, die im Formular angezeigten Daten etwa nach dem Anlegen oder L&ouml;schen von Objekten zu aktualisieren. Die Schaltfl&auml;che hei&szlig;t <b>cmdObjekteAktualisieren <\/b>und enth&auml;lt lediglich den Aufruf der Routine <b>ObjekteEinlesen<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdObjekteAktualisieren_ Click()\r\n     ObjekteEinlesen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>ObjekteEinlesen<\/b> selbst finden Sie in Listing 2. Die Prozedur f&uuml;llt eine <b>Database<\/b>-Variable mit einem Verweis auf die aktuelle Datenbank und speichert die ID des aktuell angezeigten Exports in der Variablen <b>lngExportID<\/b>. Dann beginnt sie mit der Bearbeitung einer Tabelle, die wir bisher noch nicht vorgestellt haben. Sie hei&szlig;t <b>tblExport_Objekte <\/b>und erfasst alle in der aktuellen Datenbank enthaltenen Objekte. Den Entwurf finden Sie in Bild 4, die Erl&auml;uterungen dazu folgen gleich im Anschluss.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_004.png\" alt=\"Entwurf der Tabelle zum Speichern der Objekte\" width=\"575\" height=\"137,8703\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf der Tabelle zum Speichern der Objekte<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ObjekteEinlesen()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>lngExportID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngExportID = Me!ExportID\r\n     db.Execute \"UPDATE tblExport_Objekte AS t1 INNER JOIN \" _\r\n         & \"tblExport_ObjekteExporte AS t2 ON t1.ObjektID = t2.ObjektID \" _\r\n         & \"SET t1.Loeschen = -1 WHERE t2.ExportID = \" & Me!ExportID, dbFailOnError\r\n     TabellenEinlesen db, lngExportID\r\n     AbfragenEinlesen db, lngExportID\r\n     FormulareEinlesen db, lngExportID\r\n     BerichteEinlesen db, lngExportID\r\n     MakrosEinlesen db, lngExportID\r\n     ModuleEinlesen db, lngExportID\r\n     VerweiseEinlesen db, lngExportID\r\n     db.Execute \"DELETE FROM tblExport_Objekte WHERE Loeschen = -1\", dbFailOnError\r\n     Me.Requery\r\n     Me.Recordset.FindFirst \"ExportID = \" & lngExportID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Diese Routine startet das Einlesen aller Objekte der aktuellen Datenbank<\/span><\/b><\/p>\n<p>Die Prozedur aktualisiert nun zun&auml;chst eventuell in der Tabelle enthaltene Datens&auml;tze, indem sie den Wert des Feldes <b>Loeschen <\/b>f&uuml;r jeden Datensatz auf den Wert <b>-1 <\/b>setzt, was dem Wert <b>True <\/b>entspricht. Der Hintergrund ist, dass die folgenden Prozeduren ja nicht nur alle vorhandenen Objekte in die Tabelle <b>tblExport_Objekte <\/b>eintragen sollen, sondern dass eventuell gel&ouml;schte Objekte, die aber noch in der Tabelle enthalten sind, dort entfernt werden sollen. Anschlie&szlig;end pr&uuml;fen die folgenden Methoden, ob ein in der Datenbank enthaltenes Objekt bereits in der Tabelle <b>tblExport_Objekte <\/b>enthalten ist. Falls ja, wird das Feld <b>Geloescht <\/b>f&uuml;r dieses Objekt auf den Wert <b>False <\/b>einstellt, falls nicht, wird ein neuer Datensatz f&uuml;r das Objekt angelegt. Datens&auml;tze, die dann noch den Wert <b>True <\/b>im Feld <b>Geloescht <\/b>aufweisen, sind offensichtlich nicht mehr in der Tabelle enthalten (oder unter einem anderen Namen gespeichert) und k&ouml;nnen gel&ouml;scht werden.<\/p>\n<p>Schlie&szlig;lich aktualisiert die Prozedur die Datenherk&uuml;nfte des Formulars und somit auch die der Unterformulare mit der <b>Requery<\/b>-Methode und stellt das Formular auf den zuletzt aktiven Datensatz ein.<\/p>\n<p>Bei dieser Gelegenheit wird auch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st, das noch das Kombinationsfeld <b>cboBezeichnungen <\/b>auf den aktuellen Datensatz des Formulars einstellt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!cboBezeichnungen = Me!ExportID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Tabellen einlesen<\/b><\/p>\n<p>Die Prozedur <b>TabellenEinlesen <\/b>wird von der zuvor beschriebenen Prozedur <b>ObjekteEinlesen <\/b>aufgerufen und erwartet zwei Parameter &#8211; einen Verweis auf die zu untersuchende Datenbank sowie den Prim&auml;rschl&uuml;sselwert f&uuml;r den aktuellen Export (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>TabellenEinlesen(db<span style=\"color:blue;\"> As <\/span>DAO.Database, lngExportID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>tdf<span style=\"color:blue;\"> As <\/span>DAO.TableDef\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilterstring<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolEinlesen<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngObjektID<span style=\"color:blue;\"> As Long<\/span>\r\n     strFilterstring = Nz(DLookup(\"Tabellenfilter\", \"tblExport_Exporte\", \"ExportID = \" & lngExportID), \"*\")\r\n     strFilter = <span style=\"color:blue;\">Split<\/span>(strFilterstring, \",\")\r\n     For Each tdf In db.TableDefs\r\n         bolEinlesen = <span style=\"color:blue;\">False<\/span>\r\n         For i = <span style=\"color:blue;\">LBound<\/span>(strFilter) To <span style=\"color:blue;\">UBound<\/span>(strFilter)\r\n             <span style=\"color:blue;\">If <\/span>tdf.Name Like strFilter(i)<span style=\"color:blue;\"> Then<\/span>\r\n                 bolEinlesen = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n         For i = <span style=\"color:blue;\">LBound<\/span>(strFilter) To <span style=\"color:blue;\">UBound<\/span>(strFilter)\r\n             <span style=\"color:blue;\">If <\/span>\"-\" & tdf.Name Like strFilter(i) And <span style=\"color:blue;\">Left<\/span>(strFilter(i), 1) = \"-\"<span style=\"color:blue;\"> Then<\/span>\r\n                 bolEinlesen = <span style=\"color:blue;\">False<\/span>\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">If <\/span>bolEinlesen = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n             db.Execute \"INSERT INTO tblExport_Objekte(Objektbezeichnung, ObjekttypID, Loeschen) VALUES(''\" & tdf.Name _\r\n                 & \"'', 1, 0)\", dbFailOnError\r\n             <span style=\"color:blue;\">If <\/span>Err.Number = 3022<span style=\"color:blue;\"> Then<\/span>\r\n                 lngObjektID = DLookup(\"ObjektID\", \"tblExport_Objekte\", \"Objektbezeichnung = ''\" & tdf.Name _\r\n                     & \"'' AND ObjekttypID = 1\")\r\n                 db.Execute \"UPDATE tblExport_Objekte SET Loeschen = 0 WHERE ObjektID = \" & lngObjektID, dbFailOnError\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 lngObjektID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             db.Execute \"INSERT INTO tblExport_ObjekteExporte(ObjektID, ExportID) VALUES(\" & lngObjektID & \", \" _\r\n                 & lngExportID & \")\", dbFailOnError\r\n             <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> tdf\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Einlesen der Tabellen der aktuellen Datenbank und eintragen in die Tabelle tblExport_Objekte<\/span><\/b><\/p>\n<p>Die Prozedur soll nicht alle Tabellen einlesen, sondern nur solche, die nicht &uuml;ber spezielle Optionen von der Erfassung ausgeschlossen werden sollen &#8211; mehr zum Dialog, mit dem Sie diese Optionen festlegen, weiter unten.<\/p>\n<p>Deshalb ermittelt die Prozedur nun zun&auml;chst einen entsprechenden Filterstring, der im Feld <b>Tabellenfilter <\/b>der Tabelle <b>tblExport_Exporte <\/b>f&uuml;r den Datensatz mit dem entsprechenden Wert im Fremdschl&uuml;sselfeld <b>ExportID <\/b>gespeichert ist. Der Wert, der hier ermittelt und in der Variablen <b>strFilterstring <\/b>gespeichert wird, k&ouml;nnte etwa wie folgt aussehen (wenn das Feld Tabellenfilter leer ist, wird <b>strFilterstring <\/b>mit dem Ausdruck <b>* <\/b>gef&uuml;llt):<\/p>\n<pre>tbl*,usys*,msysresources,-frmExport_*<\/pre>\n<p>Das bedeutet, dass alle Tabellen, die mit <b>tbl <\/b>und <b>usys <\/b>beginnen, und die Tabelle <b>msysresources <\/b>ber&uuml;cksichtigt werden sollen. Die Tabellennamen, die mit einem vorangestellten Minuszeichen versehen wurden, sollen nicht ber&uuml;cksichtigt werden. In diesem Fall sollen also beispielsweise die Tabellen dieser L&ouml;sung, deren Namen alle mit <b>tblExport_ <\/b>beginnen, nicht eingelesen werden.<\/p>\n<p>Die einzelnen Elemente aus <b>strFilterstring <\/b>werden nun mit der <b>Split<\/b>-Funktion an der Stelle der Kommata (<b>,<\/b>) auseinander genommen und jeweils als eigenes Element zum Array <b>strFilter() <\/b>hinzugef&uuml;gt.<\/p>\n<p>Die Prozedur durchl&auml;uft nun die <b>TableDefs<\/b>-Auflistung der aktuellen Datenbank in einer <b>For Each<\/b>-Schleife, wobei die Variable <b>tdf <\/b>jeweils die aktuelle Tabelle referenziert.<\/p>\n<p>F&uuml;r jedes Element durchl&auml;uft die Prozedur dann in einer untergeordneten <b>For&#8230;Next<\/b>-Schleife alle Eintr&auml;ge des Arrays mit den Filterausdr&uuml;cken. Stimmt der Name der aktuellen Tabelle mit dem Filterausdruck &uuml;berein, stellt die Prozedur die Variable <b>bolEinlesen <\/b>auf den Wert <b>True <\/b>ein und verl&auml;sst die Schleife. Nun kann es sein, dass etwa der Eintrag <b>tblExport_Exporte <\/b>dem Kriterium <b>tbl* <\/b>entspricht, aber auch <b>-tblExport_*<\/b>. Dann durchl&auml;uft die Prozedur im n&auml;chsten Schritt in einer weiteren Schleife alle Filterausdr&uuml;cke und stellt dem Tabellennamen diesmal ein Minuszeichen voran (also etwa <b>-tblExport_Exporte<\/b>). Liegt hier ein Treffer vor, wird <b>bolEinlesen <\/b>wieder auf <b>False <\/b>eingestellt und die Schleife wird ebenfalls mit <b>Exit For <\/b>verlassen.<\/p>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft den Wert von <b>bolEinlesen <\/b>f&uuml;r dieses <b>TableDef<\/b>-Objekt. Ist dieser True, versucht die Prozedur, den Tabellennamen in die Tabelle <b>tblExport_Objekte <\/b>einzutragen &#8211; samt dem Wert <b>False <\/b>im Feld <b>Loeschen<\/b>. Ist bereits eine Tabelle gleichen Namens vorhanden, bleibt es bei dem Versuch &#8211; die resultierende Fehlermeldung wird durch das vorhergehende <b>On Error Resume Next <\/b>unterbunden. In diesem Fall ermittelt die Prozedur den Prim&auml;rschl&uuml;sselwert f&uuml;r diesen Eintrag und aktualisiert f&uuml;r den gefundenen Datensatz das Feld <b>Loeschen <\/b>auf den Wert <b>False<\/b>. Diese Tabelle ist also bereits in <b>tblExport_Objekte <\/b>gespeichert, es muss nur noch das zuvor auf <b>True <\/b>eingestellte Feld <b>Loeschen <\/b>auf <b>False <\/b>ge&auml;ndert werden, weil die Tabelle ja noch vorhanden ist. War der Eintrag f&uuml;r diese Tabelle noch nicht vorhanden, ermittelt die Prozedur nun den Prim&auml;rschl&uuml;sselwert des neuen Eintrags und speichert diesen in der Variablen <b>lngObjektID<\/b>.<\/p>\n<p>M&ouml;glicherweise fragen Sie sich, warum wir diesen aufwendigen Weg gehen und nicht einfach alle Objekte vor dem erneuten Einlesen l&ouml;schen. Der Grund ist einfach: Wir sind faul und wollen unn&ouml;tige Schritte nicht wiederholen, und wir gehen davon aus, dass dies auch bei Ihnen der Fall ist. In diesem Fall wird ja sp&auml;ter festgelegt, welche Objekte mit welcher Exportkonfiguration verkn&uuml;pft werden. Damit wir diese Information nicht nach jedem Einlesen erneut angeben m&uuml;ssen, werden vorhandene Objekte beibehalten und nur nicht mehr vorhandene Objekte aus den Konfigurationstabellen gel&ouml;scht.<\/p>\n<p><!--30percent--><\/p>\n<p>Den Wert von <b>lngObjektID<\/b> verwendet die Prozedur, um einen neuen Eintrag zur Tabelle <b>tblExport_ExporteObjekte <\/b>hinzuzuf&uuml;gen. Dabei erh&auml;lt das Feld <b>ExportID <\/b>den in <b>lngExportID <\/b>enthaltenen Wert und <b>ObjektID <\/b>den soeben ermittelten Wert der Variablen <b>lngObjektID<\/b>. Auf diese Weise wird der Eintrag f&uuml;r das Objekt der aktuell im Formular ausgew&auml;hlten Export-Konfiguration zugeordnet.<\/p>\n<p>Die &uuml;brigen Tabellen werden auf die gleiche Weise erfasst und gegebenenfalls zur Tabelle <b>tblExport_Objekte <\/b>hinzugef&uuml;gt.<\/p>\n<p><b>Objekte und Exporte<\/b><\/p>\n<p>Die Tabelle <b>tblExport_ExporteObjekte <\/b>haben wir uns noch nicht angesehen. Der Zweck dieser Tabelle ist es, f&uuml;r jede Export-Konfiguration der Anwendung festzulegen, welche Objekte exportiert werden sollen. Da wir eine Tabelle namens <b>tblExport_Exporte <\/b>zum Speichern der Exportkonfigurationen verwenden und eine weitere namens <b>tblExport_Objekte<\/b> (s. Bild 5), welche die Daten zu Tabellen, Abfragen et cetera speichert, ben&ouml;tigen wir noch eine M&ouml;glichkeit, diese Daten miteinander zu verkn&uuml;pfen. Da jedes Objekt mit jeder Export-Konfiguration verkn&uuml;pft werden soll, ist eine Verkn&uuml;pfungstabelle zur Herstellung einer m:n-Beziehung gefragt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_006.png\" alt=\"In der Tabelle tblExport_Objekte gespeicherte Objekte\" width=\"500\" height=\"377,6908\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: In der Tabelle tblExport_Objekte gespeicherte Objekte<\/span><\/b><\/p>\n<p>Diese sieht im Entwurf wie in Bild 6 aus und enth&auml;lt die beiden Fremdschl&uuml;sselfelder <b>ObjektID <\/b>und <b>ExportID<\/b>, f&uuml;r die ein zusammengesetzter, eindeutiger Index festgelegt ist &#8211; schlie&szlig;lich soll jedes Objekt jeder Exportkonfiguration nur einmal zugeordnet werden k&ouml;nnen. Das Feld <b>Exportieren <\/b>ist ein <b>Ja\/Nein<\/b>-Feld, das festlegt, ob dieses Objekt in der angegebenen Exportkonfiguration ber&uuml;cksichtigt wird. Bei den Tabellen kann der Benutzer zus&auml;tzlich festlegen, ob er diese mit oder ohne Daten exportieren m&ouml;chte. Dies stellt er, ebenfalls konfigurationsabh&auml;ngig, im Feld <b>MitDaten <\/b>der Tabelle <b>tblExport_ExporteObjekte <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_008.png\" alt=\"Entwurf der Tabelle tblExport_ExporteObjekte\" width=\"575\" height=\"392,6622\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf der Tabelle tblExport_ExporteObjekte<\/span><\/b><\/p>\n<p>Nach dem Aufruf der Prozeduren zum Einlesen der Objekte sieht diese Tabelle in der Datenblattansicht etwa wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_007.png\" alt=\"Daten der Tabelle tblExport_ExporteObjekte\" width=\"575\" height=\"255,5556\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Daten der Tabelle tblExport_ExporteObjekte<\/span><\/b><\/p>\n<p><b>Abfragen einlesen<\/b><\/p>\n<p>Die Prozedur <b>AbfragenEinlesen<\/b> ist prinzipiell wie die Prozedur <b>TabellenEinlesen <\/b>aufgebaut &#8211; daher wollen wir diese hier nicht ausf&uuml;hrlich beschreiben.<\/p>\n<p>Die Unterschiede liegen im Wesentlichen darin, dass diese Prozedur ihren Filter aus dem Feld <b>Abfragefilter<\/b> der Tabelle <b>tblExport_Exporte <\/b>bezieht und die <b>QueryDefs<\/b>-Auflistung zur Ermittlung der Abfragen durchl&auml;uft.<\/p>\n<p>Au&szlig;erdem stellt sie beim Eintragen der Abfragen in die Tabelle <b>tblExport_Objekte <\/b>f&uuml;r das Feld <b>ObjekttypID <\/b>den dem Objekttyp entsprechenden Wert ein.<\/p>\n<p><b>Formulare und Berichte einlesen<\/b><\/p>\n<p>Das Einlesen der Formulare und Berichte verl&auml;uft ebenfalls so &auml;hnlich wie das der Tabellen und Abfragen. Allerdings gibt es ein paar Unterschiede, die Sie auch in Listing 4 ablesen k&ouml;nnen. Die dort dargestellte Prozedur <b>FormulareEinlesen <\/b>verwendet den Filterausdruck aus dem Feld <b>Formularfilter<\/b>. Um die richtigen Objekte zu ermitteln, verwendet diese Prozedur allerdings keine Auflistung der DAO-Bibliothek wie <b>TableDefs <\/b>oder <b>QueryDefs<\/b>, sondern diesmal die <b>AllForms<\/b>-Auflistung des <b>CurrentProject<\/b>-Objekts. Beim Eintragen der Daten in die Tabelle <b>tblExport_Objekte <\/b>verwendet die Prozedur f&uuml;r das Feld <b>ObjekttypID <\/b>den Wert <b>3<\/b>. Die Werte f&uuml;r den Objekttyp beziehungsweise f&uuml;r das Fremdschl&uuml;sselfeld <b>ObjekttypID <\/b>stammen &uuml;brigens aus der Tabelle <b>tblExport_Objekttypen<\/b>, die Sie in Bild 8 finden. Das Einlesen der Berichte erfolgt analog zu den Formularen, Gleiches gilt f&uuml;r die Makros und Module.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_009.png\" alt=\"Die Tabelle tblExport_Objekttypen\" width=\"275\" height=\"205,4217\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Die Tabelle tblExport_Objekttypen<\/span><\/b><\/p>\n<p><b>Verweise einlesen<\/b><\/p>\n<p>Neben den Objekten sollen auch die Verweise der aktuellen Datenbank eingelesen werden. Dies erledigt die Prozedur <b>VerweiseEinlesen<\/b>, welche die gleichen Parameter erwartet wie die zuvor beschriebenen Prozeduren (s. Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>VerweiseEinlesen(db<span style=\"color:blue;\"> As <\/span>DAO.Database, lngExportID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>ref<span style=\"color:blue;\"> As <\/span>VBIDE.Reference\r\n     <span style=\"color:blue;\">Dim <\/span>lngVerweisID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     db.Execute \"UPDATE tblExport_Verweise SET Loeschen = True\", dbFailOnError\r\n     For Each ref In VBE.ActiveVBProject.References\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         db.Execute \"INSERT INTO tblExport_Verweise(Verweisname, VerweisGUID) VALUES(''\" & ref.Name & \"'', ''\" _\r\n             & ref.GUID & \"'')\", dbFailOnError\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 3022<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"UPDATE tblExport_Verweise SET Loeschen = <span style=\"color:blue;\">False<\/span> WHERE Verweisname = ''\" & ref.Name & \"''\", dbFailOnError\r\n             lngVerweisID = db.OpenRecordset(\"SELECT VerweisID FROM tblExport_Verweise WHERE Verweisname = ''\" _\r\n                 & ref.Name & \"''\").Fields(0)\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             lngVerweisID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         db.Execute \"INSERT INTO tblExport_VerweiseExporte(VerweisID, ExportID, Major, Minor) VALUES(\" _\r\n             & lngVerweisID & \", \" & lngExportID & \", \" & ref.Major & \", \" & ref.Minor & \")\", dbFailOnError\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 3022<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n             lngID = DLookup(\"VerweisExportID\", \"tblExport_VerweiseExporte\", \"ExportID = \" & lngExportID _\r\n                 & \" AND VerweisID = \" & lngVerweisID)\r\n             db.Execute \"UPDATE tblExport_VerweiseExporte SET Major = \" & ref.Major & \", Minor = \" & ref.Minor _\r\n                 & \" WHERE VerweisExportID = \" & lngID, dbFailOnError\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Next<\/span> ref\r\n     db.Execute \"DELETE FROM tblExport_Verweise WHERE Loeschen = True\", dbFailOnError\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Einlesen der Verweise der aktuellen Datenbank und eintragen in die Tabelle tblExport_Verweise<\/span><\/b><\/p>\n<p>Die Prozedur stellt zun&auml;chst den Wert des Feldes <b>Loeschen <\/b>der Tabelle <b>tblExport_Verweise <\/b>auf den Wert <b>True <\/b>ein. Hier wird gleich deutlich: Die Verweise speichern wir nicht gemeinsam mit den &uuml;brigen Objekten in der Tabelle <b>tblExport_Objekte<\/b>, sondern in einer eigenen Tabelle. Diese sieht im Entwurf wie in Bild 9 aus. Sie enth&auml;lt neben dem Feld Verweisname, f&uuml;r das &uuml;brigens wieder ein eindeutiger Index definiert ist, noch ein weiteres Feld namens <b>VerweisGUID<\/b>. Dieses ist wichtig, wenn Sie die Verweise zur Zieldatenbank hinzuf&uuml;gen. Schlie&szlig;lich finden Sie auch hier das Feld <b>Loeschen<\/b>, mit dem zu l&ouml;schende Verweise markiert werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_010.png\" alt=\"Die Tabelle tblExport_Verweise\" width=\"575\" height=\"355,8715\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Die Tabelle tblExport_Verweise<\/span><\/b><\/p>\n<p>Die Prozedur <b>VerweiseEinlesen <\/b>durchl&auml;uft in einer <b>For Each<\/b>-Schleife alle Elemente der Auflistung <b>References <\/b>f&uuml;r das mit dem Objekt <b>ActiveVBProject <\/b>referenzierte Projekt der aktuellen Anwendung. Der jeweilige Verweis landet in der Variablen <b>ref<\/b>. Innerhalb der Schleife versucht die Prozedur, einen Datensatz mit den entsprechenden Informationen zur Tabelle <b>tblExport_Verweise <\/b>hinzuzuf&uuml;gen. Gelingt dies nicht, weil es bereits einen Eintrag mit gleichem Verweisnamen gibt, aktualisiert die Prozedur diesen Eintrag, indem sie den Wert des Feldes <b>Loeschen <\/b>von <b>True <\/b>auf <b>False <\/b>&auml;ndert.<\/p>\n<p>Sie ermittelt in beiden F&auml;llen den Wert des Prim&auml;rschl&uuml;ssels des betroffenen Eintrags, um einen entsprechenden Eintrag zur Verkn&uuml;pfungstabelle <b>tblExport_ExporteVerweise <\/b>hinzuzuf&uuml;gen (den Entwurf dieser Tabelle finden Sie in Bild 10). Diese Tabelle hat den gleichen Zweck wie die Tabelle <b>tblExport_ExporteObjekte<\/b>: Sie soll festlegen, welcher Verweis f&uuml;r die entsprechende Exportkonfiguration verwendet werden soll. Auch hier werden nur noch nicht vorhandene Datens&auml;tze neu angelegt, f&uuml;r bereits vorhandene Kombinationen aus <b>ExportID <\/b>und <b>VerweisID <\/b>aktualisiert die Prozedur lediglich die Version der Verweise in den beiden Feldern <b>Major <\/b>und <b>Minor<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_011.png\" alt=\"Die Tabelle tblExport_VerweiseExporte\" width=\"575\" height=\"399,3759\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Die Tabelle tblExport_VerweiseExporte<\/span><\/b><\/p>\n<p>Damit haben wir soweit alle Informationen gesammelt, die sich auf die Objekte und Verweise beziehen.<\/p>\n<p><b>Objekte f&uuml;r den Export ausw&auml;hlen<\/b><\/p>\n<p>Im Formular <b>frmExport_Main <\/b>lassen sich diese Daten nat&uuml;rlich nicht direkt darstellen &#8211; dazu ben&ouml;tigen wir einen Rutsch Unterformulare. Da auch diese nicht alle gleichzeitig in einem Formular abgebildet werden sollen, f&uuml;gen Sie dem Formular <b>frmExport_Main <\/b>ein Registersteuerelement namens <b>regObjekte<\/b> hinzu. Dieses nimmt f&uuml;r jeden Objekttyp eine eigene Seite auf, also beispielsweise <b>pgeTabellen<\/b>, <b>pgeAbfragen<\/b>, <b>pgeFormulare <\/b>und so weiter. Sp&auml;ter kommen noch weitere hinzu.<\/p>\n<p>F&uuml;r jeden Objekttyp legen Sie ein eigenes Unterformular an. Das Unterformular f&uuml;r die Anzeige der Tabellen hei&szlig;t beispielsweise <b>frmExport_sfmTabellen<\/b> und verwendet die Abfrage aus Bild 11 als Datenherkunft.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_012.png\" alt=\"Datenherkunft des Unterformulars frmExport_sfmTabellen\" width=\"700\" height=\"359,5042\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Datenherkunft des Unterformulars frmExport_sfmTabellen<\/span><\/b><\/p>\n<p>Diese f&uuml;hrt die beiden Tabellen <b>tblExport_Objekte <\/b>und <b>tblExport_ObjekteExporte <\/b>zusammen. Dies ist wichtig, da so auch der Inhalt des Feldes <b>ExportID <\/b>mit in die Datenherkunft gelangt. Da es mehrere Exportkonfigurationen gibt, bei denen jede m&ouml;glicherweise andere Objekte der Datenbank exportieren soll, darf das Unterformular auch nur diejenigen Datens&auml;tze der Verkn&uuml;pfungs-tabelle <b>tblExport_ExporteObjekte <\/b>samt dem Wert im Feld <b>Exportieren <\/b>und <b>MitDaten <\/b>anzeigen, die zu dem aktuell im Hauptformular angezeigten Datensatz geh&ouml;ren.<\/p>\n<p>Das Unterformular <b>frmExport_sfmTabellen <\/b>soll aus dieser Datenherkunft lediglich die drei Felder <b>Objektbezeichnung<\/b>, <b>Exportieren <\/b>und <b>MitDaten <\/b>anzeigen (s. Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_013.png\" alt=\"Das Unterformular frmExport_sfmTabellen\" width=\"575\" height=\"231,3111\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Das Unterformular frmExport_sfmTabellen<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen Sie dieses Formular noch auf die entsprechende Seite des Registersteuerelements im Hauptformular einf&uuml;gen. Dazu f&uuml;gen Sie das Unterformular zun&auml;chst auf die schnellstm&ouml;gliche Weise zum Hauptformular hinzu &#8211; n&auml;mlich, indem Sie dieses aus dem Navigationsbereich in den Entwurf des Formulars <b>frmExport_Main <\/b>ziehen.<\/p>\n<p>Dort schneiden Sie es dann aus (etwa mit <b>Strg + X<\/b>), markieren dann die entsprechende Registerseite, sodass diese hervorgehoben wird, und f&uuml;gen das ausgeschnittene Unterformular mit dem Kontextmen&uuml;befehl <b>Einf&uuml;gen <\/b>an dieser Stelle ein. Nach dem Einstellen der Position des Unterformular-Steuerelements sieht das Formular wie in Bild 13 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_014.png\" alt=\"Das Unterformular frmExport_sfmTabellen im Registersteuerelement des Hauptformulars\" width=\"575\" height=\"476,6129\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Das Unterformular frmExport_sfmTabellen im Registersteuerelement des Hauptformulars<\/span><\/b><\/p>\n<p>Stellen Sie sicher, dass die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements wie in der Abbildung beide den Wert <b>ObjektID <\/b>aufweisen. Die Unterformular-Steuerelemente haben wir der Einfachheit halber &uuml;brigens <b>sfmTabellen<\/b>, <b>sfmAbfragen<\/b>, <b>sfmFormulare <\/b>und so weiter benannt.<\/p>\n<p>Die Unterformulare f&uuml;r die &uuml;brigen Tabellen, also f&uuml;r <b>tblExport_Abfragen<\/b>, <b>tblExport_Formulare<\/b>, <b>tblExport_Berichte<\/b>, <b>tblExport_Makros <\/b>und <b>tblExport_Module <\/b>haben wir auf die gleiche Weise angelegt. Einziger Unterschied: Das Feld <b>MitDaten <\/b>muss dort nat&uuml;rlich nicht ber&uuml;cksichtigt werden, denn nur die Tabellen enthalten Daten (s. Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_015.png\" alt=\"Das Unterformular frmExport_sfmAbfragen soll nur diese beiden Felder anzeigen.\" width=\"450\" height=\"186,7742\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Das Unterformular frmExport_sfmAbfragen soll nur diese beiden Felder anzeigen.<\/span><\/b><\/p>\n<p>Beim Unterformular <b>frmExport_sfmVerweise <\/b>sollen zus&auml;tzlich noch die beiden Felder <b>Major <\/b>und <b>Minor <\/b>zur Angabe der Version hinzugef&uuml;gt werden sowie das Feld <b>VerweisGUID<\/b> (s. Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_016.png\" alt=\"Beim Unterformular frmExport_sfmVerweise kommen noch die beiden Felder zur Anzeige der Version hinzu.\" width=\"450\" height=\"214,9254\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Beim Unterformular frmExport_sfmVerweise kommen noch die beiden Felder zur Anzeige der Version hinzu.<\/span><\/b><\/p>\n<p><b>Weitere Formularelemente<\/b><\/p>\n<p>Bevor wir uns um den tats&auml;chlichen Export und somit um die Erstellung einer neuen Datenbank besch&auml;ftigen k&ouml;nnen, m&uuml;ssen wir noch einige Elemente im Hauptformular <b>frmExport_Main <\/b>erl&auml;utern.<\/p>\n<p><b>Zieldatenbank ausw&auml;hlen<\/b><\/p>\n<p>Da w&auml;re zun&auml;chst einmal die Zieldatenbank, die Sie entweder direkt in das Textfeld <b>txtZiel <\/b>eintragen oder &uuml;ber einen Klick auf die Schaltfl&auml;che <b>cmdDateiauswahl <\/b>rechts von diesem Textfeld ausw&auml;hlen. Letzteres w&uuml;rde einen <b>Datei speichern<\/b>-Dialog &ouml;ffnen, mit dem Sie entweder eine vorhandene Datei ausw&auml;hlen oder aber den Namen f&uuml;r eine neu zu erstellende Datei angeben. Der Code, der durch einen Klick auf die Schaltfl&auml;che <b>cmdDateiauswahl <\/b>ausgef&uuml;hrt wird, ist schnell erl&auml;utert (s. Listing 6):<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDateiauswahl_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strVerzeichnis<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDatei<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZiel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtZiel, \"\")) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strVerzeichnis = <span style=\"color:blue;\">Mid<\/span>(Me!txtZiel, 1, <span style=\"color:blue;\">InStrRev<\/span>(Me.txtZiel, \"\\\"))\r\n         strDatei = <span style=\"color:blue;\">Mid<\/span>(Me!txtZiel, <span style=\"color:blue;\">InStrRev<\/span>(Me.txtZiel, \"\\\") + 1)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strVerzeichnis = CurrentProject.Path\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strZiel = GetSaveFile(strVerzeichnis, strDatei, , \"Zieldatei festlegen\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strZiel) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtZiel = strZiel\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Anzeigen eines Datei speichern-Dialogs<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob <b>txtZiel <\/b>bereits ein Ziel enth&auml;lt. Falls ja, ermitteln die beiden Zeilen im ersten Teil der <b>If&#8230;Then<\/b>-Bedingung das Verzeichnis und den Dateinamen aus diesem Wert, anderenfalls liefert <b>CurrentProject.Path <\/b>das Startverzeichnis f&uuml;r die Eingabe beziehungsweise Auswahl der Zieldatenbank. Die folgende Anweisung ruft die Funktion <b>GetSaveFile <\/b>auf, die Sie im Modul <b>mdlDateifunktionen <\/b>finden. Liefert diese Funktion keine leere Zeichenkette zur&uuml;ck, landet das Ergebnis im Feld <b>txtZiel<\/b>.<\/p>\n<p>Das Feld <b>txtZiel <\/b>ist an das Feld <b>Ziel <\/b>der Tabelle <b>tblExport_Exporte <\/b>gebunden, sodass die Zieldatenbank gleich in dieser Tabelle gespeichert wird.<\/p>\n<p><b>Zielversion festlegen<\/b><\/p>\n<p>Wichtig ist auch noch die Zielversion der Anwendung. Diese legen Sie mit dem Kombinationsfeld <b>cboZielversion <\/b>fest. Das Kombinationsfeld verwendet die folgende Abfrage auf Basis der Tabelle <b>tblExport_ZIelversionen <\/b>(s. Bild 16) als Datensatzherkunft:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_017.png\" alt=\"Die Tabelle tblExport_Zielversionen mit den aktuellen Access-Versionen\" width=\"450\" height=\"188,5416\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Die Tabelle tblExport_Zielversionen mit den aktuellen Access-Versionen<\/span><\/b><\/p>\n<pre>SELECT ExportZielversionID, Zielversion FROM tblExport_Zielversionen;<\/pre>\n<p>Dabei zeigt sie nur das zweite Feld der Datensatzherkunft an. Das Steuerelement <b>cboZielversion <\/b>ist an das Feld <b>Zielversion <\/b>der dem Formular <b>frmExport_Main <\/b>zugrunde liegenden Tabelle gebunden.<\/p>\n<p><b>Optionen<\/b><\/p>\n<p>Die Optionen zum jeweiligen Export haben wir nicht direkt im Formular und auch nicht auf einer der Registerseiten untergebracht, sondern in einem eigenen Formular. Dieses &ouml;ffnen Sie &uuml;ber die Schaltfl&auml;che <b>cmdOptionen <\/b>im Fu&szlig; des Formulars <b>frmExport_Main<\/b>. Die dadurch ausgel&ouml;ste Prozedur sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span> cmdOptionen_Click()\r\n     DoCmd.OpenForm _\r\n        \"frmExport_Optionen\", _\r\n       OpenArgs:=Me!ExportID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies &ouml;ffnet das Formular aus Bild 17 und &uuml;bergibt per &ouml;ffnungsargument den Wert des Prim&auml;rschl&uuml;sselfeldes des aktuellen Datensatzes im Formular <b>frmExport_Optionen<\/b>. Das so ge&ouml;ffnete Formular verarbeitet diese Information in der Prozedur, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird. Diese pr&uuml;ft, ob ein &ouml;ffnungsargument &uuml;bergeben wurde und stellt den Filter des Formulars so ein, dass der entsprechende Datensatz angezeigt wird (s. Listing 7):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_018.png\" alt=\"Das Formular frmExport_Optionen mit den Werten einiger Felder der Tabelle tblExport_Exporte\" width=\"450\" height=\"297,9021\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Das Formular frmExport_Optionen mit den Werten einiger Felder der Tabelle tblExport_Exporte<\/span><\/b><\/p>\n<p>Das Formular <b>frmExport_Optionen <\/b>verwendet ebenfalls die Tabelle <b>tblExport_Exporte <\/b>als Datenherkunft.<\/p>\n<p>In diesem Formular stellen Sie die Filter f&uuml;r die einzelnen Objekte ein, die in die Liste der exportierbaren Objekte aufgenommen werden sollen. Wenn Sie beispielsweise nur Tabellen anzeigen m&ouml;chten, die mit <b>tbl <\/b>beginnen, verwenden Sie im Feld <b>Tabellenfilter <\/b>den Wert <b>tbl*<\/b>. Um Objekte aufgrund ihres Namens auszuschlie&szlig;en, stellen Sie dem Filtervergleichswert einfach ein Minuszeichen voran (<b>&#8211;<\/b>). Wie diese Informationen verarbeitet werden, haben Sie ja bereits weiter oben erfahren.<\/p>\n<p><b>Objekte f&uuml;r den Export ausw&auml;hlen<\/b><\/p>\n<p>Die Auswahl der Objekte, die in die neue Datenbank exportiert werden sollen, erfolgt dort, wo diese auch angezeigt werden &#8211; n&auml;mlich in den jeweiligen Unterformularen des Formulars <b>frmExport_Main <\/b>(s. Bild 18). Hier k&ouml;nnen Sie beispielsweise alle Tabellen anhaken, die exportiert werden sollen. Zus&auml;tzlich legen Sie bei den Tabellen fest, ob diese mit oder ohne Daten exportiert werden sollen &#8211; die &uuml;brigen Objekte bieten diese M&ouml;glichkeit nicht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_03\/pic_939_019.png\" alt=\"Ausw&auml;hlen der Objekte f&uuml;r den Export\" width=\"400\" height=\"375,8139\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Ausw&auml;hlen der Objekte f&uuml;r den Export<\/span><\/b><\/p>\n<p><b>Vereinfachung der Auswahl<\/b><\/p>\n<p>In der Regel starten Sie dabei mit der Auswahl aller Objekte und entfernen dann diejenigen, die Sie nicht ben&ouml;tigen oder entfernen alle Haken und f&uuml;gen dann die ben&ouml;tigten Objekte hinzu. Zu diesem Zweck haben wir noch eine kleine Zusatzfunktion eingebaut &#8211; die Auswahl entweder aller Elemente oder keines Elements. Wahrscheinlich fragen Sie sich nun, wie das gelingen soll &#8211; immerhin scheint das Formular keine Steuerelemente f&uuml;r diesen Zweck zu enthalten Genau: Wir wollten das Formular nicht weiter aufbl&auml;hen und haben diese Funktion einfach f&uuml;r das Ereignis <b>Beim Doppelklicken <\/b>der Spaltenk&ouml;pfe der jeweiligen Felder (bei den Tabellen also etwa <b>Exportieren <\/b>und <b>MitDaten<\/b>) implementiert.<\/p>\n<p>Beim Unterformular <b>frmExport_sfmTabellen <\/b>w&auml;hlen Sie dazu den Wert <b>[Ereignisprozedur] <\/b>f&uuml;r die Eigenschaft <b>Beim Doppelklicken <\/b>des Formulars aus. Die durch das Anklicken der Schaltfl&auml;che mit den drei Punkten (&#8230;) rechts von der Eigenschaft erscheinende neue Prozedur f&uuml;llen Sie etwa wie in Listing 8. Diese Prozedur verwendet zwei Variablen, die Sie im Kopf des Klassenmoduls des Formulars wie folgt deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     Select Case Screen.ActiveControl.Name\r\n         <span style=\"color:blue;\">Case <\/span>\"Exportieren\"\r\n             db.Execute \"UPDATE tblExport_ObjekteExporte SET Exportieren = \" & CInt(bolExportieren) _\r\n                 & \" WHERE ExportID = \" & Me.Parent!cboBezeichnungen, dbFailOnError\r\n             bolExportieren = <span style=\"color:blue;\">Not<\/span> bolExportieren\r\n             Me.Requery\r\n         <span style=\"color:blue;\">Case <\/span>\"MitDaten\"\r\n             db.Execute \"UPDATE tblExport_ObjekteExporte SET MitDaten = \" & CInt(bolMitDaten) & \" WHERE ExportID = \" _\r\n                 & Me.Parent!cboBezeichnungen, dbFailOnError\r\n             bolMitDaten = <span style=\"color:blue;\">Not<\/span> bolMitDaten\r\n             Me.Requery\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Alle Eintr&auml;ge ausw&auml;hlen oder keinen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bolExportieren<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>bolMitDaten<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Wenn Sie dann in der Formularansicht auf einen der Spaltenk&ouml;pfe klicken, l&ouml;st dies die Ereignisprozedur aus. Diese pr&uuml;ft zun&auml;chst die Eigenschaft <b>Screen.ActiveControl.Name <\/b>und erh&auml;lt damit den Namen des Feldes, auf dessen Spaltenkopf Sie geklickt haben. Das Ergebnis wertet die Prozedur in einer <b>Select Case<\/b>-Bedingung aus. Haben Sie beispielsweise auf <b>Exportieren <\/b>geklickt, pr&uuml;ft die Prozedur den Wert von <b>bolExportieren<\/b>. Dieser Wert lautet direkt nach dem &ouml;ffnen <b>False<\/b>. Die Prozedur stellt dann den Wert des Feldes <b>Exportieren <\/b>auf den aktuellen Inhalt der Variablen <b>bolExportieren <\/b>ein &#8211; aber nat&uuml;rlich f&uuml;r die Datens&auml;tze, die zur aktuell im Hauptformular ausgew&auml;hlten Exportkonfiguration geh&ouml;ren. Anschlie&szlig;end aktualisiert die Prozedur den Inhalt des Unterformulars und stellt den Wert der Variablen <b>bolExportieren<\/b> auf <b>True <\/b>ein, wenn dieser zuvor <b>False <\/b>lautete und umgekehrt. Auf diese Weise ist sichergestellt, dass der folgende Doppelklick wieder alle Haken der Spalte entfernt.<\/p>\n<p>Klicken Sie auf die Spalte <b>MitDaten<\/b>, geschieht genau das Gleiche &#8211; nur dass diesmal der Inhalt des Feldes <b>MitDaten <\/b>angepasst wird.<\/p>\n<p><b>Verschiedene Konfigurationen<\/b><\/p>\n<p>Der Clou der L&ouml;sung ist, wie eingangs erw&auml;hnt, dass Sie damit nicht nur eine, sondern gleich mehrere Exportkonfigurationen schaffen k&ouml;nnen. Dabei legen Sie f&uuml;r die eine Konfiguration, die eine Version f&uuml;r den Gesch&auml;ftsf&uuml;hrer liefern soll, beispielsweise alle Objekte f&uuml;r den Export fest, bei der anderen Konfiguration, die einfache Mitarbeiter nutzen sollen, definieren Sie nur einen begrenzten Umfang von Objekten. Sie k&ouml;nnen &uuml;ber das Kombinationsfeld <b>cboBezeichnungen <\/b>bequem zwischen den einzelnen Konfigurationen wechseln.<\/p>\n<p><b>Datenbank exportieren<\/b><\/p>\n<p>Nun geht es los: Wir wollen die Datenbank mit den festgelegten Objekten exportieren. Dazu klicken Sie auf die Schaltfl&auml;che <b>cmdExportieren<\/b>, was die Prozedur aus Listing 9 ausl&ouml;st.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdExportieren_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtZiel)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Kein Ziel angegeben.\", vbOKOnly + vbExclamation, \"Kein Ziel\"\r\n         Me!txtZiel.SetFocus\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Exportieren Me!txtZiel, Me!ExportID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Start des Exportvorgangs<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft, ob der Benutzer eine Zieldatenbank angegeben hat, und ruft dann eine weitere Prozedur namens <b>Exportieren<\/b> auf, die sich im Modul <b>mdlExport_Tools <\/b>befindet und wie in Listing 10 aussieht. Die Prozedur erwartet zwei Parameter, und zwar den Pfad der Zieldatei sowie den Prim&auml;rschl&uuml;sselwert der durchzuf&uuml;hrenden Exportkonfiguration.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Exportieren(strZiel<span style=\"color:blue;\"> As String<\/span>, lngExportID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>dbQuelle<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>dbZiel<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     DatenbankErstellen dbQuelle, dbZiel, strZiel, lngExportID\r\n     TabellenKopieren dbQuelle, strZiel, lngExportID\r\n     TabellenLeeren dbQuelle, strZiel, lngExportID\r\n     AbfragenKopieren dbQuelle, strZiel, lngExportID\r\n     FormulareKopieren dbQuelle, strZiel, lngExportID\r\n     BerichteKopieren dbQuelle, strZiel, lngExportID\r\n     MakrosKopieren dbQuelle, strZiel, lngExportID\r\n     ModuleKopieren dbQuelle, strZiel, lngExportID\r\n     StartformularUebertragen dbQuelle, dbZiel\r\n     SuchenErsetzenTabellen dbQuelle, strZiel, lngExportID\r\n     StartribbonUebertragen dbQuelle, dbZiel\r\n     AnwendungstitelUebertragen dbQuelle, dbZiel\r\n     VerweiseUebertragen dbQuelle, strZiel, lngExportID\r\n     SQLAusfuehren dbQuelle, dbZiel, lngExportID\r\n     <span style=\"color:blue;\">Set<\/span> dbZiel = Nothing\r\n''    SuchenErsetzenCode dbQuelle, strZiel, lngExportID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Hauptprozedur des Exportvorgangs<\/span><\/b><\/p>\n<p>Sie ist die Steuerzentrale f&uuml;r den Aufruf einiger weiterer Prozeduren, welche die Objekte und die &uuml;brigen St&uuml;ck f&uuml;r St&uuml;ck in die neue Datenbank &uuml;bertragen.<\/p>\n<p><b>Neue Datenbank erstellen<\/b><\/p>\n<p>Die erste Prozedur hei&szlig;t <b>Datenbank-Erstellen <\/b>(s. Listing 11). Die Prozedur erwartet die folgenden Parameter:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DatenbankErstellen(dbQuelle<span style=\"color:blue;\"> As <\/span>DAO.Database, dbZiel<span style=\"color:blue;\"> As <\/span>DAO.Database, strZiel<span style=\"color:blue;\"> As String<\/span>, lngExportID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngVersion<span style=\"color:blue;\"> As Long<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Kill strZiel\r\n     Select Case Err.Number\r\n         <span style=\"color:blue;\">Case <\/span>0, 53 ''Datei nicht gefunden\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> Err.Number, Err.Description\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Die Datenbank konnte nicht gel&ouml;scht werden.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> dbQuelle = CurrentDb\r\n     lngVersion = DLookup(\"ZielversionWert\", \"tblExport_Zielversionen\", \"ExportZielversionID = \" _\r\n         & DLookup(\"ZielversionID\", \"tblExport_Exporte\", \"ExportID = \" & lngExportID))\r\n     <span style=\"color:blue;\">Set<\/span> dbZiel = DBEngine.CreateDatabase(strZiel, dbLangGeneral, lngVersion)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Anlegen der neuen Datenbank<\/span><\/b><\/p>\n<ul>\n<li><b>dbQuelle<\/b>: Verweis auf die Quelldatenbank, wird in dieser Prozedur gef&uuml;llt<\/li>\n<li><b>dbZiel<\/b>: Verweis auf die Zieldatenbank, wird ebenfalls in dieser Prozedur gef&uuml;llt<\/li>\n<li><b>strZiel<\/b>: Pfad der Zieldatenbank<\/li>\n<li><b>lngExportID<\/b>: ID der Exportkonfiguration<\/li>\n<\/ul>\n<p>Die Prozedur l&ouml;scht zun&auml;chst bei abgeschalteter Fehlerbehandlung eine eventuell vorhandene Datenbank mit dem Namen der Zieldatenbank (gegebenenfalls k&ouml;nnen Sie hier noch eine R&uuml;ckfrage einbauen).<\/p>\n<p>Dann stellt die Prozedur die Variable <b>dbQuelle <\/b>auf die aktuelle Datenbank ein und ermittelt per <b>DLookup <\/b>auf die Tabelle <b>tblExport_Zielversionen <\/b>den Zahlenwert der Konstanten f&uuml;r die Erstellung der richtigen Zielversion. Diese Zahl landet in der Variablen <b>lngZielversion<\/b>.<\/p>\n<p>Mit der Methode <b>CreateDatabase <\/b>des <b>DBEngine<\/b>-Objekts erstellt die Prozedur schlie&szlig;lich die neue Datenbank und speichert einen Verweis auf diese Datenbank in der Variablen <b>dbZiel<\/b>, deren Inhalt an die aufrufende Prozedur zur&uuml;ckgegeben wird.<\/p>\n<p><b>Tabellen kopieren<\/b><\/p>\n<p>Die zweite aufgerufene Unterprozedur hei&szlig;t <b>TabellenKopieren <\/b>und erwartet den Verweis auf das <b>Database<\/b>-Objekt der Quelltabelle, den Pfad zur Zieltabelle sowie die ID der Exportkonfiguration als Parameter (s. Listing 12).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>TabellenKopieren(dbQuelle<span style=\"color:blue;\"> As <\/span>DAO.Database, strZiel<span style=\"color:blue;\"> As String<\/span>, lngExportID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> rst = dbQuelle.OpenRecordset(\"SELECT * FROM tblExport_Objekte INNER JOIN tblExport_ObjekteExporte \" _\r\n         & \"ON tblExport_Objekte.ObjektID = tblExport_ObjekteExporte.ObjektID WHERE ExportID = \" & lngExportID _\r\n         & \" AND Exportieren = -1 AND ObjekttypID = 1\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         DoCmd.CopyObject strZiel, rst!Objektbezeichnung, acTable, rst!Objektbezeichnung\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 12: Kopieren der Tabellen<\/span><\/b><\/p>\n<p>Warum nicht den Verweis auf das <b>Database<\/b>-Objekt der Zieltabelle Weil die in dieser und den folgenden Prozeduren verwendeten Anweisungen zum &uuml;bertragen der Tabellen diesen schlicht nicht ben&ouml;tigen.<\/p>\n<p>Stattdessen erstellen wir innerhalb der Prozedur ein Recordset auf Basis der Tabelle <b>tblExport_Objekte<\/b>.<\/p>\n<p>Dabei ber&uuml;cksichtigen wir lediglich diejenigen Datens&auml;tze, bei denen das Feld <b>ExportID <\/b>in den Datens&auml;tzen der verkn&uuml;pften Tabelle <b>tblExport_ObjekteExporte <\/b>der ID des durchzuf&uuml;hrenden Exportkonfiguration entspricht, deren Feld <b>Exportieren <\/b>auf den Wert <b>True <\/b>beziehungsweise <b>-1 <\/b>eingestellt ist und deren Objekttyp dem der Tabelle entspricht &#8211; in diesem Fall <b>1<\/b>.<\/p>\n<p>Die Datens&auml;tze der Tabelle durchl&auml;uft die Prozedur in einer <b>Do While<\/b>-Schleife.<\/p>\n<p>In dieser wird f&uuml;r jeden Datensatz die <b>CopyObject<\/b>-Methode des <b>DoCmd<\/b>-Objekts ausgef&uuml;hrt. Diese erwartet wiederum einige Parameter, n&auml;mlich:<\/p>\n<ul>\n<li><b>DestinationDatabase<\/b>: Pfad zur Zieldatenbank aus der Variablen <b>strZiel<\/b><\/li>\n<li><b>NewName<\/b>: Neuer Name des Objekts, hier der Originalname aus dem Feld <b>Objektbezeichnung<\/b><\/li>\n<li><b>SourceObjectType<\/b>: Typ des Objekts, in diesem Fall <b>acTable<\/b><\/li>\n<li><b>SourceObjectName<\/b>: Name des zu kopierenden Objekts<\/li>\n<\/ul>\n<p>Auf diese Weise kopiert die Prozedur <b>TabellenKopieren<\/b> mit der <b>CopyObject<\/b>-Methode alle f&uuml;r diesen Exportvorgang ausgew&auml;hlten Tabellen in die Zieldatenbank.<\/p>\n<p><b>Abfragen kopieren<\/b><\/p>\n<p>Das Kopieren der Abfragen erfolgt &uuml;ber die Prozedur <b>AbfragenKopieren<\/b>. Diese ist im Wesentlichen mit der Funktion zum Kopieren von Tabellen identisch.<\/p>\n<p><b>Formulare kopieren<\/b><\/p>\n<p>Die Formulare kopiert die Prozedur aus Listing 13. Diese Prozedur schlie&szlig;t die zu kopierenden Objekte vor dem Kopiervorgang. Dennoch kann es zu Problemen beim Kopieren von Formularen kommen, die zur Export-L&ouml;sung selbst geh&ouml;ren. Diese Formulare (und Unterformulare) lassen sich nicht sauber schlie&szlig;en und somit auch nicht kopieren. In diesem Fall tritt der Fehler mit der Nummer <b>2007 <\/b>auf (<b>Sie haben bereits ein Datenbankobjekt namens &#8220;frmExport_sfmFormulare&#8220; ge&ouml;ffnet.<\/b>). Dann gibt die Prozedur schlicht eine entsprechende Meldung zur&uuml;ck und kopiert das folgende Formular.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>FormulareKopieren(dbQuelle<span style=\"color:blue;\"> As <\/span>DAO.Database, strZiel<span style=\"color:blue;\"> As String<\/span>, lngExportID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> rst = dbQuelle.OpenRecordset(\"SELECT * FROM tblExport_Objekte INNER JOIN tblExport_ObjekteExporte \" _\r\n         & \"ON tblExport_Objekte.ObjektID = tblExport_ObjekteExporte.ObjektID WHERE ExportID = \" & lngExportID _\r\n         & \" AND Exportieren = -1 AND ObjekttypID = 3\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         DoCmd.Close acForm, rst!Objektbezeichnung\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         DoCmd.CopyObject strZiel, rst!Objektbezeichnung, acForm, rst!Objektbezeichnung\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 2007<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Das Formular ''\" & rst!Objektbezeichnung & \"'' konnte nicht kopiert werden.\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 13: Kopieren der Formulare<\/span><\/b><\/p>\n<p><b>Weitere Objekte kopieren<\/b><\/p>\n<p>Das Kopieren der Berichte, Makros und Module erfolgt auf &auml;hnliche Weise wie bei den Tabellen und Abfragen.<\/p>\n<p>Daher stellen wir diese Techniken hier nicht im Detail vor.<\/p>\n<p><b>Datenbankeigenschaften &uuml;bertragen<\/b><\/p>\n<p>In der aktuellen Version &uuml;bertr&auml;gt der Datenbank-Exportierer die drei folgenden Eigenschaften an die Zieldatenbank:<\/p>\n<ul>\n<li>das Startformular,<\/li>\n<li>das Startribbon und<\/li>\n<li>den Anwendungstitel.<\/li>\n<\/ul>\n<p>Wir schauen uns beispielhaft an, wie die Prozedur <b>StartformularUebertragen <\/b>den Inhalt der Eigenschaft <b>Startformular <\/b>der Originaldatenbank an die Zieldatenbank &uuml;bergibt. Die Prozedur erwartet Verweise auf die Quelldatenbank und die Zieldatenbank als Parameter &#8211; die ID der Exportvariante spielt in diesem Fall keine Rolle (s. Listing 14).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>StartformularUebertragen(dbQuelle<span style=\"color:blue;\"> As <\/span>DAO.Database, dbZiel<span style=\"color:blue;\"> As <\/span>DAO.Database)\r\n     <span style=\"color:blue;\">Dim <\/span>prp<span style=\"color:blue;\"> As <\/span>DAO.Property\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     dbZiel.Properties(\"StartupForm\") = dbQuelle.Properties(\"StartupForm\")\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 3270<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> prp = dbZiel.CreateProperty(\"StartupForm\", dbText, dbQuelle.Properties(\"StartupForm\"))\r\n         dbZiel.Properties.Append prp\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 14: Anlegen der Eigenschaft f&uuml;r das Startformular<\/span><\/b><\/p>\n<p>Die Prozedur versucht bei deaktivierter Fehlerbehandlung, der Eigenschaft <b>Startup-Form <\/b>der Zieldatenbank den entsprechenden Wert der Quelldatenbank zuzuordnen. Dies wird erfahrungsgem&auml;&szlig; fehlschlagen, da diese Eigenschaft erst angelegt wird, wenn der Benutzer diesen Wert in den Access-Optionen f&uuml;r die aktuelle Datenbank definiert. Im Falle des daraus resultierenden Fehlers mit der Nummer <b>3270 <\/b>legt die Prozedur die betroffene Eigenschaft neu an und weist dieser den entsprechenden Wert zu. Dann h&auml;ngt sie die neu erstellte Eigenschaft in Form eines <b>Property<\/b>-Objekts an die <b>Properties<\/b>-Auflistung des <b>Database<\/b>-Objekts f&uuml;r Zieldatenbank an.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Beschreibung der L&ouml;sung dieses Beitrags sprengt leicht den Rahmen f&uuml;r einen einzigen Beitrag, daher setzen wir diesen demn&auml;chst fort. Es fehlt noch die Beschreibung der &uuml;bertragung der Verweise sowie die Anwendung spezieller SQL-Anweisungen. Au&szlig;erdem k&uuml;mmern wir uns noch um das L&ouml;schen von Daten in Tabellen, deren Daten nicht &uuml;bertragen werden sollten, sowie um das Durchsuchen von Code und Tabelleninhalten nach zu ersetzenden Texten.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Datenbankexport.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{3EF656D1-2C69-4D48-803B-6FC1F27F5F51}\/aiu_939.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie eine Datenbank entwickeln, die Sie an einen oder mehrere Kunden weitergeben, enth&auml;lt diese oft noch Testdaten, Tools, die Sie zur Entwicklung ben&ouml;tigen et cetera. Vielleicht entwickeln Sie sogar Datenbanken f&uuml;r mehrere Zielversionen von Access, die unterschiedliche Anforderungen haben. Oder Sie wollen schnell Versionen mit unterschiedlichen Funktionsumg&auml;ngen exportieren. Die hier vorgestellte L&ouml;sung zeigt einige Techniken, um dies zu bewerkstelligen. Der Vorteil etwa gegen&uuml;ber den eingebauten Importieren-Funktionen ist, dass Sie hier vollst&auml;ndige Konfigurationen speichern k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662014,66032014,44000027],"tags":[],"class_list":["post-55000939","post","type-post","status-publish","format-standard","hentry","category-662014","category-66032014","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Datenbankexport - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Datenbankexport\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenbankexport\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie eine Datenbank entwickeln, die Sie an einen oder mehrere Kunden weitergeben, enth&auml;lt diese oft noch Testdaten, Tools, die Sie zur Entwicklung ben&ouml;tigen et cetera. Vielleicht entwickeln Sie sogar Datenbanken f&uuml;r mehrere Zielversionen von Access, die unterschiedliche Anforderungen haben. Oder Sie wollen schnell Versionen mit unterschiedlichen Funktionsumg&auml;ngen exportieren. Die hier vorgestellte L&ouml;sung zeigt einige Techniken, um dies zu bewerkstelligen. Der Vorteil etwa gegen&uuml;ber den eingebauten Importieren-Funktionen ist, dass Sie hier vollst&auml;ndige Konfigurationen speichern k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenbankexport\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:21:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/1717c9b163544b68aced827104972939\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"33\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenbankexport\",\"datePublished\":\"2020-05-22T21:21:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/\"},\"wordCount\":5474,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/1717c9b163544b68aced827104972939\",\"articleSection\":[\"2014\",\"3\\\/2014\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/\",\"name\":\"Datenbankexport - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/1717c9b163544b68aced827104972939\",\"datePublished\":\"2020-05-22T21:21:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/1717c9b163544b68aced827104972939\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/1717c9b163544b68aced827104972939\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenbankexport\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenbankexport\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Datenbankexport - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/","og_locale":"de_DE","og_type":"article","og_title":"Datenbankexport","og_description":"Wenn Sie eine Datenbank entwickeln, die Sie an einen oder mehrere Kunden weitergeben, enth&auml;lt diese oft noch Testdaten, Tools, die Sie zur Entwicklung ben&ouml;tigen et cetera. Vielleicht entwickeln Sie sogar Datenbanken f&uuml;r mehrere Zielversionen von Access, die unterschiedliche Anforderungen haben. Oder Sie wollen schnell Versionen mit unterschiedlichen Funktionsumg&auml;ngen exportieren. Die hier vorgestellte L&ouml;sung zeigt einige Techniken, um dies zu bewerkstelligen. Der Vorteil etwa gegen&uuml;ber den eingebauten Importieren-Funktionen ist, dass Sie hier vollst&auml;ndige Konfigurationen speichern k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:21:05+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/1717c9b163544b68aced827104972939","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"33\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenbankexport","datePublished":"2020-05-22T21:21:05+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/"},"wordCount":5474,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/1717c9b163544b68aced827104972939","articleSection":["2014","3\/2014","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenbankexport\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/","url":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/","name":"Datenbankexport - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/1717c9b163544b68aced827104972939","datePublished":"2020-05-22T21:21:05+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenbankexport\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/1717c9b163544b68aced827104972939","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/1717c9b163544b68aced827104972939"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenbankexport\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenbankexport"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000939"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000939\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}