{"id":55001083,"date":"2017-04-01T00:00:00","date_gmt":"2020-05-14T13:42:15","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1083"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Loesung_zum_FormularAddIn_umbauen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/","title":{"rendered":"L&ouml;sung zum Formular-Add-In umbauen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/71c357ab5332412cb1bb7ea9f68824de\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Verkn&uuml;pfte Daten suchen&#8220; haben wir eine L&ouml;sung beschrieben, die man zwar prima in eine Datenbank integrieren und dann dort nutzen kann. Allerdings ist es doch aufw&auml;ndig, jedes Mal erst die ben&ouml;tigten Objekte zu importieren &#8211; und au&szlig;erdem steigert das Verteilen des gleichen Codes auf viele verschiedene Datenbanken nicht unbedingt die Wartbarkeit. Da die genannte L&ouml;sung nicht f&uuml;r den Benutzer, sondern eher f&uuml;r den Entwickler gedacht ist, wollen wir diese in ein Add-In umwandeln. Dieser Beitrag zeigt die Vorgehensweise und auch die Fallstricke.<\/b><\/p>\n<p>Die umzuwandelnde Datenbank enth&auml;lt zwei Formulare, von denen eines ein Unterformular ist, sowie eine Tabelle. Beim Aufrufen des Add-Ins &uuml;ber den entsprechenden Ribbon-Eintrag soll das Hauptformular der Anwendung ge&ouml;ffnet werden. Wir gehen nun Schritt f&uuml;r Schritt vor, um die Fallstricke St&uuml;ck f&uuml;r St&uuml;ck zu entsch&auml;rfen.<\/p>\n<h2>Tabelle USysRegInfo anlegen<\/h2>\n<p>Aufmerksame Leser unseres Magazins wissen, dass eine Tabelle namens <b>USysRegInfo <\/b>f&uuml;r ein Add-In unerl&auml;sslich ist. Diese speichert die Informationen, die beim Hinzuf&uuml;gen des Add-Ins zur Liste der Add-Ins der Anwendung in die Registry geschrieben werden, damit Access dieses Add-In in der Add-In-Liste anzeigt.<\/p>\n<p>Dort steht dann beispielsweise, wo die Add-In-Datenbank gespeichert ist und welche Funktion aufgerufen werden soll, wenn der Benutzer das Add-In startet. In unserem Fall sieht die Tabelle wie in Bild 1 aus. Die erste Zeile gibt an, dass beim Starten des Add-Ins eine Funktion namens <b>Autostart <\/b>aufgerufen werden soll.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_001.png\" alt=\"Die Tabelle USysRegInfo\" width=\"599,593\" height=\"284,2974\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die Tabelle USysRegInfo<\/span><\/b><\/p>\n<p>Die zweite enth&auml;lt das Verzeichnis, in dem das Add-In gespeichert sein wird. <b>|ACCDIR <\/b>wird beim Registrieren automatisch durch das Add-In-Verzeichnis ersetzt.<\/p>\n<h2>Startfunktion definieren<\/h2>\n<p>Neben der Tabelle m&uuml;ssen wir also eine Funktion definieren, welche beim Start des Add-Ins aufgerufen wird, und dort die durchzuf&uuml;hrenden Schritte eintragen. In unserem Fall wollen wir nur das Formular <b>frmTabellen <\/b>aufrufen.<\/p>\n<p>Die Funktion legen wir in einem neuen Standardmodul namens <b>mdlAddIn <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>Autostart()\r\n     DoCmd.OpenForm \"frmTabellen\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Anwendungseigenschaften anpassen<\/h2>\n<p>Damit das Add-In im Add-In-Manager eine gute Figur abgibt, stellen Sie ein paar Eigenschaften f&uuml;r die Anwendung ein. Dazu geh&ouml;ren der <b>Titel<\/b>, die <b>Firma <\/b>und der <b>Kommentar <\/b>(s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_004.png\" alt=\"&auml;ndern der Eigenschaften der Access-Anwendung\" width=\"424,7115\" height=\"458,8492\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: &auml;ndern der Eigenschaften der Access-Anwendung<\/span><\/b><\/p>\n<h2>Datenbanktyp &auml;ndern<\/h2>\n<p>Damit die Add-In-Datenbank als solche erkannt wird, &auml;ndern Sie die Dateiendung der Datenbank von <b>.accdb <\/b>auf <b>.accda<\/b>.<\/p>\n<h2>Add-In registrieren<\/h2>\n<p>Nun k&ouml;nnen Sie das Add-In bereits registrieren. Dazu schlie&szlig;en Sie die Anwendung und &ouml;ffnen eine beliebige andere Datenbankanwendung in Access. W&auml;hlen Sie dann den Ribbon-Eintrag <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>aus. Klicken Sie auf die Schaltfl&auml;che <b>Neues hinzuf&uuml;gen&#8230;<\/b>, um einen <b>Datei &ouml;ffnen<\/b>-Dialog zu &ouml;ffnen und die <b>.accda<\/b>-Datenbank auszuw&auml;hlen. Nach der Auswahl unserer Datei wird diese wie in Bild 3 im Add-In-Manager angezeigt. Hier finden Sie dann auch die &auml;nderungen in den Eigenschaften der Anwendung wieder.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_003.png\" alt=\"Add-In-Manager von Access\" width=\"424,7115\" height=\"253,8506\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Add-In-Manager von Access<\/span><\/b><\/p>\n<h2>Erster Start<\/h2>\n<p>Der erste Startversuch durch Anklicken des neuen Eintrags in der Add-In-Liste im Ribbon f&uuml;hrt dann gleich zum ersten Fehler (s. Bild 4). Gewohnheitsm&auml;&szlig;ig werden Sie nun auf die Schaltfl&auml;che <b>Debuggen <\/b>klicken und sich den Fehler ansehen &#8211; hierzu folgt sp&auml;ter eine Warnung!<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_005.png\" alt=\"Fehler beim Versuch, das neue Add-In zu starten\" width=\"424,7115\" height=\"241,078\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Fehler beim Versuch, das neue Add-In zu starten<\/span><\/b><\/p>\n<p>Schauen wir zun&auml;chst auf den Fehler: Access kann die Tabelle <b>tblArtikel<\/b>, die als Datenherkunft des Formulars angegeben werden soll, nicht finden. Das hat normalerweise den Grund, dass keine solche Tabelle in der Datenbank enthalten ist.<\/p>\n<p>In diesem Fall haben wir das Add-In aber zum Experimentieren von einer Datenbank aus ge&ouml;ffnet, die wir mit genau den gleichen Tabellen ausgestattet haben, die wir auch schon beim Erstellen des Add-Ins zum Testen verwendet haben. Grunds&auml;tzlich ist die Tabelle also vorhanden.<\/p>\n<p>Allerdings greift das Add-In standardm&auml;&szlig;ig auf die Tabellen in der Add-In-Datenbank zu &#8211; aber dort befindet sich ja nur noch die Tabelle <b>tblKonfigurationen<\/b>! Die Tabelle <b>tblArtikel <\/b>jedoch befindet sich in der Host-Datenbank und kann somit nicht so einfach als Datenherkunft eines Formulars in der Add-In-Datenbank verwendet werden. Wie wir dies l&ouml;sen, schauen wir uns gleich an. Bevor wir uns ans Werk machen, jedoch noch die versprochene Warnung.<\/p>\n<h2>Warnung: Code im Add-In &auml;ndern<\/h2>\n<p>Wie erw&auml;hnt, m&ouml;chte man beim Auftauchen von Fehlern in Add-Ins genau wie bei normalen Datenbanken gleich in den VBA-Editor eintauchen und den Fehler beheben. Wenn Sie allerdings Elemente einer Add-In-Datenbank &auml;ndern, w&auml;hrend diese von einer anderen Access-Datenbank als Add-In ge&ouml;ffnet wurde, werden diese &auml;nderungen nicht gespeichert! Sie k&ouml;nnen zwar tempor&auml;r &auml;nderungen durchf&uuml;hren und auch testen, aber Sie sollten, wenn Sie dies vorhaben, beispielsweise &auml;nderungen am Code in die Zwischenablage kopieren, die Datenbank schlie&szlig;en, die Add-In-Datenbank &ouml;ffnen und dort die &auml;nderungen reproduzieren.<\/p>\n<p>Erst danach k&ouml;nnen Sie die &auml;nderungen durch erneuten Aufruf des Add-Ins in der Host-Datenbank testen. Das ist leider etwas umst&auml;ndlich, aber nicht zu &auml;ndern.<\/p>\n<p>Hierbei gibt es aber noch einen Fallstrick: Durch das Hinzuf&uuml;gen der Datenbank zur Add-In-Liste wurde diese in den Add-In-Ordner kopiert. Sie m&uuml;ssen also auch noch aufpassen, dass Sie die &auml;nderungen an der richtigen Datenbank durchf&uuml;hren. Es gibt zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Sie &auml;ndern direkt die Add-In-Datenbank im Add-In-Verzeichnis.<\/li>\n<li>Sie &auml;ndern die Originaldatenbank und kopieren diese nach dem &auml;ndern jeweils &uuml;ber die Version im Add-In-Verzeichnis.<\/li>\n<\/ul>\n<p>Wenn Sie &auml;nderungen an Stellen vornehmen, welche die Funktion als Add-In an sich betreffen &#8211; also beispielsweise Einstellungen der Anwendungseigenschaften oder in der Tabelle <b>USysRegInfo <\/b>-, m&uuml;ssen Sie das Add-In auch neu registrieren.<\/p>\n<h2>Zugriff auf Datenherk&uuml;nfte von Tabellen, die sich nicht im Add-In befinden<\/h2>\n<p>Die Zeile, die den obigen Fehler ausgel&ouml;st hat, befindet sich in der folgenden Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UnterformulareAktualisieren()\r\n     ...\r\n     Me!sfmTabelle4.Form.RecordSource = Nz(Me!cboTabellen4)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Gibt es eine Alternative zum Zuweisen des Namens der Tabelle zur Eigenschaft <b>RecordSource <\/b>des Unterformulars Wir k&ouml;nnten versuchen, ein Recordset auf Basis dieser Tabelle zu erstellen und dieses der Eigenschaft <b>Recordset <\/b>des Unterformulars zuweisen. Dazu ben&ouml;tigen wir zun&auml;chst eine <b>Database<\/b>-Variable und jeweils eine <b>Recordset<\/b>-Variable f&uuml;r die vier Unterformulare. Die <b>Database<\/b>-Variable f&uuml;llen wir wie &uuml;blich mit der Funktion <b>CurrentDb<\/b>.<\/p>\n<p>Den Recordset-Variablen weisen wir dann mit der <b>OpenRecordset<\/b>-Methode das Recordset auf Basis der im entsprechenden Kombinationfeld festgelegten Tabelle zu. Schlie&szlig;lich bekommt die <b>Recordset<\/b>-Eigenschaft der vier Unterformulare jeweils das entsprechende Recordset zugewiesen &#8211; hier die gek&uuml;rzte Fassung der ge&auml;nderten Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UnterformulareAktualisieren()\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>rst1<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rst2<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rst3<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rst4<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me.cboTabellen4)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> rst4 = db.OpenRecordset(Me!cboTabellen4, _\r\n             dbOpenDynaset)\r\n         Me!cboFremdschluessel4.RowSource = -_\r\n             Nz(Me!cboTabellen4)\r\n         <span style=\"color:blue;\">Set<\/span> Me!sfmTabelle4.Form.Recordset = rst4\r\n         UnterformularEinstellen Me!sfmTabelle4.Form\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     \r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Mit dieser &auml;nderung &ouml;ffnet sich das Formular zumindest schon einmal fehlerfrei.<\/p>\n<p>Aber warum gelingt dies nun so reibungslos Greifen wir mit den Recordsets auf Basis des mit <b>CurrentDb <\/b>gelieferten <b>Database<\/b>-Objekts nicht auch auf die Tabellen der Add-In-Datenbank zu Genau das geschieht nicht: <b>CurrentDb <\/b>bezieht sich immer auf die Host-Datenbank. Wenn Sie per VBA\/DAO auf eine Tabelle der Add-In-Datenbank zugreifen wollen, m&uuml;ssen Sie statt <b>CurrentDb <\/b>die Funktion <b>CodeDb <\/b>nutzen. Diese liefert einen Verweis auf das <b>Database<\/b>-Objekt der Add-In-Datenbank.<\/p>\n<h2>Weitere Recordsets zuweisen<\/h2>\n<p>Allerdings ist noch nicht alles Gold, was gl&auml;nzt: Das Kombinationsfeld <b>cboTabelle1 <\/b>zeigt, wie die &uuml;brigen Kombinationsfelder zur Auswahl der Tabellen, nur die Tabellen der Add-In-Datenbank an (s. Bild 5). Also m&uuml;ssen wir wohl auch hier nochmal Hand anlegen und die <b>RowSource<\/b>-Eigenschaft durch entsprechende Recordsets ersetzen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_006.png\" alt=\"Das Add-In zeigt seine eigenen Tabellen im Kombinationsfeld an.\" width=\"549,6265\" height=\"246,6492\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Add-In zeigt seine eigenen Tabellen im Kombinationsfeld an.<\/span><\/b><\/p>\n<p>Bisher hatten wir dort den folgenden Ausdruck als Wert der Eigenschaft <b>Datensatzherkunft <\/b>verwendet:<\/p>\n<pre>SELECT MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Name) <span style=\"color:blue;\">Not<\/span> Like ''MSys*'' \r\nAND (MSysObjects.Name) <span style=\"color:blue;\">Not<\/span> Like ''~*'' And (MSysObjects.Name) <span style=\"color:blue;\">Not<\/span> Like ''f_*'') \r\nAND ((MSysObjects.Type) In (1,4,5,6))) ORDER BY MSysObjects.Name;<\/pre>\n<p>Diesen m&uuml;ssen wir nun beim &ouml;ffnen des Formulars einem Recordset zuweisen und dieses dann f&uuml;r die Eigenschaft <b>Recordset<\/b> der Kombinationsfelder hinterlegen. Dies erledigen wir in der Ereignisprozedur <b>Form_Load<\/b> des Formulars (s. Listing 1). Hier erstellen wir ein Recordset auf Basis des soeben genannten SQL-Ausdrucks auf Basis der Tabelle <b>MSysObjects <\/b>und weisen diesen der Variablen <b>rst <\/b>zu. Dann weisen wir dieses Recordset den vier Kombinationsfeldern <b>cboTabellen1 <\/b>bis <b>cboTabellen4 <\/b>zu.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>strBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>lngKonfigurationID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT MSysObjects.Name FROM MSysObjects WHERE (((MSysObjects.Name) <span style=\"color:blue;\">Not<\/span> Like \" _\r\n         \"''MSys*'' And (MSysObjects.Name) <span style=\"color:blue;\">Not<\/span> Like ''~*'' And (MSysObjects.Name) <span style=\"color:blue;\">Not<\/span> Like ''f_*'') AND ((MSysObjects.Type) \" _\r\n         \"In (1,4,5,6))) ORDER BY MSysObjects.Name;\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> Me!cboTabellen1.Recordset = rst\r\n     <span style=\"color:blue;\">Set<\/span> Me!cboTabellen2.Recordset = rst\r\n     <span style=\"color:blue;\">Set<\/span> Me!cboTabellen3.Recordset = rst\r\n     <span style=\"color:blue;\">Set<\/span> Me!cboTabellen4.Recordset = rst\r\n     ...   \r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: F&uuml;llen der Kombinationsfelder zur Auswahl der Tabellen<\/span><\/b><\/p>\n<p>Auch dies bringt die gew&uuml;nschte L&ouml;sung.<\/p>\n<p>Als N&auml;chstes meckert Access, wenn Sie eine der Tabellen in einem der Kombinationsfelder <b>cboTabellen1 <\/b>bis <b>cboTabellen4 <\/b>ausw&auml;hlen. Dann scheitert in der Prozedur, die durch das <b>Nach Aktualisierung<\/b>-Ereignis ausgel&ouml;st wird, die Zuweisung der ausgew&auml;hlten Tabelle an die Unterformulare. Deshalb m&uuml;ssen Sie auch die vier Prozeduren <b>cboTabellen1_AfterUpdate<\/b> bis <b>cboTabellen4_AfterUpdate <\/b>erweitern. Wie das f&uuml;r die erste Ereignisprozedur aussieht, haben wir in Listing 2 abgebildet. Die ersten vier Zeilen sind neu, hier werden <b>Database<\/b>&#8211; und <b>Recordset<\/b>-Objekt deklariert und gef&uuml;llt. Unten wird die auskommentierte Zeile durch die dar&uuml;ber liegende Zeile ersetzt, die der <b>Recordset<\/b>-Eigenschaft des Unterformulars das Recordset aus <b>rst <\/b>zuweist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboTabellen1_AfterUpdate()\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(Me!cboTabellen1, dbOpenDynaset)\r\n     Me!cboPrimaerschluessel1.RowSource = Nz(Me!cboTabellen1)\r\n     Me!cboPrimaerschluessel1 = Null\r\n     Me!cboPrimaerschluessel1.SetFocus\r\n     Me!cboPrimaerschluessel1.Dropdown\r\n     <span style=\"color:blue;\">Set<\/span> Me!sfmTabelle1.Form.Recordset = rst\r\n''    Me!sfmTabelle1.Form.RecordSource = Nz(Me!cboTabellen1)\r\n     UnterformularEinstellen Me!sfmTabelle1.Form\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Anpassung der Prozedur, die nach dem Ausw&auml;hlen der anzuzeigenden Tabelle ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Interessant ist, dass die Kombinationsfelder <b>cboPrimaerschluessel1 <\/b>bis <b>cboPrimaerschluessel3 <\/b>und <b>cboFremdschluessel2 <\/b>bis <b>cboFremdschluessel4 <\/b>von Anfang an reibungslos funktionieren. Diese haben ja den Herkunfts-typ <b>Feldliste<\/b>, was bedeutet, dass sie die Felder der als Datensatzherkunft zugewiesenen Tabelle anzeigen.  Da sich dies nicht mit einem Recordset abbilden l&auml;sst, hatten wir schon damit gerechnet, dass wir hier eine Wertliste auf Basis der jeweiligen Tabelle zusammenstellen und den Kombinationsfeldern zuweisen m&uuml;ssten. Allerdings scheint die Wertliste intern auch &uuml;ber das mit <b>CurrentDb<\/b> gelieferte <b>Database<\/b>-Objekt gef&uuml;ttert zu werden, sodass diese nach wie vor die gew&uuml;nschten Ergebnisse anzeigt.<\/p>\n<p>Damit arbeitet das Add-In f&uuml;r unsere Beispielkonfiguration fehlerfrei. Wenn Sie es allerdings im aktuellen Zustand in einer anderen Datenbank &ouml;ffnen, knallt es: Das Formular l&auml;dt ja immer den ersten Eintrag der Tabelle <b>tblKonfigurationen <\/b>als Konfiguration. Dort sind die zu ladenden Tabellen samt Prim&auml;r- und Fremdschl&uuml;sselfeldern gespeichert. Wenn Sie nun versuchen, in einer Datenbank mit einem v&ouml;llig anderen Datenmodell auf die Tabellen der Suedsturm-Anwendung zuzugreifen, l&ouml;sen Sie nat&uuml;rlich wieder neue Fehler aus.<\/p>\n<h2>Letzte Aufgabe: Konfigurationen identifizieren<\/h2>\n<p>Also m&uuml;ssen wir uns &uuml;berlegen, wie wir die Anwendung dazu bringen, nur die f&uuml;r die aktuelle Host-Datenbank g&uuml;ltigen Konfigurationen anzuzeigen. Der Ansatz ist, die in den Konfigurationen enthaltenen Tabellen mit den in der Host-Datenbank enthaltenen Tabellen abzugleichen und nur diejenigen Eintr&auml;ge der Tabelle <b>tblKonfigurationen <\/b>in den Kombinationsfeldern anzuzeigen, deren Tabellen alle in der Host-Datenbank vorkommen. Um dies zu realisieren, ist jedoch ein wenig VBA-Code n&ouml;tig.<\/p>\n<h2>Konfigurationen mit Tabellen der Host-Datenbank abgleichen<\/h2>\n<p>Um zu pr&uuml;fen, ob alle in einer Konfiguration enthaltenen Tabellen auch in der Host-Datenbank vorhanden sind, m&uuml;ssen wir die Daten der Felder <b>Tabelle1 <\/b>bis <b>Tabelle4 <\/b>der Tabelle <b>tblKonfigurationen <\/b>mit den in der Systemtabelle <b>MSysObjects <\/b>gespeicherten Namen der Tabellen abgleichen.<\/p>\n<p>Der erste Ansatz dazu ist die Abfrage aus Bild 6. Hier haben wir auf der einen Seite die Tabelle <b>tblKonfigurationen<\/b>, welche ja in den Feldern <b>Tabelle1 <\/b>bis <b>Tabelle4 <\/b>eine bis vier an der Konfiguration beteiligte Tabellen enth&auml;lt. Auf der anderen Seite haben wir vier Kopien der Tabelle <b>MSysObjects <\/b>in den Entwurf der Abfrage gezogen. Dabei haben wir jeweils eines der <b>Tabelle&#8230;<\/b>-Felder mit dem Feld <b>Name <\/b>der Tabelle <b>MSysObjects <\/b>verkn&uuml;pft und in den Verkn&uuml;pfungseigenschaften eingestellt, dass alle Datens&auml;tze der Tabelle <b>tblKonfigurationen <\/b>angezeigt werden sollen, auch wenn dazu kein verkn&uuml;pfter Datensatz in der Tabelle <b>MSysObjects <\/b>enthalten ist. Daraus zeigen wir nun in den ersten vier Paaren von Ausgabefeldern der Abfrage jeweils den Namen der <b>Tabelle1 <\/b>bis <b>Tabelle4 <\/b>an sowie den entsprechenden, im Feld <b>Name <\/b>der zugeordneten Kopie der Tabelle <b>MSysObjects <\/b>enthaltenen Wert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_007.png\" alt=\"Abfrage, um zu pr&uuml;fen, ob alle in einer Konfiguration enthaltenen Tabellen auch in der Datenbank enthalten sind\" width=\"700\" height=\"316,3405\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Abfrage, um zu pr&uuml;fen, ob alle in einer Konfiguration enthaltenen Tabellen auch in der Datenbank enthalten sind<\/span><\/b><\/p>\n<p>Diese Ausgaben sind nur zur Kontrolle und sehen wie die Spalten zwei bis neun aus Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_008.png\" alt=\"Ergebnis der Abfrage\" width=\"700\" height=\"88,62096\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ergebnis der Abfrage<\/span><\/b><\/p>\n<p>In den vier hinteren Feldern haben wir jeweils die beiden zusammengeh&ouml;renden Felder ausgewertet, und zwar in der Form, dass wir mit einem Ausdruck wie etwa f&uuml;r das erste Feld <b>Nz([Tabelle1])=Nz([MSysObjects].[Name]) <\/b>ermitteln, ob die beiden Tabellennamen &uuml;bereinstimmen. Dies geschieht nur, wenn die Tabelle sowohl im entsprechenden Feld der Tabelle <b>tblKonfigurationen <\/b>als auch in einem Datensatz der Tabelle <b>MSysObjects <\/b>enthalten ist. In diesem Fall liefert der genannte Ausdruck dann den Wert <b>-1<\/b>, sonst den Wert <b>0<\/b>. Enthalten alle der letzten vier Spalten den Wert <b>-1<\/b>, sind die Tabellen der Konfiguration in der Host-Datenbank enthalten, sonst nicht. Zusammenfassend k&ouml;nnten wir also sagen, dass die Konfiguration zur Datenbank passt, wenn das Produkt der letzten vier Spalten nicht <b>0 <\/b>ist. Zusammenfasst brauchen wir also nur den folgenden Ausdruck in einem einzelnen Feld mit dem Wert <b>0 <\/b>zu vergleichen, um zu pr&uuml;fen, ob die Konfiguration nutzbar ist:<\/p>\n<pre>(Nz([Tabelle1])=Nz([MSysObjects].[Name]))\r\n*(Nz([Tabelle2])=Nz([MSysObjects_3].[Name]))\r\n*(Nz([Tabelle3])=Nz([MSysObjects_2].[Name]))\r\n*(Nz([Tabelle4])=Nz([MSysObjects_1].[Name]))<\/pre>\n<p>Dies m&uuml;ssen wir nun noch mit der Tabelle verheiraten, die als Datenherkunft f&uuml;r das Formular und als Datensatzherkunft f&uuml;r das Kombinationsfeld <b>cboKonfigurationen <\/b>herh&auml;lt.<\/p>\n<p>Genau genommen bearbeiten wir die Abfrage aus der obigen Abbildung einfach weiter, indem wir alle Felder au&szlig;er <b>KonfigurationID <\/b>entfernen, die &uuml;brigen Felder der Tabelle <b>tblKonfigurationen <\/b>hinzuf&uuml;gen und noch ein Feld, das wie in Bild 8 aussieht und den obigen Ausdruck als Inhalt hat. Speichern Sie diese Abfrage unter dem Namen <b>qryKonfigurationen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1083_009.png\" alt=\"Neue Abfrage f&uuml;r die Datenherkunft des Hauptformulars\" width=\"649,559\" height=\"352,9599\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Neue Abfrage f&uuml;r die Datenherkunft des Hauptformulars<\/span><\/b><\/p>\n<p>Nun tragen Sie diese Abfrage f&uuml;r die Eigenschaft <b>Datenherkunft <\/b>des Formulars <b>frmTabellen <\/b>ein sowie f&uuml;r Eigenschaft <b>Datensatzherkunft <\/b>des Kombinationsfeldes <b>cboKonfigurationen <\/b>des gleichen Formulars. Damit sind wir zumindest einmal so weit, was den Einsatz und den Test in der Add-In-Datenbank selbst angeht. Allerdings stammen die vier Instanzen der Tabelle <b>MSysObjects <\/b>in der Abfrage ja aus der jeweiligen Host-Tabelle, weshalb uns die Abfrage in der aktuellen Form nicht f&uuml;r den Einsatz als Add-In weiterhilft.<\/p>\n<p>Wir k&ouml;nnen hier mit dem <b>IN<\/b>-Statement von Access-SQL arbeiten, welches beispielsweise erlaubt, Daten von Tabellen aus anderen Datenbanken zu ermitteln. Das gelingt beispielsweise so:<\/p>\n<pre>SELECT * FROM tblTest IN (''c:\\Testdatenbank.accdb'')<\/pre>\n<p>Dummerweise m&uuml;ssten wir den Namen der Datenbank aber dynamisch eintragen, je nachdem, von welcher Host-Datenbank aus das Add-In ge&ouml;ffnet wird. Und eine M&ouml;glichkeit, den Datenbankpfad zur Laufzeit in die <b>IN<\/b>-Klausel der Abfrage zu schreiben, ist uns nicht bekannt. Also &uuml;bernehmen wir diese Aufgabe einfach in das <b>Form_Load<\/b>-Ereignis und weisen die Datenherkunft des Formulars und die Datensatzherkunft des Kombinationsfeldes dort dynamisch zu, indem wir an den entsprechenden Stellen die Funktion <b>CurrentDb.Name <\/b>einsetzen. Die daraus resultierende SQL-Anweisung wollten wir dann der Eigenschaft <b>Datenherkunft<\/b> des Formulars und <b>Datensatzherkunft <\/b>des Kombinationsfeldes <b>cboKonfigurationen <\/b>zuweisen. Dies gelang auch &#8211; allerdings ist das Ergebnis dieser Abfrage mit mehreren <b>LEFT JOIN<\/b>-Operationen nat&uuml;rlich nicht mehr aktualisierbar. Also haben wir die Abfrage erneut umgebaut, indem wir sie in eine Unterabfrage f&uuml;r eine Hauptabfrage wie die folgende gepackt haben:<\/p>\n<pre>SELECT * FROM tblKonfigurationen \r\nWHERE KonfigurationID IN (SELECT ...)<\/pre>\n<p>Die <b>IN<\/b>-Abfrage ist nat&uuml;rlich entsprechend umfangreich. Insgesamt mussten wir die Prozedur <b>Form_Load <\/b>wie in Listing 3 abgebildet umbauen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>strBezeichnung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngKonfigurationID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     strSQL = \"SELECT * FROM tblKonfigurationen WHERE KonfigurationID IN (SELECT KonfigurationID &quot; _\r\n         &amp; &quot;FROM (((tblKonfigurationen  LEFT JOIN [;database=\" & CurrentDb.Name & \"].[MSysObjects] &quot; _\r\n         &amp; &quot;ON tblKonfigurationen.Tabelle1 = MSysObjects.Name)  LEFT JOIN [;database=\" & CurrentDb.Name _\r\n         & \"].[MSysObjects] AS MSysObjects_3  ON tblKonfigurationen.Tabelle2 = MSysObjects_3.Name) &quot; _\r\n         &amp; &quot; LEFT JOIN [;database=\" & CurrentDb.Name & \"].[MSysObjects] AS MSysObjects_2 &quot; _\r\n         &amp; &quot; ON tblKonfigurationen.Tabelle3 = MSysObjects_2.Name)  LEFT JOIN [;database=\" & CurrentDb.Name _\r\n         & \"].[MSysObjects] AS MSysObjects_1  ON tblKonfigurationen.Tabelle4 = MSysObjects_1.Name &quot; _\r\n         &amp; &quot; WHERE (Nz([Tabelle1])=Nz([MSysObjects].[Name])) *(Nz([Tabelle2])=Nz([MSysObjects_3].[Name])) &quot; _\r\n         &amp; &quot; *(Nz([Tabelle3])=Nz([MSysObjects_2].[Name])) *(Nz([Tabelle4])=Nz([MSysObjects_1].[Name])) &lt;&gt; 0);\"\r\n     Me.RecordSource = strSQL\r\n     Me!cboKonfiguration.RowSource = strSQL\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Umbauten an der Prozedur Form_Load<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit war das Ziel erreicht &#8211; ein Hauptformular und ein Unterformular sowie eine Tabelle waren in eine eigene Datenbank ausgegliedert und in ein Add-In umgewandelt, das nun von allen Anwendungen aus ge&ouml;ffnet werden kann, in denen es interessant ist, die Inhalte verkn&uuml;pfter Tabellen zu betrachten und auch nach den Datens&auml;tzen in den &uuml;bergeordneten Tabellen zu filtern.<\/p>\n<h2>Praxistipp<\/h2>\n<p>F&uuml;r uns hat es sich als praktisch herausgestellt, die Add-In-Datenbank nach der ersten Registrierung immer im Anwendungsverzeichnis zu bearbeiten und den neuesten Stand mit einer Batch-Datei in das Add-In-Verzeichnis zu kopieren.<\/p>\n<p>Auf diese Weise brauchen wir uns gar nicht aus dem Anwendungsverzeichnis herauszubewegen und k&ouml;nnen das Add-In per Doppelklick verf&uuml;gbar machen &#8211; f&uuml;r die Testanwendung, die sich ebenfalls im Anwendungsverzeichnis befindet.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VerknuepfteDatenSuchen.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/FABC6A00-0E98-44E9-9B68-5F4606B59E9C\/aiu_1083.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag Verkn&uuml;pfte Daten suchen haben wir eine L&ouml;sung beschrieben, die man zwar prima in eine Datenbank integrieren und dann dort nutzen kann. Allerdings ist es doch aufwendig, jedes Mal erst die ben&ouml;tigten Objekte zu importieren &#8211; und au&szlig;erdem steigert das Verteilen des gleichen Codes auf viele verschiedene Datenbanke nicht unbedingt die Wartbarkeit. Da die genannte L&ouml;sung nicht f&uuml;r den Benutzer, sondern eher f&uuml;r den Entwickler gedacht ist, wollen wir diese in ein Add-In umwandeln. Dieser Beitrag zeigt die Vorgehensweise und auch die Fallstricke.<\/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":[66022017,662017,44000025],"tags":[],"class_list":["post-55001083","post","type-post","status-publish","format-standard","hentry","category-66022017","category-662017","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>L&ouml;sung zum Formular-Add-In umbauen - 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\/Loesung_zum_FormularAddIn_umbauen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"L&ouml;sung zum Formular-Add-In umbauen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag Verkn&uuml;pfte Daten suchen haben wir eine L&ouml;sung beschrieben, die man zwar prima in eine Datenbank integrieren und dann dort nutzen kann. Allerdings ist es doch aufwendig, jedes Mal erst die ben&ouml;tigten Objekte zu importieren - und au&szlig;erdem steigert das Verteilen des gleichen Codes auf viele verschiedene Datenbanke nicht unbedingt die Wartbarkeit. Da die genannte L&ouml;sung nicht f&uuml;r den Benutzer, sondern eher f&uuml;r den Entwickler gedacht ist, wollen wir diese in ein Add-In umwandeln. Dieser Beitrag zeigt die Vorgehensweise und auch die Fallstricke.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:42:15+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/71c357ab5332412cb1bb7ea9f68824de\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"L&ouml;sung zum Formular-Add-In umbauen\",\"datePublished\":\"2020-05-14T13:42:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/\"},\"wordCount\":2647,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/71c357ab5332412cb1bb7ea9f68824de\",\"articleSection\":[\"2\\\/2017\",\"2017\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/\",\"name\":\"L&ouml;sung zum Formular-Add-In umbauen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/71c357ab5332412cb1bb7ea9f68824de\",\"datePublished\":\"2020-05-14T13:42:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/71c357ab5332412cb1bb7ea9f68824de\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/71c357ab5332412cb1bb7ea9f68824de\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Loesung_zum_FormularAddIn_umbauen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"L&ouml;sung zum Formular-Add-In umbauen\"}]},{\"@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":"L&ouml;sung zum Formular-Add-In umbauen - 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\/Loesung_zum_FormularAddIn_umbauen\/","og_locale":"de_DE","og_type":"article","og_title":"L&ouml;sung zum Formular-Add-In umbauen","og_description":"Im Beitrag Verkn&uuml;pfte Daten suchen haben wir eine L&ouml;sung beschrieben, die man zwar prima in eine Datenbank integrieren und dann dort nutzen kann. Allerdings ist es doch aufwendig, jedes Mal erst die ben&ouml;tigten Objekte zu importieren - und au&szlig;erdem steigert das Verteilen des gleichen Codes auf viele verschiedene Datenbanke nicht unbedingt die Wartbarkeit. Da die genannte L&ouml;sung nicht f&uuml;r den Benutzer, sondern eher f&uuml;r den Entwickler gedacht ist, wollen wir diese in ein Add-In umwandeln. Dieser Beitrag zeigt die Vorgehensweise und auch die Fallstricke.","og_url":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:42:15+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/71c357ab5332412cb1bb7ea9f68824de","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"L&ouml;sung zum Formular-Add-In umbauen","datePublished":"2020-05-14T13:42:15+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/"},"wordCount":2647,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/71c357ab5332412cb1bb7ea9f68824de","articleSection":["2\/2017","2017","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/","url":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/","name":"L&ouml;sung zum Formular-Add-In umbauen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/71c357ab5332412cb1bb7ea9f68824de","datePublished":"2020-05-14T13:42:15+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/71c357ab5332412cb1bb7ea9f68824de","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/71c357ab5332412cb1bb7ea9f68824de"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Loesung_zum_FormularAddIn_umbauen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"L&ouml;sung zum Formular-Add-In umbauen"}]},{"@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\/55001083","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=55001083"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001083\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001083"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}