Spezifikationen nutzen

15.02.2006 von Lorenz  Hölscher
Wenn Sie regelmäßig externe Daten in eine Access-Datenbank importieren, empfiehlt es sich, eine passende Spezifikation zu nutzen. Von Spezifikationen haben Sie noch nie gehört? Kein Wunder, bemüht sich Access doch nach Kräften, sie gut vor Ihnen zu verstecken.

Es beginnt typischerweise damit, dass Sie eine Textdatei importieren wollen. Nach Angabe des Dateityps und -namens startet der Textimport- Assistent. Diesem können Sie nun in allen Details erklären, welche Trennzeichen in der Datei enthalten sind, welche Datentypen in welchem Feld stehen und so weiter. Oder Sie haben alle diese Informationen in einer Spezifikation gespeichert, anstatt sie jedes Mal neu eintippen zu müssen.

Gut versteckt

Unverständlicherweise führt der Weg zu dieser Erleichterung über die Schaltfläche mit der völlig belanglosen Beschriftung Weitere. Sie ist sowieso nur für Textdatei-Importe sichtbar, beim Import einer Excel-Datei beispielsweise kennt ja jede Zelle selber ein Format.

Auch beim Export einer Tabelle oder Abfrage in das Textformat haben Sie Zugriff auf den Assistenten mit dieser Schaltfläche nur, wenn die unformatierte Ausgabe gewählt wird.

Spezifikation erstellen

Da eine Spezifikation nur Sinn macht, wenn gleich formatierte Dateien regelmäßig importiert werden, lässt sie sich am einfachsten anhand eines Beispielimports erstellen.

Nach der Auswahl der Textdatei via Datei Externe Daten Importieren geben Sie in allen Schritten des Assistenten die Einstellungen zu Trennzeichen, Datentyp, Spaltenauswahl und Ähnlichem an. Erst im letzten Schritt klicken Sie nicht auf Fertigstellen, sondern auf Weitere und sehen einen Dialog wie in Bild 1. Er enthält jetzt alle eben getroffenen Einstellungen, für die Feldinformationen sogar übersichtlicher als im Assistenten. Hier sind noch weitere Änderungen möglich.

Bild 1: Dialog für Import-Spezifikationen.

Vor allem lassen sich, etwa für Datum und Spracheinstellungen, Einstellungen vornehmen, die im eigentlichen Assistenten fehlen. Mit Speichern werden Sie nach einem Namen für diese Spezifikation gefragt. Die Liste aller vorhandenen Spezifikationen findet sich nach Klick auf Spezifikationen.

Makro für Import

So weit ist das schon eine erhebliche Erleichterung für den häufigen Import immer gleicher Dateien. Aber gerade dann werden Sie sich sehr wahrscheinlich ein Makro einrichten. Das ist auch noch erfreulich einfach, wenn Sie die entsprechende Aktion TransferText gefunden haben und ein Makro wie etwa in Bild 2 dafür schreiben.

Bild 2: Makro zum Import einer Textdatei.

Was aber ist, wenn die Datei jeden Monat ihren Namen wechselt? Wenn verschiedene Nutzer importieren sollen, können Sie denen kaum zumuten, immer wieder einen bestimmten Dateinamen sicherzustellen.

VBA-Code statt Makro

Sie können nämlich nicht einfach das Makro-Argument Dateiname leer lassen, damit Access bei der Ausführung den Dateinamen erfragt. Um hier mehr Flexibilität zu erlangen, müssen Sie das Makro in VBA-Code verwandeln.

Das geht immerhin automatisch, indem Sie den Makro-Entwurf öffnen und unter Datei Speichern unter die Auswahl Als Modul treffen. Danach können Sie noch angeben, ob Sie eventuelle Kommentare im Makro übernehmen oder eine VBA-Fehlerbehandlung neu einfügen wollen. In Listing 1 sehen Sie das Ergebnis des konvertierten Makros als VBA-Code.

Function macImport01()
On Error GoTo macImport01_Err
DoCmd.TransferText acImportDelim, _
"TblPersonen_01 Importspezifikation", "Tabelle1", _
"C:\Daten\tblPersonen_01.txt", _
True, "", 1250
macImport01_Exit:
Exit Function
macImport01_Err:
MsgBox Error$
Resume macImport01_Exit
End Function

Fehlerbehandlung weglassen

Die Fehlerbehandlung ist völlig überflüssig, weil sie erstens Objekte aus der Access-Frühzeit einsetzt wie Error$, dessen modernes Pendant aber seit Access 97 die Eigenschaft eines Objekts ist und vernünftigerweise Err.Description heißt.

Zweitens beschränkt sich diese Fehlerbehandlung darauf, die Beschreibung des Fehlers anzuzeigen. Dasselbe haben Sie allerdings auch, wenn Sie gar keine Fehlerbehandlung vornehmen, außerdem steht Ihnen dann sogar noch ein Debuggen- Button zu Verfügung, der Sie zur fehlerhaften Codezeile hinführt. Auch dieser Vorteil wäre verloren. In Listing 2 sehen Sie, wie Sie den VBA-Code erst einmal auf die einzig notwendige Zeile kürzen.

Function Import01()
DoCmd.TransferText acImportDelim, _
"TblPersonen_01 Importspezifikation", "Tabelle1", _
"C:\Daten\tblPersonen_01.txt", _
True, "", 1250
End Function

Dateiauswahl anzeigen

Da bei regelmäßigem Import davon auszugehen ist, dass die Dateien immer wieder im gleichen Verzeichnis stehen, wäre es am einfachsten, dem Benutzer eine Liste aller vorgefundenen Textdateien direkt anzubieten. Um diese Dateiauswahl brauchbar anzeigen zu können, erstellen Sie ein Formular mit zwei Listboxen.

Mit dem Code aus Listing 3 können Sie aus diesem vorgegebenen Verzeichnis alle Textdateien in der linken Listbox lstDateien anzeigen lassen. Das ist praktisch, damit der Benutzer sich nicht erst durch Verzeichnisbäume hindurchsuchen muss

Bild 3: Abfrage zum Ermitteln der Spezifikationsnamen.

Option Compare Database
Option Explicit
Private Sub btnAbbrechen_Click()
DoCmd.Close
End Sub
Private Sub btnImportieren_Click()
DoCmd.TransferText acImportDelim, _
lstSpezifikationen.Value, "Tabelle1", _
"C:\Daten\" & lstDateien.Value, True
End Sub
Private Sub Form_Load()
Dim strDatei As String
strDatei = Dir("C:\Daten\*.txt")
Do Until strDatei = ""
lstDateien.AddItem strDatei
strDatei = Dir()
Loop
End Sub.

Spezifikationen ermitteln

Jetzt müssen Sie nur noch in der zweiten Listbox lstSpezifikationen alle Spezifikationsnamen dieser Datenbank anzeigen, damit der Benutzer eventuell eine passende auswählt.

Aber woher nehmen? Irgendwie scheinen beim Access-Design die Spezifikationen so spät hinzugebastelt worden zu sein, dass es keine Auflistung dazu gibt, weder eine direkte Auflistung noch ein VBA-Objekt, welches die Spezifikationen enthält. Also müssen wir auf die Interna von Access zurückgreifen.

Da Access alle Inhalte einer Datenbank jeweils vollständig in den MSys-Tabellen gespeichert hat, ist nur eine kurze Suche notwendig, um die Spezifikationsnamen in MSysIMEXSpecs wieder zu erkennen. Diese Tabelle kriegen Sie natürlich nur zu Gesicht, wenn Sie in Extras/Optionen/Ansicht die Systemtabellen anzeigen lassen. Aber dann können Sie eine Abfrage wie in Bild 4 erstellen, welche diese Liste anzeigt. Diese Abfrage lässt sich dann als Datenquelle für die lstSpezifikationen- Listbox im Formular einsetzen.

Spezifikationsname prüfen

Häufig wird es zu genau einer Datei immer genau eine ähnlich benannte Spezifikation geben. Sie können also beim Import nach Auswahl des Dateinamens immer direkt die passende Spezifikation im Code angeben.

Allerdings sollten Sie sicherheitshalber dabei prüfen, ob nicht ein neuer Dateiname noch ohne zugehörige Spezifikation ist. Dazu eignet sich die Funktion aus Listing 4, welche direkt auf die MSysIMEXSpecs-Tabelle zugreift. Dabei ist es unerheblich, ob Sie die Systemtabellen wieder ausgeblendet haben, denn sowohl die Abfrage als auch die Funktion kann trotzdem darauf zugreifen.

Function IstSpezifikationDa(strName As String) As Boolean
IstSpezifikationDa = (DCount("*", "MSysIMEXSpecs", _
"[SpecName] = '" & strName & "'") > 0)
End Function