Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
CSV-Verknüpfungen pflegen
Wenn Sie Dateien im .csv-Format in Ihre Datenbank eingebunden haben, kommt es gelegentlich vor, dass diese verschoben, umbenannt oder gelöscht werden. Dieser Beitrag zeigt nicht nur, wie Sie .csv-Dateien per VBA einbinden können, sondern auch, wie Sie erkennen, ob die Dateien noch an Ort und Stelle sind und diese gegebenenfalls mithilfe des Benutzers wieder einbinden.
Als Beispiel-Datei zum Verknüpfen verwenden wir einfach eine im .csv-Format exportierte Tabelle der Südsturm-Datenbank, in diesem Fall tblArtikel. Dazu nutzen wir den Export-Assistenten, den Sie über den Ribbon-Eintrag Externe Daten|Exportieren|Textdatei aufrufen. Hier stellen Sie beispielsweise ein, dass die Datei mit Spaltenüberschriften gespeichert werden soll. Außerdem öffnen Sie mit einem Klick auf die Schaltfläche Erweitert... den Dialog mit den Exportspezifikationen.
Speichern Sie diese per Mausklick auf die Schaltfläche Speichern unter... und geben Sie im Dialog Import/Export-Spezifikation speichern den Namen tblArtikel_CSV ein (s. Bild 1).
Bild 1: Export der Beispieltabelle, die später verknüpft werden sollNun wollen wir eine Verknüpfung zu der soeben in eine CSV-Datei exportierten Tabelle mit dem dafür vorgesehenen Assistenten erstellen (Ribbon-Eintrag Externe Daten|Importieren und Verknüpfen|Textdatei). Egal, ob wir dies mit Access 2013 oder 2016 erledigen wollten: Es gab immer eine Fehlermeldung wie die aus Bild 2.
Bild 2: Fehlermeldung beim Versuch, eine Verknüpfung zu erstellenDiese erscheint auch unabhängig davon, ob wir beim Verknüpfen die Textdateispezifikation auswählen oder nicht. In beiden Fällen legte Access jedoch die Verknüpfung in der Liste der Tabellen an (s. Bild 3).
Bild 3: Access erstellt die Verknüpfungen trotz Fehlermeldung.Wenn Sie keine Textdateispezifikation auswählen, liefert Access jedoch noch zusätzlich die Fehlermeldung aus Bild 4. Anscheinend sucht Access hier nach der Textdateispezifikation, deren Name standardmäßig beim Anlegen einer solchen vorgeschlagen wird – diese ist aber nicht in der Datenbank gespeichert (die Textdateispezfikationen finden Sie übrigens in den Systemtabellen MSysIMEXSpecs und MSysIMEXColumns).
Bild 4: Fehlermeldung wegen einer fehlenden Textdateispezifikation
In einer weiteren Systemtabelle namens MSysObjects entdecken wir, dass auch beim Verknüpfen ohne Textdateispezifikation eine solche angegeben wird – in diesem Fall als Wert der Eigenschaft DSN mit dem Wert TblArtikel Verknüpfungsspezifikation (s. Bild 5).
Bild 5: Die Importspezifikation wird in der Systemtabelle MSysObjects als Teil der Connect-Zeichenfolge angegeben.Es scheint sich hier also um einen Fehler des Import-Assistenten zu handeln. Das ist aber kein Problem, denn wir streben ja in diesem Beitrag ohnehin eine VBA-gesteuerte Methode zum Verknüpfen der CSV-Dateien an.
Verschieben der CSV-Datei
Wenn Sie nun einmal die CSV-Datei verschieben und die darauf basierende Verknüpfung öffnen möchten, findet Access die angegebene Datei natürlich nicht mehr und gibt eine entsprechende Fehlermeldung aus. Es gibt auch keine einfache Möglichkeit, den Speicherort der verknüpften Datei an die veränderten Gegebenheiten anzupassen – Sie müssen die Verknüpfung erneuern.
Dazu können Sie diese entweder löschen und komplett neu erstellen oder Sie nutzen den Tabellenverknüpfungs-Manager. Diesen öffnen Sie über den Ribbon-Eintrag Externe Daten|Importieren und Verknüpfen|Verknüpfungs-Manager. Hier wählen Sie die zu aktualisierende Verknüpfung aus (s. Bild 6).
Bild 6: Der Tabellenverknüpfungs-ManagerNach einem Klick auf die Schaltfläche OK bietet Access mit einem Datei auswählen-Dialog die Möglichkeit, die Quelldatei der Verknüpfung erneut auszuwählen (s. Bild 7). Nach einer Erfolgsmeldung können Sie nun wieder auf die aktualisierte Verknüpfung zugreifen.
Bild 7: Auswahl des neuen Speicherorts der Quelldatei einer VerknüpfungDies funktioniert übrigens nur, wenn sich der Speicherort der Datei geändert hat. Sollten Sie den Dateinamen oder die Dateiendung angepasst haben, können Sie mit der bereits angelegten Verknüpfung nicht mehr auf diese Datei zugreifen – der Dateiname ist fest verankert, lediglich der Pfad ist änderbar.
Übrigens: Die Option Immer zur Eingabe eines neuen Speicherort auffordern im Tabellenverknüpfungs-Manager ist etwas ungeschickt benannt: Man könnte meinen, dass bei folgenden Problemen, die durch das Fehlen der Datei am angegebenen Ort auftreten, direkt ein Datei auswählen-Dialog erscheint.
Das ist aber nicht so: Die Option ist vielmehr so gemeint, dass Sie, wenn Sie mehr als eine Verknüpfung aktualisieren wollen, für jede einzelne den Speicherort angeben müssen.
Wie auch immer: Sie möchten die Verknüpfung, wenn Sie beispielsweise abwechselnd an Ihrem Arbeitsplatz oder am heimischen Rechner eine Anwendung entwickeln, nicht immer manuell aktualisieren. Das Gleiche gilt natürlich für den Kunden, der meist originelle Ideen hat, um den Speicherort der verknüpften Dateien zu variieren.
Außerdem wollen wir so flexibel sein, auch einmal eine Datei mit einer anderen Bezeichnung als beim erstmaligen Erstellen der Verknüpfung angegeben zu verwenden. Also prüfen wir nun die Möglichkeiten, die Verknüpfung möglichst automatisch zu aktualisieren.
Verknüpfung per VBA herstellen
Nun schauen wir uns an, wie wir die Verknüpfung per VBA herstellen und ob auch hier die Probleme mit der Textdateispezifikation auftreten. Dazu nutzen wir den VBA-Befehl DoCmd.TransferText.
Der erste Aufruf sieht wie folgt aus:
DoCmd.TransferText acLinkDelim, , "tblArtikel_CSV_VBA", CurrentProject.Path & " blArtikel.csv", True
Die Parameter haben dabei die folgenden Bedeutung:
- TransferType: Der Wert acLinkDelim legt fest, dass eine Verknüpfung einer Textdatei mit einem festgelegten Delimiter zum Einsatz kommt.
- SpecificationName: Bleibt im ersten Anlauf leer, da wir zunächst keine Textdateispezifikation verwenden möchten.
- TableName: Legt den Namen der Tabelle fest, hier "tblArtikel_CSV_VBA"
- FileName: Gibt den Dateinamen der zu verknüpfenden Datei an, in diesem Fall mit CurrentProject.Path & " blArtikel.csv" die Datei tblArtikel.csv im Verzeichnis der Datenbankdatei.
- HasFieldNames: Legt mit dem Wert True fest, dass die erste Zeile beim Verknüpfen als Spaltenüberschriften interpretiert wird und nicht als Werte.
Das Ergebnis in der Tabelle MSysObjects sieht zunächst gut aus: Hier finden wir nun keine Angabe einer Textdateispezifikation mehr unter dem Wert DSN des Feldes Connect vor:
Text;DSN=;FMT=Delimited;HDR=YES;IMEX=2;ACCDB=YES;
Dummerweise wirkt sich dies negativ auf die Erstellung der Verknüpfung aus. Wenn Sie den neuen Eintrag tblArtikel_CSV_VBA per Doppelklick öffnen, erscheint zwar keine Fehlermeldung, aber die angezeigte Tabelle liefert nur die erste Spalte mit den Werten des Feldes ArtikelID (s. Bild 8) – und diese auch noch jeweils mit abschließendem Semikolon.
Bild 8: Das Ergebnis eines Imports ohne TextdateispezifikationEs sieht also so aus, als ob wir doch eine Textdateispezifikation angeben müssen. Da die Methode TransferText aber einen Parameter zur Übergabe des Namens einer solchen anbietet, probieren wir dies gleich einmal aus:
DoCmd.TransferText acLinkDelim, "tblArtikel_CSV", "tblArtikel_CSV_VBA_MitSpezifikation", CurrentProject.Path & " blArtikel.txt", True
Diese Variante gelingt auf Anhieb – die Verknüpfung landet unter dem Namen tblArtikel_CSV_VBA_MitSpezifikation im Navigationsbereich der Datenbank. Wir können die Arbeit, die wir vorher manuell durch Durchlaufen des Assistenten erledigt haben, auch per VBA ausführen. Mit einem Unterschied: Die Textdateispezifikation müssen wir zunächst einmal mit dem Assistenten erstellen.
Verknüpfung per VBA aktualisieren
Was geschieht nun mit der Verknüpfung, wenn wir diese erneut mit dem gleichen VBA-Befehl anlegen? In diesem Fall erstellt die Methode die gleiche Verknüpfung nochmals, aber behält die bereits vorhandene Verknüpfung bei. Dazu ändert sie die Bezeichnung des neuen Exemplars, indem sie hinten eine laufende Nummer anhängt (also etwa tblArtikel_CSV_VBA_MitSpezifikation1).
Wenn wir die Verknüpfung aktualisieren wollen, weil diese nicht mehr aktuell ist, sollten wir also die bestehende Verknüpfung zuvor löschen, damit die neue wieder mit dem gewünschten Namen angelegt wird.
Dazu sollten wir zunächst prüfen, ob die Verknüpfung noch funktioniert. Dies gelingt per VBA, indem wir ein Recordset auf Basis dieser Verknüpfung erstellen. Sollte die zugrunde liegende Datei nicht mehr vorhanden sein, löst dies einen Fehler aus. In diesem Fall wollen wir erstens die Verknüpfung löschen und zweitens per Datei auswählen-Dialog den neuen Speicherort der Verknüpfung abfragen.
Die Verknüpfung erstellen wir dann wie bereits weiter oben beschrieben neu. In diesem Fall ist es uns dann auch möglich, nicht nur ein anderes Dateiverzeichnis, sondern auch einen anderen Dateinamen anzugeben. Beim Wechseln des Verzeichnisses über den Tabellenverknüpfungs-Manager war das ja nicht möglich.
Schauen wir uns nun an, wie Sie die Verknüpfung per VBA wiederherstellen können.
Testfälle
Wenn man eine solche Funktion wie die nachfolgend vorgestellte programmieren möchte, testet man normalerweise die verschiedenen Konstellationen. Dabei ist es natürlich mühselig, immer wieder die Konstellation herzustellen und dann die Funktion mit den gewünschten Parametern aufzurufen, um dann die Ergebnisse und Rückgabewerte mit den erwarteten Werten abzugleichen.
Etwas mehr Arbeit zu Beginn, aber wesentlich schnellere Tests erhalten Sie, wenn Sie die Tests automatisieren. Dazu braucht man gar nicht unbedingt ein spezielles Framework, wie es beispielsweise beim Unit-Testing verwendet wird, sondern man kann auch einfach ein paar kleine Prozeduren schreiben, welche die Ausgangssituation herstellen, die Funktionen testen und dann die hervorgerufene Situation und die Rückgabewerte der Funktion testen.
In unserem Fall wollen wir die folgenden Konstellationen testen:
- Die Verknüpfung ist noch gar nicht vorhanden (Verknüpfung löschen, danach prüfen, ob die Verknüpfung vorhanden und funktionstüchtig ist und ob die Funktion VerknüpfungAktualisieren den Wert True zurückliefert).
- Die Verknüpfung ist vorhanden, aber die verknüpfte Datei fehlt (Datei löschen oder umbenennen, danach prüfen, ob die Verknüpfung funktioniert und die Funktion den Wert True zurückliefert).
- Die angegebene Importspezifikation fehlt (Funktion soll abbrechen und den Wert False zurückliefern).
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.