{"id":55001448,"date":"2023-08-01T00:00:00","date_gmt":"2023-08-17T16:18:16","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1448"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Aktuelle_Datenbankversion_ermitteln","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/","title":{"rendered":"Aktuelle Datenbankversion ermitteln"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/7be7966fc04149acb5d13a55807dbaa5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es gibt verschiedene Gr&uuml;nde, um Kopien einer Datenbank anzulegen. Das Herstellen einer Sicherungskopie ist wohl der am meisten verbreitete Grund. Das ist sinnvoll, aber es kann dabei zu Problemen kommen, wenn man nicht achtsam ist: Dann arbeitet man auf einmal in der Sicherheitskopie weiter und wundert sich, wenn man anschlie&szlig;end die Originaldatenbank &ouml;ffnet und die Funktionen, die man neu hinzuprogrammiert, nicht mehr findet. Oder man testet mit einer Datenbankdatei auf einer virtuellen Maschine und f&uuml;gt dort Anpassungen hinzu. Auch hier kann es zu einem &auml;hnlichen Durcheinander kommen. Um in einem solchen Fall die aktuelle Version zu finden, reicht es nicht, sich das &Auml;nderungsdatum der Datei anzusehen. Warum das nicht reicht und wie wir die aktuellere Datenbank zuverl&auml;ssig finden, zeigen wir in diesem Beitrag.<\/b><\/p>\n<p>Die Ausgangssituation l&auml;sst sich auch wie folgt zusammenfassen: Uns liegen zwei Datenbankdateien gleichen Namens vor, von denen wir nicht mehr wissen, welche den aktuellsten Bearbeitungsstand aufweist. Und leider haben wir auch noch soeben beide Versionen ge&ouml;ffnet, um zu schauen, ob wir so herausfinden k&ouml;nnen, welche die aktuelle Version ist. Damit haben wir einen wichtigen Marker zerst&ouml;rt &#8211; n&auml;mlich das &Auml;nderungsdatum der Datei.<\/p>\n<p>Daran h&auml;tten wir zumindest erkennen k&ouml;nnen, welche Version wir zuletzt ge&ouml;ffnet haben. Allerdings wird bereits beim &Ouml;ffnen einer Access-Anwendung das &Auml;nderungsdatum auf das aktuelle Datum eingestellt &#8211; wir brauchen dazu gar keine &Auml;nderungen am Entwurf oder an den Daten vorzunehmen.<\/p>\n<p>Nun haben wir also zwei verschiedene Versionen einer Datenbank vorliegen und ben&ouml;tigen Kriterien, um herauszufinden, an welcher wir zuletzt gearbeitet haben.<\/p>\n<p>Diese lauten beispielsweise wie folgt:<\/p>\n<ul>\n<li>Gibt es in einer der beiden Datenbanken neue, die es in der anderen Datenbank nicht gibt?<\/li>\n<li>Wurden aus einer der Datenbanken vielleicht sogar Objekte gel&ouml;scht?<\/li>\n<li>Wie lautet das letzte Bearbeitungsdatum der Objekte der Datenbank?<\/li>\n<\/ul>\n<p>Wenn wir diese Kriterien untersuchen, sollten wir ann&auml;hernd herausfinden k&ouml;nnen, welche der beiden Datenbankdateien den aktuelleren Stand aufweist. Das ist zumindest dann der Fall, wenn wir nur an einer der beiden &Auml;nderungen seit einem bestimmten Zeitpunkt vorgenommen haben.<\/p>\n<p>Wenn wir die Datenbanken abwechselnd ge&ouml;ffnet und &Auml;nderungen an verschiedenen (oder sogar den gleichen) Stellen vorgenommen haben, ist das zwar unangenehm, weil wir die &Auml;nderungen dann zusammenf&uuml;hren m&uuml;ssen. Wir wissen dann aber zumindest, warum bestimmte &Auml;nderungen, von denen wir sicher waren, dass wir sie durchgef&uuml;hrt haben, nicht mehr vorhanden sind.<\/p>\n<h2>&Auml;nderungszeitpunkt von Objekten ermitteln<\/h2>\n<p>Den &Auml;nderungszeitpunkt eines Objekts k&ouml;nnen wir neben dem Erstellungszeitpunkt &uuml;ber die Benutzeroberfl&auml;che von Access ermitteln. Dazu klicken wir mit der rechten Maustaste in die Titelleiste des Navigationsbereichs von Access und w&auml;hlen dort den Eintrag <b>Anzeigen nach|Details <\/b>aus. Danach sehen wir die gew&uuml;nschten Informationen zu jedem Eintrag (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_001.png\" alt=\"&Auml;nderungszeitpunkt von Objekten ermitteln\" width=\"624,559\" height=\"447,2288\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: &Auml;nderungszeitpunkt von Objekten ermitteln<\/span><\/b><\/p>\n<p>Wenn wir Datenbanken mit so wenigen Objekten wie die aus dem Screenshot vergleichen wollen, brauchen wir daf&uuml;r keine eigene Anwendung zu entwickeln. Aber in der Regel ist die Anzahl der enthaltenen Objekte gr&ouml;&szlig;er und ein manueller Abgleich macht schnell keinen Spa&szlig; mehr.<\/p>\n<p>Also machen wir uns auf die Suche nach dem Speicherort dieser Informationen und sto&szlig;en dabei schnell auf die Systemtabelle <b>MSysObjects<\/b>. Systemtabellen wie diese sind standardm&auml;&szlig;ig ausgeblendet. Wir holen diese hervor, indem wir wieder mit der rechten Maustaste auf die Titelleiste des Navigationsbereichs klicken und nun den Eintrag <b>Navigationsoptionen&#8230; <\/b>ausw&auml;hlen. Es erscheint der Dialog <b>Navigationsoptionen<\/b>, wo wir im Bereich <b>Anzeigeoptionen <\/b>die Optionen <b>Ausgeblendete Objekte anzeigen <\/b>und <b>Systemobjekte anzeigen <\/b>aktivieren.<\/p>\n<p>Diese Tabelle liefert f&uuml;r alle Datenbankobjekte wie Tabellen, Abfragen, Formulare, Berichte, Makros und VBA-Module jeweils einen Eintrag (und f&uuml;r einige weitere Objekttypen, die hier nicht von Interesse sind). Dieser enth&auml;lt neben dem Objekttyp und dem Namen auch zwei Felder namens <b>DateCreated <\/b>und <b>DateUpdated<\/b>. Damit haben wir bereits alle Informationen, die wir ben&ouml;tigen. Wir m&uuml;ssen sie nur noch zusammenf&uuml;hren und abgleichen.<\/p>\n<h2>Objektedaten in neue Datenbank importieren<\/h2>\n<p>Dazu erstellen wir eine neue Datenbank namens <b>AktuellereDatenbankFinden.accdb<\/b>. In diese wollen wir zuerst die Tabelle <b>MSysObjects <\/b>der beiden Versionen der Datenbank importieren. Dazu ben&ouml;tigen wir bereits ein Formular, denn wir wollen die Auswahl der Datenbankdateien so komfortabel wie m&ouml;glich gestalten &#8211; in diesem Fall mit entsprechenden Dateiauswahl-Dialogen.<\/p>\n<p>Nach der Auswahl der abzugleichenden Datenbanken wollen wir mit einer Schaltfl&auml;che einen Vorgang starten, bei dem die relevanten Daten f&uuml;r alle in den beiden Datenbanken enthaltenen Objekte in eine zusammenfassende Tabelle geschrieben werden.<\/p>\n<p>Diese hei&szlig;t <b>tblObjekte <\/b>und ihr Entwurf sieht wie in Bild 2 aus. Neben dem Objektnamen speichern wir darin den Objekttyp sowie das &Auml;nderungsdatum f&uuml;r das Objekt in der ersten und in der zweiten Datenbank. Wenn das Objekt nur in einer der beiden Datenbanken vorhanden ist, schreiben wir das Datum nur in das entsprechende Feld.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_002.png\" alt=\"Entwurf der Tabelle zum Speichern der &Auml;nderungsdaten der Objekte\" width=\"499,5589\" height=\"371,0767\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle zum Speichern der &Auml;nderungsdaten der Objekte<\/span><\/b><\/p>\n<h2>Formular zum Anzeigen der &Auml;nderungsdaten<\/h2>\n<p>Das Formular zur Auswahl der zu untersuchenden Dateien und zum Anzeigen der relevanten Daten legen wir unter dem Namen <b>frmVergleichen <\/b>an. Diesem f&uuml;gen wir zun&auml;chst zwei Textfelder namens <b>txtVersion1 <\/b>und <b>txtVersion2<\/b> hinzu. Daneben platzieren wir zwei Schaltfl&auml;chen.<\/p>\n<p>Diese statten wir jeweils mit einem Ordner-Icon aus und stellen die Eigenschaften <b>Hintergrundart <\/b>und <b>Rahmenart <\/b>auf <b>Transparent<\/b> ein. Das Formular sieht anschlie&szlig;end wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_003.png\" alt=\"Felder zum Ausw&auml;hlen der zu vergleichenden Dateien\" width=\"424,5589\" height=\"167,6829\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Felder zum Ausw&auml;hlen der zu vergleichenden Dateien<\/span><\/b><\/p>\n<p>F&uuml;r die Ereignisprozeduren der beiden Schaltfl&auml;chen, die durch das Ereignis <b>Beim Klicken <\/b>ausgel&ouml;st werden, hinterlegen wir die folgenden Prozeduren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDateiOeffnen1_Click()\r\n     Me!txtVersion1 = DateiOeffnen\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdDateiOeffnen2_Click()\r\n     Me!txtVersion2 = DateiOeffnen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Beide nutzen die gleiche Funktion, um den Pfad zu der zu untersuchenden Datei zu ermitteln:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>DateiOeffnen()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objFiledialog<span style=\"color:blue;\"> As <\/span>Office.FileDialog\r\n     <span style=\"color:blue;\">Dim <\/span>varFilename<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objFiledialog = _\r\n         Application.FileDialog(msoFileDialogFilePicker)\r\n     objFiledialog.InitialFileName = CurrentProject.Path\r\n     <span style=\"color:blue;\">If <\/span>objFiledialog.Show = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         DateiOeffnen = objFiledialog.SelectedItems(1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Um das <b>FileDialog<\/b>-Objekt zu nutzen, ben&ouml;tigen wir einen Verweis auf die Bibliothek <b>Microsoft Office 16.0 Object Library<\/b>, den wir mit dem <b>Verweise<\/b>-Dialog aus Bild 4 hinzuf&uuml;gen (VBA-Editor, Men&uuml;eintrag <b>Extras|Verweise<\/b>). F&uuml;r die beiden Textfelder stellen wir die Eigenschaft <b>Horizontaler Anker <\/b>auf <b>Beide <\/b>ein, damit sich diese an die Formularbreite anpassen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_004.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf die Office-Bibliothek\" width=\"424,5589\" height=\"334,6954\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Hinzuf&uuml;gen eines Verweises auf die Office-Bibliothek<\/span><\/b><\/p>\n<h2>Unterformular zum Anpassen der Ergebnisse<\/h2>\n<p>Bevor wir die Funktion zum Abgleichen der Unterschiede anlegen, f&uuml;gen wir dem Formular ein Unterformular zum Anzeigen der Ergebnisse hinzu. Das Unterformular hei&szlig;t <b>sfmVergleichen <\/b>und verwendet die Tabelle <b>tblObjekte <\/b>als Datensatzquelle. Wir f&uuml;gen alle Felder dieser Tabelle zum Formular hinzu und stellen seine Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>ein (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_005.png\" alt=\"Unterformular der Anwendung\" width=\"424,5589\" height=\"214,3089\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Unterformular der Anwendung<\/span><\/b><\/p>\n<p>Danach f&uuml;gen wir das Formular samt einer weiteren Schaltfl&auml;che namens <b>cmdVergleichen <\/b>zum Hauptformular hinzu (siehe Bild 6). F&uuml;r das hinzugef&uuml;gte Unterformular stellen wir die beiden Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>auf <b>Beide <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_006.png\" alt=\"Das Hauptformular der Anwendung in der Entwurfsansicht\" width=\"424,5589\" height=\"368,6958\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Das Hauptformular der Anwendung in der Entwurfsansicht<\/span><\/b><\/p>\n<h2>Einlesen der Objektdaten der Datenbanken<\/h2>\n<p>Im n&auml;chsten Schritt f&uuml;gen wir der Schaltfl&auml;che <b>cmdVergleichen<\/b> eine Prozedur f&uuml;r das Ereignis <b>Beim Klicken <\/b>hinzu (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVergleichen_Click()\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>lngObjektID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strObjekttyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strWhere<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     db.Execute \"DELETE FROM tblObjekte\", dbFailOnError\r\n     db.Execute \"DROP TABLE tblObjects1\", dbFailOnError\r\n     db.Execute \"DROP TABLE tblObjects2\", dbFailOnError\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     DoCmd.TransferDatabase acImport, \"Microsoft Access\", Me.txtVersion1, acTable, \"MSysObjects\", \"tblObjects1\"\r\n     DoCmd.TransferDatabase acImport, \"Microsoft Access\", Me.txtVersion2, acTable, \"MSysObjects\", \"tblObjects2\"\r\n     strWhere = \" WHERE Type IN (1, 4, 5, 6, -32761, -32764, -32766, -32768) AND NOT Name LIKE ''~*'' \" _\r\n         & \"AND NOT Name LIKE ''MSys*'' AND NOT Name LIKE ''f_*''\"\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblObjects1\" & strWhere, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         strObjekttyp = ObjekttypErmitteln(rst!Type)\r\n         db.Execute \"INSERT INTO tblObjekte(Objektname, Objekttyp, Geaendert1) VALUES(''\" & rst!Name & \"'', ''\" _\r\n             & strObjekttyp & \"'', \" & ISODatum(rst!DateUpdate) & \")\", dbFailOnError\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblObjects2\" & strWhere, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         lngObjektID = Nz(DLookup(\"ObjektID\", \"tblObjekte\", \"Objektname = ''\" & rst!Name & \"''\"), 0)\r\n         <span style=\"color:blue;\">If <\/span>lngObjektID = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strObjekttyp = ObjekttypErmitteln(rst!Type)\r\n             db.Execute \"INSERT INTO tblObjekte(Objektname, Objekttyp, Geaendert2) VALUES(''\" & rst!Name & \"'', ''\" _\r\n                 & strObjekttyp & \"'', \" & ISODatum(rst!DateUpdate) & \")\", dbFailOnError\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             db.Execute \"UPDATE tblObjekte SET Geaendert2 = \" & ISODatum(rst!DateUpdate) & \" WHERE ObjektID = \" _\r\n                 & lngObjektID, dbFailOnError\r\n         End If \r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     Me!sfmVergleichen.Form.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Abgleichen der &Auml;nderungsdaten der Objekt der zu untersuchenden Datenbanken<\/span><\/b><\/p>\n<p>Hier f&uuml;hren wir zuerst einige Aufr&auml;umarbeiten durch. Wir leeren die Tabelle <b>tblObjekte<\/b>, damit keine Daten aus vorherigen Untersuchungen mehr in der Tabelle sind. Au&szlig;erdem l&ouml;scht die Prozedur zwei Tabellen namens <b>tblObjects1 <\/b>und <b>tblObjects2<\/b>, die wir bisher noch gar nicht angelegt haben.<\/p>\n<p>Genau aus diesem Grund erledigen wir diese Aufgabe auch bei deaktivierter eingebauter Fehlerbehandlung &#8211; der Versuch, eine nicht vorhandene Tabelle zu l&ouml;schen, w&uuml;rde sonst einen Fehler ausl&ouml;sen.<\/p>\n<p>Was aber sind das &uuml;berhaupt f&uuml;r Tabellen? In diese kopieren wir die Daten der Systemtabellen namens <b>MSysObjects <\/b>der zu untersuchenden Datenbanken. Das erledigen wir mit der Methode <b>TransferDatabase <\/b>der <b>DoCmd<\/b>-Klasse. Damit diese einen Import durchf&uuml;hrt, &uuml;bergeben wir als ersten Parameter den Wert <b>acImport<\/b>. Der zweite Parameter gibt die Herkunftsanwendung der Daten an, der dritte den Typ des einzulesenden Objekts. Die letzten beiden Parameter legen fest, dass die Daten der Tabelle <b>MSysObjects <\/b>in die Tabelle <b>tblObjects1 <\/b>beziehungsweise <b>tblObjects2 <\/b>eingelesen werden sollen. Dieser Befehl erstellt die Tabellen auf Basis der Quelltabelle neu.<\/p>\n<h2>Abgleich der &Auml;nderungsdaten<\/h2>\n<p>Die folgenden Anweisungen legen die f&uuml;r den Abgleich der &Auml;nderungsdaten notwendigen Daten in der Tabelle <b>tblObjekte <\/b>an. Dabei wollen wir nur die Datens&auml;tze der Tabelle <b>MSysObjects <\/b>ber&uuml;cksichtigen, die eines der zu untersuchenden Objekte betreffen. Au&szlig;erdem wollen wir Systemtabellen und tempor&auml;re Objekte oder im Hintergrund verwendete Objekte nicht ber&uuml;cksichtigen.<\/p>\n<p>Dazu stellen wir ein <b>Where<\/b>-Kriterium zusammen, das nur die Objekttypen <b>1<\/b>, <b>4<\/b>, <b>5<\/b>, <b>6<\/b>, <b>-32761<\/b>, <b>-32764<\/b>, <b>-32766 <\/b>und <b>-32768 <\/b>ber&uuml;cksichtigt (mehr dazu weiter unten) und einige Objekte aufgrund ihres Objektnamens ausschlie&szlig;t (<b>f_*<\/b>,<b> MSys*<\/b> oder <b>~*<\/b>).<\/p>\n<p>Nun beginnen wir mit dem Einlesen der Daten aus der ersten zu untersuchenden Datenbank. Dazu erstellen wir ein Recordset auf Basis der Tabelle <b>tblObjects1<\/b>, welches das Kriterium aus <b>strWhere <\/b>ber&uuml;cksichtigt. Das Recordset enth&auml;lt also nur die Objekte der Datenbank, die wir untersuchen wollen. Anschlie&szlig;end durchlaufen wir die Elemente des Recordsets in einer <b>Do While<\/b>-Schleife. Dabei rufen wir als Erstes eine Funktion namens <b>ObjekttypErmitteln <\/b>auf, der wir den Wert des Feldes <b>Type <\/b>&uuml;bergeben. Die Funktion untersucht diesen Wert in einer <b>Select Case<\/b>-Bedingung und liefert einen Text zur&uuml;ck, welcher dem angegebenen Zahlenwert entspricht &#8211; bei dem Wert <b>1 <\/b>beispielsweise den Text <b>Tabelle<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ObjekttypErmitteln(lngObjekttyp<span style=\"color:blue;\"> As <\/span>_\r\n         Long)<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case lngObjekttyp\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             ObjekttypErmitteln = \"Lokale Tabelle\"\r\n         <span style=\"color:blue;\">Case <\/span>4\r\n             ObjekttypErmitteln = \"ODBC-Tabelle\"\r\n         <span style=\"color:blue;\">Case <\/span>5\r\n             ObjekttypErmitteln = \"Abfrage\"\r\n         <span style=\"color:blue;\">Case <\/span>6\r\n             ObjekttypErmitteln = \"Verkn&uuml;pfte Tabelle\"\r\n         <span style=\"color:blue;\">Case <\/span>-32761\r\n             ObjekttypErmitteln = \"VBA-Modul\"\r\n         <span style=\"color:blue;\">Case <\/span>-32764\r\n             ObjekttypErmitteln = \"Bericht\"\r\n         <span style=\"color:blue;\">Case <\/span>-32766\r\n             ObjekttypErmitteln = \"Makro\"\r\n         <span style=\"color:blue;\">Case <\/span>-32768\r\n             ObjekttypErmitteln = \"Formular\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Damit ausgestattet rufen wir die <b>Execute<\/b>-Methode des <b>Database<\/b>-Objekts der aktuellen Datenbank auf und &uuml;bergeben dieser eine <b>INSERT INTO<\/b>-Anweisung, mit der wir einen neuen Datensatz zur Tabelle <b>tblObjekte <\/b>hinzuf&uuml;gen.<\/p>\n<p>Dieser tr&auml;gt die Werte f&uuml;r die Felder <b>Objektname<\/b>, <b>Objekttyp <\/b>und <b>Geaendert1 <\/b>ein, also das &Auml;nderungsdatum f&uuml;r das Objekt aus der ersten zu untersuchenden Datenbank.<\/p>\n<p>Nach dem Durchlaufen der ersten Schleife sieht die Tabelle wie in Bild 7 aus. F&uuml;r jedes relevante Objekt wurde ein Eintrag angelegt. Lediglich das &Auml;nderungsdatum f&uuml;r das gleichnamige Objekt in der zweiten zu untersuchenden Datenbank ist noch nicht vorhanden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_007.png\" alt=\"Die Tabelle tblObjekte nach dem Untersuchen der ersten Datenbank\" width=\"499,5589\" height=\"227,3978\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Die Tabelle tblObjekte nach dem Untersuchen der ersten Datenbank<\/span><\/b><\/p>\n<p>Dieses f&uuml;gen wir nun hinzu. Dazu erstellen wir ein weiteres Recordset, das nun die Datens&auml;tze der Tabelle <b>tblObjects2 <\/b>mit den Daten aus der zweiten zu untersuchenden Datenbank enth&auml;lt.<\/p>\n<p>W&auml;hrend wir die Datens&auml;tze dieses Recordsets durchlaufen, ermitteln wir per <b>DLookup <\/b>den Prim&auml;rschl&uuml;sselwert eines eventuell bereits vorhandenen Datensatzes f&uuml;r das aktuelle Objekt in der Tabelle <b>tblObjekte<\/b>. Hat <b>lngObjektID <\/b>anschlie&szlig;end den Wert <b>0<\/b>, handelt es sich hierbei um ein Objekt, das nur in der zweiten, nicht aber in der ersten zu untersuchenden Datenbank vorhanden ist.<\/p>\n<p>In diesem Fall legen wir einen neuen Datensatz in der Tabelle <b>tblObjekte <\/b>an, f&uuml;r den wir lediglich das Datum im Feld <b>Geaendert2 <\/b>eintragen &#8211; das Feld <b>Geaendert1 <\/b>bleibt leer. Ist <b>lngObjektID <\/b>nicht <b>0<\/b>, ist das Objekt bereits in der Tabelle <b>tblObjekte <\/b>vorhanden und wir brauchen nur per <b>UPDATE<\/b>-Abfrage das Datum im Feld <b>Geaendert2 <\/b>zu erg&auml;nzen.<\/p>\n<p>Nachdem wir so alle Objekte der beiden zu untersuchenden Datenbanken und ihre &Auml;nderungsdaten eingetragen haben, brauchen wir nur noch das Unterformular mit dem Inhalt der Tabelle <b>tblObjekte <\/b>zu aktualisieren.<\/p>\n<h2>Formular anpassen<\/h2>\n<p>Schauen wir uns nun das Ergebnis an, sehen wir, dass alle Daten wie gew&uuml;nschte eingetragen wurden (siehe Bild 8). Allerdings k&ouml;nnen wir nicht besonders gut erkennen, ob irgendein Objekt in der einen oder anderen Datenbank ein aktuelleres &Auml;nderungsdatum aufweist. Das wird bei einer gr&ouml;&szlig;eren Anzahl von Objekten nur noch schwieriger. Also passen wir das Unterformular noch so an, dass wir die Unterschiede besser erkennen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_008.png\" alt=\"Anzeige der &Auml;nderungsdaten im Formular\" width=\"599,559\" height=\"377,5308\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Anzeige der &Auml;nderungsdaten im Formular<\/span><\/b><\/p>\n<h2>Unterschiede mit bedingter Formatierung<\/h2>\n<p>Dazu bietet sich der Einsatz der bedingten Formatierung an. Dazu zeigen wir das Formular in der Formularansicht an und klicken in die Datenblattansicht des Unterformulars. Im Ribbon finden wir nun unter <b>Formulardatenblatt <\/b>den Eintrag <b>Formatierung|Bedingte Formatierung<\/b>.<\/p>\n<p>Klicken wir diesen Befehl an, nachdem wir das Feld <b>Geaendert1 <\/b>markiert haben, erscheint der Dialog <b>Manager f&uuml;r Regeln zur bedingten Formatierung<\/b> und zeigt unter <b>Formatierungsregeln anzeigen f&uuml;r:<\/b> direkt das gew&uuml;nschte Feld an (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_009.png\" alt=\"Der Manager f&uuml;r die bedingte Formatierung\" width=\"524,559\" height=\"284,136\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Der Manager f&uuml;r die bedingte Formatierung<\/span><\/b><\/p>\n<p>Hier klicken wir auf <b>Neue Regel <\/b>und f&uuml;hren im Dialog <b>Neue Formatierungsregel <\/b>die folgenden Schritte durch:<\/p>\n<ul>\n<li>Zweites Auswahlfeld auf <b>Gr&ouml;&szlig;er als <\/b>einstellen<\/li>\n<li>F&uuml;r das Feld rechts daneben den Namen des zu vergleichenden Feldes in eckigen Klammern eingeben, hier <b>[Geaendert2]<\/b><\/li>\n<li>Hintergrundfarbe auf Gr&uuml;n einstellen (siehe Bild 10)<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_010.png\" alt=\"Einf&uuml;gen der ersten Regel\" width=\"574,559\" height=\"292,9308\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Einf&uuml;gen der ersten Regel<\/span><\/b><\/p>\n<\/ul>\n<p>Danach k&ouml;nnen wir den Dialog wieder schlie&szlig;en und legen dann eine zweite Regel an, diesmal f&uuml;r das Feld <b>Geaendert2<\/b>. Dazu w&auml;hlen wir dieses Feld im <b>Manager f&uuml;r Regeln zur bedingten Formatierung <\/b>aus. Die Formatierungsregel ist fast genauso aufgebaut &#8211; nur dass wir hier mit dem Feld <b>[Geaendert1] <\/b>vergleichen.<\/p>\n<p>Mit ein paar unterschiedlichen &Auml;nderungsdaten sieht das Unterformular nun wie in Bild 11 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_011.png\" alt=\"Farbige Markierung aktuellerer Elemente\" width=\"599,559\" height=\"201,5685\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Farbige Markierung aktuellerer Elemente<\/span><\/b><\/p>\n<p>Es fehlt noch eine Markierung f&uuml;r Elemente, die nur in einer der beiden Datenbanken vorhanden sind. Diese wollen wir zur besseren Unterscheidbarkeit mit einem blauen Hintergrund versehen. Die Formatierungsregel bauen wir anders auf als die vorherigen. Wir stellen im ersten Auswahlfeld den Wert <b>Ausdruck ist <\/b>ein. F&uuml;r das zweite Feld daneben geben wir folgenden Ausdruck an:<\/p>\n<pre>[Geaendert2] Ist Null Und [Geaendert1] Ist Nicht Null<\/pre>\n<p>Dadurch wird <b>Geaendert1 <\/b>blau markiert, wenn es nicht leer ist, aber <b>Geaendert2 <\/b>keinen Inhalt hat. Die vollst&auml;ndige Regel sehen Sie in Bild 12.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_012.png\" alt=\"Regel f&uuml;r Elemente, die nur in einer Anwendung vorkommen\" width=\"599,559\" height=\"305,6768\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Regel f&uuml;r Elemente, die nur in einer Anwendung vorkommen<\/span><\/b><\/p>\n<p>F&uuml;r das Feld <b>Geaendert2 <\/b>formulieren wir die Regel genau andersherum. Das Ergebnis sieht, wenn jede Version der Datenbank ein Objekt aufweist, dass die andere Version nicht enth&auml;lt, wie in Bild 13 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_013.png\" alt=\"Unterformular mit verschiedenen Unterschieden\" width=\"599,559\" height=\"199,8529\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Unterformular mit verschiedenen Unterschieden<\/span><\/b><\/p>\n<h2>Optimierungen der Benutzeroberfl&auml;che<\/h2>\n<p>Was noch auff&auml;llt, sind die &uuml;berfl&uuml;ssigen Elemente im Hauptformular &#8211; diese entfernen wir durch Einstellen der Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Trennlinien <\/b>und <b>Bildlaufleisten <\/b>auf den Wert <b>Nein<\/b>. Au&szlig;erdem soll das Formular zentriert erscheinen. Dazu stellen wir die Eigenschaft <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>ein.<\/p>\n<h2>Umwandlung in ein Add-In<\/h2>\n<p>Der n&auml;chste Schritt ist die Umwandlung dieser Anwendung in ein Add-In, das wir &uuml;ber die Liste der Add-Ins im Ribbon starten k&ouml;nnen. Warum sollen wir diesen Aufwand betreiben? <\/p>\n<p>Weil es nicht so h&auml;ufig vorkommt, dass wir es einsetzen &#8211; und wenn wir es dann brauchen, wissen wir sicher, dass es &uuml;ber die Liste der Add-Ins in Access aufrufbar ist. Au&szlig;erdem haben wir im Beitrag <b>Access-Add-In per Knopfdruck erstellen <\/b>(<b>www.access-im-unternehmen.de\/1427<\/b>) ein Add-In programmiert, mit dem wir Datenbankanwendungen wie die vorliegende schnell in ein Add-In umwandeln k&ouml;nnen. Zeit, dieses Add-In einmal einzusetzen!<\/p>\n<p>Dazu rufen wir das Add-In, das Sie im Download zu dem oben genannten Beitrag finden und installieren k&ouml;nnen, &uuml;ber das Add-In-Men&uuml; auf. Es erscheint ein Dialog, den wir wie in Bild 14 f&uuml;llen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1448_014.png\" alt=\"Erstellen eines Add-Ins aus einer Datenbank\" width=\"424,5589\" height=\"268,411\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Erstellen eines Add-Ins aus einer Datenbank<\/span><\/b><\/p>\n<p>Danach sind noch folgende Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Einstellen der Dateiendung auf <b>.accda<\/b><\/li>\n<li>Erg&auml;nzen der Prozedur Autostart im Modul <b>mdlAddIn <\/b>um den Aufruf des Formulars <b>frmVergleichen<\/b>:<\/li>\n<\/ul>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart()\r\n     DoCmd.OpenForm \"frmVergleichen\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Danach rufen wir in Access den Add-In-Manager auf und f&uuml;gen das neue Add-In &uuml;ber die Schaltfl&auml;che <b>Neues hinzuf&uuml;gen&#8230; <\/b>zur Liste der Add-Ins hinzu.<\/p>\n<p>Anschlie&szlig;end finden Sie das Add-In im Ribbon und k&ouml;nnen es jederzeit verwenden, um die Unterschiede bez&uuml;glich der &Auml;nderungszeit der Objekte zweier Versionen einer Datenbank zu ermitteln.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag ist aus meiner eigenen Praxis entstanden &#8211; ich hatte bei zwei Versionen einer Datenbank den &Uuml;berblick verloren und wollte genau wissen, ob es Unterschiede bez&uuml;glich der Objekte gibt.<\/p>\n<p>Ich &uuml;berlegte zun&auml;chst, ob ich die Objekte komplett vergleichen wollte, aber das schien mir zu aufwendig und mir kam die Idee, einfach nur die &Auml;nderungsdaten der einzelnen Objekte zu vergleichen.<\/p>\n<p>Dieser Beitrag zeigt, wie ich die L&ouml;sung entwickelt und daraus ein Add-In erstellt habe. Man k&ouml;nnte diese L&ouml;sung noch weiter aufbohren und den Code der einzelnen Objekte oder ihren Inhalt vergleichen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>AktuellereDatenbankfinden.accda<\/p>\n<p>AktuellereDatenbankfinden.accdb<\/p>\n<p>Beispiel_V1.accdb<\/p>\n<p>Beispiel_V2.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/FB84B92C-0DE7-4210-86CD-FF9B47A5020B\/aiu_1448.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt verschiedene Gr&uuml;nde, um Kopien einer Datenbank anzulegen. Das Herstellen einer Sicherungskopie ist wohl der am meisten verbreitete Grund. Das ist sinnvoll, aber es kann dabei zu Problemen kommen, wenn man nicht achtsam ist: Dann arbeitet man auf einmal in der Sicherheitskopie weiter und wundert sich, wenn man anschlie&szlig;end die Originaldatenbank &ouml;ffnet und die Funktionen, die man neu hinzuprogrammiert, nicht mehr findet. Oder man testet mit einer Datenbankdatei auf einer virtuellen Maschine und f&uuml;gt dort Anpassungen hinzu. Auch hier kann es zu einem &auml;hnlichen Durcheinander kommen. Um in einem solchen Fall die aktuelle Version zu finden, reicht es nicht, sich das &Auml;nderungsdatum der Datei anzusehen. Warum das nicht reicht und wie wir die aktuellere Datenbank zuverl&auml;ssig finden, zeigen wir in diesem Beitrag.<\/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":[662023,66042023,44000027],"tags":[],"class_list":["post-55001448","post","type-post","status-publish","format-standard","hentry","category-662023","category-66042023","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Aktuelle Datenbankversion ermitteln - 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\/Aktuelle_Datenbankversion_ermitteln\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aktuelle Datenbankversion ermitteln\" \/>\n<meta property=\"og:description\" content=\"Es gibt verschiedene Gr&uuml;nde, um Kopien einer Datenbank anzulegen. Das Herstellen einer Sicherungskopie ist wohl der am meisten verbreitete Grund. Das ist sinnvoll, aber es kann dabei zu Problemen kommen, wenn man nicht achtsam ist: Dann arbeitet man auf einmal in der Sicherheitskopie weiter und wundert sich, wenn man anschlie&szlig;end die Originaldatenbank &ouml;ffnet und die Funktionen, die man neu hinzuprogrammiert, nicht mehr findet. Oder man testet mit einer Datenbankdatei auf einer virtuellen Maschine und f&uuml;gt dort Anpassungen hinzu. Auch hier kann es zu einem &auml;hnlichen Durcheinander kommen. Um in einem solchen Fall die aktuelle Version zu finden, reicht es nicht, sich das &Auml;nderungsdatum der Datei anzusehen. Warum das nicht reicht und wie wir die aktuellere Datenbank zuverl&auml;ssig finden, zeigen wir in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-17T16:18:16+00:00\" \/>\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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Aktuelle Datenbankversion ermitteln\",\"datePublished\":\"2023-08-17T16:18:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/\"},\"wordCount\":2763,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/7be7966fc04149acb5d13a55807dbaa5\",\"articleSection\":[\"2023\",\"4\\\/2023\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/\",\"name\":\"Aktuelle Datenbankversion ermitteln - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/7be7966fc04149acb5d13a55807dbaa5\",\"datePublished\":\"2023-08-17T16:18:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/7be7966fc04149acb5d13a55807dbaa5\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/7be7966fc04149acb5d13a55807dbaa5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Aktuelle_Datenbankversion_ermitteln\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Aktuelle Datenbankversion ermitteln\"}]},{\"@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":"Aktuelle Datenbankversion ermitteln - 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\/Aktuelle_Datenbankversion_ermitteln\/","og_locale":"de_DE","og_type":"article","og_title":"Aktuelle Datenbankversion ermitteln","og_description":"Es gibt verschiedene Gr&uuml;nde, um Kopien einer Datenbank anzulegen. Das Herstellen einer Sicherungskopie ist wohl der am meisten verbreitete Grund. Das ist sinnvoll, aber es kann dabei zu Problemen kommen, wenn man nicht achtsam ist: Dann arbeitet man auf einmal in der Sicherheitskopie weiter und wundert sich, wenn man anschlie&szlig;end die Originaldatenbank &ouml;ffnet und die Funktionen, die man neu hinzuprogrammiert, nicht mehr findet. Oder man testet mit einer Datenbankdatei auf einer virtuellen Maschine und f&uuml;gt dort Anpassungen hinzu. Auch hier kann es zu einem &auml;hnlichen Durcheinander kommen. Um in einem solchen Fall die aktuelle Version zu finden, reicht es nicht, sich das &Auml;nderungsdatum der Datei anzusehen. Warum das nicht reicht und wie wir die aktuellere Datenbank zuverl&auml;ssig finden, zeigen wir in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-08-17T16:18:16+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Aktuelle Datenbankversion ermitteln","datePublished":"2023-08-17T16:18:16+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/"},"wordCount":2763,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/7be7966fc04149acb5d13a55807dbaa5","articleSection":["2023","4\/2023","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/","url":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/","name":"Aktuelle Datenbankversion ermitteln - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/7be7966fc04149acb5d13a55807dbaa5","datePublished":"2023-08-17T16:18:16+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/7be7966fc04149acb5d13a55807dbaa5","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/7be7966fc04149acb5d13a55807dbaa5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Aktuelle_Datenbankversion_ermitteln\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Aktuelle Datenbankversion ermitteln"}]},{"@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\/55001448","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=55001448"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001448\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}