Import/Export-Spezifikationen im Griff

Wer oft Daten importiert oder exportiert, wird dies in vielen Fällen mit den entsprechenden Assistenten und den damit erzeugten Spezifikationen erledigen. Falls nicht, erhalten Sie in diesem Beitrag eine kurze Einführung in die notwendigen Schritte. Außerdem erfahren Sie, wo Access die Spezifikationen speichert und wie Sie diese ganz schnell ändern, ohne extra den Assistenten dafür öffnen zu müssen.

Wenn Sie etwa unter Access 2007/2010 einen Export mit dem Assistenten durchführen möchten, finden Sie alles Notwendige im Ribbon-Tab Externe Daten (unter Access 2003 und älter verwenden Sie zum Importieren den Menüeintrag Datei|Externe Daten|Importieren beziehungsweise Verknüpfen und zum Exportieren den Kontextmenüeintrag Exportieren des jeweiligen Objekts im Datenbankfenster). Im Ribbon-Tab Externe Daten klicken Sie einfach auf das gewünschte Ziel beziehungsweise die Quelle (s. Bild 1) und starten so den Assistenten. Nach dem Auswählen der Quell-/Zieldatei sieht der Assistenten dann in allen Access-Versionen des neuen Jahrtausends ähnlich aus.

pic001.png

Bild 1: Aufruf von Import- und Export-Funktionen unter Access 2010

Der Export erfordert einige Vorbereitung: Wenn nicht alle Felder und alle Datensätze einer Tabelle in die Zieldatei, etwa eine Excel-Tabelle, geschrieben werden sollen, müssen Sie eine entsprechende Abfrage erstellen, welche nur die gewünschten Felder aufnimmt und gegebenenfalls die Datensätze durch entsprechende Kriterien einschränkt.

Dafür lässt sich der Assistent anschließend in zwei Schritten abfertigen: Er fragt nur, ob die Datenspalten durch Trennzeichen oder eine fixe Spaltenbreite voneinander getrennt werden sollen und welches Trennzeichen gegebenenfalls verwendet werden soll. Außerdem möchte er wissen, ob die Feldnamen als Spaltenköpfe mitexportiert werden sollen und ob die einzelnen Werte etwa in Anführungszeichen eingefasst werden sollen.

Beim Importieren etwa aus einer Textdatei ist der Assistent naturgemäß etwas neugieriger: Er fragt auch zunächst, ob die Daten in festen Spalten vorliegen oder durch ein Begrenzungszeichen voneinander getrennt sind (s. Bild 5).

pic002.png

Bild 2: Soll mit oder ohne Trennzeichen importiert/exportiert werden

pic003.png

Bild 3: Welches Trennzeichen wird verwendet, welches Textbegrenzungszeichen und wie sieht es mit der ersten Zeile aus

pic004.png

Bild 4: Festlegen von Feldern und Datentypen

pic005.png

Bild 5: Auswählen eines Primärschlüsselfeldes, falls gewünscht

Spezifikationen speichern

Es wird gern übersehen, ist aber enorm wichtig: der Dialog, der sich durch einen Mausklick auf die Schaltfläche Erweitert öffnet (s. Bild 6). Hier finden Sie nämlich nicht nur eine Zusammenfassung der vorgenommenen Einstellungen, sondern auch noch die Möglichkeit, die Einstellungen zu speichern. Dazu klicken Sie auf die Schaltfläche Speichern unter … und geben im folgenden Dialog den Namen der zu speichernden Spezifikation an.

pic006.png

Bild 6: Übersicht und weitere Optionen

Damit schaffen Sie die Voraussetzung für die folgenden Aktionen:

  • Sie können einen Import oder Export auf Basis der gespeicherten Spezifikation mit einer einfachen VBA-Anweisung aufrufen.
  • Sie können änderungen an der Spezifikation durchführen, indem Sie den Assistenten erneut starten, gleich mit einem Klick auf Spezifikationen… den Dialog Import/Export-Spezifikationen öffnen und dort die gewünschte Spezifikation auswählen. Sie können die Spezifikation dann ändern und unter dem gleichen oder einem anderen Namen sichern.

Import/Export per VBA

Für den Import/Export per VBA gibt es ein paar Methoden des DoCmd-Objekts, zum Beispiel DoCmd.TransferSpreadsheet für Excel-Tabellen oder DoCmd.TransferText für Textdateien.

Wenn Sie beispielsweise den Inhalt der Tabelle tblKategorien in einer Textdatei speichern möchten und dazu bereits eine Export-Spezifikation unter dem Namen Kategorien Exportspezifikation erstellt haben, können Sie dies mit der folgenden Anweisung erledigen:

DoCmd.TransferText acExportDelim, "Kategorien Exportspezifikation", "tblKategorien", CurrentProject.Path & "\Kategorien.txt", True

Der erste Parameter gibt dabei die Export/Import-Art an, der zweite den Namen der Spezifikation, der dritte die Quelltabelle und der vierte die Zieldatenbank.

Der letzte Parameter bestimmt, ob die Feldnamen beim Export in die erste Zeile geschrieben werden sollen.

Auf ähnliche Weise gehen Sie auch beim Importieren von Daten vor – Sie müssen lediglich eine entsprechende Spezifikation anlegen und als ersten Parameter eine der acImport…-Konstanten angeben.

Umständliches Anpassen der Spezifikationen

Wenn Sie eine Spezifikation einmal ändern müssen, weil Sie beispielsweise einen Import mit vielen Feldern erstellt und beim Testen festgestellt haben, dass der Import noch nicht richtig funktioniert, müssen Sie theoretisch jedes Mal erneut den Assistenten öffnen und die Spezifikation laden, ändern und erneut speichern. Das ist sehr unpraktisch, denn der Assistent fragt beispielsweise jedes Mal erneut den Namen der zu importierenden Datei ab. Dabei müssen Sie auch immer wieder zum entsprechenden Quellverzeichnis navigieren, um die Datei auszuwählen, was mit der Zeit nervt.

Zum Glück gibt es noch eine Alternative, die in den folgenden Abschnitten vorgestellt wird.

Speicherort der Spezifikationen

Die Daten einer Spezifikation werden günstigerweise an einer leicht erreichbaren Stelle gespeichert – nämlich in zwei als Systemtabellen markierten Tabellen:

  • MSysIMEXSpecs speichert die allgemeinen Daten einer Spezifikation (Bild 6) und
  • MSysIMEXColumns enthält die Informationen zu den einzelnen Feldern (siehe Bild 8).

pic007.png

Bild 7: Entwurf der Tabelle MSysIMEXSpecs

pic008.png

Bild 8: Entwurf der Tabelle MSysIMEXColumns

Sollten die Tabellen bei Ihnen nicht sichtbar sein, kann dies zwei Ursachen haben:

  • Sie haben noch keine Spezifikation gespeichert. Die Tabellen werden erst erstellt, wenn Sie mindestens eine Spezifikation gespeichert haben.
  • Die Access-Optionen sind so eingestellt, dass keine Systemtabellen angezeigt werden. In diesem Fall aktivieren Sie die Anzeige der Systemobjekte. Unter Access 2003 und älter zeigen Sie die Optionen mit Extras|Optionen an, die gesuchte Option Systemobjekte befindet sich unter Ansicht|Anzeigen, unter Access 2007 und jünger klicken Sie mit der rechten Maustaste auf die Titelzeile des Navigationsbereichs und wählen aus dem Kontextmenü den Eintrag Navigationsoptionen… aus – die Option Systemobjekte anzeigen befindet sich unten links.

Spezifikationen bearbeiten

Unter Access 2007 und jünger können Sie die beiden Tabellen MSysIMEXSpecs und MSysIMEXColumns direkt bearbeiten. Sie können dort also sowohl die allgemeinen Einstellungen anpassen als auch die für die einzelnen Felder. Wenn Sie also einen Import etwa unter dem Namen Kategorien Importspezifikation gespeichert haben, ermitteln Sie aus dem Feld SpecID (s. Bild 10).

pic009.png

Bild 9: Ermitteln der SpecID für eine gespeicherte Spezifikation

pic010.png

Bild 10: Bearbeiten der Spalteninformationen in MSysIMEXColumns

Kein Zugriff unter Access 2003 und älter

Wenn Sie dies unter älteren Access-Versionen ausprobieren, werden Sie schnell auf Widerstand stoßen: Die Daten der beiden Tabellen MSysIMEXSpecs und MSysIMEXColumns lassen sich nicht ändern. Genau wie die übrigen Systemtabellen scheinen diese beiden Tabellen geschützt zu sein. änderungen lassen sich offensichtlich nur per Assistent durchführen.

Das ist jedoch kein Grund, den Kopf in den Sand zu stecken: Diese Tabelle ist nämlich keine typische Systemtabelle, sondern sie wird nur als solche dargestellt und bringt die Eigenschaft mit sich, dass die enthaltenen Daten nicht direkt geändert werden können. Sie können jedoch per VBA auf die Inhalte der beiden Tabellen zugreifen und diese auch ändern. Probieren Sie beispielsweise einmal die folgende Prozedur aus:

Public Sub SpecsAnpassen()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Set db = CurrentDb
    Set rst = db.OpenRecordset("MSysIMEXSpecs", dbOpenDynaset)
    rst.AddNew
    rst!SpecName = "Testspezifikation"
    rst.Update
    Set db = Nothing
End Sub

Die Prozedur öffnet ein Recordset auf Basis der Tabelle MSysIMEXSpecs und fügt mit der AddNew-Methode einen neuen Datensatz hinzu. Dabei trägt sie als Namen der Spezifikation den Wert Testspezifikation ein. Nicht nur, dass das Aufrufen der Prozedur keinen Fehler hervorruft – der Datensatz wird auch noch problemlos angelegt!

Systemtabelle oder nicht

Schauen wir uns also einmal an, warum sich diese Tabelle so anders als die übrigen Systemtabellen verhält. In anderen Systemtabellen fügen Sie nämlich nicht einfach mal so einen Datensatz hinzu.

Wenn Sie obige Prozedur mal mit den folgenden Zeilen ausführen und somit probieren, der Tabelle MSysObjects einen Datensatz hinzuzufügen, liefert das die Fehlermeldung aus Bild 11:

pic011.png

Bild 11: Fehler beim ändern einer herkömmlichen Systemtabelle

Set rst = db.OpenRecordset("MSysObjects", dbOpenDynaset)
rst.AddNew
rst!ID = 99999999
rst!Name = "Testobjekt"
rst.Update

Wer sich schon ein wenig mit Systemtabellen beschäftigt hat, der weiß, wodurch sich diese von anderen Tabellen unterscheiden – nämlich durch den Wert dbSystemObject in der Eigenschaft Attributes des entsprechenden TableDef-Objekts. Wenn Sie diesen Wert etwa für die Systemtabelle MSysObjects ermitteln möchten, geben Sie die folgende Anweisung im Direktfenster des VBA-Editors ein:

Debug.Print CurrentDB.TableDefs("MSysObjects").Attributes
-2147483648

Wenn Sie das Ergebnis mit dem Zahlenwert für die Konstante dbSystemObject vergleichen, den Sie im Objektkatalog finden oder einfach mit Debug.Print dbSystemObject ermitteln können, ergibt sich eine Differenz von 2.

Ermitteln Sie nun mit der folgenden Anweisung den Attributes-Wert der Tabelle MSysIMEXSpecs:

Debug.Print CurrentDB.TableDefs("MSysIMEXSpecs").Attributes

Das Ergebnis lautet 2. Die Tabellen zum Speichern von Spezifikationen sind also keine Systemtabellen, sondern mit einem nicht dokumentierten Attributes-Wert versehen. Dieser wiederum sorgt dafür, dass eine Tabelle als Systemtabelle verborgen dargestellt wird und außerdem nicht direkt geändert werden kann.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar