{"id":55001216,"date":"2019-12-01T00:00:00","date_gmt":"2020-07-10T09:39:02","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1216"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Backendkopie_zum_Bearbeiten_holen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/","title":{"rendered":"Backendkopie zum Bearbeiten holen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/df23c2091c2447768a2ff26104e295f0\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Ein Kunde hatte die Anforderung, dass das Backend grunds&auml;tzlich auf dem Server liegen sollte und der Benutzer vom Frontend auf seinem Rechner per Netzwerk vom Homeoffice darauf zugreift. Wegen instabiler Internetverbindung soll das Backend aber w&auml;hrend der Bearbeitung besser auf den lokalen Rechner kopiert werden und nach dem Schlie&szlig;en der Anwendung wieder zur&uuml;ck auf den Server. Wie man dies realisieren kann und was dabei zu beachten ist, zeigen wir in diesem Beitrag.<\/b><\/p>\n<p><b>Voraussetzung<\/b><\/p>\n<p>Wir gehen an dieser Stelle davon aus, dass das Verzeichnis, in dem sich das Backend auf dem Server befindet, als Netzlaufwerk in den lokalen Rechner eingebunden ist, sodass das Backend mit den &uuml;blichen VBA-Methoden zum Kopieren von Dateien auf den lokalen Rechner und zur&uuml;ck zum Server kopiert werden kann.<\/p>\n<p><b>Planung<\/b><\/p>\n<p>Naiv betrachtet k&ouml;nnte man die Aufgabe herunterbrechen in folgende Schritte:<\/p>\n<ul>\n<li>Beim &Ouml;ffnen der Anwendung wird das Backend auf den lokalen Rechner kopiert und die Tabellen werden in das Frontend eingebunden.<\/li>\n<li>Bei Schlie&szlig;en der Anwendung wird das Backend zur&uuml;ck auf den Server kopiert.<\/li>\n<\/ul>\n<p>Das setzt jedoch voraus, dass das Fronted immer ordnungsgem&auml;&szlig; geschlossen wird und niemals abst&uuml;rzt. Wenn das Frontend einmal abst&uuml;rzt, w&uuml;rde es beim erneuten Start das Backend erneut auf den lokalen Rechner kopieren und die Tabellen einbinden. Das wird zum Problem, sobald der Benutzer vor dem Absturz bereits Daten ge&auml;ndert hat.<\/p>\n<p>Beim Starten wird n&auml;mlich dann die alte Version des Backends vom Server geladen und eingebunden und die vor dem Absturz durchgef&uuml;hrten &Auml;nderungen sind nicht mehr verf&uuml;gbar.<\/p>\n<p>Dem m&uuml;ssen wir Rechnung tragen, indem wir beispielsweise in einer Optionen-Tabelle festhalten, wann das Backend vom Server auf den lokalen Rechner kopiert wurde und umgekehrt.<\/p>\n<p>Dann k&ouml;nnen wir beim Start der Anwendung pr&uuml;fen, ob das letzte Kopieren auf den Server vor oder nach dem letzten Kopieren vom Server auf den lokalen Rechner stattgefunden hat und damit ermitteln, ob die Anwendung beendet wurde, ohne dass das Backend auf den Server kopiert wurde.<\/p>\n<p><b>Erster Schritt: Backend erstellen<\/b><\/p>\n<p>Sollten Sie eine solche L&ouml;sung ausgehend von einer Datenbank erstellen, deren Tabellen und Benutzeroberfl&auml;che noch in einer einzigen Datenbankdatei gespeichert sind, m&uuml;ssen Sie zun&auml;chst ein Backend erstellen und die Tabellen, die sp&auml;ter auf dem Server liegen sollen, in das Backend verschieben. Danach l&ouml;schen Sie diese Tabellen aus dem Frontend und erstellen entsprechende Verkn&uuml;pfungen auf die Tabellen des Backends.  Als Beispiel verwenden wir die Datenbank zum flexiblen Verwalten von Adressen aus dem Beitrag <b>Flexible Adressen <\/b>(<b>www.access-im-unternehmen.de\/1214<\/b>). Diese enth&auml;lt eine &uuml;berschaubare Anzahl von Tabellen.<\/p>\n<p><b>Aufteilen der Datenbank<\/b><\/p>\n<p>Das Aufteilen der Datenbank lassen wir bequem von dem daf&uuml;r vorgesehenen Assistenten erledigen. Diesen starten Sie &uuml;ber den Ribbon-Befehl <b>Datenbanktools|Daten verschieben|Access-Datenbank <\/b>(siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1216_001.png\" alt=\"Aufteilen einer Datenbank\" width=\"649,559\" height=\"117,3726\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Aufteilen einer Datenbank<\/span><\/b><\/p>\n<p>Auf der ersten Seite des so gestarteten Assistenten klicken Sie auf die Schaltfl&auml;che <b>Datenbank aufteilen <\/b>und w&auml;hlen im nun erscheinenden Dialog <b>Back-End-Datenbank erstellen <\/b>den Pfad zu der zu erstellenden Backend-Datenbank aus. Wir geben hier einfach den Namen der aufzuteilenden Datenbank mit dem Suffix <b>_BE <\/b>an, also <b>BackendKopieren_BE.accdb <\/b>(siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1216_002.png\" alt=\"Auswahl der Zieldatenbank\" width=\"499,6607\" height=\"267,6754\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Auswahl der Zieldatenbank<\/span><\/b><\/p>\n<p>Bei der hier verwendeten Anzahl Tabellen schlie&szlig;t der Assistent den Vorgang recht z&uuml;gig ab.<\/p>\n<p>Die &Auml;nderungen im Frontend sind &uuml;berschaubar: Statt der bisher vorhandenen lokalen Tabellen finden sich im Navigationsbereich nun die gleichen Tabellen, allerdings mit dem Verkn&uuml;pfungssymbol (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1216_003.png\" alt=\"Das Frontend nach der Aufteilung\" width=\"499,6607\" height=\"315,9503\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Frontend nach der Aufteilung<\/span><\/b><\/p>\n<p>Wenn Sie diese &ouml;ffnen, zeigen Sie die Daten allerdings genau so an, als ob Sie eine lokale Tabelle verwenden. Auch das Bearbeiten der enthaltenen Daten geschieht wie gewohnt.<\/p>\n<p><b>Verkn&uuml;pfungen l&ouml;schen und neu erstellen oder aktualisieren<\/b><\/p>\n<p>Nun stellt sich die Frage: Wollen wir die Verkn&uuml;pfungen l&ouml;schen, bevor wir die Backend-Datenbank, die ja aktuell im gleichen Verzeichnis wie die Frontend-Datenbank liegt, auf den Server verschieben und diese neu anlegen, wenn das Backend beim n&auml;chsten &Ouml;ffnen des Datenbankfrontends vom Server geholt wird Oder reicht es aus, die Verkn&uuml;pfungen zu aktualisieren Wenn Sie das Frontend immer vom gleichen Verzeichnis aus starten und sich das Backend ebenfalls immer in diesem Verzeichnis befindet, ist das grunds&auml;tzlich nicht n&ouml;tig, wenn nur das Backend ausgetauscht wird. Allerdings kann es ja einmal vorkommen, dass der Benutzer die Frontend-Datenbank auf einen anderen Rechner kopiert oder sich der Verzeichnisname &auml;ndert. Dann m&uuml;ssen die Verkn&uuml;pfungen doch aktualisiert werden.<\/p>\n<p>Wir begn&uuml;gen uns mit dem Aktualisieren aller in der Frontend-Datenbank enthaltenen Verkn&uuml;pfungen &#8211; so kann man auch einmal eine neue Tabelle zum Backend hinzuf&uuml;gen und braucht diese nur manuell zu verkn&uuml;pfen, damit diese Verkn&uuml;pfung bei folgenden Starts der Anwendung in das Aktualisieren aller vorhandenen Verkn&uuml;pfungen integriert wird.<\/p>\n<p><b>Verkn&uuml;pfungen per VBA aktualisieren<\/b><\/p>\n<p>Das Aktualisieren der verkn&uuml;pften Tabellen erledigen wir mit der Prozedur aus Listing 1. Diese deklariert ein <b>Database<\/b>&#8211; und ein <b>TableDef<\/b>-Objekt und weist der <b>Database<\/b>-Variablen <b>db <\/b>das <b>Database<\/b>-Objekt der aktuellen Datenbank zu. Dann durchl&auml;uft es alle <b>TableDef<\/b>-Objekte der Auflistung <b>TableDefs <\/b>des <b>Database<\/b>-Objekts und referenziert diese jeweils mit der Variablen <b>tdf<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>VerknuepfungenAktualisieren()\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>tdf<span style=\"color:blue;\"> As <\/span>DAO.TableDef\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     For Each tdf In db.TableDefs\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(tdf.Connect) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             tdf.Connect = \";DATABASE=\" & CurrentProject.Path & \"BackendKopieren_BE.accdb\"\r\n             tdf.RefreshLink\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> tdf\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Verkn&uuml;pfungen aktualisieren<\/span><\/b><\/p>\n<p>Dabei pr&uuml;ft sie zun&auml;chst anhand der Eigenschaft <b>Connect<\/b> des <b>TableDef<\/b>-Objekts, ob es sich bei der Tabelle um eine lokale oder eine verkn&uuml;pfte Tabelle handelt. Enth&auml;lt diese Eigenschaft einen Wert, handelt es sich um ein verkn&uuml;pftes Objekt. In diesem Fall stellen wir die Eigenschaft auf einen Wert ein, der aus <b>;DATABASE=<\/b>, dem Pfad der Frontend-Datenbank, einem Backslash sowie dem angenommenen Namen der Backend-Datenbank besteht, also zum Beispiel folgenden Ausdruck:<\/p>\n<pre>;DATABASE=C:...BackendKopierenBackendKopieren_BE.accdb<\/pre>\n<p>Danach aktualisieren wir die Verkn&uuml;pfung mit der <b>RefreshLink<\/b>-Methode.<\/p>\n<p><b>Aktualisieren der Verkn&uuml;pfungen testen<\/b><\/p>\n<p>Um die Verkn&uuml;pfungen nach der Aktualisierung zu testen, verschieben Sie die beiden Datenbanken beispielsweise in ein Unterverzeichnis namens <b>Test<\/b>. Wenn Sie dann die Frontend-Datenbank &ouml;ffnen und versuchen, eine der Tabellen &uuml;ber die Verkn&uuml;pfung zu &ouml;ffnen, erhalten Sie die Fehlermeldung aus Bild 4. Logisch: Die Verkn&uuml;pfugn zeigt &uuml;ber die <b>Connect<\/b>-Eigenschaft noch auf den alten Speicherort der Backend-Datenbank.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1216_004.png\" alt=\"Fehler beim Versuch, eine verkn&uuml;pfte Tabelle nach dem Verschieben zu &ouml;ffnen\" width=\"649,559\" height=\"89,46021\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Fehler beim Versuch, eine verkn&uuml;pfte Tabelle nach dem Verschieben zu &ouml;ffnen<\/span><\/b><\/p>\n<p>Erst nachdem Sie nun die Prozedur <b>VerknuepfungenAktualisieren <\/b>aufrufen, funktioniert das &Ouml;ffnen der verkn&uuml;pften Tabellen wieder.<\/p>\n<p>&Uuml;brigens reicht es nicht aus, Frontend und Backend einfach nur in ein anderes Verzeichnis zu kopieren, um den Fehler beim Zugriff auf eine der verkn&uuml;pften Tabellen auszul&ouml;sen. Genau genommen resultieren aus dieser Aktion oft Verwirrungen, weil man &uuml;ber das Frontend vermeintlich Daten der verkn&uuml;pften Tabellen im neuen Verzeichnis vornimmt. Tats&auml;chlich greift das Frontend aber, wenn Sie die Datenbankdateien nur kopieren und nicht verschieben (beziehungsweise die Datenbankdateien am alten Speicherort l&ouml;schen) noch auf das Backend im alten Speicherort zu.<\/p>\n<p><b>Optionen f&uuml;r das Kopieren<\/b><\/p>\n<p>Nun wollen wir das Backend bei jedem &Ouml;ffnen der Anwendung neu vom Server in das lokale Verzeichnis kopieren und die Verkn&uuml;pfung aktualisieren. Dazu muss die entsprechende Prozedur wissen, unter welchem Pfad sie auf die auf dem Server liegende Datei zugreifen kann. Dazu wollen wir eine Optionen-Tabelle namens <b>tblOptionen <\/b>anlegen. Neben einem Feld namens <b>Backendpfad<\/b> wollen wir noch weitere Informationen in dieser Tabelle speichern. Wir m&uuml;ssen n&auml;mlich in irgendeiner Form festhalten, ob das Backend zuletzt vom Server auf das lokale Verzeichnis oder vom lokalen Verzeichnis auf den Server kopiert wurde.<\/p>\n<p>Wenn das Backend zuletzt vom lokalen Verzeichnis auf den Server kopiert wurde, ist das offensichtlich beim vorherigen Schlie&szlig;en der Anwendung geschehen. Wenn hingegen beim &Ouml;ffnen des Frontends die Information vorliegt, dass der letzte Kopiervorgang vom Server zum lokalen Verzeichnis erfolgte, dann wurde das Frontend bei der letzten Verwendung offensichtlich nicht korrekt geschlossen.<\/p>\n<p>In diesem Fall wollen wir pr&uuml;fen, ob das auf dem Server oder das im lokalen Verzeichnis gespeicherte Backend ein aktuelleres Bearbeitungsdatum hat. Ist das Backend im lokalen Verzeichnis neuer, soll der Benutzer gefragt werden, ob das neuere Backend weiter genutzt werden soll oder ob das &auml;ltere Backend vom Server &uuml;ber das vorhandene Backend kopiert werden soll.<\/p>\n<p>Wie speichern wir diese Information ab Wir k&ouml;nnten zwei Felder definieren, die wir etwa <b>ZuletztVomServerKopiert <\/b>und <b>ZuletztZumServerVerschoben <\/b>nennen und die den Datentyp <b>Datum\/Uhrzeit<\/b> erhalten. Oder wir verwenden einfach ein <b>Boolean<\/b>-Feld etwa namens <b>ZuletztVomServerKopiert<\/b>. Wenn es den Wert <b>True <\/b>enth&auml;lt, wurde das Backend zuletzt vom Server in das lokale Verzeichnis kopiert, im Falle von <b>False <\/b>wurde es vom lokalen Verzeichnis zum Server verschoben.<\/p>\n<p><!--30percent--><\/p>\n<p>Die Datumsangaben zu speichern, ist schon interessant, da wir dem Benutzer im Falle eines unterwarteten Schlie&szlig;ens zus&auml;tzliche Informationen liefern k&ouml;nnen, wann das Backend zuletzt wohin kopiert oder verschoben wurde &#8211; also legen wir zwei Felder namens <b>ZuletztVomServerKopiert <\/b>und <b>ZuletztZumServerVerschoben <\/b>an.<\/p>\n<p>Die Tabelle <b>tblOptionen<\/b> sieht damit wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1216_005.png\" alt=\"Die Tabelle mit den Optionen der Anwendung\" width=\"649,559\" height=\"349,8246\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die Tabelle mit den Optionen der Anwendung<\/span><\/b><\/p>\n<p><b>Verwalten der Optionen der Anwendung<\/b><\/p>\n<p>Um den Pfad zur Backenddatenbank festlegen zu k&ouml;nnen, f&uuml;gen wir der Datenbank ein Formular namens <b>frmOptionen <\/b>hinzu, das wir &uuml;ber die Eigenschaft <b>Datensatzquelle <\/b>an die Tabelle <b>tblOptionen <\/b>binden. Wir ziehen alle Felder dieser Tabelle aus der Feldliste in den Detailbereich des Formularentwurfs. Das Textfeld <b>BackendPfad <\/b>benennen wir in <b>txtBackendPfad<\/b> um. Neben diesem Textfeld platzieren wir eine Schaltfl&auml;che namens <b>cmdAuswaehlen<\/b>, unter den drei Textfeldern eine weitere Schaltfl&auml;che namens <b>cmdOK<\/b>. Das Formular sieht dann wie in Bild 6 aus. Die beiden Textfelder, die an die Felder <b>ZuletztVomServerKopiert <\/b>und <b>ZuletztZumServerVerschoben  <\/b>gebunden sind, soll der Benutzer nicht bearbeiten k&ouml;nnen. Daher stellen wir f&uuml;r beide Textfelder die Eigenschaften <b>Aktiviert <\/b>auf <b>Nein <\/b>und <b>Gesperrt <\/b>auf <b>Ja <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1216_006.png\" alt=\"Formular zum Bearbeiten und Ansehen der Optionen\" width=\"499,6607\" height=\"192,4922\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Formular zum Bearbeiten und Ansehen der Optionen<\/span><\/b><\/p>\n<p>F&uuml;r die Schaltfl&auml;che <b>cmdAuswaehlen <\/b>hinterlegen wir die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAuswaehlen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     strPfad = Nz(Me!txtBackendPfad, \"\")\r\n     strPfad = <span style=\"color:blue;\">Mid<\/span>(strPfad, 1, <span style=\"color:blue;\">InStrRev<\/span>(strPfad, \"\"))\r\n     Me!txtBackendPfad = OpenFileName(strPfad, _\r\n         \"Backend auf dem Server ausw&auml;hlen\", _\r\n         \"Access-DB (*.accdb;*.accde)\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese &ouml;ffnet mit der Funktion <b>OpenFileName <\/b>aus dem Modul <b>mdlTools <\/b>den <b>Dateiauswahl<\/b>-Dialog und schreibt den Pfad zu der vom Benutzer ausgew&auml;hlten Datenbankdatei in das Textfeld <b>txtBackendpfad<\/b>.<\/p>\n<p>Als Standardpfad beim Anzeigen des Dialogs soll der Pfad zu der aktuell im Textfeld ausgew&auml;hlten Datei angezeigt werden, den wir zuvor mit geeigneten Zeichenkettenfunktionen ermitteln.<\/p>\n<p>Die Schaltfl&auml;che <b>cmdOK <\/b>soll das Formular schlicht schlie&szlig;en:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit das Formular keine M&ouml;glichkeit zum Wechseln des Datensatzes bietet &#8211; die Tabelle <b>tblOptionen<\/b> soll ja nur einen Satz von Optionen enthalten -, stellen wir die Eigenschaften <b>Navigationsschaltfl&auml;chen <\/b>auf <b>Nein <\/b>und <b>Zyklus <\/b>auf <b>Aktueller Datensatz <\/b>ein. Au&szlig;erdem legen wir die Werte der Eigenschaften <b>Datensatzmarkierer <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>fest.<\/p>\n<p><b>Backend vom Server holen<\/b><\/p>\n<p>Die folgende Prozedur soll pr&uuml;fen, ob das Backend vom Server in den Ordner der lokalen Datenbank kopiert werden soll.<\/p>\n<p>Das ist unter folgenden Bedingungen der Fall:<\/p>\n<ul>\n<li>Beide Felder <b>ZuletztVomServerKopiert <\/b>und <b>Zuletzt-ZumServerVerschoben <\/b>sind leer.<\/li>\n<li>Beide Felder sind gef&uuml;llt und der Wert aus <b>ZuletztZumServerVerschoben <\/b>ist gr&ouml;&szlig;er als der Wert aus <b>ZuletztVomServerKopiert<\/b>.<\/li>\n<\/ul>\n<p>In allen anderen F&auml;llen gehen wir davon aus, dass die Anwendung nicht ordnungsgem&auml;&szlig; geschlossen wurde und fragen den Benutzer, ob er die Version vom Server tats&auml;chlich &uuml;ber die aktuell auf dem lokalen Verzeichnis gespeicherte Version &uuml;berspielen soll.<\/p>\n<p>Das Kopieren des Backends vom Server in das Verzeichnis des Frontends erledigt die Funktion <b>BackendHolen<\/b> aus Listing 2. Diese Funktion verwendet wieder eine Objektvariable namens <b>db <\/b>mit einem Verweis auf das aktuelle <b>Database<\/b>-Objekt. Au&szlig;erdem liest sie die Daten der Tabelle <b>tblOptionen <\/b>in ein Recordset namens <b>rst <\/b>ein.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BackendHolen()<span style=\"color:blue;\"> As Boolean<\/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;\">Dim <\/span>strQuelle<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZiel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolBackendHolen<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblOptionen\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span>Nz(rst!ZuletztVomServerKopiert, 0) &gt; Nz(rst!ZuletztZumServerVerschoben, 0)<span style=\"color:blue;\"> Then<\/span>\r\n         If <span style=\"color:blue;\">MsgBox<\/span>(\"Das Frontend wurde m&ouml;glicherweise zuletzt nicht korrekt geschlossen.\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & \"Wollen Sie das Backend dennoch neu vom Server einlesen\", vbYesNo + <span style=\"color:blue;\">vbCr<\/span>itical) = vbYes Then\r\n             bolBackendHolen = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         bolBackendHolen = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolBackendHolen = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strQuelle = rst!BackendPfad\r\n         strZiel = CurrentProject.Path & \"BackendKopieren_BE.accdb\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         Kill strZiel\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         FileCopy strQuelle, strZiel\r\n         VerknuepfungenAktualisieren\r\n         rst.Edit\r\n         rst!ZuletztVomServerKopiert = Now\r\n         rst.Update\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     BackendHolen = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Backend vom Server in das Verzeichnis des Frontends kopieren<\/span><\/b><\/p>\n<p>Sie pr&uuml;ft dann zun&auml;chst, ob der Wert des Feldes <b>ZuletztVomServerKopiert <\/b>gr&ouml;&szlig;er ist als der des Feldes <b>ZuletztZumServerVerschoben<\/b>. Damit hier kein Fehler wegen eines Nullwertes ausgel&ouml;st wird, ersetzen wir diese gegebenenfalls mit der <b>Nz<\/b>-Funktion durch den Wert <b>0<\/b>. Ist <b>ZuletztVomServerKopiert <\/b>gr&ouml;&szlig;er, wurde die Backend-Datenbank seit dem letzten Kopieren nicht wieder zum Server zur&uuml;ckgeschrieben. In diesem Fall soll die folgende Meldung den Benutzer darauf aufmerksam machen und fragen, ob dieser die Backend-Datenbank vom Server tats&auml;chlich &uuml;ber die Version im lokalen Verzeichnis schreiben lassen m&ouml;chte. Falls ja, wird die Variable <b>bolBackendHolen <\/b>auf den Wert <b>True <\/b>eingestellt. Anderenfalls, also falls <b>ZuletztZumServerVerschoben <\/b>gr&ouml;&szlig;er ist, wird <b>bolBackendHolen <\/b>ebenfalls auf <b>True <\/b>eingestellt.<\/p>\n<p>Hat <b>bolBackendHolen <\/b>danach den Wert <b>True<\/b>, wird die vorhandene Backend-Datenbank im lokalen Verzeichnis mit der <b>Kill<\/b>-Anweisung gel&ouml;scht und die Version vom Server mit der <b>FileCopy<\/b>-Anweisung in das lokale Verzeichnis kopiert. Au&szlig;erdem ruft die Prozedur dann noch die Routine <b>VerknuepfungenAktualisieren <\/b>auf, um die Verkn&uuml;pfungen zu aktualisieren. Schlie&szlig;lich versetzt sie das Recordset <b>rst <\/b>mit der <b>Edit<\/b>-Methode in den Bearbeitungszustand und stellt dabei den Wert des Feldes <b>ZuletztVomServerKopiert <\/b>auf das aktuelle Datum und die aktuelle Uhrzeit ein. Damit der neue Zustand des Recordsets in die Tabelle &uuml;bertragen wird, ruft die Funktion noch die <b>Update<\/b>-Methode des Recordsets auf. Tritt bei all diesen Befehlen kein Problem auf, gibt die Funktion den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<p><b>Backend auf den Server &uuml;bertragen<\/b><\/p>\n<p>Beim &Uuml;bertragen des Backends auf den Server beim Schlie&szlig;en des Frontends m&uuml;ssen wir theoretisch auch den Wert der beiden Felder <b>ZuletztVomServerKopiert <\/b>und <b>ZuletztZumServerVerschoben <\/b>beachten, denn es kann ja sein, dass die Backend-Datenbank beim &Ouml;ffnen des Frontends nicht in das Verzeichnis des Frontends kopiert wurde. In diesem Fall ist das Backend aber gar nicht im Verzeichnis des Frontends enthalten. Wir brauchen also beim Schlie&szlig;en des Frontends nur zu pr&uuml;fen, ob das Backend im gleichen Verzeichnis enthalten ist. Das erledigen wir innerhalb einer <b>If&#8230;Then<\/b>-Bedingung in der Funktion <b>BackendZumServer<\/b> (siehe Listing 3). Hier versuchen wir, die Datei <b>BackendKopieren.accdb <\/b>im aktuellen Verzeichnis des Frontends zu finden. Ist das nicht der Fall, weist die Funktion den Benutzer per Meldung darauf hin und dass die Anwendung nun geschlossen wird. Anderenfalls wird die Variable <b>bolBackendZumServer <\/b>auf <b>True <\/b>eingestellt.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BackendZumServer()<span style=\"color:blue;\"> As Boolean<\/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;\">Dim <\/span>strQuelle<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZiel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolBackendZumServer<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblOptionen\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(CurrentProject.Path & \"BackendKopieren_BE.accdb\")) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Das Backend konnte nicht gefunden werden.\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Die Anwendung wird ohne Kopieren des Backends auf den Server geschlossen.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         bolBackendZumServer = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolBackendZumServer = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strQuelle = CurrentProject.Path & \"BackendKopieren_BE.accdb\"\r\n         strZiel = rst!BackendPfad\r\n         FileCopy strZiel, <span style=\"color:blue;\">Replace<\/span>(strZiel, \".accdb\", \"_\" & Format(Now, \"yyyy_mm_dd_hh_nn_ss\") & \".accdb\")\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         Kill strZiel\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         FileCopy strQuelle, strZiel\r\n         rst.Edit\r\n         rst!ZuletztZumServerVerschoben = Now\r\n         rst.Update\r\n         BackendZumServer = <span style=\"color:blue;\">True<\/span>\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: Backend zur&uuml;ck zum Server kopieren<\/span><\/b><\/p>\n<p>Den Wert dieser Variablen pr&uuml;fen wir in der folgenden <b>If&#8230;Then<\/b>-Bedingung. Ist dieser <b>True<\/b>, ermitteln wir zun&auml;chst die Quelle und das Ziel f&uuml;r das Verschieben des Backends.<\/p>\n<p>Dann erstellen wir mit der <b>FileCopy<\/b>-Methode eine Kopie des aktuell im Serververzeichnis gespeicherten Backends. Dieses versehen wir mit dem aktuellen Datum und der aktuellen Uhrzeit, also etwa wie folgt:<\/p>\n<pre>BackendKopieren_BE_2019_10_31_18_30_13.accdb<\/pre>\n<p>Dann l&ouml;schen wir die soeben kopierte Datei <b>BackendKopieren.accdb <\/b>und kopieren das Backend vom Verzeichnis des Frontends zum angegebenen Ort auf dem Server. Auch hier liefert die Funktion den Wert <b>True <\/b>zur&uuml;ck, wenn die entsprechende Anweisung ohne Fehler erreicht wird.<\/p>\n<p><b>Beim Starten und Beenden<\/b><\/p>\n<p>Nun m&uuml;ssen wir diese beiden Prozeduren nur noch beim Starten und beim Beenden der Frontend-Anwendung ansto&szlig;en. In der Beispieldatenbank verwenden wir ein Intro-Formular, das immer angezeigt wird. Das bietet die Gelegenheit, die Prozedur zum Kopieren des Backends in das Verzeichnis des Frontends beim &Ouml;ffnen des Formulars aufzurufen.<\/p>\n<p>Das erledigen wir dann auch, indem wir f&uuml;r die Ereignisprozudur <b>Beim Laden <\/b>des Formulars den Wert <b>[Ereignisprozedur] <\/b>einstellen und auf die Schaltfl&auml;che mit den drei Punkten neben der Eigenschaft klicken. Dies legt automatisch die Ereignisprozedur im Klassenmodul des Formulars an. Wir erg&auml;nzen den Code dieser Prozedur wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     BackendHolen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit ist der Teil, der beim &Ouml;ffnen ausgef&uuml;hrt werden soll, schon einmal erledigt. Alternativ k&ouml;nnten Sie auch das <b>AutoExec<\/b>-Makro verwenden, das automatisch beim &Ouml;ffnen einer Access-Datenbank ausgef&uuml;hrt wird und den Makrobefehl <b>AusfuehrenCode<\/b> zum Ausf&uuml;hren von VBA-Prozeduren anbietet. Wie aber bringen wir die Anwendung dazu, zu erkennen, wann der Benutzer diese beendet Es gibt kein Makro wie <b>AutoExec<\/b>, das beim Schlie&szlig;en einer Datenbankanwendung ausgel&ouml;st wird. Allerdings k&ouml;nnen wir einen Trick anwenden: Der Benutzer kann das Intro-Formular mit einem Klick auf die Schaltfl&auml;che <b>cmdGO <\/b>schlie&szlig;en. Die dadurch ausgel&ouml;ste Prozedur sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdGo_Click()\r\n     DoCmd.OpenForm \"frmKunden\"\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir k&ouml;nnen das Formular an dieser Stelle aber auch unsichtbar machen, indem wir seine Eigenschaft <b>Visible <\/b>auf den Wert <b>False <\/b>einstellen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdGo_Click()\r\n     DoCmd.OpenForm \"frmKunden\"\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Was haben wir dadurch gewonnen Das Formular bleibt nun unsichtbar ge&ouml;ffnet und wird erst geschlossen, wenn der Benutzer auch die Anwendung schlie&szlig;t. Das bietet uns die M&ouml;glichkeit, f&uuml;r das Formular eine Ereignisprozedur zu hinterlegen, die beim Schlie&szlig;en des Formulars ausgel&ouml;st wird &#8211; zum Beispiel <b>Beim Schlie&szlig;en <\/b>oder <b>Beim Entladen<\/b>. In einer dieser Ereignisprozeduren f&uuml;gen wir dann den Aufruf der Prozedur zum Verschieben der Backend-Datenbank zum Server ein. In diesem Fall wollen wir das Ereignis <b>Beim Entladen <\/b>nutzen und f&uuml;gen diesem zun&auml;chst die folgende Anweisung hinzu &#8211; diese wird sp&auml;ter noch erweitert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     BackendZumServer\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Probleme beim Kopieren<\/b><\/p>\n<p>Das ist zumindest auf den ersten Blick ein guter Plan. Allerdings haben wir hier noch nicht im Blick, dass es sein kann, dass zu diesem Zeitpunkt noch andere Formulare als <b>frmIntro <\/b>ge&ouml;ffnet sind, die noch Daten aus den verkn&uuml;pften Tabellen des Backends anzeigen. Wenn wir dann versuchen, die Backend-Datei mit der <b>FileCopy<\/b>-Methode zu kopieren, tritt der Fehler aus Bild 7 auf.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1216_007.png\" alt=\"Fehler beim Versuch, das Backend mit noch ge&ouml;ffneten Tabellen zu kopieren\" width=\"424,7115\" height=\"241,078\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Fehler beim Versuch, das Backend mit noch ge&ouml;ffneten Tabellen zu kopieren<\/span><\/b><\/p>\n<p>Wir m&uuml;ssen also vor dieser Aktion daf&uuml;r sorgen, dass alle Tabellen geschlossen sind. Dazu erstellen wir die folgende Funktion, die alle Formulare au&szlig;er <b>frmIntro <\/b>schlie&szlig;t:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>FormulareSchliessen()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     For Each frm In Forms\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> frm.Name = \"frmIntro\"<span style=\"color:blue;\"> Then<\/span>\r\n             DoCmd.Close acForm, frm.Name\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> frm\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         FormulareSchliessen = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Tritt dabei kein Fehler auf, gibt die Funktion den Wert <b>True <\/b>zur&uuml;ck. In der Prozedur <b>BackendZumServer <\/b>bauen wir diese Funktion wie folgt ein:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>FormulareSchliessen = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n     ...\r\n<span style=\"color:blue;\">Else<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Es konnten nicht alle Formulare geschlossen  werden.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Wenn beim Schlie&szlig;en der Formulare ein Fehler auftritt, soll also eine entsprechende Fehlermeldung erscheinen. Ganz wichtig: In die Ereignisprozedur, die durch das Ereignis <b>Beim Entladen <\/b>ausgel&ouml;st wird, f&uuml;gen wir noch die Abfrage ein, welchen Wert die Funktion <b>Backend-ZumServer <\/b>zur&uuml;ckgegeben hat. Ist dieser <b>False<\/b>, erh&auml;lt der Benutzer eine Meldung, dass er selbst die ge&ouml;ffneten Elemente schlie&szlig;en und erneut die Anwendung schlie&szlig;en soll. Au&szlig;erdem stellen wir den Parameter <b>Cancel <\/b>auf <b>True <\/b>ein, damit das Schlie&szlig;en des Formulars abgebrochen wird &#8211; was zur Folge hat, dass auch die Anwendung nicht geschlossen werden kann:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>BackendZumServer = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Anwendung konnte nicht geschlossen  werden.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Bitte schlie&szlig;en Sie manuell alle noch  ge&ouml;ffneten Formulare und schlie&szlig;en Sie  die Anwendung dann erneut.\"\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieser Beitrag zeigt, wie Sie das Backend f&uuml;r eine Anwendung jeweils beim &Ouml;ffnen der Anwendung neu vom Server kopieren, um dann damit zu arbeiten. Nach der Bearbeitung und mit dem Schlie&szlig;en der Anwendung soll die aktuelle Version des Backends dann wieder auf den Server zur&uuml;ckkopiert werden, wobei die dortige aktuelle Version zuvor in ein Backup kopiert wird. Die hier verwendeten Routinen weisen noch keine ausgefeilte Fehlerbehandlung auf. Hier k&ouml;nnte man noch m&ouml;gliche Fehler behandeln wie etwa ein nicht mehr vorhandenes Zielverzeichnis auf dem Server. In einer Fortsetzung dieses Beitrags zeigen wir in der n&auml;chsten Ausgabe, wie Sie die L&ouml;sung so absichern, dass keine unbehandelten Fehler mehr auftreten.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>BackendKopieren.accdb<\/p>\n<p>BackendKopieren_BE.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/144CA69C-59E9-4D23-9BA5-840D905F9C47\/aiu_1216.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Kunde hatte die Anforderung, das dass Backend grunds&auml;tzlich auf dem Server liegen sollte und der Benutzer vom Frontend auf seinem Rechner per Netzwerk vom Homeoffice darauf zugreift. Wegen nicht stabiler Internetverbindung soll das Backend aber w&auml;hrend der Bearbeitung besser auf den lokalen Rechner kopiert werden und nach dem Schlie&szlig;en der Anwendung wieder zur&uuml;ck auf den Server. Wie man dies realisieren kann und was dabei zu beachten ist, 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":[662019,66062019,44000027],"tags":[],"class_list":["post-55001216","post","type-post","status-publish","format-standard","hentry","category-662019","category-66062019","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>Backendkopie zum Bearbeiten holen - 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\/Backendkopie_zum_Bearbeiten_holen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Backendkopie zum Bearbeiten holen\" \/>\n<meta property=\"og:description\" content=\"Ein Kunde hatte die Anforderung, das dass Backend grunds&auml;tzlich auf dem Server liegen sollte und der Benutzer vom Frontend auf seinem Rechner per Netzwerk vom Homeoffice darauf zugreift. Wegen nicht stabiler Internetverbindung soll das Backend aber w&auml;hrend der Bearbeitung besser auf den lokalen Rechner kopiert werden und nach dem Schlie&szlig;en der Anwendung wieder zur&uuml;ck auf den Server. Wie man dies realisieren kann und was dabei zu beachten ist, zeigen wir in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:39:02+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/df23c2091c2447768a2ff26104e295f0\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Backendkopie zum Bearbeiten holen\",\"datePublished\":\"2020-07-10T09:39:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/\"},\"wordCount\":3217,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/df23c2091c2447768a2ff26104e295f0\",\"articleSection\":[\"2019\",\"6\\\/2019\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/\",\"name\":\"Backendkopie zum Bearbeiten holen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/df23c2091c2447768a2ff26104e295f0\",\"datePublished\":\"2020-07-10T09:39:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/df23c2091c2447768a2ff26104e295f0\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/df23c2091c2447768a2ff26104e295f0\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Backendkopie_zum_Bearbeiten_holen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backendkopie zum Bearbeiten holen\"}]},{\"@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":"Backendkopie zum Bearbeiten holen - 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\/Backendkopie_zum_Bearbeiten_holen\/","og_locale":"de_DE","og_type":"article","og_title":"Backendkopie zum Bearbeiten holen","og_description":"Ein Kunde hatte die Anforderung, das dass Backend grunds&auml;tzlich auf dem Server liegen sollte und der Benutzer vom Frontend auf seinem Rechner per Netzwerk vom Homeoffice darauf zugreift. Wegen nicht stabiler Internetverbindung soll das Backend aber w&auml;hrend der Bearbeitung besser auf den lokalen Rechner kopiert werden und nach dem Schlie&szlig;en der Anwendung wieder zur&uuml;ck auf den Server. Wie man dies realisieren kann und was dabei zu beachten ist, zeigen wir in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:39:02+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/df23c2091c2447768a2ff26104e295f0","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Backendkopie zum Bearbeiten holen","datePublished":"2020-07-10T09:39:02+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/"},"wordCount":3217,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/df23c2091c2447768a2ff26104e295f0","articleSection":["2019","6\/2019","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/","url":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/","name":"Backendkopie zum Bearbeiten holen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/df23c2091c2447768a2ff26104e295f0","datePublished":"2020-07-10T09:39:02+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/df23c2091c2447768a2ff26104e295f0","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/df23c2091c2447768a2ff26104e295f0"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Backendkopie_zum_Bearbeiten_holen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Backendkopie zum Bearbeiten holen"}]},{"@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\/55001216","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=55001216"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001216\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}