Access 2007: Anlagen

Anlagen per VBA

Man mag fast meinen, dass VBA in Zusammenhang mit dem neuen Anlage-Datentyp und dem passenden Steuerelement der Vergangenheit angehört – ohne einzige Codezeile stellt Access Dialoge zum Bearbeiten, Öffnen, Hinzufügen und mehr zur Verfügung.

Wer allerdings schon ein wenig mit Access arbeitet, weiß, dass man vielleicht auch mal ein paar Hundert oder Tausend Elemente „handeln“ möchte – und um mal eben die 1 GByte-Speicherkarte der Digitalkamera in die Datenbank zu entladen, wäre ein wenig Automatisierung nun doch ganz hilfreich. Und dann taucht doch die Frage auf, wie man denn nun ein Feld handhabt, das einen oder mehrere Werte enthalten kann. Mit Access 2007 führt Microsoft eine neue DAO-Bibliothek ein: die Microsoft Office 2007 Access Database Engine Object Library. Sie ist standardmäßig als Verweis eingestellt, die vorherigen DAO- und ADO-Bibliotheken nicht mehr (Bild 6).

Bild 6: Die neue DAO-Bibliothek im Verweise-Fenster.
Bild 6: Die neue DAO-Bibliothek im Verweise-Fenster.

Genau genommen handelt es sich nur um eine Erweiterung der bisherigen DAO-Objektbibliothek. Neu ist beispielsweise das Objekt Recordset2, das Sie gleich für den Zugriff auf die im Anlage-Feld gespeicherten Dateien einsetzen werden.

Oberflächlich betrachtet speichert Access die Anhänge in einem einzigen Feld, das aber intern mit einer versteckten Tabelle verknüpft ist. Diese enthält je Anlage einen Datensatz. Wie greift man aber nun per VBA auf diese verknüpfte Tabelle zu? Ganz einfach: Man erstellt eine neue Datensatzgruppe auf Basis der Value-Eigenschaft des Anlage-Feldes.

Listing 1 zeigt, wie es geht: Es öffnet zunächst eine Datensatzgruppe auf Basis der Tabelle Employees und dann eine zweite, die auf dem Feld mit dem Datentyp Anlage basiert.

Public Sub AnlagenfelderAuflisten()
Dim db As DAO.Database
Dim rst As DAO.Recordset2
Dim rstAttachments As DAO.Recordset2
Dim fld As Field2
Set db = CurrentDb
Set rst = db.OpenRecordset("Employees", dbOpenDynaset)
Set rstAttachments = rst.Fields("Attachments").Value
For Each fld In rstAttachments.Fields
Debug.Print fld.Name
Next fld
rstAttachments.Close
rst.Close
Set rstAttachments = Nothing
Set rst = Nothing
Set db = Nothing
End Sub