{"id":55000761,"date":"2011-02-01T00:00:00","date_gmt":"2020-05-22T22:01:30","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=761"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"CodeBibliotheken","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/","title":{"rendered":"Code-Bibliotheken"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/6a89e4e157d743d39ddc5b49ab0cc65a\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wer bereits eine Reihe von Projekten durchgef&uuml;hrt hat, verf&uuml;gt in der Regel &uuml;ber einen Fundus immer wiederkehrender Elemente wie Prozeduren, Module oder Klassen. Diese kopiert man dann von bestehenden in neue Datenbanken und kann so getestete, funktionierende Elemente weiternutzen. Aber was ist, wenn man in einer Datenbank Fehler an einem solchen Element findet und behebt oder das Element gar weiterentwickelt Wie gew&auml;hrleistet man, dass die &uuml;brigen Anwendungen, die dieses Element verwenden, auch davon profitieren Dies gelingt zum Beispiel durch den Einsatz von Code-Bibliotheken. Wie dieser in der Praxis aussieht, erfahren Sie in diesem Beitrag.<\/b><\/p>\n<p>Auch wer nur ganz wenige Zeilen seines Codes in anderen Anwendungen weiterverwendet: Standardfunktionen wie etwa zum Ermitteln eines SQL-formatierten Datums (#2010\/10\/01#) oder FLookup und Co. (schnellere Varianten der eingebauten Dom&auml;nenfunktionen) oder &auml;hnliche wird wohl jeder Entwickler bereits einmal aus einer Anwendung kopiert und in eine weitere Anwendung eingef&uuml;gt haben.<\/p>\n<p>Hin und wieder zeigt sich jedoch, dass das eine oder andere Element nicht wie gew&uuml;nscht funktioniert oder gar Fehler verursacht. Nach der &auml;nderung der verantwortlichen Codezeilen tritt der Fehler nicht mehr auf &#8211; aber nur in der Anwendung, in der Sie ihn behoben haben.<\/p>\n<p>Also ermitteln Sie alle Anwendungen, in denen die entsprechende Funktion noch vorkommt, was je nach Verbreitung gar nicht so einfach ist, und beheben den Fehler an allen betroffenen Stellen. <\/p>\n<p>Noch interessanter wird es, wenn Sie komplette S&auml;tze, bestehend aus Elementen wie Tabellen, Abfragen, Formularen, Standard- und Klassenmodulen, immer wieder verwenden und diese wiederum auf gemeinsame Elemente zugreifen.<\/p>\n<p>Ein Beispiel ist ein Modul mit einer einfachen Funktion zur Fehlerbehandlung. Wenn alle Elemente in der gleichen Datenbankdatei stecken, k&ouml;nnen auch alle auf die gleiche Fehlerbehandlung zugreifen.<\/p>\n<p>Wenn Sie nun einen Satz von Elementen (eine Komponente), der auch die Fehlerbehandlung verwendet, von Anwendung A nach Anwendung B kopieren, l&auml;uft alles rund.<\/p>\n<p>Wenn Sie jetzt einen anderen Satz von Elementen von Anwendung C nach Anwendung B importieren, der die gleiche Fehlerbehandlung verwendet, ist diese doppelt vorhanden, was einen Kompilierfehler ausl&ouml;st.<\/p>\n<p>Dies ist kein Problem, wenn Sie die Komponenten komplett in eigene Datenbankdateien auslagern und diese von den eigentlichen Datenbank-Anwendungen aus referenzieren: Jede Komponente kann dann ihre eigene Fehlerbehandlung verwenden.<\/p>\n<p>Oder, um das Spiel noch ein wenig weiterzutreiben: Die Fehlerbehandlung wird ihrerseits in eine weitere Datenbankdatei ausgelagert und von allen anderen Komponenten und auch von der Hauptanwendung referenziert.<\/p>\n<p>Und damit kommen wir zum Thema Codebibliotheken: Darunter versteht man im Allgemeinen herk&ouml;mmliche Datenbankdateien, die &uuml;ber den Verweise-Dialog in die Hauptanwendung eingebunden werden.<\/p>\n<p><b>Bibliothek erstellen<\/b><\/p>\n<p>Als Bibliothek verwenden Sie eine herk&ouml;mmliche Access-Datenbank (in den Beispieldateien hei&szlig;t diese <b>DBMitBibliothek.mdb<\/b>).<\/p>\n<p>Legen Sie fest, welche Access-Versionen auf diese Bibliothek zugreifen sollen und verwenden Sie die kleinste Version als Datenbankformat (viele verwenden noch Access 2000, weshalb dies gr&ouml;&szlig;tm&ouml;gliche Kompatibilit&auml;t bietet &#8211; aber beachten Sie, dass beispielsweise nicht alle VBA-Befehle<b> <\/b>hiermit funktionieren).<\/p>\n<p>Elemente, die Sie in anderen Datenbanken verwenden m&ouml;chten, m&uuml;ssen als <b>Public <\/b>deklariert werden. Beginnen wir mit einer kleinen Beispielfunktion namens <b>BibMsgBox<\/b>, die wie folgt aussieht und in einem Standardmodul namens <b>mdlBibliothek <\/b>landet:<\/p>\n<pre>Public Sub BibMsgBox()\r\n    MsgBox &quot;Meldung aus der Bibliothek&quot;\r\nEnd Sub<\/pre>\n<p>Die Prozedur zeigt ein einfaches Meldungsfenster an. Damit die Bibliothek beim Einbinden in andere Datenbanken keinen Konflikt ausl&ouml;st, vergeben Sie einen eindeutigen Namen f&uuml;r das VBA-Projekt. Dies erledigen Sie in den Projekteigenschaften (<b>Extras|Projekteigenschaften<\/b>, s. Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Bibliotheken-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Einstellen des Namens eines VBA-Projekts<\/span><\/b><\/p>\n<p><b>Bibliothek referenzieren<\/b><\/p>\n<p>Nun &ouml;ffnen oder erstellen Sie die Datenbank, welche die in der Bibliothek befindliche Routine aufrufen soll. Dort m&uuml;ssen Sie die Bibliothek zun&auml;chst referenzieren, was Sie &uuml;ber den <b>Verweise<\/b>-Dialog erledigen.<\/p>\n<p>Aktivieren Sie mit <b>Alt + F11 <\/b>den VBA-Editor und w&auml;hlen Sie den Men&uuml;eintrag <b>Extras|Verweise <\/b>aus. Klicken Sie auf Durchsuchen und w&auml;hlen Sie die soeben erstellte Bibliotheksdatenbank aus. Diese erscheint anschlie&szlig;end in der Liste der Verweise (s. Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Bibliotheken-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Ein Verweis auf eine Bibliotheksdatenbank<\/span><\/b><\/p>\n<p>Sollte dies nicht der Fall sein, ist m&ouml;glicherweise im Projekt-Explorer des VBA-Editors das falsche Projekt aktiviert. Der Projekt-Explorer zeigt n&auml;mlich nach dem Einbinden der Bibliothek nicht mehr nur das zur aktuellen Datenbankdatei geh&ouml;rende VBA-Projekt in der &Uuml;bersicht an, sondern auch das per Verweis eingebundene (s. Bild 3). Ist dieses aktiviert, zeigt der <b>Verweise<\/b>-Dialog die f&uuml;r dieses VBA-Projekt festgelegten Verweise an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Bibliotheken-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Auch in Bibliotheksdatenbanken enthaltene Projekte werden im Projekt-Explorer angezeigt.<\/span><\/b><\/p>\n<p><b>&auml;ndern von Bibliotheken<\/b><\/p>\n<p>Wenn Sie Bibliotheken verwenden, stellen sich oft erst im Einsatz in der Zielanwendung Programmierfehler heraus. Sie werden dann normalerweies schnell in den VBA-Editor wechseln, um das Problem zu beheben.<\/p>\n<p>Auch wenn dies im ersten Moment gelingt: &auml;nderungen an Bibliotheken von anderen Anwendungen aus sind, genau wie bei Access-Add-Ins auch, nur tempor&auml;r und halten genau solange, bis Sie die Anwendung schlie&szlig;en.<\/p>\n<p>Das reicht zum Testen, ob ein Bugfix funktioniert, zum Durchf&uuml;hren der eigentlichen &auml;nderung m&uuml;ssen Sie die Bibliotheksdatenbank jedoch allein &ouml;ffnen. Ein kleiner Praxistipp: Nehmen Sie kleinere &auml;nderungen direkt von der Host-Anwendung aus vor und testen Sie diese.<\/p>\n<p><!--30percent--><\/p>\n<p>Dann kopieren Sie das komplette Modul, schlie&szlig;en die Hauptanwendung, &ouml;ffnen die Bibliotheksdatenbank und f&uuml;gen den ge&auml;nderten Code in das entsprechende Modul ein. Gr&ouml;&szlig;ere &auml;nderungen sollten Sie jedoch direkt in der Bibliotheksanwendung durchf&uuml;hren, da &auml;nderungen sonst schnell versehentlich verloren gehen.<\/p>\n<p><b>Komplette Klassen aus Bibliotheken verwenden<\/b><\/p>\n<p>Der Anlass f&uuml;r diesen Beitrag ist eigentlich der Einsatz verschiedener Klassenmodule beziehungsweise kompletter Sammlungen von Modulen und anderen Elementen in unterschiedlichen Anwendungen (ein Beispiel folgt in der kommenden Ausgabe von Access im Unternehmen).<\/p>\n<p>Damit jede Anwendung gleich von eventuellen &auml;nderungen profitiert, sollen alle die gleiche Bibliothek anzapfen und den dort enthaltenen Code verwenden.<\/p>\n<p>In vielen F&auml;llen reicht es aus, lediglich auf die &ouml;ffentlich deklarierten Funktionen und Prozeduren der Bibliothek zuzugreifen. Der TreeViewHandler beispielsweise wird jedoch enger mit der Host-Anwendung verzahnt.<\/p>\n<p>Diese soll beispielsweise auf Ereignisse reagieren, die durch den Zugriff auf die Elemente des mit dem TreeViewHandler gesteuerten TreeViews ausgel&ouml;st werden &#8211; ein Klick auf ein Element, das Anzeigen des Kontextmen&uuml;s und so weiter. Damit dies funktioniert, m&uuml;ssen Sie in der Host-Anwendung gleich eine komplette Klasse instanzieren.<\/p>\n<p>Wir zeigen an einem kleinen Beispiel, wie das funktioniert. Die Beispieldatenbank <b>Bibliothek.mdb <\/b>enth&auml;lt eine Klasse namens <b>clsEreignisklasse <\/b>mit folgendem Inhalt:<\/p>\n<pre>Public Event EreignisWurdeAusgeloest()\r\nPublic Sub Ereignisausloesen()\r\n    RaiseEvent EreignisWurdeAusgeloest\r\nEnd Sub\r\nPublic Sub Methode()\r\n    MsgBox &quot;Methode funktioniert&quot;\r\nEnd Sub<\/pre>\n<p>Wenn Sie diese Datenbank nun schlie&szlig;en und die oben bereits verwendete Host-Datenbank <b>DBMitBibliothek<\/b> &ouml;ffnen, sollten Sie die Klasse eigentlich referenzieren k&ouml;nnen &#8211; beispielsweise wie bei der Deklaration in Bild 4.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Bibliotheken-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Die Klasse ist trotz Verweis nicht sichtbar.<\/span><\/b><\/p>\n<p>Allerdings bietet nicht nur IntelliSense keine solche Klasse zur Auswahl an, die Deklaration wie in folgender Zeile f&uuml;hrt sogar zu einem Kompilierfehler (<b>Benutzerdefinierter Typ nicht deklariert<\/b>):<\/p>\n<pre>Public objEreignisklasse As clsEreignisklasse<\/pre>\n<p>Das Problem ist die f&uuml;r diesen Zweck falsche Deklaration des Klassenmoduls in der Bibliotheksdatenbank. F&uuml;r diese m&uuml;ssen Sie die Eigenschaft <b>Instancing <\/b>auf <b>PublicNonCreatable<\/b> einstellen (s. Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Bibliotheken-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Deklarieren der Klasse als &ouml;ffentliches Element<\/span><\/b><\/p>\n<p>Diese Einstellung erm&ouml;glicht nun zwar die Deklaration, allerdings hapert es mit der Instanzierung. Wenn Sie dies mit der folgenden Anweisung erledigen m&ouml;chten, l&ouml;sen Sie damit einen Fehler aus, der die unzul&auml;ssige Verwendung des Schl&uuml;sselworts New anmahnt:<\/p>\n<pre>Set objEreignisklasse = New clsEreignisklasse<\/pre>\n<p>Letztlich teilt die Einstellung <b>PublicNonCreatable <\/b>ja bereits mit, dass die Klasse nun wohl &ouml;ffentlich verf&uuml;gbar ist, aber nicht instanziert werden kann. Kein Problem, denn dies funktioniert zumindest im privaten Rahmen eines Standardmoduls der Bibliotheksdatenbank <b>Bibliothek.mdb<\/b>.<\/p>\n<p>Dieses Modul hei&szlig;t <b>mdlBibliothek <\/b>und enth&auml;lt die folgende Funktion:<\/p>\n<pre>Public Function NeueEreignisklasse() As clsEreignisklasse\r\n    Set NeueEreignisklasse = New clsEreignisklasse\r\nEnd Function<\/pre>\n<p>In der Host-Datenbank <b>DBMitVerweis <\/b>legen Sie nun folgende Prozedur an, um ein Objekt auf Basis der Klasse <b>clsEreignisklasse <\/b>der Bibliotheksdatenbank zu erstellen:<\/p>\n<pre>Public Sub TestEreignisklasse()\r\n    Set objEreignisklasse = NeueEreignisklasse\r\nEnd Sub<\/pre>\n<p>Leider f&uuml;hrt dies zumindest bei der Beispieldatenbank und der Beispielbibliothek zu reproduzierbaren Abst&uuml;rzen, zumindest unter Access 2010.<\/p>\n<p>Also gehen wir noch einen Schritt weiter, indem wir Folgendes durchf&uuml;hren:<\/p>\n<ul>\n<li class=\"aufz-hlung\">&Ouml;ffnen Sie die Bibliotheksdatenbank.<\/li>\n<li class=\"aufz-hlung\">Markieren Sie die Klassel <b>clsEreignisklasse<\/b>.<\/li>\n<li class=\"aufz-hlung\">W&auml;hlen Sie aus dem Kontextmen&uuml; den Eintrag <b>Exportieren|Textdatei<\/b> aus.<\/li>\n<li class=\"aufz-hlung\">Speichern Sie die Klasse unter einem beliebigen Namen wie beispielsweise <b>clsEreignisklasse.txt<\/b>.<\/li>\n<li class=\"aufz-hlung\">&Ouml;ffnen Sie die Klasse mit einem Texteditor.<\/li>\n<\/ul>\n<p>Hier finden Sie nun einige zus&auml;tzliche Zeilen zu den im VBA-Editor angezeigten (s. Bild 6).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Bibliotheken-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Export eines Klassenmoduls im Textformat<\/span><\/b><\/p>\n<p>Stellen Sie das Attribut <b>VB_Creatable <\/b>sowie <b>VB_Exposed <\/b>auf <b>True <\/b>ein. Speichern Sie dann die Textdatei und aktivieren Sie erneut den VBA-Editor.<\/p>\n<p>Dort &ouml;ffnen Sie die erneut das Klassenmodul <b>clsEreignisklasse<\/b>, positionieren die Einf&uuml;gemarke darin und markieren mit <b>Strg + A <\/b>den kompletten Inhalt und l&ouml;schen diesen.<\/p>\n<p>W&auml;hlen Sie dann den Men&uuml;befehl <b>Einf&uuml;gen|Datei <\/b>aus und f&uuml;gen den Inhalt des soeben exportierten und ge&auml;nderten Klassenmoduls wieder ein.<\/p>\n<p>Nach dem Einf&uuml;gen finden Sie einige unn&ouml;tige Zeilen, die Sie wie in Bild 7 entfernen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Bibliotheken-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Einf&uuml;gen des ge&auml;nderten Klassenmoduls<\/span><\/b><\/p>\n<p>Ein Blick auf die Eigenschaft <b>Instancing<\/b> zeigt, dass die soeben manuell herbeigef&uuml;hrte Konstellation im VBA-Editor eigentlich gar nicht eingestellt werden kann &#8211; die Eigenschaft ist n&auml;mlich leer. Das spielt f&uuml;r diese L&ouml;sung jedoch keine Rolle.<\/p>\n<p>Schlie&szlig;en Sie die Bibliotheksdatenbank und &ouml;ffnen Sie erneut die Datenbank, welche auf die Elemente der Bibliotheksdatenbank zugreifen soll.<\/p>\n<p>Binden Sie die Bibliotheksdatenbank erneut ein. Legen Sie dann ein neues Modul an und f&uuml;gen Sie einer neuen Prozedur die folgenden Zeilen hinzu:<\/p>\n<pre>Public Sub TestEreignisklasse()\r\n    Dim obj As Bibliothek.clsEreignisklasse\r\n    Set obj = New Bibliothek.clsEreignisklasse\r\n    With obj\r\n        .Methode\r\n    End With\r\nEnd Sub<\/pre>\n<p>Wenn Sie alles richtig gemacht haben, unterst&uuml;tzt IntelliSense Sie beim Schreiben der Anweisungen.<\/p>\n<p>Rufen Sie diese Prozedur auf, sollte die in der Prozedur <b>Methode <\/b>der Bibliotheksklasse angegebene <b>MsgBox<\/b>-Anweisung zur Anzeige eines Meldungsfensters f&uuml;hren.<\/p>\n<p>Fehlt noch der Test, ob die Host-Datenbank auch durch die Klasse der Bibliotheksdatenbank ausgel&ouml;ste Ereignisse verarbeiten kann. Dazu legen Sie ein neues Formular mit einer einzigen Schaltfl&auml;che an. F&uuml;gen Sie ein <b>Beim Klicken<\/b>-Ereignis f&uuml;r die Schaltfl&auml;che hinzu und erg&auml;nzen Sie den Code des Klassenmoduls des Formulars dann wie folgt:<\/p>\n<pre>Dim WithEvents obj As Bibliothek.clsEreignisklasse\r\nPrivate Sub cmdEvent_Click()\r\n    Set obj = New Bibliothek.clsEreignisklasse\r\n    With obj\r\n        .Ereignisausloesen\r\n    End With\r\nEnd Sub\r\nPrivate Sub obj_EreignisWurdeAusgeloest()\r\n    MsgBox &quot;Ereignis erfolgreich ausgel&ouml;st&quot;\r\nEnd Sub<\/pre>\n<p>Ein Klick auf die Schaltfl&auml;che <b>cmdEvent <\/b>instanziert die Klasse der Bibliotheksdatenbank und l&ouml;st die Prozedur <b>EreignisAusloesen <\/b>aus (siehe oben). Diese l&ouml;st wiederum das in <b>clsEreignisklasse <\/b>enthaltene Ereignis <b>EreignisWurdeAusgeloest <\/b>aus, die wiederum die Implementierung im Klassenmodul des Formulars startet.<\/p>\n<p><b>Verweise aktuell halten<\/b><\/p>\n<p>In <b>.mdb<\/b>&#8211; oder <b>.accdb<\/b>-Datenbanken k&ouml;nnen Sie den Verweis auf eine Bibliotheksdatenbank per Code pr&uuml;fen und aktualisieren. In <b>.mde<\/b>&#8211; oder <b>.accde<\/b>-Datenbanken lassen sich die Verweise nicht mehr anpassen. Werden Datenbank und Bibliothek verschoben, kann die Datenbank die Bibliothek gegebenfalls nicht mehr finden.<\/p>\n<p>In diesem Fall gibt es nur eine L&ouml;sung: Die Bibliothek muss sich im gleichen Verzeichnis wie die Datenbank selbst befinden. Denn egal, welcher Speicherort im Verweis auf die Bibliothek festgelegt ist: Findet Access diese dort nicht, sucht es immer auch noch im Verzeichnis der aktuellen Datenbank danach.<\/p>\n<p><b>Das .mde-Problem<\/b><\/p>\n<p>Das Erstellen einer .mde- oder .accde-Datenbank, also einer Version, deren Formulare, Berichte und Module Sie nicht mehr bearbeiten k&ouml;nnen, schlie&szlig;t auch die Verweise mit ein. Sie k&ouml;nnen diese schlicht nicht mehr zur Laufzeit anpassen, auch wenn die <b>References<\/b>-Auslistung dies normalerweise zul&auml;sst.<\/p>\n<p>Es geht aber noch weiter: Sie k&ouml;nnen eine .mdb\/.accdb-Datenbank mit einem Verweis auf eine .mdb\/.accdb-Bibliothek auch nicht in eine .mde\/.accde-Datenbank umwandeln. Um dies zu tun, m&uuml;ssen auch alle per Verweis eingebundenen Bibliotheksdatenbanken als .mde\/.accde-Datenbank vorliegen.<\/p>\n<p>Wenn Sie mit einer solchen Konfiguration arbeiten, ist der Pfad zur verwendeten Codebibliothek nat&uuml;rlich fix in der .mde\/.accde-Datenbank verankert. Das bedeutet, dass die Codebibliothek eigentlich immer im gleichen Verzeichnis landen muss &#8211; auch, wenn Sie die Datenbanken an anderen Arbeitspl&auml;tzen installieren wollen. Das ist grunds&auml;tzlich zwar m&ouml;glich, in der Praxis aber schwer umzusetzen.<\/p>\n<p>Gl&uuml;cklicherweise gibt Access nicht gleich auf, wenn es eine referenzierte Datenbank nicht im angegebenen Verzeichnis findet. Stattdessen durchsucht es weitere Speicherorte, zum Beispiel das Verzeichnis, in dem sich die Datenbank mit dem Verweis auf die Bibliothek selbst befindet.<\/p>\n<p>Das bedeutet, dass Sie die Bibliotheksdatenbanken bei Verwendung von .mde\/.accde-Datenbanken optimalerweise im gleichen Verzeichnis ablegen &#8211; dies gilt nat&uuml;rlich auch f&uuml;r .mdb\/.accdb-Datenbanken.<\/p>\n<p>Es gibt noch eine kuriose Konstellation: Wenn Sie beide Datenbanken in Verzeichnissen unterbringen, die wiederum in einem Verzeichnis liegen, findet die Anwendung die Bibliothek auch automatisch wieder.<\/p>\n<p>Dies sieht schematisch etwa so aus:<\/p>\n<pre>c:\\\r\n    Programme\r\n        Anwendung\r\n            DBMitVerweis.mdb\r\n        Bibliotheken\r\n            Bibliothek.mdb<\/pre>\n<p>Sie k&ouml;nnen die beiden Verzeichnisse Anwendung und Bibliotheken nun gemeinsam verschieben, wohin Sie m&ouml;chten &#8211; <b>DBMitVerweis.mdb <\/b>findet <b>Bibliothek.mdb <\/b>immer wieder. Vielleicht ist dies ein von Microsoft gewolltes und verstecktes Feature &#8211; dokumentiert ist es jedenfalls nicht.<\/p>\n<p>Der Nutzen ist jedoch da: Wenn Sie beispielsweise eine ganze Reihe verschiedener Bibliotheken f&uuml;r verschiedene Zwecke in einem Verzeichnis speichern und die Anwendungen, die auf diese Bibliotheken zugreifen, in parallelen Verzeichnissen, brauchen Sie sich um die Integrit&auml;t der Verweise keine Sorgen mehr zu machen. Zumindest dann nicht, wenn die einzelnen Verzeichnisse immer im gleichen Hauptverzeichnis liegen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit den hier vorgestellten Techniken k&ouml;nnen Sie komplette Module und Klassen in Bibliotheken auslagern. In einem weiteren Beitrag zu diesem Thema gehen wir auf die praktischen M&ouml;glichkeiten ein.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Bibliotheken.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{464E79C6-173F-421D-A10B-36454D1F453A}\/aiu_761.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer bereits eine Reihe von Projekte durchgef&uuml;hrt hat, verf&uuml;gt in der Regel &uuml;ber einen Fundus immer wiederkehrender Elemente wie Prozeduren, Module oder Klassen. Diese kopiert man dann von bestehenden in neue Datenbanken und kann so getestete, funktionierende Elemente weiternutzen. Aber was ist, wenn man in einer Datenbank Fehler an einem solchen Element findet und behebt oder das Element gar weiterentwickelt Wie gew&auml;hrleistet man, dass die &uuml;brigen Anwendungen, die dieses Element verwenden, auch davon profitieren Dies gelingt zum Beispiel durch den Einsatz von Code-Bibliotheken. Wie dieser in der Praxis aussieht, erfahren Sie in diesem Beitrag.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012011,662011,44000025],"tags":[],"class_list":["post-55000761","post","type-post","status-publish","format-standard","hentry","category-66012011","category-662011","category-VBA_und_Programmiertechniken"],"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>Code-Bibliotheken - 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\/CodeBibliotheken\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Code-Bibliotheken\" \/>\n<meta property=\"og:description\" content=\"Wer bereits eine Reihe von Projekte durchgef&uuml;hrt hat, verf&uuml;gt in der Regel &uuml;ber einen Fundus immer wiederkehrender Elemente wie Prozeduren, Module oder Klassen. Diese kopiert man dann von bestehenden in neue Datenbanken und kann so getestete, funktionierende Elemente weiternutzen. Aber was ist, wenn man in einer Datenbank Fehler an einem solchen Element findet und behebt oder das Element gar weiterentwickelt Wie gew&auml;hrleistet man, dass die &uuml;brigen Anwendungen, die dieses Element verwenden, auch davon profitieren Dies gelingt zum Beispiel durch den Einsatz von Code-Bibliotheken. Wie dieser in der Praxis aussieht, erfahren Sie in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:01:30+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/6a89e4e157d743d39ddc5b49ab0cc65a\" \/>\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=\"12\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Code-Bibliotheken\",\"datePublished\":\"2020-05-22T22:01:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/\"},\"wordCount\":2243,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6a89e4e157d743d39ddc5b49ab0cc65a\",\"articleSection\":[\"1\\\/2011\",\"2011\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/\",\"name\":\"Code-Bibliotheken - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6a89e4e157d743d39ddc5b49ab0cc65a\",\"datePublished\":\"2020-05-22T22:01:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6a89e4e157d743d39ddc5b49ab0cc65a\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/6a89e4e157d743d39ddc5b49ab0cc65a\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/CodeBibliotheken\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Code-Bibliotheken\"}]},{\"@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":"Code-Bibliotheken - 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\/CodeBibliotheken\/","og_locale":"de_DE","og_type":"article","og_title":"Code-Bibliotheken","og_description":"Wer bereits eine Reihe von Projekte durchgef&uuml;hrt hat, verf&uuml;gt in der Regel &uuml;ber einen Fundus immer wiederkehrender Elemente wie Prozeduren, Module oder Klassen. Diese kopiert man dann von bestehenden in neue Datenbanken und kann so getestete, funktionierende Elemente weiternutzen. Aber was ist, wenn man in einer Datenbank Fehler an einem solchen Element findet und behebt oder das Element gar weiterentwickelt Wie gew&auml;hrleistet man, dass die &uuml;brigen Anwendungen, die dieses Element verwenden, auch davon profitieren Dies gelingt zum Beispiel durch den Einsatz von Code-Bibliotheken. Wie dieser in der Praxis aussieht, erfahren Sie in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:01:30+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/6a89e4e157d743d39ddc5b49ab0cc65a","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Code-Bibliotheken","datePublished":"2020-05-22T22:01:30+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/"},"wordCount":2243,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/6a89e4e157d743d39ddc5b49ab0cc65a","articleSection":["1\/2011","2011","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/","url":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/","name":"Code-Bibliotheken - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/6a89e4e157d743d39ddc5b49ab0cc65a","datePublished":"2020-05-22T22:01:30+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/6a89e4e157d743d39ddc5b49ab0cc65a","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/6a89e4e157d743d39ddc5b49ab0cc65a"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/CodeBibliotheken\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Code-Bibliotheken"}]},{"@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\/55000761","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=55000761"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000761\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}