Access: schema.ini
Die schema.ini ist ja eigentlich eine geniale Erfindung im Zusammenhang mit dem Import und Export von und nach Access. Die schema.ini bietet wesentlich mehr Möglichkeiten, als eine Import- oder Exportspezifikation.
Leider gibt es aber auch ein paar Haken bei der Benutzung der schema.ini:
- Es gibt keine gute und vollständige Dokumentation.
- Die von Access generierten Fehlermeldungen im Zusammenhang mit der schema.ini sind irreführend.
- Die schema.ini eignet sich nur bedingt bei wechselnden Dateinamen.
- Die schema.ini muss immer in dem Verzeichnis stehen, in dem auch die zu importierende oder exportierende Datei steht (das bereitet vor allem dann Probleme, wenn der Import aus einem schreibgeschützten Bereich erfolgen soll )
So sieht eine kleine schema.ini aus, die ich für eine Exportfunktion nutze:
[Daten.csv]
ColNameHeader=True
Format=Delimited(;)
TextDelimiter=none
DateTimeFormat=dd.mm.yyyy
Col1=Marktbezeichnung Char
Col2=WHG Char
Col3=LFZ Integer
Col4=AbweichLimitAbs Double
Col5="Datum Gültig ab" date
Col6="Datum Gültig bis" date
[schema.ini]
ColNameHeader=True
Format=Delimited(;)
TextDelimiter=none
MaxScanRows=0
CharacterSet=ANSI
DecimalSymbol=,
Und so kann der Export-Makro aussehen:
Sub Export_Daten()
Tabelle = "Tab_name" 'Name der Tabelle oder Abfrage
Datei = "Daten.csv" 'Name der Zieldatei
Pfad = "C:\daten\"
DoCmd.TransferText acExportDelim, "", Tabelle, Pfad & Datei, True, ""
'DoCmd.TransferText acExportDelim, "", Tabelle, ZielPfadDatei, HatFeldNamen?, ""
End Sub
Wie man sieht, ist der Dateiname in der schema.ini fest definiert. Auch die Spalten sind in der Datei fest hinterlegt und hier lauert auch schon die erste Fehlerquelle: Stimmen Dateiname oder Feldname nicht überein, führt das zu Fehlern.
Ein falscher Dateiname führt nicht zu einer Fehlermeldung, sodern führt dazu, dass die Schema.ini ignoriert wird (zumindest aber die Einträge unter dem Dateinamen). Der Export sieht dann natürlich ganz anders als erwartet aus.
Ein falscher Feldname führt zwar zu einer Fehlermeldung, jedoch ist diese nicht sprechend – im Gegenteil sie führt einen komplett in die Irre:
Laufzeitfehler 3011: Das Microsoft Jet-Datenbankmodul konnte das Objekt nicht finden? Also die Fehlermeldung kann man getrost vergessen.
Man muss vielmehr schauen, dass die Spalten-Namen in Access mit denen in der schema.ini exakt übereinstimmen. Tun sie das, tritt die Fehlermeldung auch nicht mehr auf. Ich habe mir -dank dieser Fehlermeldung- einen Wolf gesucht; an allem gezweifelt nur nicht am Sinn der Fehlermeldung.
Das Problem von wechselnden Dateinamen kann man nur in den Griff bekommen, wenn man die schema.ini mittels Makro erzeugt oder aber zumindest verändert und auf den entsprechenden Dateinamen anpasst (dazu gibt es später vielleicht ein Beispiel).
Das Problem des fehlenden Zugriffs auf das Verzeichnis, aus dem gelesen werden soll, kann nicht direkt mit einer schema.ini gelöst werden. Natürlich kann man sich eine schema.ini erstellen und diese dann per Makro in eine Importspezifikaiton wandeln, aber dann kann man auch gleich eine Importspezifikation erstellen...
Schreib was...