{"id":55001525,"date":"2024-12-01T00:00:00","date_gmt":"2024-11-06T18:59:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1525"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"AccessFrontend_automatisch_aktualisieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/","title":{"rendered":"Access-Frontend automatisch aktualisieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/91f19f26b3204d61a6471d52fd28f11c\" width=\"1\" height=\"1\" alt=\"\"><b>Wenn man allein mit einer Access-Anwendung arbeitet, die man w&auml;hrenddessen weiterentwickelt, ist man immer auf dem aktuellsten Stand. Wer eine Anwendung auf die Arbeitspl&auml;tze seiner eigenen Mitarbeiter oder sogar die der Mitarbeiter eines Kunden installiert hat, muss schon ein wenig Aufwand betreiben, wenn jeder immer die aktuellste Version der Anwendung vorfinden soll. Die alte Version muss entfernt und die neue installiert werden. Hier kann man die Benutzer informieren, sodass diese die notwendigen Schritte manuell durchf&uuml;hren oder man erledigt dies selbst. Praktischer w&auml;re es jedoch, wenn die Anwendung selbst erkennen w&uuml;rde, wenn es eine neue Version gibt, und dann selbstst&auml;ndig ein Update durchf&uuml;hrt. Das geht nat&uuml;rlich nicht, weil sie sich nicht selbst l&ouml;schen und durch eine neue Version ersetzen kann, w&auml;hrend sie l&auml;uft. Also ben&ouml;tigen wir einen kleinen Workaround: Wir stellen dem &Ouml;ffnen der eigentlichen Anwendung eine weitere Access-Anwendung voran, die auf Updates pr&uuml;ft und diese durchf&uuml;hrt und erst dann die eigentliche Anwendung aufruft. Alle notwendigen Schritte erl&auml;utern wir in diesem Beitrag.<\/b><\/p>\n<h2>Varianten von Frontend-Updatern<\/h2>\n<p>Eine solche vorgeschaltete Anwendung nennt man auch Frontend-Updater. Dabei muss es sich nicht zwingend um eine Access-Anwendung handeln &#8211; wenn &uuml;ber die notwendigen Programmierkenntnisse und Tools verf&uuml;gt, kann man dies auch in Form einer Exe-Datei auf Basis VB6, VB.NET oder twinBASIC erledigen.<\/p>\n<p>Die Aufgabe bleibt jedoch gleich: Der Frontend-Updater soll vor der eigentlichen Access-Anwendung ge&ouml;ffnet werden und pr&uuml;fen, ob die derzeit auf dem Rechner befindliche Frontend-Datenbank die aktuellste verf&uuml;gbare Version ist. Ist diese Bedingung erf&uuml;llt, kann die Frontend-Datenbank ge&ouml;ffnet werden. Falls nicht, soll die vorhandene Frontend-Datenbank gel&ouml;scht (oder zumindest umbenannt) werden und die neue Version der Frontend-Datenbank soll stattdessen in das entsprechende Verzeichnis kopiert werden. Danach wird entweder die vorhandene oder die neu hinzugef&uuml;gte Frontend-Datenbank gestartet.<\/p>\n<p>Hier ergeben sich einige technische Herausforderungen:<\/p>\n<ul>\n<li>Wie finden wir heraus, ob sich die aktuellste Version auf dem aktuellen Rechner befindet?<\/li>\n<li>Wenn nicht &#8211; wie kopieren wir die aktuellere Version auf den Rechner und l&ouml;schen die vorhandene Version oder benennen diese um?<\/li>\n<li>Wie k&ouml;nnen wir von einer Access-Datenbank aus eine andere Access-Datenbank starten?<\/li>\n<li>Welche Voraussetzungen sind f&uuml;r ein solches Vorgehen &uuml;berhaupt erforderlich?<\/li>\n<\/ul>\n<h2>Voraussetzungen f&uuml;r ein automatisches Update des Frontends<\/h2>\n<p>Ein Update kann man nicht in jedem Fall ohne Weiteres &uuml;ber die vorhandene Version kopieren und dann einfach weiterarbeiten.<\/p>\n<p>Die erste Voraussetzung ist, dass die Daten, die von den Frontends aus bearbeitet werden, sich in einer Backend-Datenbank befinden. Das sollte aber im Mehrbenutzerbetrieb ohnehin der Fall sein. Gegebenenfalls befinden sich die Tabellen mit den Gesch&auml;ftsdaten sogar in einer SQL Server-Datenbank.<\/p>\n<p>Die zweite Voraussetzung ist, dass sich auch keine benutzerdefinierten Daten in der Frontend-Datenbank befinden. Es kommt beispielsweise oft vor, dass der Benutzer Optionen f&uuml;r die Anwendung selbst einstellen kann. So findet er beim &Ouml;ffnen der Anwendung auf seinem Desktop-Rechner immer die Konfiguration vor, die er selbst eingestellt hat. Solche Daten speichert man &uuml;blicherweise in einer oder mehreren Optionen-Tabellen in der Frontend-Datenbank.<\/p>\n<p>Um dies zu umgehen, gibt es beispielsweise die folgenden Alternativen:<\/p>\n<ul>\n<li>Die Einstellungen f&uuml;r den jeweiligen Benutzer werden in einer Optionentabelle im Backend auf dem Server gespeichert, wobei dort noch ein Feld hinzuzuf&uuml;gen ist, dass kenntlich macht, zu welchem Benutzer die Einstellungen geh&ouml;ren.<\/li>\n<li>Die Einstellungen werden in einem weiteren Backend gespeichert, das sich im gleichen Verzeichnis wie das Frontend des Benutzers befindet. Auf diese Weise k&ouml;nnen wir das Frontend austauschen, ohne dass die Einstellungen des Benutzers verlorengehen. Wir m&uuml;ssen nur sicherstellen, dass sich eine neue Version des Frontends automatisch wieder mit dem Backend mit den Optionentabellen verkn&uuml;pft.<\/li>\n<li>Oder wir speichern Optionen gar nicht in einer Tabelle, sondern in der Registry in dem f&uuml;r den aktuellen Benutzer f&uuml;r VBA-Anwendungen vorgesehenen Bereich. Wie das gelingt, zeigen wir beispielsweise im Beitrag <b>Optionen einfach in der Registry speichern <\/b>(<b>www.access-im-unternehmen.de\/1512<\/b>).<\/li>\n<\/ul>\n<h2>Information &uuml;ber die aktuelle Version speichern<\/h2>\n<p>Wenn wir vergleichen wollen, ob die auf dem Server liegende Version des Datenbank-Frontends aktueller ist, als die vorliegende Version, m&uuml;ssen wir irgendwo in den Datenbankdateien die Versionsnummer speichern.<\/p>\n<p>Zun&auml;chst einmal schlagen wir vor, hier einfach eine durchlaufende Nummer zu verwenden. Auf diese Weise k&ouml;nnen wir am einfachsten vergleichen, welche Version die aktuellere ist.<\/p>\n<p>Dann ben&ouml;tigen wir einen geeigneten Ort f&uuml;r diese Information. Dazu gibt es mindestens die folgenden beiden Vorschl&auml;ge:<\/p>\n<ul>\n<li>Speichern der Versionsnummer in einer Optionentabelle der Frontends<\/li>\n<li>Speichern der Versionsnummer in einer Eigenschaft der Access-Datenbank<\/li>\n<\/ul>\n<p>Beide Informationen k&ouml;nnen wir einfach per VBA abfragen und manuell oder per Code setzen. Sp&auml;ter beschreiben wir die technische Umsetzung.<\/p>\n<h2>Pr&uuml;fen, ob die vorliegende Version die aktuellste Version ist<\/h2>\n<p>Wenn sich sowohl im vorliegenden Frontend als auch in der Version auf dem Server die Information &uuml;ber die Version entweder in einer Tabelle oder in einer Eigenschaft befindet, k&ouml;nnen wir diese einfach einlesen und vergleichen.<\/p>\n<p>In beiden F&auml;llen m&uuml;ssen wir von der Frontend-Updater-Anwendung aus per VBA auf die jeweilige Version zugreifen. Wenn wir, wie oben vorgeschlagen, eine einfache Versionsnummer w&auml;hlen, k&ouml;nnen wir diese auch ganz einfach vergleichen und entscheiden, ob die Version vom Server die aktuelle Version ersetzen soll.<\/p>\n<h2>Umbenennen\/L&ouml;schen der alten Version und Kopieren der neuen Version<\/h2>\n<p>Wenn wir herausgefunden haben, dass sich auf dem Server eine aktuellere Version der Frontend-Datenbank befindet, sind die folgenden Schritte durchzuf&uuml;hren:<\/p>\n<ul>\n<li>L&ouml;schen oder Umbenennen der vorliegenden Version, wobei wir das Umbenennen bevorzugen w&uuml;rden. Auf diese Weise k&ouml;nnten wir die vorliegende Version wiederherstellen, wenn das Update aus irgendeinem Grund nicht funktioniert. Beim Umbenennen k&ouml;nnten wir einfach die aktuelle Version hinten an den Dateinamen anh&auml;ngen. Das Umbenennen oder auch das L&ouml;schen l&auml;sst sich per VBA realisieren.<\/li>\n<li>Kopieren der neueren Version vom Server auf den aktuellen Rechner. Dies gelingt ebenfalls mit einem einfachen VBA-Befehl.<\/li>\n<\/ul>\n<h2>Starten der eigentlichen Datenbank von der Updater-Anwendung aus<\/h2>\n<p>Schlie&szlig;lich fehlt noch der Schritt, der bei jedem Start durchgef&uuml;hrt werden muss: Die Frontend-Updater-Datenbank muss die eigentliche Datenbank starten, unabh&auml;ngig davon, ob diese zuvor aktualisiert wurde oder nicht.<\/p>\n<h2>Testszenario<\/h2>\n<p>Zum Testen verwenden wir zwei gleiche Datenbanken, die lediglich die Tabelle mit der Versionsnummer enthalten. Die zu pr&uuml;fende und gegebenenfalls zu ersetzende Datenbank liegt in einem Verzeichnis mit der Frontend-Updater-Datenbank.<\/p>\n<p>Statt eines Servers verwenden wir ein Verzeichnis namens <b>Server<\/b>, das sich im gleichen Verzeichnis wie die beiden zuvor genannten Datenbankdateien befindet.<\/p>\n<p>Die Struktur sieht also wie folgt aus:<\/p>\n<pre>Frontend.accdb\r\nFrontendUpdater.accdb\r\nServer\r\n   Frontend.accdb (neuere Version)<\/pre>\n<p>Die <b>Frontent.accdb<\/b>-Datenbanken enthalten eine Tabelle namens <b>tblVersion <\/b>mit einem einzigen Feld mit dem Datentyp <b>Zahl <\/b>und dem Namen <b>Version<\/b>.<\/p>\n<p>Nun bearbeiten wir die Datenbank <b>FrontendUpdater.accdb<\/b>, damit diese die notwendige Pr&uuml;fung durchf&uuml;hrt, gegebenenfalls das Frontend ersetzt und dieses dann startet.<\/p>\n<h2>Code beim Starten automatisch ausf&uuml;hren<\/h2>\n<p>Die Voraussetzung f&uuml;r eine automatische Pr&uuml;fung beim Start der Datenbank <b>FrontendUpdater.accdb <\/b>ist, dass diese beim Starten den entsprechenden Code ausf&uuml;hrt. Das k&ouml;nnen wir am einfachsten mit einem <b>AutoExec<\/b>-Makro realisieren, der wir den Namen der zu startenden VBA-Funktion f&uuml;r die Makroaktion <b>Ausf&uuml;hrenCode<\/b> &uuml;bergeben (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1525_001.png\" alt=\"AutoExec-Makro, das beim Start automatisch ausgef&uuml;hrt wird\" width=\"424,5589\" height=\"151,4013\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: AutoExec-Makro, das beim Start automatisch ausgef&uuml;hrt wird<\/span><\/b><\/p>\n<p>Die Funktion <b>StartDb <\/b>k&ouml;nnen wir testhalber zun&auml;chst wie folgt formulieren:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StartDb()\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Start\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Starten wir die Datenbank nun neu, sollte das Meldungsfenster erscheinen.<\/p>\n<h2>Version des vorliegenden Frontends einlesen<\/h2>\n<p>Mit der Funktion <b>GetVersion <\/b>aus Listing 1, der wir den Pfad zu der zu untersuchenden Datenbankdatei &uuml;bergeben, erstellen wir ein <b>Database<\/b>-Objekt auf Basis der mit <b>OpenDatabase <\/b>ge&ouml;ffneten Datenbankdatei. F&uuml;r diese &ouml;ffnen wir ein Recordset auf Basis der Tabelle <b>tblVersion<\/b>. Enth&auml;lt diese zumindest einen Datensatz, lesen wir daraus die Version aus und geben diese als Funktionswert zur&uuml;ck. Anderenfalls geben wir eine entsprechende Meldung aus.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetVersion(strFrontend<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = OpenDatabase(strFrontend)\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT Version FROM tblVersion\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         GetVersion = rst!Version\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Keine Versionsnummer in ''\" & strFrontend & \"'' gefunden.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einlesen der Version, l&auml;ngere Variante<\/span><\/b><\/p>\n<p>Die zweite Version von GetVersion ist noch ein wenig k&uuml;rzer (siehe Listing 2). Hier integrieren wir den Namen der zu untersuchenden Datenbank in die <b>OpenRecordset<\/b>-Methode. Dadurch sparen wir das Initialisieren des <b>Database<\/b>-Objekts f&uuml;r die Frontend-Datenbank.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetVersion1(strFrontend<span style=\"color:blue;\"> As String<\/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 = CurrentDb.OpenRecordset(\"SELECT Version FROM tblVersion IN ''\" & strFrontend & \"''\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         GetVersion1 = rst!Version\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Keine Versionsnummer in ''\" & strFrontend & \"'' gefunden.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Einlesen der Version, k&uuml;rzere Variante<\/span><\/b><\/p>\n<p>Egal, welche Version wir w&auml;hlen &#8211; wir k&ouml;nnen damit sowohl die Version des vorliegenden Frontends als auch die der Version vom Server ermitteln und dann in per <b>If&#8230;Then<\/b>-Bedingung ermitteln, welche Aktion durchzuf&uuml;hren ist. Dazu nutzen wir die neue Version der Prozedur <b>StartDb <\/b>aus Listing 3.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StartDb()\r\n     <span style=\"color:blue;\">Dim <\/span>strCurrent<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strServer<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngVersionCurrent<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngVersionServer<span style=\"color:blue;\"> As Long<\/span>\r\n     strCurrent = CurrentProject.Path & \"\\Frontend.accdb\"\r\n     strServer = CurrentProject.Path & \"\\Server\\Frontend.accdb\"\r\n     lngVersionCurrent = GetVersion(strCurrent)\r\n     lngVersionServer = GetVersion1(strServer)\r\n     <span style=\"color:blue;\">If <\/span>lngVersionCurrent &lt; lngVersionServer<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Muss von Version ''\" & lngVersionCurrent & \"'' auf Version ''\" & lngVersionServer & \"'' aktualisiert werden.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Keine Aktualisierung n&ouml;tig.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Vergleichen der Version und Ausgabe der zu treffenden Ma&szlig;nahme<\/span><\/b><\/p>\n<p>Sie schreibt die Pfade zu den zu untersuchenden Frontends in die Variablen <b>strCurrent <\/b>und <b>strServer<\/b>.<\/p>\n<p>Dann nutzt sie die Funktion <b>GetVersion<\/b>, um die Versionen zu den beiden Dateien zu ermitteln und in die Variablen <b>lngVersionCurrent <\/b>und <b>lngVersionServer <\/b>zu schreiben.<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft sie, ob das Frontend vom Server eine gr&ouml;&szlig;ere Versionsnummer hat als das vorliegende und gibt eine entsprechende Meldung aus.<\/p>\n<p>Bevor wir uns ansehen, wie wir das Frontend ersetzen, erstellen wir noch schnell eine kleine Hilfsprozedur, mit der wir die Versionsst&auml;nde der Frontends jeweils auf <b>1 <\/b>und <b>2 <\/b>einstellen. So brauchen wir diese nicht immer manuell einzustellen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SetVersions()\r\n     <span style=\"color:blue;\">Dim <\/span>strFrontend<span style=\"color:blue;\"> As String<\/span>\r\n     strFrontend = CurrentProject.Path & \"\\Frontend.accdb\"\r\n     CurrentDb.Execute \"UPDATE tblVersion IN ''\" _\r\n         & strFrontend & \"'' SET Version = 1\", dbFailOnError\r\n     strFrontend = CurrentProject.Path _\r\n         & \"\\Server\\Frontend.accdb\"\r\n     CurrentDb.Execute \"UPDATE tblVersion IN ''\" _\r\n         & strFrontend & \"'' SET Version = 2\", dbFailOnError\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Ersetzen der vorliegenden Version durch die neue Version<\/h2>\n<p>In der Funktion <b>StartDb <\/b>ersetzen wir die Anweisung im <b>If<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StartDb()\r\n     ...\r\n     <span style=\"color:blue;\">If <\/span>lngVersionCurrent &lt; lngVersionServer<span style=\"color:blue;\"> Then<\/span>\r\n         ReplaceFrontend strCurrent, strServer, _\r\n             lngVersionCurrent, lngVersionServer\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Wir rufen also eine Prozedur namens <b>ReplaceFrontend <\/b>auf, der wir den Pfad zu dem aktuellen Frontend, den Pfad zum neuen Frontend sowie die Versionen des aktuellen und des neuen Frontends als Parameter &uuml;bergeben (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ReplaceFrontend(strCurrent<span style=\"color:blue;\"> As String<\/span>, strServer<span style=\"color:blue;\"> As String<\/span>, lngVersionCurrent<span style=\"color:blue;\"> As Long<\/span>, lngVersionServer<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strCopy<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Muss von Version ''\" & lngVersionCurrent & \"'' auf Version ''\" & lngVersionServer & \"'' aktualisiert werden.\"\r\n     strCopy = <span style=\"color:blue;\">Replace<\/span>(strCurrent, \".accdb\", \"_\" & lngVersionCurrent & \".accdb\")\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Kill strCopy\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     Name strCurrent<span style=\"color:blue;\"> As <\/span>strCopy\r\n     FileCopy strServer, strCurrent\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Sichern der aktuellen Version und ersetzen durch die neue Version<\/span><\/b><\/p>\n<p>Wir haben die Meldung &uuml;ber das notwendige Ersetzen des Frontends aus <b>StartDb <\/b>in diese Prozedur &uuml;bertragen. Dann ermitteln wir den Namen der Sicherheitskopie, der aus dem Namen der aktuellen Version und dem Zusatz der bisherige Version gebildet wird. Aus <b>Frontend.accdb <\/b>wird f&uuml;r die Version <b>1 <\/b>beispielsweise <b>Frontend_1.accdb<\/b>.<\/p>\n<p>Wir l&ouml;schen eine eventuell bereits vorhandene Datei dieses Namens mit der <b>Kill<\/b>-Anweisung (dies bei deaktivierter Fehlerbehandlung, falls keine Datei diesen Namens vorhanden ist) und benennen die aktuelle Version mit der <b>Name<\/b>-Anweisung mit dem soeben ermittelten Dateinamen um. Dann k&ouml;nnen wir die <b>FileCopy<\/b>-Anweisung nutzen, um das Frontend vom Server auf den Client zu &uuml;bertragen.<\/p>\n<h2>Starten des aktuellen Frontends<\/h2>\n<p>Nachdem wir entweder herausgefunden haben, dass wir bereits mit der aktuellsten Version des Frontends arbeiten oder diese auf den aktuellen Stand gebracht haben, k&ouml;nnen wir dieses Starten.<\/p>\n<p>Das erledigen wir mit der folgenden Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>StartFrontend(strFrontend<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objAccess<span style=\"color:blue;\"> As <\/span>Access.Application\r\n     <span style=\"color:blue;\">Set<\/span> objAccess = _\r\n         CreateObject(\"Access.Application\")\r\n     <span style=\"color:blue;\">With<\/span> objAccess\r\n         .OpenCurrentDatabase strFrontend\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .UserControl = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Man k&ouml;nnte meinen, dass es auch ein einfacher Aufruf der <b>Shell<\/b>-Methode wie folgt tun w&uuml;rde:<\/p>\n<pre>Shell \"MSAccess.exe \" & strFrontend<\/pre>\n<p>Allerdings ruft dieser nur die angegebene Datenbankdatei auf, aber holt diese nicht in den Vordergrund. Das hei&szlig;t, dass der Benutzer sie nicht direkt sieht, was verwirrend sein k&ouml;nnte. Also w&auml;hlen wir den obigen Ansatz. Hier erstellen wir eine neue Access-Instanz mit dem Typ <b>Access.Application<\/b>. Mit dieser &ouml;ffnen wir mit <b>OpenCurrentDatabase <\/b>die mit <b>strFrontend <\/b>&uuml;bergebene Datenbankdatei. Dann machen wir diese Instanz sichtbar und aktivieren sie durch das Setzen der Eigenschaft UserControl auf den Wert <b>True<\/b>.<\/p>\n<h2>Frontend-Updater-Datenbank unsichtbar &ouml;ffnen<\/h2>\n<p>Aktuell starten wir die Frontend-Updater-Datenbank <b>FrontendUpdater.accdb <\/b>noch durch einen Doppelklick. Der Nachteil ist, dass dadurch mehr oder weniger kurz das Access-Fenster angezeigt wird, bevor die eigentliche Anwendung gestartet wird. Das ist an sich kein Problem, sieht aber nicht sch&ouml;n aus.<\/p>\n<p>Abhilfe k&ouml;nnen wir mit einem kleinen VB-Skript schaffen, das wir in einer Datei namens <b>Start.vbs <\/b>hinterlegen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1525_002.png\" alt=\"VB-Skript zum Starten der Frontend-Updater-Datenbank\" width=\"499,5589\" height=\"337,076\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: VB-Skript zum Starten der Frontend-Updater-Datenbank<\/span><\/b><\/p>\n<p>In VB-Skript k&ouml;nnen wir beim Deklarieren keine Dateitypen angeben, daher sieht das Folgende etwas ungewohnt aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>fso\r\n<span style=\"color:blue;\">Dim <\/span>strFolder\r\n<span style=\"color:blue;\">Dim <\/span>objAccess\r\n<span style=\"color:blue;\">Dim <\/span>strFrontendUpdater\r\n<span style=\"color:blue;\">Set<\/span> fso = CreateObject(\"Scripting.FileSystemObject\")\r\nstrFolder = fso.GetParentFolderName(WScript.ScriptFullName)\r\nstrFrontendUpdater = strFolder & \"\\FrontendUpdater.accdb\"\r\n<span style=\"color:blue;\">Set<\/span> objAccess = CreateObject(\"Access.Application\")\r\nobjAccess.OpenCurrentDatabase strFrontendUpdater<\/pre>\n<p>Im ersten Teil ermitteln wir mit dem <b>FileSystemObject <\/b>und seiner Funktion <b>GetParentFolderName <\/b>das Verzeichnis des Skripts, das sich im gleichen Verzeichnis wie die Datei <b>FrontendUpdater.accdb <\/b>befinden sollte.<\/p>\n<p>Damit setzen wir in <b>strFrontendUpdater <\/b>den vollst&auml;ndigen Pfad zur zu &ouml;ffnenden Datenbankdatei zusammen.<\/p>\n<p>Wir erstellen dann eine Access-Instanz und &ouml;ffnen mit <b>OpenCurrentDatabase <\/b>die Datenbankdatei aus <b>strFrontendUpdater<\/b>. Da wir hier nicht die Eigenschaft <b>Visible<\/b> auf <b>True <\/b>einstellen, wird das Access-Fenster gar nicht erst eingeblendet.<\/p>\n<p>So kann das <b>AutoExec<\/b>-Makro unsichtbar die Funktion <b>StartDb <\/b>aufrufen, die den Update-Prozess und den Start des Frontends erledigt.<\/p>\n<p>Der Benutzer soll jetzt also nicht mehr die Datei <b>Frontend.accdb <\/b>starten, sondern <b>Start.vbs<\/b>.<\/p>\n<h2>Sicherstellen, dass das Frontend nicht ge&ouml;ffnet ist<\/h2>\n<p>Es k&ouml;nnte ein Problem auftauchen, wenn das vorliegende Frontend bereits ge&ouml;ffnet ist, wenn wir die Frontend-Update-Datenbank aufrufen. Wenn wir versuchen, eine ge&ouml;ffnete Access-Datenbank umzubenennen, erhalten wir die Fehlermeldung aus Bild 3. Die Fehlermeldung wird durch die folgende Anweisung ausgel&ouml;st:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_06\/pic_1525_003.png\" alt=\"Fehlermeldung, wenn das Frontend bereits ge&ouml;ffnet ist\" width=\"499,5589\" height=\"283,5634\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Fehlermeldung, wenn das Frontend bereits ge&ouml;ffnet ist<\/span><\/b><\/p>\n<pre>Name strCurrent<span style=\"color:blue;\"> As <\/span>strCopy<\/pre>\n<p>Hier haben wir nun beispielsweise die folgenden M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir pr&uuml;fen vorher, ob das Frontend bereits ge&ouml;ffnet ist, geben eine Meldung aus, dass dieses zun&auml;chst geschlossen werden muss und beenden den Frontend-Updater.<\/li>\n<li>Wir reagieren erst bei Auftreten des Fehlers und weisen den Benutzer darauf hin, dass ein Update nicht m&ouml;glich ist, weil die Frontend-Datenbank bereits ge&ouml;ffnet ist.<\/li>\n<\/ul>\n<p>Wir stellen beide Varianten vor.<\/p>\n<h2>Pr&uuml;fen, ob das Frontend bereits ge&ouml;ffnet ist<\/h2>\n<p>Um zu pr&uuml;fen, ob eine Datenbankdatei bereits in Benutzung ist, k&ouml;nnen wir einen einfachen Test durchf&uuml;hren. Wir versuchen dabei, diese Datenbank f&uuml;r den bin&auml;ren Zugriff exklusiv zu &ouml;ffnen. Das gelingt nur, wenn die Datenbankdatei noch gar nicht ge&ouml;ffnet ist.<\/p>\n<p>Diese Aufgabe &uuml;bernimmt die Funktion <b>IsDatabaseInUse<\/b> aus Listing 5 f&uuml;r uns. Dieser &uuml;bergeben wir als Parameter den Pfad der zu untersuchenden Datenbank. Dann versucht die Funktion, die Datenbank mit der <b>Open<\/b>-Anweisung exklusiv zum Schreiben zu &ouml;ffnen.<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>IsDatabaseInUse(strDBPath<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intFile<span style=\"color:blue;\"> As Integer<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     intFile = FreeFile\r\n     Open strDBPath For Binary Access Read Write Lock Read Write<span style=\"color:blue;\"> As <\/span>intFile\r\n     <span style=\"color:blue;\">If <\/span>Err.Number &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         IsDatabaseInUse = <span style=\"color:blue;\">True<\/span>\r\n         Err.Clear\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         IsDatabaseInUse = <span style=\"color:blue;\">False<\/span>\r\n         Close intFile\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Pr&uuml;fen, ob eine Datenbank bereits in Verwendung ist<\/span><\/b><\/p>\n<p>Wenn die Datenbank bereits ge&ouml;ffnet ist, f&uuml;hrt das zu einem Fehler. In diesem Fall geben wir den Wert <b>True <\/b>zur&uuml;ck. Anderenfalls geben wir den Wert <b>False<\/b> zur&uuml;ck und beenden den schreibenden Zugriff.<\/p>\n<p>Diese Funktion integrieren wir direkt in die beim Start aufgerufene Funktion <b>StartDb<\/b> (siehe Listing 6). Hier finden wir zun&auml;chst heraus, ob das Frontend &uuml;berhaupt aktualisiert werden soll.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StartDb()\r\n     ...\r\n     <span style=\"color:blue;\">If <\/span>lngVersionCurrent &lt; lngVersionServer<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>IsDatabaseInUse(strCurrent) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Die Datenbank muss aktualisiert werden. Sie ist jedoch noch ge&ouml;ffnet. Bitte schlie&szlig;en \" _\r\n                 & \"Sie die Datenbank und starten Sie erneut.\", vbOKOnly + <span style=\"color:blue;\">vbCr<\/span>itical, \"Datenbank schlie&szlig;en\"\r\n             DoCmd.Quit\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             ReplaceFrontend strCurrent, strServer, lngVersionCurrent, lngVersionServer\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Keine Aktualisierung n&ouml;tig.\" & <span style=\"color:blue;\">vbCrLf<\/span> & \"Version aktuell: \" & lngVersionCurrent & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Version Server: \" & lngVersionServer\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     StartFrontend strCurrent\r\n     DoCmd.Quit\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Einbinden der Pr&uuml;fung, ob die Datenbank bereits ge&ouml;ffnet ist<\/span><\/b><\/p>\n<p>Falls ja, folgt als n&auml;chster Schritt die Pr&uuml;fung, ob die Datenbank ge&ouml;ffnet ist. In diesem Fall geben wir eine entsprechende Meldung aus. Wenn wir die Frontend-Updater-Datenbank mit dem oben vorgestellten Skript gestartet haben, erscheint diese Meldung v&ouml;llig ohne Anzeige des &uuml;brigen Access-Fensters.<\/p>\n<p>Nach dem Anzeigen der Meldung wird die Frontend-Updater-Datenbank beendet. Anderenfalls wird das Update wie geplant durchgef&uuml;hrt und das Frontend anschlie&szlig;end gestartet.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Frontend.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/EFFFB83B-7E98-4448-A059-C2F70CCC5612\/aiu_1525.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man allein mit einer Access-Anwendung arbeitet, die man w&auml;hrenddessen weiterentwickelt, ist man immer auf dem aktuellsten Stand. Wer eine Anwendung auf die Arbeitspl&auml;tze seiner eigenen Mitarbeiter oder sogar die der Mitarbeiter eines Kunden installiert hat, muss schon ein wenig Aufwand betreiben, wenn jeder immer die aktuellste Version der Anwendung vorfinden soll. Die alte Version muss entfernt und die neue installiert werden. Hier kann man die Benutzer informieren, sodass diese die notwendigen Schritte manuell durchf&uuml;hren oder man erledigt dies selbst. Praktischer w&auml;re es jedoch, wenn die Anwendung selbst erkennen w&uuml;rde, wenn es eine neue Version gibt, und dann selbstst&auml;ndig ein Update durchf&uuml;hrt. Das geht nat&uuml;rlich nicht, weil sie sich nicht selbst l&ouml;schen und durch eine neue Version ersetzen kann, w&auml;hrend sie l&auml;uft. Also ben&ouml;tigen wir einen kleinen Workaround: Wir stellen dem &Ouml;ffnen der eigentlichen Anwendung eine weitere Access-Anwendung voran, die auf Updates pr&uuml;ft und diese durchf&uuml;hrt und erst dann die eigentliche Anwendung aufruft. Alle notwendigen Schritte erl&auml;utern 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":[662024,66062024,44000005],"tags":[],"class_list":["post-55001525","post","type-post","status-publish","format-standard","hentry","category-662024","category-66062024","category-Allgemein"],"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>Access-Frontend automatisch aktualisieren - 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\/AccessFrontend_automatisch_aktualisieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Access-Frontend automatisch aktualisieren\" \/>\n<meta property=\"og:description\" content=\"Wenn man allein mit einer Access-Anwendung arbeitet, die man w&auml;hrenddessen weiterentwickelt, ist man immer auf dem aktuellsten Stand. Wer eine Anwendung auf die Arbeitspl&auml;tze seiner eigenen Mitarbeiter oder sogar die der Mitarbeiter eines Kunden installiert hat, muss schon ein wenig Aufwand betreiben, wenn jeder immer die aktuellste Version der Anwendung vorfinden soll. Die alte Version muss entfernt und die neue installiert werden. Hier kann man die Benutzer informieren, sodass diese die notwendigen Schritte manuell durchf&uuml;hren oder man erledigt dies selbst. Praktischer w&auml;re es jedoch, wenn die Anwendung selbst erkennen w&uuml;rde, wenn es eine neue Version gibt, und dann selbstst&auml;ndig ein Update durchf&uuml;hrt. Das geht nat&uuml;rlich nicht, weil sie sich nicht selbst l&ouml;schen und durch eine neue Version ersetzen kann, w&auml;hrend sie l&auml;uft. Also ben&ouml;tigen wir einen kleinen Workaround: Wir stellen dem &Ouml;ffnen der eigentlichen Anwendung eine weitere Access-Anwendung voran, die auf Updates pr&uuml;ft und diese durchf&uuml;hrt und erst dann die eigentliche Anwendung aufruft. Alle notwendigen Schritte erl&auml;utern wir in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-06T18:59:27+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/91f19f26b3204d61a6471d52fd28f11c\" \/>\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\\\/AccessFrontend_automatisch_aktualisieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Access-Frontend automatisch aktualisieren\",\"datePublished\":\"2024-11-06T18:59:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/\"},\"wordCount\":2524,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/91f19f26b3204d61a6471d52fd28f11c\",\"articleSection\":[\"2024\",\"6\\\/2024\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/\",\"name\":\"Access-Frontend automatisch aktualisieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/91f19f26b3204d61a6471d52fd28f11c\",\"datePublished\":\"2024-11-06T18:59:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/91f19f26b3204d61a6471d52fd28f11c\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/91f19f26b3204d61a6471d52fd28f11c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessFrontend_automatisch_aktualisieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access-Frontend automatisch aktualisieren\"}]},{\"@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":"Access-Frontend automatisch aktualisieren - 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\/AccessFrontend_automatisch_aktualisieren\/","og_locale":"de_DE","og_type":"article","og_title":"Access-Frontend automatisch aktualisieren","og_description":"Wenn man allein mit einer Access-Anwendung arbeitet, die man w&auml;hrenddessen weiterentwickelt, ist man immer auf dem aktuellsten Stand. Wer eine Anwendung auf die Arbeitspl&auml;tze seiner eigenen Mitarbeiter oder sogar die der Mitarbeiter eines Kunden installiert hat, muss schon ein wenig Aufwand betreiben, wenn jeder immer die aktuellste Version der Anwendung vorfinden soll. Die alte Version muss entfernt und die neue installiert werden. Hier kann man die Benutzer informieren, sodass diese die notwendigen Schritte manuell durchf&uuml;hren oder man erledigt dies selbst. Praktischer w&auml;re es jedoch, wenn die Anwendung selbst erkennen w&uuml;rde, wenn es eine neue Version gibt, und dann selbstst&auml;ndig ein Update durchf&uuml;hrt. Das geht nat&uuml;rlich nicht, weil sie sich nicht selbst l&ouml;schen und durch eine neue Version ersetzen kann, w&auml;hrend sie l&auml;uft. Also ben&ouml;tigen wir einen kleinen Workaround: Wir stellen dem &Ouml;ffnen der eigentlichen Anwendung eine weitere Access-Anwendung voran, die auf Updates pr&uuml;ft und diese durchf&uuml;hrt und erst dann die eigentliche Anwendung aufruft. Alle notwendigen Schritte erl&auml;utern wir in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-11-06T18:59:27+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/91f19f26b3204d61a6471d52fd28f11c","type":"","width":"","height":""}],"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\/AccessFrontend_automatisch_aktualisieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Access-Frontend automatisch aktualisieren","datePublished":"2024-11-06T18:59:27+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/"},"wordCount":2524,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/91f19f26b3204d61a6471d52fd28f11c","articleSection":["2024","6\/2024"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/","url":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/","name":"Access-Frontend automatisch aktualisieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/91f19f26b3204d61a6471d52fd28f11c","datePublished":"2024-11-06T18:59:27+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/91f19f26b3204d61a6471d52fd28f11c","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/91f19f26b3204d61a6471d52fd28f11c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/AccessFrontend_automatisch_aktualisieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Access-Frontend automatisch aktualisieren"}]},{"@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\/55001525","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=55001525"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001525\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}