Anlage-Felder bieten bereits ohne den Einsatz von VBA echten Nutzen. Wenn es jedoch darum geht, größere Operationen durchzuführen, um etwa eine Reihe von Bildern aus verschiedenen Verzeichnissen in ein oder mehrere Anlage-Felder zu kopieren, werden Sie dies kaum von Hand erledigen wollen. Stattdessen erstellen Sie eine VBA-Abfrage, die das Einfügen, Löschen oder Entfernen der Dateien in und aus dem Anlage-Feld erledigen soll.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1309_Anlagefelder.accdb.
Hinweise
Anlage-Felder wurden mit Access 2007 eingeführt. Voraussetzung ist außerdem ein Verweis auf die Bibliothek Microsoft Office x.0 Access Database Engine Object Library, der normalerweise bei Datenbanken des Typs .accdb bereits voreingestellt sein sollte.
Sollte die Datenbank aus irgendwelchen Gründen den Verweis auf die Bibliothek Microsoft DAO 3.6 Object Library enthalten, entfernen Sie diesen Sie über den Verweise-Dialog (VBA-Editor, Menü Extras|Verweise) und fügen den Verweis auf die oben genannte Bibliothek hinzu (siehe Bild 1).
Bild 1: Verweis auf die neue DAO-Bibliothek
Struktur von Anlage-Feldern
Bevor wir uns mit VBA an das Lesen und Bearbeiten eines Anlage-Feldes heranwagen, schauen wir uns die zugrunde liegende Struktur an. Am besten gelingt dies, wenn Sie eine neue Abfrage erstellen und eine Tabelle als Datenherkunft hinzufügen, die ein Anlage-Feld enthält. Dies sieht etwa wie in Bild 2 aus.
Bild 2: Das Anlage-Feld im Abfrageentwurf
Wechseln Sie zur Datenblattansicht dieser Abfrage, erkennen Sie, dass jeder Datensatz für jede enthaltene Anlage je einmal erscheint (siehe Bild 3). Der Datensatz mit dem Wert 3 im Feld DateiID enthält beispielsweise fünf Dateien im Anlagefeld. Dementsprechend erscheint der Datensatz fünf Mal, jeweils mit einer anderen Anlage.
Bild 3: Abfrage, die jeden Datensatz entsprechend der Anzahl der enthaltenen Anlagen anzeigt.
Dies weist darauf hin, dass die in Anlage-Feldern gespeicherten Daten möglicherweise in einer weiteren, für Benutzeraugen nicht sichtbaren, Tabelle gespeichert werden. In der Tat findet sich in einer Datenbank, nachdem Sie eine Tabelle mit einem Anlage-Feld hinzugefügt haben, eine zusätzliche Tabelle mit einem kryptischen Namen wie f_AE1ADE703D174BDAADDFFEBC068B79C8_Test (diese lässt sich allerdings nicht öffnen).
Und wenn die Daten des Anlage-Feldes schon in einer verknüpften Tabelle landen, finden wir sicher auch unter DAO einen alternativen Weg für den Zugriff auf diese Daten.
Nur lesen
Wenn Sie die Daten nur lesen möchten, aber nicht bearbeiten, können Sie direkt mit einem Recordset auf Basis der oben beschriebenen Abfrage arbeiten. Für die VBA-Prozeduren legen Sie im VBA-Editor mit Einfügen|Modul ein neues Modul namens mdlAnlagen an.
Fügen Sie dann die Prozedur mit dem Code aus Listing 1 hinzu. Die Prozedur deklariert und erstellt zunächst die benötigten Objekte, also ein Database-Objekt namens db und ein Recordset-Objekt namens rst und durchläuft dann alle Datensätze der Abfrage qryAnlagen in einer Do While-Schleife.
Public Sub LesenderZugriff() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("qryAnlagen", dbOpenDynaset) Do While Not rst.EOF Debug.Print rst!DateiID, rst("tblDateien.Datei.FileName"), rst("tblDateien.Datei.FileType"), _ Left(rst("tblDateien.Datei.FileData"), 100) rst.MoveNext Loop End Sub
Listing 1: Einfacher lesender Zugriff über eine Abfrage mit allen Feldern der Tabelle mit dem Anlage-Feld
Dabei gibt eine Debug.Print-Anweisung die Inhalte aller Felder im Direktbereich aus. Da der Inhalt des Anlagefeldes selbst, also die Datei, als Zeichenfolge ausgegeben wird, haben wir die Anzahl der Zeichen auf die ersten 100 begrenzt (Left(…)). Das Ergebnis finden Sie in Bild 4.
Bild 4: Inhalt eines Anlagefeldes
Die Namen der Felder können Sie dabei einfach der Datenblattansicht der Abfrage qryAnlagen entnehmen – oder Sie fragen diese etwa mit folgenden Ausdrücken im Direktfenster ab:
CurrentDb.QueryDefs("qryAnlagen").Fields(1).Name tblDateien.Datei.FileData
Nun stellt sich allerdings die Frage, ob wir auch auf die Datei zugreifen und diese etwa speichern können. Aber mit welcher Methode Zunächst einmal nutzen wir eines der aktualisierten Objekte der neuen DAO-Bibliothek, und zwar Field2.
Deklarieren Sie in der Prozedur von oben eine entsprechende Variable dieses Typs namens fld. Dann weisen Sie dieser Variablen innerhalb der Schleife den Inhalt des Feldes tblDateien.Datei.Filedata zu, also des für das Speichern der Datei zuständigen Feldes innerhalb der verborgenen, verknüpften Tabelle.
Das Objekt des Typs Field2 liefert gegenüber der älteren Variante Field zum Beispiel die neue Methode SaveToFile, die wir in diesem Fall einsetzen um den Inhalt des Feldes in einer als Parameter angegebenen Datei zu speichern. Den angepassten Code der Prozedur finden Sie in gekürzter Form in Listing 2.
Public Sub LesenderZugriff() Dim fld As DAO.Field2 ... Do While Not rst.EOF Set fld = rst.Fields("tblDateien.Datei.Filedata") fld.SaveToFile CurrentProject.Path & "\test_" & rst("tblDateien.Datei.Filename") rst.MoveNext Loop End Sub
Listing 2: Diese Prozedur durchläuft alle Anlagen und speichert diese auf der Festplatte.
Anlagen in eigenem Recordset
Nun haben wir ja bereits ermittelt, dass die Anlagen in einer eigenen Tabelle gespeichert werden. Können wir auf die Elemente dieser Tabelle auch mit einem eigenen Recordset zugreifen Ja, das ist möglich.
Dazu deklarieren Sie zunächst eine weitere Recordset-Variable, die aber dem Typ Recordset2 entsprechen muss. Dieser weisen Sie dann wiederum den Value-Wert des Anlage-Feldes des ersten Recordsets zu. Wir wollen und den Aufbau des Recordsets einmal ansehen und lesen dazu zunächst alle Feldnamen und Felddatentypen dieses Recordsets aus, nach dem wir es referenziert haben.
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: