{"id":55000880,"date":"2013-04-01T00:00:00","date_gmt":"2020-05-22T21:35:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=880"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Verschiedene_Backends_pflegen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/","title":{"rendered":"Verschiedene Backends pflegen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/aff1071e4595402ca233566ac5a2fe0f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es gibt ja die ausgefallensten Konstellationen von Access-Anwendungen. Manche Benutzer verwenden beispielsweise ein Access-Frontend, um die Daten aus verschiedenen Backend-Datenbanken zusammenzuf&uuml;hren und Auswertungen &uuml;ber die enthaltenen Daten durchzuf&uuml;hren. Interessant wird dies, wenn diese Backends sich an h&auml;ufig wechselnden Orten befinden. Nehmen wir an, drei Tabellen kommen aus Datenbank X, f&uuml;nf aus Datenbank Y und sieben aus Datenbank Z und so weiter &#8211; und manche Datenbanken befinden sich im gleichen Verzeichnis. Da ger&auml;t die Aktualisierung der Verkn&uuml;pfungen schnell zum Tagesprojekt. Damit dies schneller geht, bauen wir uns ein kleines Formular zum schnellen Umschalten der Datenbanken.<\/b><\/p>\n<p>Wenn Sie in einer Datenbankanwendung Verkn&uuml;pfungen zu den Tabellen anderer Datenbanken verwenden, k&ouml;nnen Sie diese mit dem Tabellenverkn&uuml;pfungsmanager aktualisieren. Dieser ist jedoch nicht besonders komfortabel: Erstens k&ouml;nnen Sie das Fenster nicht vergr&ouml;&szlig;ern, um beispielsweise die kompletten Pfade der verkn&uuml;pften Tabellen anzuzeigen (s. Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Der Tabellenverkn&uuml;pfungs-Manager von Access<\/span><\/b><\/p>\n<p>Sollten Sie eine Access-Datenbank zum Zusammenf&uuml;hren von Tabellenverkn&uuml;pfungen aus mehreren anderen Datenbanken einsetzen, k&ouml;nnen Sie auch nicht auf die Schnelle alle Tabellen einer bestimmten Tabelle markieren, um diese en bloc zu aktualisieren. Sie m&uuml;ssen die Tabellen einer Datenbank m&uuml;hsam zusammensuchen.<\/p>\n<p>Noch interessanter wird es, wenn sich eine Anzahl von Datenbanken mit verkn&uuml;pften Tabellen auf einem Netzlaufwerk befindet und sich etwa durch die &auml;nderung des Laufwerksbuchstabens die Pfade f&uuml;r alle verkn&uuml;pften Tabellen &auml;ndern. In diesem Fall m&uuml;ssen Sie die &auml;nderungen f&uuml;r alle Tabellen manuell &uuml;ber den Tabellenverkn&uuml;pfungs-Manager durchf&uuml;hren.<\/p>\n<p>Gl&uuml;cklicherweise ist das Verkn&uuml;pfen einer Tabelle kein Hexenwerk, und auch das Aktualisieren einer solchen gelingt per VBA recht einfach. Grund genug, die Funktionalit&auml;t des Tabellenverkn&uuml;pfungs-Managers nachzubilden und zu erweitern.<\/p>\n<p><b>Was ist zu tun<\/b><\/p>\n<p>Schauen wir uns an, welche Situationen auftreten k&ouml;nnen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Ein Benutzer verwendet eine einzige Frontend-Datenbank, die ihre Daten aus einer oder mehreren Backend-Datenbanken bezieht.<\/li>\n<li class=\"aufz-hlung\">Aus jeder Backend-Datenbank k&ouml;nnen eine oder mehrere Tabellen eingebunden sein.<\/li>\n<li class=\"aufz-hlung\">Eine oder mehrere Backend-Datenbanken k&ouml;nnen das Verzeichnis wechseln. Gegebenenfalls &auml;ndern sich dabei Teile des Verzeichnisses f&uuml;r alle betroffenen Datenbanken.<\/li>\n<\/ul>\n<p>Was ben&ouml;tigen wir, um diese &auml;nderungen m&ouml;glichst komfortabel abbilden zu k&ouml;nnen Das Formular aus Bild 2 und den darin enthaltenen VBA-Code. Das Add-In ist als Men&uuml;-Add-In konzipiert und kann somit von jeder Datenbank aus etwa &uuml;ber den Ribbon-Eintrag <b>Datenbanktools|Add-Ins|Add-Ins|BackendAdmin <\/b>gestartet werden. Es liest beim &Ouml;ffnen alle Tabellen ein, die aus anderen Access-Datenbanken stammen und zeigt diese in einem Listenfeld an. Was k&ouml;nnen Sie nun mit diesem Add-In erledigen<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Access-Add-In zum Aktualisieren der Verkn&uuml;pfungen von Tabellen aus externen Datenbanken<\/span><\/b><\/p>\n<p><b>Datenbanken nach dem Namen filtern<\/b><\/p>\n<p>Ganz oben finden Sie ein Kombinationsfeld, in das Sie Text zum Filtern der Eintr&auml;ge des Listenfeldes mit den verkn&uuml;pften Tabellen eingeben k&ouml;nnen. Nach der Eingabe eines jeden Buchstabens filtert das Listenfeld seinen Inhalt und markiert gleichzeitig alle aktuell sichtbaren Eintr&auml;ge.<\/p>\n<p>Dies hat den Vorteil, dass Sie damit gleich die darunter befindlichen Schaltfl&auml;chen nutzen k&ouml;nnen:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Markierte ausw&auml;hlen<\/b>: F&uuml;gt alle aktuell markierten Elemente zu der Auswahl hinzu, die beim Klick auf <b>Verkn&uuml;pfungen aktualisieren <\/b>aktualisiert wird. Nicht markierte Eintr&auml;ge werden aus der Auswahl entfernt.<\/li>\n<li class=\"aufz-hlung\"><b>Markierte hinzuf&uuml;gen<\/b>: F&uuml;gt alle aktuell markierten Elemente zur Auswahl hinzu. Unterschied zur vorherigen Variante: Die bereits ausgew&auml;hlten Eintr&auml;ge bleiben ausgew&auml;hlt.<\/li>\n<li class=\"aufz-hlung\"><b>Markierte entfernen<\/b>: Entfernt alle markierten Eintr&auml;ge aus der Auswahl der Tabellen f&uuml;r die Aktualisierung der Verkn&uuml;pfung.<\/li>\n<\/ul>\n<p><b>Zum Verst&auml;ndnis: Markierung und Auswahl<\/b><\/p>\n<p>Damit Sie die Arbeitsweise des Add-Ins verstehen k&ouml;nnen, m&uuml;ssen wir kurz ein paar Begriffe kl&auml;ren.<\/p>\n<p>Mit <b>Markiert <\/b>meint das Add-In solche Eintr&auml;ge der Tabellenliste, die aktuell mit schwarzem Hintergrund markiert sind.<\/p>\n<p>Mit <b>Ausgew&auml;hlt <\/b>sind solche Eintr&auml;ge gemeint, die in der ersten Spalte des Listenfeldes ein <b>x <\/b>aufweisen und die beim Klick auf <b>Verkn&uuml;pfungen aktualisieren <\/b>ber&uuml;cksichtigt werden (s. Bild 3). Mit einer Ausnahme, die sp&auml;ter erl&auml;utert wird.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Verschiedene Markierungen beim BackendAdmin<\/span><\/b><\/p>\n<p>Es gibt noch zwei Stellen, an denen Eintr&auml;ge mit dem Buchstaben <b>x <\/b>markiert werden k&ouml;nnen: Wenn eine Tabelle nicht in der angegebenen Datenbank gefunden werden konnte, stellt das Listenfeld dem jeweiligen Tabellennamen ein <b>x <\/b>voran. Und wenn die komplette Datenbank nicht unter dem angegebenen Dateinamen zu finden ist, wird diese mit einem <b>x <\/b>markiert.<\/p>\n<p><b>Verkn&uuml;pfungen aktualisieren<\/b><\/p>\n<p>Davon ausgehend, dass Sie eine oder mehrere verkn&uuml;pfte Tabellen zum Aktualisieren ausgew&auml;hlt haben, m&uuml;ssen Sie noch angeben, welche Teile des Dateinamens angepasst werden sollen. Wenn beispielsweise der Laufwerksbuchstabe von <b>e:\\ <\/b>auf <b>x:\\ <\/b>ge&auml;ndert werden soll, tragen Sie im Kombinationsfeld <b>Zu ersetzen: <\/b>den Ausdruck <b>e:\\ <\/b>und im Kombinationsfeld <b>Ersetzen mit: <\/b>den Ausdruck <b>x:\\ <\/b>ein.<\/p>\n<p>Sie werden feststellen, dass bei der Eingabe der Zeichenfolge im Kombinationsfeld <b>Zu ersetzen: <\/b>wiederum Eintr&auml;ge im Listenfeld markiert werden. In Bild 4 sehen Sie beispielsweise drei markierte Eintr&auml;ge, die eigentlich aktualisiert werden sollen. Davon enthalten aber nur zwei Eintr&auml;ge den im Kombinationsfeld <b>Zu ersetzen: <\/b>enthaltenen Ausdruck und dementsprechend werden auch nur diese aktualisiert.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Es werden nur die Eintr&auml;ge aktualisiert, die dem Ausdruck im Feld Zu ersetzen: entsprechen.<\/span><\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che <b>Verkn&uuml;pfungen aktualisieren <\/b>erledigt nun den Rest und stellt eine neue Verkn&uuml;pfung zu der angegebenen Tabelle in der Datenbank mit den neu ermittelten Dateinamen her.<\/p>\n<p>Dabei k&ouml;nnen zwei Probleme auftauchen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die per Suchen\/Ersetzen ermittelte Datenbank kann im Dateisystem nicht gefunden werden. In diesem Fall erscheint eine Meldung wie die aus Bild 5.<\/li>\n<li class=\"aufz-hlung\">Oder die Datenbank wird gefunden, die zu verkn&uuml;pfende Tabelle ist jedoch nicht in dieser Datenbank enthalten. Dies zieht die Meldung aus Bild 6 mit der Angabe aller betroffenen Tabellen nach sich.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Die neue Quelldatenbank kann nicht gefunden werden &#8230;<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: &#8230; oder die zu verkn&uuml;pfende Tabelle ist nicht in der angegebenen Datenbank enthalten.<\/span><\/b><\/p>\n<p>Auch wenn mit dem Suchen\/Ersetzen-Ausdruck nicht alle zum Neuverkn&uuml;pfen ausgew&auml;hlten Datenbanken erfasst werden k&ouml;nnen, erscheint ein entsprechender Hinweis. F&uuml;r alle Tabellen, deren neue Quelldatenbank gefunden werden konnte und die dann auch noch eine Tabelle mit dem gesuchten Namen enthalten, aktualisiert das Add-In die Verkn&uuml;pfung.<\/p>\n<p><b>Programmierung der Anwendung<\/b><\/p>\n<p>Das Formular <b>frmBackendAdmin <\/b>ist die Schaltzentrale der Anwendung und enth&auml;lt auch jegliche Funktionalit&auml;t. Gleich beim Laden wird das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st, was die Ausf&uuml;hrung der folgenden Ereignisprozedur nach sich zieht:<\/p>\n<pre>Private Sub Form_Load()\r\n    VerknuepfungenEinlesen\r\nEnd Sub<\/pre>\n<p>Die Prozedur VerknuepfungenEinlesen (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-77-anchor\">Listing 1<\/a><\/span>) verwendet zwei Variablen des Typs <b>Database <\/b>&#8211; eine f&uuml;r die Datenbank, von der aus das Add-In gestartet wird (mit <b>CurrentDb <\/b>referenziert) und eine f&uuml;r das Add-In selbst (<b>CodeDb<\/b>). Die Prozedur f&uuml;hrt gleich zu Beginn zwei SQL-Aktionsabfragen aus. Die erste l&ouml;scht alle in der Tabelle <b>tblTabellenUndDatenbanken <\/b>enthaltenen Datens&auml;tze, die zweite f&uuml;gt f&uuml;r jede in der Zieldatenbank enthaltene Verkn&uuml;pfung einen Datensatz zu dieser Tabelle hinzu. Dabei verwendet sie die Tabelle <b>MSysObjects <\/b>als Datenherkunft und bezieht sich dabei auf alle Eintr&auml;ge, deren Feld <b>Type <\/b>den Wert <b>6 <\/b>enth&auml;lt &#8211; dies steht f&uuml;r per ODBC verkn&uuml;pfte Tabellen. Es landen &uuml;brigens die Werte der Felder <b>Name<\/b>, <b>Database <\/b>und <b>ForeignName <\/b>in den Zielfeldern <b>Tabelle<\/b>, <b>DatenbankAlt <\/b>und <b>TabelleOriginal<\/b>. <b>Tabelle <\/b>entspricht dem Namen der Verkn&uuml;pfung, so wie er im Datenbankfenster beziehungsweise Navigationsbereich der Datenbank angezeigt wird, <b>TabelleOriginal <\/b>ist der Name der Tabelle in der Quelldatenbank.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Einlesen der aktuellen Verkn&uuml;pfungen der Datenbank<\/p>\n<pre>Private Sub VerknuepfungenEinlesen()\r\n    Dim dbAddIn As DAO.Database\r\n    Dim dbHost As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim rstTest As DAO.Recordset\r\n    Set dbAddIn = CodeDb\r\n    Set dbHost = CurrentDb\r\n    dbAddIn.Execute &quot;DELETE FROM tblTabellenUndDatenbanken&quot;, dbFailOnError\r\n    dbAddIn.Execute &quot;INSERT INTO tblTabellenUndDatenbanken(Tabelle, DatenbankAlt, &quot; _\r\n        &amp; &quot;TabelleOriginal) SELECT Name, Database, ForeignName From MSysObjects IN ''&quot; _\r\n        &amp; CurrentDb.Name &amp; &quot;'' WHERE Type=6&quot;, dbFailOnError\r\n    Set rst = dbAddIn.OpenRecordset(&quot;SELECT * FROM tblTabellenUndDatenbanken &quot; _\r\n        &amp; &quot;ORDER BY DatenbankAlt, Tabelle&quot;, dbOpenDynaset)\r\n    Do While Not rst.EOF\r\n        rst.Edit\r\n        If Len(Dir(rst!DatenbankAlt)) = 0 Then\r\n            rst!DatenbankNichtVorhanden = True\r\n        Else\r\n            Set rstTest = dbAddIn.OpenRecordset(&quot;SELECT Name FROM MSysObjects IN ''&quot; _\r\n                &amp; rst!DatenbankAlt &amp; &quot;'' WHERE Name = ''&quot; &amp; rst!TabelleOriginal &amp; &quot;''&quot;)\r\n            If rstTest.EOF Then\r\n                rst!TabelleNichtVorhanden = True\r\n            End If\r\n        End If\r\n        rst.Update\r\n        rst.MoveNext\r\n    Loop\r\n    Me!lstVerknuepfteTabellen.Requery\r\nEnd Sub<\/pre>\n<p>Die Tabelle <b>tblTabellenUndDatenbanken <\/b>sieht im Entwurf &uuml;brigens wie in Bild 7 aus. Die Felder <b>Tabelle <\/b>und <b>TabelleOriginal <\/b>speichern den Namen der Verkn&uuml;pfung sowie den der Originaltabelle, <b>DatenbankAlt <\/b>und <b>DatenbankNeu <\/b>den bisherigen und den zuk&uuml;nftigen Dateipfad der Quelldatei. <b>DatenbankNichtVorhanden <\/b>und <b>TabelleNichtVorhanden <\/b>nehmen die Werte f&uuml;r die <b>x<\/b>-Markierungen in den Spalten f&uuml;r die Tabelle und die Datenbank im Listenfeld auf und <b>Markiert <\/b>verweist mit dem Wert <b>True <\/b>auf Tabellen mit zu &auml;ndernden Verkn&uuml;pfungen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Tabelle zum Speichern der verkn&uuml;pften Dateien und ihrer Informationen<\/span><\/b><\/p>\n<p>Danach durchl&auml;uft die Prozedur alle Datens&auml;tze der Tabelle <b>tblTabellenUndDatenbanken <\/b>in einer <b>Do While<\/b>-Schleife.<\/p>\n<p>Dabei versetzt die Prozedur den aktuellen Datensatz zun&auml;chst mit der Edit-Methode in den Bearbeitungsmodus. In einer ersten Pr&uuml;fung ermittelt sie, ob die angegebene Quelldatenbank dieser Verkn&uuml;pfung im Dateisystem zu finden ist. Dazu verwendet sie die <b>Dir<\/b>-Funktion mit dem Dateipfad als Parameter.<\/p>\n<p>Liefert diese eine Zeichenkette mit einer L&auml;nge gr&ouml;&szlig;er als <b>0 <\/b>zur&uuml;ck, ist die Datenbank vorhanden. Anderenfalls stellt die Prozedur den Wert des Feldes <b>DatenbankNichtVorhanden <\/b>auf <b>True <\/b>ein. Ist die Datenbank vorhanden, testet die Prozedur noch, ob diese die angegebene Tabelle enth&auml;lt.<\/p>\n<p>Dazu erstellt sie ein Recordset auf der Tabelle <b>MSysObjects <\/b>aus der Datenbank, welche die Verkn&uuml;pfung enth&auml;lt &#8211; dies wird mit dem <b>IN<\/b>-Schl&uuml;sselwort und dem nachfolgend angegebenen Namen der Quelldatenbank erreicht. Wenn dieses Recordset auf Basis der Tabelle <b>MSysObjects <\/b>einen Datensatz enth&auml;lt, dessen Name mit dem Namen aus <b>rst!TabelleOriginal <\/b>&uuml;bereinstimmt, ist auch die Tabelle vorhanden.<\/p>\n<p>Anderenfalls stellt die Prozedur den Wert des Feldes <b>TabelleNichtVorhanden <\/b>der Tabelle <b>tblTabellenUndDatenbanken <\/b>auf den Wert <b>True <\/b>ein. Schlie&szlig;lich speichert die Prozedur die &auml;nderungen mit der <b>Update<\/b>-Methode und springt mit <b>MoveNext <\/b>zum n&auml;chsten Datensatz des Recordsets. Anschlie&szlig;end aktualisiert die Prozedur noch den Inhalt des Listenfeldes <b>lstVerknuepfteTabellen <\/b>mit der <b>Requery<\/b>-Methode.<\/p>\n<p><b>Listenfeld f&uuml;llen<\/b><\/p>\n<p>Damit kommen wir zum Inhalt des Listenfeldes <b>lstVerknuepfteTabellen<\/b>. Dieses verwendet die Abfrage <b>qryTabellenListe <\/b>als Datensatzherkunft (s. Bild 8). Die Abfrage enth&auml;lt einige berechnete Felder, deren Formeln aus Platzgr&uuml;nden nicht im Screenshot abgebildet werden konnten.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Diese Abfrage dient als Datenherkunft des Listenfeldes lstVerknuepfteTabellen.<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Das Feld <b>MarkiertesFeld <\/b>verwendet die folgende Formel, die den Wert <b>x <\/b>ausgibt, wenn das Feld <b>Markiert <\/b>den Wert <b>Wahr <\/b>enth&auml;lt:<\/p>\n<pre>MarkiertesFeld: Wenn([Markiert]=Wahr;&quot;x&quot;;&quot;&quot;)<\/pre>\n<p>Das Feld <b>Tabellenname <\/b>soll nicht nur den Tabellennamen ausgeben, sondern auch noch ein <b>x <\/b>voranstellen, wenn das Feld <b>TabelleNichtVorhanden <\/b>den Wert <b>True <\/b>enth&auml;lt. Au&szlig;erdem soll neben dem Namen der Verkn&uuml;pfung in der aktuellen Tabelle auch der Name der Originaltabelle ausgegeben werden:<\/p>\n<pre>Tabellenname: Wenn([TabelleNichtVorhanden];\r\n&quot;x &quot;;&quot;&quot;) &amp; [Tabelle] &amp; &quot;\/&quot; &amp; [TabelleOriginal]<\/pre>\n<p>Gleiches gilt f&uuml;r das Feld <b>Datenbank<\/b>. Dieses pr&uuml;ft jedoch den Inhalt des Feldes <b>DatenbankNichtVorhanden <\/b>und f&uuml;gt den Wert <b>x <\/b>voran, wenn dieses den Wert <b>True <\/b>aufweist:<\/p>\n<pre>Datenbank: Wenn([DatenbankNichtVorhanden];\r\n&quot;x &quot;;&quot;&quot;) &amp; [DatenbankAlt]<\/pre>\n<p>Damit das Listenfeld die Daten wie gew&uuml;nscht anzeigt, stellen Sie die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>4 <\/b>und die Eigenschaft <b>Spaltenbreiten <\/b>auf <b>0cm;0,501cm;6cm <\/b>ein (s. Bild 9). Auf diese Weise wird die erste Zeile mit dem Prim&auml;rschl&uuml;sselwert als gebundene Spalte ausgeblendet beziehungsweise mit der Breite <b>0cm <\/b>angezeigt. Die zweite Zeile zeigt mit einer Breite von <b>0,5cm <\/b>das <b>x <\/b>an, das einen Eintrag als f&uuml;r eine Verkn&uuml;pfungs&auml;nderung ausgew&auml;hlt kennzeichnet.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_02\/VerschiedeneBackends-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Einstellungen f&uuml;r die Datensatzherkunft des Listenfeldes lstVerknuepfteTabellen<\/span><\/b><\/p>\n<p>Die Zeile mit dem Namen der Verkn&uuml;pfung und der Originaltabelle erh&auml;lt eine Breite von <b>6cm<\/b>, der Dateipfad der Quelldatenbanken nimmt den Rest der Listenfeldbreite ein. Benutzer von Access 2007 und j&uuml;nger profitieren hier davon, dass sich die Breite des Listenfeldes beim &auml;ndern der Breite des Formulars ebenfalls &auml;ndert.<\/p>\n<p>Damit der Benutzer bequem Eintr&auml;ge der Liste aus- und abw&auml;hlen kann, stellen Sie die Eigenschaft <b>Mehrfachauswahl <\/b>des Listenfeldes auf den Wert <b>Erweitert <\/b>ein. Die Auswahl funktioniert dann genauso wie im Windows Explorer.<\/p>\n<p><b>Filtern von Verkn&uuml;pfungen<\/b><\/p>\n<p>Das Kombinationsfeld <b>cboSuche <\/b>soll nach der Eingabe eines Ausdrucks die im Listenfeld <b>lstVerknuepfteTabellen <\/b>angezeigten Datens&auml;tze filtern &#8211; und zwar so, dass nur solche Eintr&auml;ge angezeigt werden, deren Name den im Suchfeld angegebenen Ausdruck enth&auml;lt. Au&szlig;erdem sollen alle passenden Eintr&auml;ge direkt markiert werden, damit der Benutzer diese mit einem Klick auf eine der Schaltfl&auml;chen <b>Markierte ausw&auml;hlen <\/b>oder <b>Markierte hinzuf&uuml;gen <\/b>mit einem <b>x <\/b>in der ersten Spalte versehen und sie somit zur Auswahl der zu &auml;ndernden Verkn&uuml;pfungen hinzuf&uuml;gen kann.<\/p>\n<p>Die beim Eingeben eines Zeichens in das Kombinationsfeld <b>cboSuche<\/b> ausgel&ouml;ste Prozedur sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-66-anchor\">Listing 2<\/a><\/span> aus und pr&uuml;ft zun&auml;chst, ob die L&auml;nge der enthaltenen Zeichenkette l&auml;nger als <b>0 <\/b>ist. Falls ja, stellt sie die Datensatzherkunft auf einen neuen Ausdruck ein. Dieser liefert nur noch diejenigen Eintr&auml;ge der Abfrage <b>qryTabellenListe<\/b>, deren Feld <b>Datenbank <\/b>den in <b>cboSuche <\/b>enthaltenen Ausdruck enth&auml;lt:<\/p>\n<pre>SELECT * FROM qryTabellenListe WHERE Datenbank LIKE ''*&quot; &amp; Me!cboSuche.Text &amp; &quot;*''&quot;<\/pre>\n<p class=\"listingueberschrift\">Listing 2: Filtern und markieren von Tabellen mit bestimmten Quelldatenbanken<\/p>\n<pre>Private Sub cboSuche_Change()\r\n    Dim i As Integer\r\n    If Len(Me!cboSuche.Text) &gt; 0 Then\r\n        Me!lstVerknuepfteTabellen.RowSource = &quot;SELECT * FROM qryTabellenListe &quot; _\r\n            &amp; &quot;WHERE Datenbank LIKE ''*&quot; &amp; Me!cboSuche.Text &amp; &quot;*''&quot;\r\n        For i = 0 To Me!lstVerknuepfteTabellen.ListCount - 1\r\n            Me!lstVerknuepfteTabellen.Selected(i) = True\r\n        Next i\r\n    Else\r\n        Me!lstVerknuepfteTabellen.RowSource = &quot;SELECT * FROM qryTabellenListe&quot;\r\n        For i = 0 To Me!lstVerknuepfteTabellen.ListCount - 1\r\n            Me!lstVerknuepfteTabellen.Selected(i) = False\r\n        Next i\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die nun angezeigten Eintr&auml;ge durchl&auml;uft die Prozedur dann in einer <b>For&#8230;Next<\/b>-Schleife und stellt die Eigenschaft <b>Selected <\/b>f&uuml;r die aktuellen Eintr&auml;ge auf den Wert <b>True <\/b>ein. Dadurch werden diese Eintr&auml;ge mit dunklem Hintergrund markiert.<\/p>\n<p>Sollte der Benutzer hingegen soeben den Inhalt von <b>cboSuche <\/b>geleert haben, soll das Listenfeld wieder alle Eintr&auml;ge anzeigen. Au&szlig;erdem entfernt die Prozedur dann alle Hintergrund-Markierungen, indem sie in einer entsprechenden Schleife den Wert der Eigenschaft <b>Selected <\/b>f&uuml;r alle Eintr&auml;ge auf <b>False <\/b>einstellt.<\/p>\n<p><b>Markierte Eintr&auml;ge f&uuml;r Verkn&uuml;pfungs&auml;nderung ausw&auml;hlen<\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che <b>cmdAktuelleAuswahl <\/b>soll die aktuell markierten, also mit dunklem Hintergrund dargestellten Eintr&auml;ge mit einem <b>x <\/b>in der ersten Spalte versehen. Die dadurch ausgel&ouml;ste Prozedur finden Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-67-anchor\">Listing 3<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Hinzuf&uuml;gen markierter Eintr&auml;ge zur Liste der neu zu verkn&uuml;pfenden Tabellen<\/p>\n<pre>Private Sub cmdMarkierteAuswaehlen_Click()\r\n    Dim i As Integer\r\n    Dim dbAddIn As DAO.Database\r\n    Set dbAddIn = CodeDb\r\n    For i = 0 To Me!lstVerknuepfteTabellen.ListCount - 1\r\n        If Me!lstVerknuepfteTabellen.Selected(i) = True Then\r\n            dbAddIn.Execute &quot;UPDATE tblTabellenUndDatenbanken SET Markiert = -1 WHERE TabelleID = &quot; _\r\n                &amp; Me!lstVerknuepfteTabellen.Column(0, i), dbFailOnError\r\n        Else\r\n            dbAddIn.Execute &quot;UPDATE tblTabellenUndDatenbanken SET Markiert = 0 WHERE TabelleID = &quot; _\r\n                &amp; Me!lstVerknuepfteTabellen.Column(0, i), dbFailOnError\r\n        End If\r\n    Next i\r\n    Me!lstVerknuepfteTabellen.Requery\r\n    ListenfeldMarkierungWiederherstellen\r\nEnd Sub<\/pre>\n<p>Sie durchl&auml;uft alle Eintr&auml;ge des Listenfeldes in einer <b>For&#8230;Next<\/b>-Schleife. Dabei ist <b>0 <\/b>der erste Wert und die Anzahl der Eintr&auml;ge minus eins der letzte. Innerhalb der Schleife pr&uuml;ft die Prozedur, ob der Wert der Eigenschaft <b>Selected <\/b>f&uuml;r den aktuellen Index <b>True <\/b>lautet. Ist dies der Fall, aktualisiert die folgende <b>UPDATE<\/b>-Abfrage den Wert des Feldes <b>Markiert <\/b>des Datensatzes der Tabelle <b>tblTabellenUndDatenbanken <\/b>mit dem entsprechenden Wert im Prim&auml;rschl&uuml;sselfeld auf <b>-1<\/b>, also <b>True<\/b>.<\/p>\n<p>Den Wert der gebundenen Spalte f&uuml;r den aktuellen Eintrag im Listenfeld ermittelt die Prozedur mit dem Ausdruck <b>Me!lstVerknuepfteTabellen.Column(0,i)<\/b>, wobei <b>0 <\/b>der ersten Spalte und <b>i <\/b>der aktuellen Zeile entspricht.<\/p>\n<p>F&uuml;r alle Eintr&auml;ge, deren <b>Selected<\/b>-Eigenschaft auf den Wert <b>False <\/b>lautet, &auml;ndert eine <b>UPDATE<\/b>-Aktionsabfrage den Wert des Feldes <b>Markiert <\/b>in der Tabelle <b>tblTabellenUndDatenbanken <\/b>auf <b>0 <\/b>(<b>False<\/b>).<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Markierungen im Listenfeld wiederherstellen<\/p>\n<p>Nach dem Durchlaufen aller Eintr&auml;ge aktualisiert die Prozedur auch noch das Listenfeld. Und damit der Benutzer direkt erkennt, welche Eintr&auml;ge nun f&uuml;r das Verkn&uuml;pfen vorgesehen sind, versieht die Prozedur <b>ListenfeldmarkierungWiederherstellen <\/b>alle Eintr&auml;ge mit einem dunklen Hintergrund, deren Feld <b>Markiert <\/b>den Wert <b>-1 <\/b>enth&auml;lt.<\/p>\n<p>Diese Prozedur finden Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-68-anchor\">Listing 4<\/a><\/span>. Sie &ouml;ffnet zun&auml;chst ein Recordset auf Basis der Tabelle <b>tblTabellenUndDatenbanken<\/b>. Dann durchl&auml;uft sie in einer <b>For&#8230;Next<\/b>-Schleife alle Eintr&auml;ge des Listenfeldes und sucht im Recordset nach einem Eintrag, dessen <b>TabelleID <\/b>dem Wert der ersten Spalte des aktuell durchlaufenen Eintrags des Listenfeldes entspricht.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Farbiges Markieren aller f&uuml;r die Verkn&uuml;pfungs&auml;nderung vorgesehenen Eintr&auml;ge<\/p>\n<pre>Private Sub ListenfeldMarkierungWiederherstellen()\r\n    Dim i As Integer\r\n    Dim dbAddIn As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Set dbAddIn = CodeDb\r\n    Set rst = dbAddIn.OpenRecordset(&quot;SELECT * FROM tblTabellenUndDatenbanken&quot;, dbOpenDynaset)\r\n    For i = 0 To Me!lstVerknuepfteTabellen.ListCount - 1\r\n        rst.FindFirst &quot;TabelleID = &quot; &amp; Me!lstVerknuepfteTabellen.Column(0, i)\r\n        Me!lstVerknuepfteTabellen.Selected(i) = rst!Markiert\r\n    Next i\r\nEnd Sub<\/pre>\n<p>Dann stellt sie den Wert der Eigenschaft <b>Selected <\/b>f&uuml;r den aktuellen Listenfeldeintrag auf den Wert des Feldes <b>Markiert <\/b>des gefundenen Datensatzes ein.<\/p>\n<p><b>Markierte Datens&auml;tze zur Auswahl hinzuf&uuml;gen<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdMarkierteHinzufuegen <\/b>erledigt eine &auml;hnliche Aufgabe wie die Schaltfl&auml;che <b>cmdMarkierteAuswaehlen<\/b>. Allerdings werden die aktuell zum &auml;ndern der Verkn&uuml;pfung vorgesehenen Eintr&auml;ge beibehalten und die aktuell markierten zu diesen hinzugef&uuml;gt (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-71-anchor\">Listing 5<\/a><\/span>). Die Herausforderung bei dieser Aktion ist es, nach dem &auml;ndern der Tabelle und dem Aktualisieren des Listenfeldes genau diejenigen Datens&auml;tze farbig zu hinterlegen, die zuvor auch markiert waren.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Hinzuf&uuml;gen der markierten Elemente zur aktuellen Auswahl<\/p>\n<pre>Private Sub cmdMarkierteHinzufuegen_Click()\r\n    Dim var As Variant\r\n    Dim dbAddIn As DAO.Database\r\n    Dim intMarkiert() As Integer\r\n    Dim i As Integer\r\n    Set dbAddIn = CodeDb\r\n    For Each var In Me!lstVerknuepfteTabellen.ItemsSelected\r\n        ReDim Preserve intMarkiert(i)\r\n        intMarkiert(i) = var\r\n        i = i + 1\r\n        dbAddIn.Execute &quot;UPDATE tblTabellenUndDatenbanken SET Markiert = -1 WHERE TabelleID = &quot; _\r\n            &amp; Me!lstVerknuepfteTabellen.Column(0, var), dbFailOnError\r\n    Next var\r\n    Me!lstVerknuepfteTabellen.Requery\r\n    For i = LBound(intMarkiert) To UBound(intMarkiert)\r\n        Me!lstVerknuepfteTabellen.Selected(intMarkiert(i)) = True\r\n    Next i\r\nEnd Sub<\/pre>\n<p>Die Prozedur durchl&auml;uft diesmal alle Eintr&auml;ge der Auflistung <b>ItemsSelected <\/b>des Listenfeldes. Es braucht im Gegensatz zur Schaltfl&auml;che <b>cmdMarkierteAuswaehlen <\/b>nicht alle Eintr&auml;ge zu durchlaufen, da die nicht markierten ja nicht aus der Auswahl der zu &auml;ndernden Verkn&uuml;pfungen entfernt werden sollen.<\/p>\n<p>Innerhalb dieser Schleife redimensioniert die Prozedur ein Array des Typs <b>Integer <\/b>und stellt die Anzahl der enthaltenen Array-Elemente auf die Anzahl der bisher durchlaufenen Listenfeld-Elemente ein. Dabei sollen die bisher im Array enthaltenen Werte erhalten bleiben (<b>Preserve<\/b>). Innerhalb der Schleife erh&ouml;ht die Prozedur au&szlig;erdem jeweils den Wert der Variablen <b>i <\/b>um eins.<\/p>\n<p><b>i <\/b>dient sowohl als neue Gr&ouml;&szlig;e des Arrays als auch als Index des aktuell zu f&uuml;llenden Elements. Das Array nimmt als Werte die Indizes der markierten Elemente auf, damit die Prozedur diese Elemente nach dem Aktualisieren des Listenfeldes wieder markieren kann. Nebenher stellt die Prozedur mit einer <b>UPDATE<\/b>-Aktionsabfrage den Wert des Feldes <b>Markiert <\/b>f&uuml;r den aktuellen Listenfeldeintrag in der Tabelle <b>tblTabellenUndDatenbanken <\/b>auf <b>-1<\/b> ein.<\/p>\n<p>Dann aktualisiert die Prozedur das Listenfeld, damit die neu hinzugekommenen Markierungen in Form des <b>x <\/b>in der ersten Spalte sichtbar werden. Schlie&szlig;lich durchl&auml;uft die Prozedur eine <b>For&#8230;Next<\/b>-Schleife &uuml;ber alle Elemente des Arrays <b>intMarkiert<\/b>.<\/p>\n<p>Dieses enth&auml;lt die Indizes der zuvor durch den Benutzer angeklickten und farbig hervorgehobenen Eintr&auml;ge &#8211; beispielsweise <b>2<\/b>, <b>4 <\/b>und <b>6<\/b>. Innerhalb der Schleife werden die Eintr&auml;ge des Listenfeldes mit den Indizes <b>2<\/b>, <b>4 <\/b>und <b>6 <\/b>wieder markiert.<\/p>\n<p><b>Markierte Eintr&auml;ge entfernen<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdMarkierteEntfernen <\/b>soll die aktuell markierten Eintr&auml;ge, also solche, die der Benutzer ausgew&auml;hlt und somit mit einem dunklen Hintergrund versehen hat, aus der Liste der neu zu verkn&uuml;pfenden Tabellen entfernen. Diese Schaltfl&auml;che l&ouml;st die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-72-anchor\">Listing 6<\/a><\/span> aus.<\/p>\n<p class=\"listingueberschrift\">Listing 6: Entfernen der markierten Elemente aus der Auswahl<\/p>\n<pre>Private Sub cmdMarkierteEntfernen_Click()\r\n    Dim var As Variant\r\n    Dim dbAddIn As DAO.Database\r\n    Dim intMarkiert() As Integer\r\n    Dim i As Integer\r\n    Set dbAddIn = CodeDb\r\n    For Each var In Me!lstVerknuepfteTabellen.ItemsSelected\r\n        ReDim Preserve intMarkiert(i)\r\n        intMarkiert(i) = var\r\n        i = i + 1\r\n        dbAddIn.Execute &quot;UPDATE tblTabellenUndDatenbanken SET Markiert = 0 WHERE TabelleID = &quot; &amp; Me!lstVerknuepfteTabellen.Column(0, var), dbFailOnError\r\n    Next var\r\n    Me!lstVerknuepfteTabellen.Requery\r\n    For i = LBound(intMarkiert) To UBound(intMarkiert)\r\n        Me!lstVerknuepfteTabellen.Selected(intMarkiert(i)) = True\r\n    Next i\r\nEnd Sub<\/pre>\n<p>Die Prozedur arbeitet genau wie die zuvor beschriebene Prozedur mit einem Array, um sich vor dem Aktualisieren des Listenfeldes die markierten Eintr&auml;ge zu merken. In einer ersten Schleife des Typs <b>For Each <\/b>durchl&auml;uft die Prozedur alle Eintr&auml;ge der Auflistung <b>ItemsSelected <\/b>des Listenfeldes. Darin erweitert die Prozedur das Array <b>intMarkiert <\/b>f&uuml;r jeden markierten Eintrag um eins und speichert den Indexwert des jeweiligen Eintrags im aktuellen Feld des Arrays.<\/p>\n<p>Dann aktualisiert es die Tabelle <b>tblTabellenUndDatenbanken <\/b>so, dass der Wert des Feldes <b>Markiert <\/b>f&uuml;r die markierten Eintr&auml;ge auf den Wert <b>0 <\/b>eingestellt wird. Nach dem Durchlaufen aller Eintr&auml;ge aktualisiert die Prozedur das Listenfeld und stellt die markierten Eintr&auml;ge wieder her &#8211; dies funktioniert genauso wie in der zuvor beschriebenen Prozedur.<\/p>\n<p><b>Verkn&uuml;pfungen aktualisieren<\/b><\/p>\n<p>Wenn Sie bei ge&ouml;ffnetem Add-In neue Verkn&uuml;pfungen zur Datenbank hinzuf&uuml;gen oder bestehende entfernt haben, m&ouml;chten Sie gegebenenfalls die Anzeige im Listenfeld aktualisieren.<\/p>\n<p>Dies erledigen Sie mit einem Klick auf die Schaltfl&auml;che <b>cmdAktualisieren<\/b>. Diese Prozedur l&ouml;st lediglich die bereits vorgestellte Routine <b>VerknuepfungenEinlesen <\/b>aus:<\/p>\n<pre>Private Sub cmdAktualisieren_Click()\r\n    VerknuepfungenEinlesen\r\nEnd Sub<\/pre>\n<p><b>Neuverkn&uuml;pfung vorbereiten<\/b><\/p>\n<p>Nun fehlt nur noch ein Schritt, um die Neuverkn&uuml;pfung durchzuf&uuml;hren: Sie m&uuml;ssen dem Add-In mitteilen, welche Teile des Dateipfades ersetzt werden sollen und wodurch. Dabei helfen die beiden Kombinationsfelder unterhalb des Listenfeldes.<\/p>\n<p>Das erste hei&szlig;t <b>cboZuErsetzen <\/b>und l&ouml;st ein Ereignis aus, wenn der Benutzer den Inhalt &auml;ndert. <\/p>\n<p>Diese Prozedur ruft eine weitere Prozedur namens <b>ZuErsetzendeMarkieren <\/b>auf und &uuml;bergibt den aktuellen Text des Kombinationsfeldes an diese Prozedur:<\/p>\n<pre>Private Sub cboZuErsetzen_Change()\r\n    ZuErsetzendeMarkieren Me!cboZuErsetzen.Text\r\nEnd Sub<\/pre>\n<p>Die Prozedur <b>ZuErsetzendeMarkieren <\/b>sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-74-anchor\">Listing 7<\/a><\/span> aus und durchl&auml;uft alle Eintr&auml;ge des Listenfeldes.<\/p>\n<p class=\"listingueberschrift\">Listing 7: Markieren aller Eintr&auml;ge, die den zu ersetzenden Ausdruck im Dateipfad enthalten<\/p>\n<pre>Private Sub ZuErsetzendeMarkieren(strErsetzen As String)\r\n    Dim i As Integer\r\n    For i = 0 To Me!lstVerknuepfteTabellen.ListCount\r\n        If Me!lstVerknuepfteTabellen.Column(3, i) Like &quot;*&quot; &amp; strErsetzen &amp; &quot;*&quot; Then\r\n            Me!lstVerknuepfteTabellen.Selected(i) = True\r\n        Else\r\n            Me!lstVerknuepfteTabellen.Selected(i) = False\r\n        End If\r\n    Next i\r\nEnd Sub<\/pre>\n<p>Dieses enth&auml;lt ja in der vierten Spalte den Dateipfad. Sollte dieser, ermittelt &uuml;ber die Eigenschaft <b>Column <\/b>mit dem Wert <b>3 <\/b>f&uuml;r die Spalte und dem aktuellen Index f&uuml;r die Zeile als Parameter, den im Kombinationsfeld <b>cboZuErsetzen <\/b>angegebenen Ausdruck enthalten, wird dieser Eintrag markiert. Falls nicht, wird die Markierung, soweit vorhanden, aufgehoben.<\/p>\n<p>Der Benutzer kann nun hier manuell den gew&uuml;nschten Teil des Dateipfads eintragen. Alternativ kann er auch auf die Schaltfl&auml;che mit den drei Punkten (&#8230;) rechts vom Kombinationsfeld klicken und so das zu ersetzende Verzeichnis mit einem <b>Verzeichnis ausw&auml;hlen<\/b>-Dialog ermitteln:<\/p>\n<pre>Private Sub cmdZuErsetzen_Click()\r\n    Me!cboZuErsetzen = OpenPathName(CurrentProject.Path)\r\n    ZuErsetzendeMarkieren Me!cboZuErsetzen\r\nEnd Sub<\/pre>\n<p>Nachdem Ausw&auml;hlen des Verzeichnisses markiert ein Aufruf der Prozedur <b>ZuErsetzendeMarkieren <\/b>wieder die passenden Eintr&auml;ge im Listenfeld.<\/p>\n<p>Wozu aber verwenden wir hier ein Kombinationsfeld und kein einfaches Textfeld Ganz einfach: Weil alle f&uuml;r die Verkn&uuml;pfungen verwendeten Dateinamen zur Auswahl bereitgestellt werden sollen. Auf diese Weise kann der Benutzer schnell den kompletten Dateipfad ausw&auml;hlen und dann alles au&szlig;er den zu ersetzenden Teilen l&ouml;schen.<\/p>\n<p>Das Kombinationsfeld <b>cboErsetzenMit <\/b>erwartet den Ausdruck als Wert, der f&uuml;r den zu ersetzenden Teil des Dateinamens eingef&uuml;gt werden soll.<\/p>\n<p>Dabei kann es sich wiederum um einen manuell eingegebenen Teil des Dateinamens handeln oder um ein mit dem <b>Verzeichnis ausw&auml;hlen<\/b>-Dialog ermitteltes Verzeichnis.<\/p>\n<p>Diesen Dialog &ouml;ffnen Sie wiederum mit einem Klick auf die Schaltfl&auml;che mit den drei Punkten neben dem Kombinationsfeld <b>cboErsetzenMit<\/b>:<\/p>\n<pre>Private Sub cmdErsetzenMit_Click()\r\n    Me!cboErsetzenMit = OpenPathName(CurrentProject.Path)\r\nEnd Sub<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Verkn&uuml;pfungen aktualisieren<\/p>\n<p>Schlie&szlig;lich folgt noch das eigentliche Aktualisieren der Verkn&uuml;pfungen. Dieses startet der Benutzer durch einen Mausklick auf die Schaltfl&auml;che <b>cmdVerknuepfungenAktualisieren<\/b>. Diese l&ouml;st die in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-75-anchor\">Listing 8<\/a><\/span> und <span class=\"verweis-ohneumbruch\"><a href=\"#anker-76-anchor\">Listing 9<\/a><\/span> enthaltene Prozedur aus.<\/p>\n<p class=\"listingueberschrift\">Listing 8: Verkn&uuml;pfungen aktualisieren, Teil 1<\/p>\n<pre>Private Sub cmdVerknuepfungenAktualisieren_Click()\r\n    Dim dbAddIn As DAO.Database\r\n    Dim dbHost As DAO.Database\r\n    Dim dbSource As DAO.Database\r\n    Dim strDatenbankAlt As String\r\n    Dim strDatenbankNeu As String\r\n    Dim strTabelle As String\r\n    Dim rstTest As DAO.Recordset\r\n    Dim rstAktualisieren As DAO.Recordset\r\n    Dim strTabelleOriginal As String\r\n    Dim strFehler As String\r\n    Dim i As Integer\r\n    Set dbAddIn = CodeDb\r\n    Set rstAktualisieren = dbAddIn.OpenRecordset(&quot;SELECT * FROM tblTabellenUndDatenbanken WHERE Markiert = -1&quot;)\r\n    ZuErsetzendeMarkieren Me!cboZuErsetzen\r\n    With Me!lstVerknuepfteTabellen\r\n    For i = 0 To .ListCount - 1\r\n        If .Column(2, i) = &quot;x&quot; And .Selected(i) = False Then\r\n            MsgBox &quot;Er werden nicht alle mit ''x'' markierte Verkn&uuml;pfungen aktualisiert.&quot;\r\n            Exit For\r\n        End If\r\n    Next i\r\n    End With\r\n    If rstAktualisieren.EOF Then\r\n        MsgBox &quot;Es wurden keine zu aktualisierenden Tabellen ausgew&auml;hlt.&quot;\r\n        Exit Sub\r\n    Else\r\n        If IsNull(Me!cboZuErsetzen) Then\r\n            MsgBox &quot;W&auml;hlen Sie den zu ersetzenden Teil aus.&quot;\r\n            Me!cboZuErsetzen.SetFocus\r\n            Exit Sub\r\n        Else\r\n            If IsNull(Me!cboErsetzenMit) Then\r\n                MsgBox &quot;W&auml;hlen Sie den einzuf&uuml;genden Teil aus.&quot;\r\n                Me!cboErsetzenMit.SetFocus\r\n                Exit Sub\r\n            End If\r\n        End If\r\n    End If<\/pre>\n<\/p>\n<p class=\"listingueberschrift\">Listing 9: Verkn&uuml;pfungen aktualisieren, Teil 2<\/p>\n<pre>    Do While Not rstAktualisieren.EOF\r\n         strTabelle = rstAktualisieren!Tabelle\r\n        strDatenbankAlt = rstAktualisieren!DatenbankAlt\r\n        strDatenbankNeu = Replace(strDatenbankAlt, Nz(Me!cboZuErsetzen, &quot;&quot;), Nz(Me!cboErsetzenMit, &quot;&quot;))\r\n        strTabelleOriginal = rstAktualisieren!TabelleOriginal\r\n        rstAktualisieren.Edit\r\n        rstAktualisieren!Datenbankneu = strDatenbankNeu\r\n        rstAktualisieren.Update\r\n        If Len(Dir(strDatenbankNeu)) = 0 Then\r\n            strFehler = strFehler &amp; &quot;Die Datenbank ''&quot; &amp; strDatenbankNeu &amp; &quot;'' ist nicht vorhanden.&quot; &amp; vbCrLf\r\n        Else\r\n            Set dbSource = DBEngine.OpenDatabase(strDatenbankNeu)\r\n            Set rstTest = dbSource.OpenRecordset(&quot;SELECT Name FROM MSysObjects WHERE Name = ''&quot; _\r\n                &amp; strTabelleOriginal &amp; &quot;''&quot;, dbOpenDynaset)\r\n            If rstTest.EOF Then\r\n                strFehler = strFehler &amp; &quot;Die Tabelle ''&quot; &amp; strTabelle &amp; &quot;\/&quot; &amp; strTabelleOriginal _\r\n                    &amp; &quot;'' ist nicht in der Datenbank ''&quot; &amp; strDatenbankNeu &amp; &quot;'' vorhanden.&quot; &amp; vbCrLf\r\n            Else\r\n                Set dbHost = CurrentDb\r\n                dbHost.TableDefs(strTabelle).Connect = &quot;;database=&quot; &amp; strDatenbankNeu\r\n                dbHost.TableDefs(strTabelle).RefreshLink\r\n            End If\r\n            Set dbHost = Nothing\r\n        End If\r\n        rstAktualisieren.MoveNext\r\n    Loop\r\n    If Not Len(strFehler) = 0 Then\r\n     MsgBox &quot;Es konnten nicht alle Verkn&uuml;pfungen aktualisiert werden: &quot; &amp; vbCrLf &amp; vbCrLf &amp; strFehler\r\n    End If\r\nEnd Sub<\/pre>\n<p>Diese erstellt zun&auml;chst ein Recordset auf Basis aller Datens&auml;tze der Tabelle <b>tblTabellenUndDatenbanken<\/b>, deren Feld <b>Markiert <\/b>den Wert <b>-1 <\/b>enth&auml;lt und die somit aktualisiert werden sollen.<\/p>\n<p>Dann ruft die Prozedur die Routine <b>ZuErsetzendeMarkieren <\/b>auf, damit der Benutzer alle zu ersetzenden Verkn&uuml;pfungen erkennen kann. Dies sind nicht unbedingt alle, die der Benutzer zuvor markiert hat &#8211; gegebenenfalls passen einige nicht zu dem im Kombinationsfeld <b>cboZuErsetzen <\/b>angegebenen zu ersetzenden Teilausdruck des Dateinamens.<\/p>\n<p>Um den Benutzer gegebenenfalls von diesem Umstand in Kenntnis zu setzen, durchl&auml;uft die Prozedur alle Eintr&auml;ge des Listenfeldes und pr&uuml;ft, ob es irgendeinen Eintrag gibt, dessen zweite Spalte das <b>x <\/b>f&uuml;r die Markierung als zu erneuernde Verkn&uuml;pfung enth&auml;lt und der aber nicht durch die Routine <b>ZuErsetzendeMarkieren <\/b>farbig hervorgehoben wurde. In diesem Fall liefert die Prozedur eine entsprechende Meldung und teilt dem Benutzer mit, dass nicht alle mit einem <b>x <\/b>versehenen Verkn&uuml;pfungen erneuert werden k&ouml;nnen.<\/p>\n<p>Gegebenenfalls ist auch das Recordset <b>rstAktualisieren <\/b>leer &#8211; dies bedeutet, dass der Benutzer gar keine Verkn&uuml;pfungen zum Aktualisieren ausgew&auml;hlt hat. Auch in diesem Fall erscheint eine Meldung, au&szlig;erdem wird die Prozedur hier beendet.<\/p>\n<p>Enth&auml;lt <b>rstAktualisieren <\/b>mindestens einen Datensatz, pr&uuml;ft die Prozedur, ob der Benutzer einen zu ersetzenden Ausdruck im Kombinationfeld festgelegt hat. Ist dies nicht der Fall, muss er dies nun nachholen. Die gleiche Pr&uuml;fung erfolgt auch noch f&uuml;r das Kombinationsfeld <b>cboErsetzenMit<\/b>.<\/p>\n<p>Danach durchl&auml;uft die Prozedur in einer Schleife alle Datens&auml;tze des Recordsets <b>rstAktualisieren<\/b>. Dabei landen die Werte einiger Felder des Recordsets in den Variablen <b>strTabelle<\/b>, <b>strDatenbankAlt <\/b>und <b>strTabelleOriginal<\/b>.<\/p>\n<p>Die Variable <b>strDatenbankNeu <\/b>soll den Namen der Datenbank der neuen Verkn&uuml;pfung enthalten. Dazu ersetzt die Prozedur in <b>strDatenbankAlt <\/b>den Wert des Kombinationsfeldes <b>cboZuErsetzen <\/b>durch den Wert des Kombinationsfeldes <b>cboErsetzenMit<\/b>. Der neue Pfad zur Datenbank wird in das Feld <b>DatenbankNeu <\/b>des Recordsets geschrieben.<\/p>\n<p>Danach folgen weitere Pr&uuml;fungen: Zun&auml;chst testet die Prozedur, ob die in <b>strDatenbankNeu <\/b>gespeicherte Datei &uuml;berhaupt vorhanden ist. Ist dies nicht der Fall, liefert die <b>Dir<\/b>-Funktion f&uuml;r diesen Wert eine leere Zeichenkette.<\/p>\n<p>Dann f&uuml;gt die Prozedur zu einer String-Variablen namens <b>strFehler <\/b>einen Hinweis ein, dass die neue Quelldatenbank gar nicht vorhanden ist.<\/p>\n<p>Ist die neue Datenbank hingegen vorhanden, kann es noch passieren, dass die zu verkn&uuml;pfende Tabelle dort nicht gefunden werden kann.<\/p>\n<p>Dies pr&uuml;fen die folgenden Zeilen. Sie erstellen ein <b>Database<\/b>-Objekt und f&uuml;llen es mit einem Verweis auf die neue Quelldatenbank der Verkn&uuml;pfung.<\/p>\n<p>Dann f&uuml;llt die Prozedur ein Recordset namens <b>rstTest <\/b>mit dem Datensatz der Tabelle <b>MSysObjects <\/b>der neuen Quelltabelle, dessen Feld <b>Name <\/b>mit dem Namen der zu verkn&uuml;pfenden Tabelle &uuml;bereinstimmt.<\/p>\n<p>Ist das Recordset leer, konnte die Prozedur die zu verkn&uuml;pfende Tabelle nicht in der neuen Quelldatenbank finden und es wird eine entsprechende Meldung an die Zeichenkette in <b>strFehler <\/b>angeh&auml;ngt.<\/p>\n<p>Sollte keiner der genannten Fehler auftauchen, aktualisieren die drei Anweisungen im <b>Else<\/b>-Teil der inneren Bedingung die Verkn&uuml;pfung, indem sie die Eigenschaft <b>Connect <\/b>des entsprechenden Objekts der <b>TableDefs<\/b>-Auflistung auf einen Ausdruck wie den folgenden einstellen:<\/p>\n<pre>;database=&lt;Neuer Datenbankpfad&gt;<\/pre>\n<p>Die <b>RefreshLink<\/b>-Methode dieses Elements der <b>TableDefs<\/b>-Auflistung aktualisiert die Verkn&uuml;pfung schlie&szlig;lich.<\/p>\n<p>Sollten Fehler aufgetreten sein, erh&auml;lt der Benutzer hier&uuml;ber eine Sammelmeldung.<\/p>\n<p><b>Add-In installieren<\/b><\/p>\n<p>Wenn Sie das Add-In einsetzen m&ouml;chten, rufen Sie den Add-In-Manager von Access auf. Dort finden Sie eine Schaltfl&auml;che namens <b>Neues hinzuf&uuml;gen<\/b>. Klicken Sie diese Schaltfl&auml;che an und w&auml;hlen Sie die Datei <b>BackendAdmin.mda <\/b>aus. Beim n&auml;chsten Aufruf des Add-In-Men&uuml;s finden Sie dort den Eintrag <b>BackendAdmin <\/b>vor.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit diesem Beitrag haben Sie nicht nur ein neues Tool erhalten, sondern lernen auch eine Menge zum Thema Listenfelder und verkn&uuml;pfte Tabellen.<\/p>\n<p>In weiteren Ausbaustufen k&ouml;nnte man das Listenfeld durch ein Unterformular in der Datenblattansicht ersetzen und die verschiedenen Status durch farbige Markierungen hervorheben.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>BackendAdmin.mda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{96D8DC38-484F-405A-9913-BC378AD260B7}\/aiu_880.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt ja die ausgefallensten Konstellationen von Access-Anwendungen. Manche Benutzer verwenden beispielsweise ein Access-Frontend, um die Daten aus verschiedenen Backend-Datenbanken zusammenzuf&uuml;hren und Auswertungen &uuml;ber die enthaltenen Daten durchzuf&uuml;hren. Interessant wird dies, wenn diese Backends sich an h&auml;ufig wechselnden Orten befinden. Nehmen wir an, drei Tabellen kommen aus Datenbank X, f&uuml;nf aus Datenbank Y und sieben aus Datenbank Z und so weiter &#8211; und manche Datenbanken befinden sich im gleichen Verzeichnis. Da ger&auml;t die Aktualisierung der Verkn&uuml;pfungen schnell zum Tagesprojekt. Damit dies schneller geht, bauen wir uns ein kleines Formular zum schnellen Umschalten der Datenbanken.<\/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":[66022013,662013,44000027],"tags":[],"class_list":["post-55000880","post","type-post","status-publish","format-standard","hentry","category-66022013","category-662013","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>Verschiedene Backends pflegen - 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\/Verschiedene_Backends_pflegen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Verschiedene Backends pflegen\" \/>\n<meta property=\"og:description\" content=\"Es gibt ja die ausgefallensten Konstellationen von Access-Anwendungen. Manche Benutzer verwenden beispielsweise ein Access-Frontend, um die Daten aus verschiedenen Backend-Datenbanken zusammenzuf&uuml;hren und Auswertungen &uuml;ber die enthaltenen Daten durchzuf&uuml;hren. Interessant wird dies, wenn diese Backends sich an h&auml;ufig wechselnden Orten befinden. Nehmen wir an, drei Tabellen kommen aus Datenbank X, f&uuml;nf aus Datenbank Y und sieben aus Datenbank Z und so weiter - und manche Datenbanken befinden sich im gleichen Verzeichnis. Da ger&auml;t die Aktualisierung der Verkn&uuml;pfungen schnell zum Tagesprojekt. Damit dies schneller geht, bauen wir uns ein kleines Formular zum schnellen Umschalten der Datenbanken.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:35:17+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/aff1071e4595402ca233566ac5a2fe0f\" \/>\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=\"27\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Verschiedene Backends pflegen\",\"datePublished\":\"2020-05-22T21:35:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/\"},\"wordCount\":4339,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/aff1071e4595402ca233566ac5a2fe0f\",\"articleSection\":[\"2\\\/2013\",\"2013\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/\",\"name\":\"Verschiedene Backends pflegen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/aff1071e4595402ca233566ac5a2fe0f\",\"datePublished\":\"2020-05-22T21:35:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/aff1071e4595402ca233566ac5a2fe0f\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/aff1071e4595402ca233566ac5a2fe0f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Verschiedene_Backends_pflegen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Verschiedene Backends pflegen\"}]},{\"@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":"Verschiedene Backends pflegen - 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\/Verschiedene_Backends_pflegen\/","og_locale":"de_DE","og_type":"article","og_title":"Verschiedene Backends pflegen","og_description":"Es gibt ja die ausgefallensten Konstellationen von Access-Anwendungen. Manche Benutzer verwenden beispielsweise ein Access-Frontend, um die Daten aus verschiedenen Backend-Datenbanken zusammenzuf&uuml;hren und Auswertungen &uuml;ber die enthaltenen Daten durchzuf&uuml;hren. Interessant wird dies, wenn diese Backends sich an h&auml;ufig wechselnden Orten befinden. Nehmen wir an, drei Tabellen kommen aus Datenbank X, f&uuml;nf aus Datenbank Y und sieben aus Datenbank Z und so weiter - und manche Datenbanken befinden sich im gleichen Verzeichnis. Da ger&auml;t die Aktualisierung der Verkn&uuml;pfungen schnell zum Tagesprojekt. Damit dies schneller geht, bauen wir uns ein kleines Formular zum schnellen Umschalten der Datenbanken.","og_url":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:35:17+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/aff1071e4595402ca233566ac5a2fe0f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"27\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Verschiedene Backends pflegen","datePublished":"2020-05-22T21:35:17+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/"},"wordCount":4339,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/aff1071e4595402ca233566ac5a2fe0f","articleSection":["2\/2013","2013","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/","url":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/","name":"Verschiedene Backends pflegen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/aff1071e4595402ca233566ac5a2fe0f","datePublished":"2020-05-22T21:35:17+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/aff1071e4595402ca233566ac5a2fe0f","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/aff1071e4595402ca233566ac5a2fe0f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Verschiedene_Backends_pflegen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Verschiedene Backends pflegen"}]},{"@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\/55000880","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=55000880"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000880\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}