{"id":55001276,"date":"2020-12-01T00:00:00","date_gmt":"2021-01-27T22:08:21","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1276"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"DatenUpdates_ausliefern","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/","title":{"rendered":"Daten-Updates ausliefern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/be9e1dafad60492ba10ed552c16a72c6\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_001.png\" alt=\"Datenmodell der Beispieldatenbank\" width=\"499,6607\" height=\"262,6279\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Datenmodell der Beispieldatenbank<\/span><\/b><\/p>\n<p><b>Wenn Sie eine Anwendung bereitstellen wollen, die bereits Daten enth&auml;lt und deren Daten sowohl von Ihnen als auch vom Benutzer der Anwendung erweitert werden sollen, m&uuml;ssen Sie einige Dinge beachten. Wir gehen zur Vereinfachung davon aus, dass nur neue Daten hinzukommen und keine vorhandenen Daten ge&auml;ndert werden &#8211; das w&uuml;rde die Aufgabe noch schwieriger gestalten. Als Beispiel soll eine Datenbank mit Produkten dienen, die sowohl aus einem Basiskatalog gef&uuml;ttert werden, der gelegentlich erweitert wird, als auch vom Benutzer der Anwendung. Wie Sie das &uuml;berhaupt machen, welche Probleme das mit sich bringt und wie Sie diese l&ouml;sen, zeigen wir in diesem Beitrag.<\/b><\/p>\n<p>Im Beispiel verwenden wir zwei Tabellen, damit die m&ouml;glichen Probleme schnell deutlich werden: Die Tabelle <b>tblProdukte <\/b>enth&auml;lt die Produktdaten sowie die Zuordnung zu einer Kategorie. Die Kategorien werden in der zweiten Tabelle <b>tblKategorien <\/b>gespeichert (siehe Bild 1). Der Benutzer soll sowohl neue benutzerdefinierte Kategorien als auch Produkte anlegen k&ouml;nnen. Genauso soll der Basiskatalog von Produkten und Kategorien erweiterbar sein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_001.png\" alt=\"Datenmodell der Beispieldatenbank\" width=\"499,6607\" height=\"262,6279\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Datenmodell der Beispieldatenbank<\/span><\/b><\/p>\n<p>Angenommen, es gibt im Basiskatalog drei Kategorien mit den Prim&auml;rschl&uuml;sselwerten <b>1<\/b>, <b>2 <\/b>und <b>3<\/b>. Au&szlig;erdem gibt es einige Produkte, die mit diesen Kategorien verkn&uuml;pft sind. Nun f&uuml;gt der Benutzer eine neue Kategorie hinzu, die standardm&auml;&szlig;ig den n&auml;chsten freien Autowert erh&auml;lt, zum Beispiel den Wert <b>4<\/b>, und f&uuml;gt au&szlig;erdem einige Produkte hinzu, die mit dieser neuen Kategorie verkn&uuml;pft sind.<\/p>\n<p>Wenn der Herausgeber der Produktdatenbank nun dem Basiskatalog eine neue Kategorie hinzuf&uuml;gt, wird diese dort ebenfalls den Prim&auml;rschl&uuml;sselwert <b>4 <\/b>erhalten. Wenn wir die neuen Daten des Basiskatalogs nun in die bereits vom Anwender ge&auml;nderte Datenbank &uuml;bertragen wollen, m&uuml;ssen wir den Prim&auml;rschl&uuml;sselwert einer der Kategorien &auml;ndern &#8211; entweder f&uuml;r die aus dem Basiskatalog oder f&uuml;r die vom Benutzer hinzugef&uuml;gte Kategorie.<\/p>\n<p>Da sowohl im Basiskatalog als auch im der vom Benutzer erweiterten Datenbank bereits Produkte enthalten sind, die mit der neuen Kategorie verkn&uuml;pft sind, m&uuml;ssen wir folglich auch die Fremdschl&uuml;sselfelder dieser Eintr&auml;ge anpassen.<\/p>\n<p>Man w&uuml;rde hier wohl die Daten des Benutzers anpassen, damit die Daten des Basiskatalogs in allen Kopien der Anwendung die gleichen Prim&auml;rschl&uuml;sselwerte hat.<\/p>\n<p>Das ist technisch kein Problem, allerdings ist es ein Aufwand, den man sich sparen k&ouml;nnte. Ein Weg ist, GUIDs als Prim&auml;rschl&uuml;sselwerte zu verwenden. Allerdings bringt dies wieder eigene Probleme mit sich, die wir im Beitrag <b>GUIDs im Prim&auml;rschl&uuml;sselfeld nutzen <\/b>in der folgenden Ausgabe zeigen (<b>www.access-im-unternehmen.de\/1278<\/b>).<\/p>\n<p><b>Alternative: Eigener Nummernkreis f&uuml;r den Anwender<\/b><\/p>\n<p>Also w&auml;hlen wir einen alternativen Weg: Wir gehen davon aus, dass die Anzahl der Produkte und Kategorien, die dem Basiskatalog hinzugef&uuml;gt werden, endlich ist und w&auml;hlen mit ausreichender Sicherheit eine maximale Menge aus &#8211; sagen wir 1.000.000.<\/p>\n<p>Wenn der Benutzer einen neuen Produkt-Datensatz anlegt, soll dieser einen Autowert erhalten, der gr&ouml;&szlig;er als 1.000.000 ist. Wie erledigen wir das<\/p>\n<p>Dazu f&uuml;gen wir einfach einen Datensatz hinzu, dessen Prim&auml;rschl&uuml;sselfeld den Wert <b>1.000.000 <\/b>aufweist. Und keine Sorge: Sie m&uuml;ssen dazu nicht manuell die entsprechende Anzahl Datens&auml;tze eingeben. Wir f&uuml;gen diesen Datensatz gezielt mit einer Prozedur wie der folgenden hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AutowertSetzen()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"INSERT INTO tblKategorien(KategorieID,  Kategorie) VALUES(1000000, 'Dummy')\", dbFailOnError\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur f&uuml;hrt eine <b>INSERT INTO<\/b>-Abfrage aus, die einen Datensatz hinzuf&uuml;gt, der den vorgegebenen Wert f&uuml;r das Feld <b>KategorieID <\/b>enth&auml;lt. Das ist &uuml;brigens die einzige Methode, wie Sie trotz Autowert einen eigenen ID-Wert zu einer Tabelle hinzuf&uuml;gen k&ouml;nnen &#8211; mit der DAO-Methode <b>AddNew <\/b>ist das nicht m&ouml;glich.<\/p>\n<p>Wenn der Benutzer nun einen neuen Datensatz zur Tabelle <b>tblKategorien <\/b>hinzuf&uuml;gt, erh&auml;lt dieser direkt den n&auml;chsth&ouml;heren Wert (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_002.png\" alt=\"Neuer Benutzer-Datensatz\" width=\"424,7115\" height=\"246,1149\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Neuer Benutzer-Datensatz<\/span><\/b><\/p>\n<p>Der Dummy-Datensatz hat nur einen Nachteil: Er erscheint beispielsweise im Nachschlagefeld zur Auswahl einer Kategorie. Wie k&ouml;nnen wir das &auml;ndern Dazu gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir definieren die Datensatzherkunft des Nachschlagefeldes in der Tabelle so, dass dieser Datensatz nicht angezeigt wird oder<\/li>\n<li>wir l&ouml;schen den Datensatz vor der Weitergabe einfach wieder &#8211; denn solange der Benutzer die Datenbank nicht komprimiert, ist der zuletzt verwendete Autowert immer noch in der Datenbank gespeichert und es wird beim Anlegen eines neuen Datensatzes der n&auml;chste Autowert eingetragen (siehe Bild 3).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_003.png\" alt=\"Neuer Benutzer-Datensatz ohne Dummy-Datensatz\" width=\"424,7115\" height=\"198,2683\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Neuer Benutzer-Datensatz ohne Dummy-Datensatz<\/span><\/b><\/p>\n<\/ul>\n<p>In der ersten Variante stellen wir die Eigenschaft <b>Datensatzherkunft <\/b>des Feldes <b>KategorieID <\/b>im Entwurf der Tabelle <b>tblProdukte <\/b>wie folgt ein:<\/p>\n<pre>SELECT [KategorieID], [Kategorie] FROM tblKategorien WHERE NOT KategorieID = 1000000;<\/pre>\n<p>Damit erscheint der Eintrag nicht in diesem Nachschlagefeld und auch nicht in Kombinationsfeldern in Formularen, die auf Basis des Nachschlagefeldes angelegt werden (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_004.png\" alt=\"Anpassen der Datensatzherkunft des Nachschlagefeldes\" width=\"649,559\" height=\"291,718\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anpassen der Datensatzherkunft des Nachschlagefeldes<\/span><\/b><\/p>\n<p><b>ID vor Weitergabe l&ouml;schen<\/b><\/p>\n<p>Bei der zweiten Variante legen wir wir mit der oben genannten Prozedur einen Datensatz mit dem Wert 1.000.000 an und l&ouml;schen diesen direkt wieder. <\/p>\n<p>Dazu erweitern wir die Prozedur <b>AutowertSetzen <\/b>um die entsprechende <b>DELETE<\/b>-Anweisung:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AutowertSetzen()\r\n     ...\r\n     db.Execute \"DELETE FROM tblKategorien  WHERE KategorieID = 1000000\", dbFailOnError\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Da Access sich den h&ouml;chsten angelegten Autowert merkt, auch wenn man diesen wieder l&ouml;scht, wird der erste Datensatz des Benutzers in der Tabelle <b>tblKategorien <\/b>den Prim&auml;rschl&uuml;sselwert <b>1.000.001 <\/b>erhalten.<\/p>\n<p>Wie aber k&ouml;nnen wir sicherstellen, dass der Benutzer die Datenbank nicht komprimiert und damit den Autowert-Z&auml;hler zur&uuml;cksetzt &#8211; sodass der Autowert eines neuen Datensatzes f&uuml;r unser Beispiel den Wert <b>4 <\/b>liefert<\/p>\n<p>Auch das l&auml;sst sich erledigen: Wir verlegen einfach den Aufruf der Prozedur <b>AutowertSetzen <\/b>an den Start der Anwendung. Allerdings erweitern wir diese noch leicht, indem wir eine Pr&uuml;fung wie in Listing 1 voranstellen. Hier kontrollieren wir, ob der h&ouml;chste Wert des Feldes <b>KategorieID <\/b>kleiner als <b>1.000.000 <\/b>ist. Ist das der Fall, wurde die Datenbank offensichtlich komprimiert oder der Autowert wurde noch nicht auf <b>1.000.000 <\/b>eingestellt. Also holen wir dies nach, indem wir einen neuen Datensatz mit diesem Autowert hinzuf&uuml;gen und diesen direkt wieder l&ouml;schen. Damit erh&auml;lt der erste vom Benutzer zur Tabelle <b>tblKategorien <\/b>hinzugef&uuml;gte Datensatz den Wert <b>1.000.001<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AutowertSetzen()\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 = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT Max(KategorieID) FROM tblKategorien\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span>rst(0) &lt; 1000000<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"INSERT INTO tblKategorien(KategorieID, Kategorie) VALUES(1000000, 'Dummy')\", dbFailOnError\r\n         db.Execute \"DELETE FROM tblKategorien WHERE KategorieID = 1000000\", dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Setzen des Autowertes, wenn dieser nicht hoch genug ist<\/span><\/b><\/p>\n<p>Diese Prozedur m&uuml;ssen wir nur noch beim Start der Anwendung aufrufen &#8211; dazu legen Sie beispielsweise ein Makro namens <b>AutoExec <\/b>an, das die Makroaktion <b>CodeAusf&uuml;hren <\/b>enth&auml;lt und die Funktion <b>AutowertSetzen() <\/b>aufruft &#8211; die <b>Sub<\/b>-Prozedur m&uuml;ssen Sie dazu in eine <b>Function<\/b>-Prozedur &auml;ndern.<\/p>\n<p>Den Entwurf des Makros finden Sie in Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_005.png\" alt=\"Makro zum Aufrufen der Funktion zum Einstellen des Autowerts\" width=\"424,7115\" height=\"148,2959\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Makro zum Aufrufen der Funktion zum Einstellen des Autowerts<\/span><\/b><\/p>\n<p>Damit wird auch nach dem Komprimieren direkt wieder <b>1.000.000 <\/b>als letzter Autowert eingestellt, wenn der gr&ouml;&szlig;te Wert des Feldes <b>KategorieID <\/b>kleiner als <b>1.000.000 <\/b>ist.<\/p>\n<p><b>Parametrisieren der Funktion AutowertSetzen<\/b><\/p>\n<p>In der Beispieldatenbank haben wir zwei Tabellen, die wir mit dieser Funktion mit einem neuen Start-Autowert ausstatten m&uuml;ssen. Man k&ouml;nnte die Funktion <b>AutowertSetzen<\/b> parametrisieren, indem man beispielsweise den Namen der Tabelle und des Prim&auml;rschl&uuml;sselfeldes sowie den gew&uuml;nschten Autowert &uuml;bergibt und diese Informationen dann in den enthaltenen Anweisungen verarbeitet.<\/p>\n<p>Das Problem ist nur, dass Tabellen meist Einschr&auml;nkungen f&uuml;r Felder enthalten &#8211; zum Beispiel w&uuml;rde unsere Tabelle <b>tblKategorie <\/b>es nicht erlauben, beim Anlegen eines neuen Datensatzes keinen Wert in das Feld <b>Kategorie <\/b>einzugeben.<\/p>\n<p>Auf diese Weise m&uuml;ssten wir alle Felder mit Einschr&auml;nkungen wie dieser f&uuml;llen &#8211; und das gelingt mit Parametern nicht. Wir m&uuml;ssen also die <b>INSERT INTO<\/b>&#8211; und die <b>DELETE<\/b>-Aufrufe individuell in die Prozedur <b>AutowerteSetzen <\/b>eintragen. Dabei m&uuml;ssen wir auch eventuelle Verkn&uuml;pfungen wie hier &uuml;ber das Fremdschl&uuml;sselfeld <b>KategorieID <\/b>der Tabelle <b>tblProdukte <\/b>ber&uuml;cksichtigen.<\/p>\n<p>In diesem Fall verwenden wir direkt den neu zur Tabelle <b>tblKategorien <\/b>hinzugef&uuml;gten Datensatz als Kategorie des neu zur Tabelle <b>tblProdukte <\/b>hinzuzuf&uuml;genden Produkts (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AutowertSetzen()\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 = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT Max(KategorieID) FROM tblKategorien\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span>rst(0) &lt; 1000000<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"INSERT INTO tblKategorien(KategorieID, Kategorie) VALUES(1000000, 'Dummy')\", dbFailOnError\r\n         db.Execute \"INSERT INTO tblProdukte(ProduktID, Produktbezeichnung, KategorieID) VALUES(1000000, \" _\r\n             & \"'Dummy', 1000000)\", dbFailOnError\r\n         db.Execute \"DELETE FROM tblProdukte WHERE ProduktID = 1000000\", dbFailOnError\r\n         db.Execute \"DELETE FROM tblKategorien WHERE KategorieID = 1000000\", dbFailOnError\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: Setzen des Autowertes f&uuml;r zwei verkn&uuml;pfte Tabellen<\/span><\/b><\/p>\n<p>Wir m&uuml;ssen auch auf die Reihenfolge achten und zuerst die Tabellen mit dem an der Beziehung beteiligten Prim&auml;rschl&uuml;sselfeld anlegen. Das L&ouml;schen geschieht dann in umgekehrter Reihenfolge.<\/p>\n<p>Und nun wird es kompliziert: Es kann ja auch sein, dass der Benutzer zwar einen Datensatz f&uuml;r die Tabelle <b>tblProdukte <\/b>angelegt hat, aber nicht f&uuml;r die Tabelle <b>tblKategorien <\/b>&#8211; weil er f&uuml;r das neue Produkt eine der mit dem Basiskatalog gelieferten Kategorien ausgew&auml;hlt hat.<\/p>\n<p>In diesem Fall w&uuml;rde unsere Funktion nicht funktionieren, weil wir ja nur pr&uuml;fen, ob in der Tabelle <b>tblKategorien <\/b>nur Datens&auml;tze mit einem Prim&auml;rschl&uuml;sselwert kleiner als <b>1.000.000 <\/b>existieren. Dann f&uuml;gen wir jeweils einen neuen Datensatz mit dem Prim&auml;rschl&uuml;sselwert <b>1.000.000 <\/b>hinzu, was dazu f&uuml;hrt, dass der folgende Datensatz in beiden Tabellen den Autowert <b>1.000.001 <\/b>erh&auml;lt.<\/p>\n<p>Hat der Benutzer dann aber schon ein Produkt mit dem Autowert <b>1.000.001 <\/b>angelegt, f&uuml;hrt das zu einem Fehler. Dies stellen Sie wie folgt nach:<\/p>\n<ul>\n<li>&Ouml;ffnen Sie die Datenbank, die in keiner Tabelle einen Prim&auml;rschl&uuml;sselwert gr&ouml;&szlig;er als 999.999 enth&auml;lt.<\/li>\n<li>F&uuml;hren Sie die Funktion <b>AutowertSetzen <\/b>aus.<\/li>\n<li>F&uuml;gen Sie der Tabelle <b>tblProdukte <\/b>ein neues Produkt hinzu. Dieses sollte den Autowert <b>1.000.001 <\/b>erhalten.<\/li>\n<li>F&uuml;hren Sie die Funktion <b>AutowertSetzen <\/b>erneut aus. Dadurch wird der zuletzt verwendete Autowert der Tabelle <b>tblProdukte <\/b>wieder auf <b>1.000.000 <\/b>eingestellt.<\/li>\n<li>Legen Sie nun einen neuen Datensatz in der Tabelle <b>tblProdukte <\/b>an. Dieser erh&auml;lt nun ebenfalls den Prim&auml;rschl&uuml;sselwert <b>1.000.001<\/b> (siehe Bild 6). Der Versuch, diesen Datensatz zu speichern, l&ouml;st einen Fehler aus, weil das Prim&auml;rschl&uuml;sselfeld doppelte Werte enth&auml;lt.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_006.png\" alt=\"Doppelter Prim&auml;rschl&uuml;sselwert\" width=\"424,7115\" height=\"220,8125\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Doppelter Prim&auml;rschl&uuml;sselwert<\/span><\/b><\/p>\n<\/ul>\n<p>Wir m&uuml;ssen die Funktion <b>AutowertSetzen<\/b> also noch um eine individuelle Betrachtung der Tabellen erweitern, die wie in Listing 3 aussieht. Hier lesen wir nun f&uuml;r jede Tabelle den aktuell gr&ouml;&szlig;ten Wert des Prim&auml;rschl&uuml;sselfeldes ein und behandeln die Tabellen einzeln. Eine weitere &Auml;nderung ist, dass wir die Werte f&uuml;r die Fremdschl&uuml;sselfelder der zum Setzen des Autowertes angelegten Datens&auml;tze auf die jeweils als maximal ermittelten Werte der verkn&uuml;pften Tabelle einstellen. Wir ermitteln also beispielsweise den gr&ouml;&szlig;ten Wert des Feldes <b>KategorieID <\/b>in der Tabelle <b>tblKategorien <\/b>und nutzen diesen f&uuml;r das Fremdschl&uuml;sselfeld <b>KategorieID <\/b>der Tabelle <b>tblProdukte<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AutowertSetzen()\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>rstKategorien<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstProdukte<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rstKategorien = db.OpenRecordset(\"SELECT Max(KategorieID) FROM tblKategorien\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstProdukte = db.OpenRecordset(\"SELECT Max(ProduktID) FROM tblProdukte\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span>rstKategorien(0) &lt; 1000000<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"INSERT INTO tblKategorien(KategorieID, Kategorie) VALUES(1000000, 'Dummy')\", dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>rstProdukte(0) &lt; 1000000<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"INSERT INTO tblProdukte(ProduktID, Produktbezeichnung, KategorieID) VALUES(1000000, 'Dummy', \" _\r\n             & rstKategorien(0) & \")\", dbFailOnError\r\n         db.Execute \"DELETE FROM tblProdukte WHERE ProduktID = 1000000\", dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>rstKategorien(0) &lt; 1000000<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"DELETE FROM tblKategorien WHERE KategorieID = 1000000\", dbFailOnError\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: Setzen des Autowertes, wenn dieser nicht hoch genug ist &#8211; erweiterte Fassung<\/span><\/b><\/p>\n<p><b>Daten-Update aus erweitertem Basiskatalog hinzuf&uuml;gen<\/b><\/p>\n<p>Damit kommen wir zum zweiten Teil der Aufgabe: Wie k&ouml;nnen wir neue Daten aus dem Basiskatalog zu den Datenbankanwendungen beim Benutzer hinzuf&uuml;gen Hier gibt es wieder verschiedene M&ouml;glichkeiten, zum Beispiel die folgenden:<\/p>\n<ul>\n<li>Wir stellen dem Benutzer eine Datenbank mit den Tabellen mit der Basisdaten zur Verf&uuml;gung. Diese soll er starten, damit diese automatisch alle Datens&auml;tze in die Zieldatenbank schreibt.<\/li>\n<li>Wir stellen die hinzuzuf&uuml;genden Daten in einer Textdatei mit SQL-Anweisungen zusammen, die von der Zielanwendung ausgelesen und ausgef&uuml;hrt wird.<\/li>\n<\/ul>\n<p>In beiden F&auml;llen sollen immer alle Datens&auml;tze vorhanden sein und es soll versucht werden, diese in die Tabellen der Datenbank zu schreiben. Fehler beim Versuch, vorhandene Datens&auml;tze zu &uuml;berschreiben, sollen ignoriert werden (beziehungsweise protokolliert). So landen dann auf jeden Fall alle Datens&auml;tze in der Datenbank, die dort noch nicht vorhanden sind. Wir w&auml;hlen an dieser Stelle die erste Variante, da die zweite noch das Erstellen der ben&ouml;tigten SQL-Anweisungen erfordern w&uuml;rde.<\/p>\n<p>Wir erstellen also eine neue Datenbank, welche die gleichen Tabellen enth&auml;lt wie die Zieldatenbank. Au&szlig;erdem f&uuml;gen wir dieser Datenbank die Funktion <b>Datenupdate<\/b> aus Listing 4 hinzu. Zus&auml;tzlich f&uuml;gen wir auch dieser Datenbank ein <b>AutoExec<\/b>-Makro hinzu, das diesmal allerdings die Funktion <b>Datenupdate <\/b>aufruft.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Datenupdate()\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>strZiel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strZiel = CurrentProject.Path & \"Datenupdates_Ziel.accdb\"\r\n     db.Execute \"INSERT INTO tblKategorien IN '\" & strZiel & \"' SELECT * FROM tblKategorien\"\r\n     db.Execute \"INSERT INTO tblProdukte IN '\" & strZiel & \"' SELECT * FROM tblProdukte\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Kopieren der Daten<\/span><\/b><\/p>\n<p>Die einfachste Version der Funktion <b>Datenupdate <\/b>definiert in der Variablen <b>strZiel <\/b>die Zieldatenbank. Dazu verwenden wir den mit <b>CurrentProject.Path <\/b>ermittelten Pfad plus den bekannten Dateinamen. Wir setzen also voraus, dass die Datenbank mit den Basisdaten vor dem Starten in das Verzeichnis der Zieldatenbank kopiert wird. Dann referenzieren wir das aktuelle <b>Database<\/b>-Objekt und rufen f&uuml;r jede Tabelle mit anzuf&uuml;genden Daten die <b>Execute<\/b>-Methode auf.<\/p>\n<p>Die verwendeten <b>INSERT INTO<\/b>-Anweisungen verwenden das <b>IN<\/b>-Schl&uuml;sselwort, das die Zieldatenbank der Operation angibt. Au&szlig;erdem legen wir als Quelle alle Felder und Datens&auml;tze der Tabellen <b>tblKategorien <\/b>und <b>tblProdukte <\/b>fest. Schlie&szlig;lich achten wir auch hier auf die Reihenfolge: Wir f&uuml;gen bei verkn&uuml;pften Tabellen zuerst die Daten der Tabellen ein, die das an der Beziehung beteiligte Prim&auml;rschl&uuml;sselfeld enth&auml;lt &#8211; also <b>tblKategorien <\/b>vor <b>tblProdukte<\/b>.<\/p>\n<p>Wir haben den Tabellen der Beispieldatenbank mit dem Basiskatalog jeweils einen vierten Datensatz hinzuf&uuml;gt, welcher in beiden F&auml;llen den Prim&auml;rschl&uuml;sselwert <b>4 <\/b>hat.<\/p>\n<p>Das Ergebnis aus Bild 7 &uuml;berzeugt &#8211; die in der Datenbank mit dem Basiskatalog angelegten Datens&auml;tze wurden genau unter den gew&uuml;nschten Prim&auml;rschl&uuml;sselwerten zu den beiden Tabellen <b>tblKategorien <\/b>und <b>tblProdukte <\/b>hinzugef&uuml;gt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_007.png\" alt=\"Zieldatenbank mit je einem neuen Datensatz\" width=\"424,7115\" height=\"286,9235\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Zieldatenbank mit je einem neuen Datensatz<\/span><\/b><\/p>\n<p>Aber warum gab es keine Fehlermeldung, obwohl wir auch versucht haben, bereits vorhandene Datens&auml;tze anzuf&uuml;gen Weil wir den Parameter <b>dbFailOnError <\/b>nicht angegeben haben. In diesem Fall werden keine Fehlermeldungen ausgeben, auch wenn welche auftreten.<\/p>\n<p>F&uuml;gen wir diesen Parameter hinzu und starten die Datenbank mit dem Basiskatalog erneut, erhalten wir die Fehlermeldung aus Bild 8. In diesem Fall ist die Verwendung der <b>Execute<\/b>-Methode ohne <b>dbFailOnError <\/b>jedoch praktischer.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_06\/pic_1276_008.png\" alt=\"Fehler beim Hinzuf&uuml;gen bereits vorhandener Datens&auml;tze\" width=\"424,7115\" height=\"241,078\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Fehler beim Hinzuf&uuml;gen bereits vorhandener Datens&auml;tze<\/span><\/b><\/p>\n<p><b>Ermitteln der Anzahl der hinzugef&uuml;gten Datens&auml;tze<\/b><\/p>\n<p>Wenn wir wissen wollen, wieviele Datens&auml;tze hinzugef&uuml;gt wurden, k&ouml;nnen wir die Eigenschaft <b>RecordsAffected <\/b>des <b>Database<\/b>-Objekts nutzen. Dieser liefert immer die Anzahl der mit einer <b>Execute<\/b>-Anweisung ge&auml;nderten Datens&auml;tze &#8211; zum Beispiel so:<\/p>\n<pre>db.Execute \"INSERT INTO tblKategorien IN '\" & strZiel  & \"' SELECT * FROM tblKategorien\"\r\n<span style=\"color:blue;\">Debug.Print<\/span> \"Neue Kategorien: \" & db.RecordsAffected<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Damit haben Sie die Grundlagen f&uuml;r das Updaten der Daten einer Datenbank erhalten. Die L&ouml;sung basiert darauf, dass wir erstens einen eigenen Wertebereich f&uuml;r die durch den Benutzer angef&uuml;gten Datens&auml;tze verwenden und unsere eigenen Erweiterungen in dem nicht f&uuml;r den Benutzer zug&auml;nglichen Bereich platzieren.<\/p>\n<p>Dazu verwenden wir je Tabelle eine eigene <b>INSERT INTO<\/b>-Abfrage, die einfach alle Daten des Basiskatalogs in die Zieltabelle schreibt &#8211; so werden alle Datens&auml;tze eingef&uuml;gt, die noch nicht vorhanden sind.<\/p>\n<p>Zum Einstellen des Prim&auml;rschl&uuml;sselwertes gibt es noch eine Alternative. Dabei verwendet man eine Eigenschaft, die sich nur per ADO einstellen l&auml;sst. Wie das genau geschieht, zeigen wir im Beitrag <b>Numerische Autowerte einstellen <\/b>(<b>www.access-im-unternehmen.de\/1269<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Datenupdates_Basiskatalog.accdb<\/p>\n<p>Datenupdates_Ziel.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/226B69F2-0DD3-4104-87F8-7B4A54964DEB\/aiu_1276.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie eine Anwendung bereitstellen wollen, die bereits Daten enth&auml;lt und deren Daten sowohl von Ihnen als auch vom Benutzer der Anwendung erweitert werden sollen, m&uuml;ssen Sie einige Dinge beachten. Wir gehen zur Vereinfachung davon aus, dass nur neue Daten hinzukommen und keine vorhandenen Daten ge&auml;ndert werden &#8211; das w&uuml;rde die Aufgabe noch schwieriger gestalten. Als Beispiel soll eine Datenbank mit Produkten dienen, die sowohl aus einem Basiskatalog gef&uuml;ttert werden, der gelegentlich erweitert wird, als auch vom Benutzer der Anwendung. Wie Sie das &uuml;berhaupt machen, welche Probleme das mit sich bringt und wie Sie diese l&ouml;sen, 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":[662020,66062020,44000027],"tags":[],"class_list":["post-55001276","post","type-post","status-publish","format-standard","hentry","category-662020","category-66062020","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Daten-Updates ausliefern - 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\/DatenUpdates_ausliefern\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Daten-Updates ausliefern\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie eine Anwendung bereitstellen wollen, die bereits Daten enth&auml;lt und deren Daten sowohl von Ihnen als auch vom Benutzer der Anwendung erweitert werden sollen, m&uuml;ssen Sie einige Dinge beachten. Wir gehen zur Vereinfachung davon aus, dass nur neue Daten hinzukommen und keine vorhandenen Daten ge&auml;ndert werden - das w&uuml;rde die Aufgabe noch schwieriger gestalten. Als Beispiel soll eine Datenbank mit Produkten dienen, die sowohl aus einem Basiskatalog gef&uuml;ttert werden, der gelegentlich erweitert wird, als auch vom Benutzer der Anwendung. Wie Sie das &uuml;berhaupt machen, welche Probleme das mit sich bringt und wie Sie diese l&ouml;sen, zeigen wir in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-27T22:08:21+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/be9e1dafad60492ba10ed552c16a72c6\" \/>\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=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Daten-Updates ausliefern\",\"datePublished\":\"2021-01-27T22:08:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/\"},\"wordCount\":2546,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/be9e1dafad60492ba10ed552c16a72c6\",\"articleSection\":[\"2020\",\"6\\\/2020\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/\",\"name\":\"Daten-Updates ausliefern - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/be9e1dafad60492ba10ed552c16a72c6\",\"datePublished\":\"2021-01-27T22:08:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/be9e1dafad60492ba10ed552c16a72c6\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/be9e1dafad60492ba10ed552c16a72c6\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenUpdates_ausliefern\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Daten-Updates ausliefern\"}]},{\"@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":"Daten-Updates ausliefern - 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\/DatenUpdates_ausliefern\/","og_locale":"de_DE","og_type":"article","og_title":"Daten-Updates ausliefern","og_description":"Wenn Sie eine Anwendung bereitstellen wollen, die bereits Daten enth&auml;lt und deren Daten sowohl von Ihnen als auch vom Benutzer der Anwendung erweitert werden sollen, m&uuml;ssen Sie einige Dinge beachten. Wir gehen zur Vereinfachung davon aus, dass nur neue Daten hinzukommen und keine vorhandenen Daten ge&auml;ndert werden - das w&uuml;rde die Aufgabe noch schwieriger gestalten. Als Beispiel soll eine Datenbank mit Produkten dienen, die sowohl aus einem Basiskatalog gef&uuml;ttert werden, der gelegentlich erweitert wird, als auch vom Benutzer der Anwendung. Wie Sie das &uuml;berhaupt machen, welche Probleme das mit sich bringt und wie Sie diese l&ouml;sen, zeigen wir in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-01-27T22:08:21+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/be9e1dafad60492ba10ed552c16a72c6","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Daten-Updates ausliefern","datePublished":"2021-01-27T22:08:21+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/"},"wordCount":2546,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/be9e1dafad60492ba10ed552c16a72c6","articleSection":["2020","6\/2020","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/","url":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/","name":"Daten-Updates ausliefern - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/be9e1dafad60492ba10ed552c16a72c6","datePublished":"2021-01-27T22:08:21+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/be9e1dafad60492ba10ed552c16a72c6","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/be9e1dafad60492ba10ed552c16a72c6"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/DatenUpdates_ausliefern\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Daten-Updates ausliefern"}]},{"@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\/55001276","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=55001276"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001276\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}