9.9.4 Umgang mit Attachments
9.9.5 Attachment-Felder auslesen
Die folgende Routine zeigt zunächst, wie Sie an die hinter einem Attachment-Feld steckende Tabelle herankommen und gibt zum Beweis die Feldnamen der verborgenen Tabelle aus. Die Routine bezieht sich auf die Tabelle tblDateien, die Sie mit der Prozedur aus Listing 9.9 angelegt haben. Nach dem Öffnen eines Recordsets auf Basis dieser Tabelle weist die Routine einem weiteren Recordset die Value-Eigenschaft des Attachment-Feldes zu - spätestens dies belegt, dass sich hinter Attachments eine weitere, interne Tabelle verbirgt (natürlich können Sie auch die Kurzform mit Ausrufezeichen und ohne Value-Eigenschaft verwenden: rst!Datei). Dieses Recordset kann dann wie jedes andere behandelt werden, was hier durch das Ausgeben der Feldnamen- und Felddatentypen erfolgt:
Public Sub FelderDerAttachmenttabelleAusgeben() Dim db As DAO.Database Dim rst As Recordset2 Dim rstAttachments As Recordset2 Dim fld As Field2 Set db = CurrentDb Set rst = db.OpenRecordset("tblDateien", dbOpenDynaset) If Not rst.EOF Then Set rstAttachments = rst.Fields("Datei").Value For Each fld In rstAttachments.Fields Debug.Print fld.Name, fld.Type Next fld Set rstAttachments = Nothing Else MsgBox "Die Funktion funktioniert nicht mit einer leeren Tabelle." End If rst.Close Set rst = Nothing Set db = Nothing End Sub
Listing 9.46: Auslesen der Felder der Anlagen-Tabelle
Die Ausgabe im Direktfenster sieht dann wie folgt aus:
FileData 11 FileFlags 4 FileName 10 FileTimeStamp 8 FileType 10 FileURL 12
Die Zahlen für die Datentypen entsprechen den Werten aus Tabelle 9.1. Daraus ergeben sich folgende Datentypen:
FileData: Byte-Array
FileFlags: Long
FileName: Text (enthält den Namen der angefügten Datei)
FileTimeStamp: Date/Time
FileType: Text
FileUrl: Memo
Daten aus Attachment-Feldern auslesen, Variante I
Gehen Sie einen Schritt weiter und erzeugen Sie einige Datensätze mit Attachments im Feld Datei. Die folgende Routine zeigt, wie Sie auf die im Attachment-Feld referenzierte, verborgene Tabelle zugreifen und deren Daten auslesen können. Im Prinzip ist diese Routine wie die aus dem vorherigen Listing aufgebaut - mit dem Unterschied, dass sie nicht die Felder, sondern die Datensätze des Attachment-Recordsets durchläuft und die darin gespeicherten Inhalte ausgibt.
Public Sub AttachmentsAuslesenI() Dim db As DAO.Database Dim rst As Recordset2 Dim rstAttachments As Recordset2 Dim fld As Field2 Set db = CurrentDb Set rst = db.OpenRecordset("tblDateien", dbOpenDynaset) Do While Not rst.EOF Set rstAttachments = rst.Fields("Datei").Value Do While Not rstAttachments.EOF Debug.Print rstAttachments!FileFlags, _ rstAttachments! FileName, rstAttachments! Filetimestamp, _ rstAttachments! FileType , rstAttachments! FileURL rstAttachments.MoveNext Loop Set rstAttachments = Nothing rst.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub
Listing 9.47: Ausgabe der Informationen aller Anlagen der Datensätze einer Tabelle
Daten aus Attachment-Feldern auslesen, Variante II
Wie obiges Beispiel zeigt, verhalten sich das Recordset rst und das Recordset rstAttachments etwa wie per 1:n-Beziehung verknüpfte Tabellen. Sie durchlaufen in einer übergeordneten Schleife alle Datensätze des Recordsets rst und in einer untergeordneten Schleife alle Datensätze von rstAttachments, die zu einem Feld des übergeordneten Recordsets gehören.
Das können Sie auch einfacher haben, wenn auch scheinbar weniger strukturiert. Dazu greifen Sie bereits beim Deklarieren des Hauptrecordsets auf die Felder des im Attachment-Feld enthaltenen Recordsets zu:
SELECT DateiID, Datei.FileData, Datei.Filename FROM tblDateien
Damit erstellen Sie quasi ein Recordset auf Basis der Tabelle tblDateien und der damit verknüpften und versteckten Tabelle mit den Attachments. Wenn Sie etwa alle Dateinamen der in den Datensätzen gespeicherten Dateien ausgeben möchten, können Sie das mit folgender Routine erledigen - achten Sie nur darauf, dass Sie die »Unterfelder« nicht mit der !-Syntax (rst!Datei.Filename), sondern beispielsweise mit rst("Datei.Filename") referenzieren (alternativ können Sie dem Feld bereits in der SQL-Anweisung einen passenden ALIAS-Namen zuweisen):
Public Sub AttachmentsAuslesenII() Dim db As DAO.Database Dim rst As Recordset2 Set db = CurrentDb Set rst = db.OpenRecordset("SELECT DateiID, Datei.FileData, " _ & "Datei.Filename FROM tblDateien", dbOpenDynaset)
Do While Not rst.EOF Debug.Print rst!DateiID, rst("Datei.FileName") rst.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub
Listing 9.48: Durchlaufen von Attachment-Recordsets ohne Einsatz eines weiteren Recordsets
Diese Variante können Sie auch für die nachfolgenden Beispiele zu Attachments verwenden. An die notwendige SQL-Anweisung kommen Sie im Übrigen am schnellsten, wenn Sie die gewünschten Felder wie in Abbildung 9.13 in der Abfrage-Entwurfsansicht einer neuen Abfrage zusammenstellen und dann in die SQL-Ansicht wechseln.

Abbildung 9.13: Abfrage über die Felder einer Tabelle mit Attachment-Feld
Nächster Abschnitt:
9.9.6 Dateien aus einem Attachment-Feld auf der Festplatte speichern
|