Kapitel 6: DAO-Programmierung
Wesentlich komplizierter als das Bewegen des Satzzeigers sind die Aktionen Löschen und Einfügen.
Delete
BeforeDelConfirm
A
fterDelConfirm
Current
löschen
Datensatz
Current
Warten
Dialog
Datensatz
löschen
Nein
Ja
BeforeInsert
A
fterUpdate
A
fterInsert
BeforeUpdate
Neuer
Datensatz
Current
User-
Eingabe
Sichern
Current
Warten
Abbildung 6.8 Ereignisse beim Löschen bzw.
Hinzufügen von Datensätzen
Auf Anlage-Felder zugreifen
Der neue effiziente Felddatentyp Anlage ersetzt den »alten« Datentyp OLE Objekt, welcher allerdings aus
Kompatibilitätsgründen weiter mitgeschleppt wird.
Mit Hilfe von Anlagen können Sie mehrere Dateien unterschiedlichen Typs in einem einzigen Feld spei-
chern. Wenn Sie beispielsweise über eine Datenbank mit Bewerbern verfügen, können Sie für jeden
Bewerber einen Lebenslauf sowie ein Foto anfügen.
Im Gegensatz zum OLE-Feld handelt es sich bei einem Anlage-Feld um weit mehr als nur ein binäres Feld,
im Hintergrund verwaltet Access in einer Systemtabelle neben den eigentlichen Daten (binär) noch weitere
Verwaltungsinformationen, von denen derzeit jedoch nicht alle genutzt werden.
Im Grunde haben Sie es bei Anlage-Feldern mit 1:n-Beziehungen zu tun, können Sie doch in einem der-
artigen Feld mehrere Dateien speichern. Damit dürfte schnell klar sein, dass es mit dem direkten Zugriff auf
die Binärdaten dieses Feldes per Value-Eigenschaft wohl nichts wird. Allerdings liegen Sie mit Value nicht
328
BEISPIEL
ganz falsch, aus Sicht des Programmierers wird von der Value-Eigenschaft ein neues Recordset zurückgege-
ben, das in den einzelnen Zeilen die jeweiligen Anlagen verwaltet.
In diesem Zusammenhang geistern auch zwei »neue« DAO-Klassen herum: Recordset2 und Field2. Wäh-
rend Recordset2 lediglich über eine zusätzliche Eigenschaft verfügt (ParentRecordset, d.h. das übergeordnete
Recordset von dem die aktuelle Instanz abgeleitet wurde), bietet ein Field2-Objekt zwei in diesem Zusam-
menhang interessante neue Methoden
LoadFromFile und
SaveToFile,
mit denen Sie Dateien in ein Anlage-Feld einlesen bzw. die Daten auch wieder als externe Datei speichern
können.
Doch der Reihe nach. Zunächst wollen wir Ihnen in einem kleinen Beispiel zeigen, wie der Zugriff auf das
Anlagefeld erfolgt und gleichzeitig einen Blick auf die Feldstruktur des enthaltenen Recordsets werfen.
Zugriff auf das Anlagefeld »Fotos«:
Private rsPersonal As Recordset
Private rsFotos As Recordset
Private Sub Befehl38_Click()
On Error Resume Next
Dim f As DAO.Field
Recordset abrufen (vom geöffneten Fenster):
Set rsPersonal = Me.Recordset
Hier erfolgt der Zugriff auf das Anlage-Feld:
Set rsFotos = rsPersonal.Fields("Fotos").Value
Im Direkt-Fenster geben wir die Satzstruktur des gerade erzeugten Recordsets und die jeweiligen Daten aus:
For Each f In rsFotos.Fields
Debug.Print "Feldname: " & f.Name & "(" & f.Type & ")"
Debug.Print "Daten: " & f.Value
Debug.Print " ----------------------------------------------------------------"
Next
...
End Sub
Die angezeigten Daten:
Feldname: FileData(11)
Daten: # # # jpg ?????Aa?? ???????????????????
“??????????????RÛN??????R???????????????????????????#Å???d?!Ä#Aaaa#
A^??????#A~???#AŽ^??L?????????????????????????????????????????????????????????????????????????????Äg`aa
aa# #
----------------------------------------------------------------
Feldname: FileFlags(4)
Daten:
329
Arbeiten mit Recordsets
BEISPIEL
Kapitel 6: DAO-Programmierung
----------------------------------------------------------------
Feldname: FileName(10)
Daten: EmpID1.jpg
----------------------------------------------------------------
Feldname: FileTimeStamp(8)
Daten:
----------------------------------------------------------------
Feldname: FileType(10)
Daten: jpg
----------------------------------------------------------------
Feldname: FileURL(12)
Daten:
----------------------------------------------------------------
Wie Sie sehen, werden die Felder
FileData,
FileFlags,
FileName,
FileTimeStamp,
FileType und
FileURL
im eingelagerten Recordset verwaltet.
Auf den ersten Blick erkennbar, handelt es sich bei FileData um die binären Daten
1
. Je nach Dateityp und
Access-Einstellungen werden diese Daten in komprimierter oder Original-Form abgelegt. Wohlgemerkt
handelt es sich hier nur um eine gespeicherte Datei, die nächste befindet sich, so vorhanden, im zweiten
Datensatz des Recordsets.
FileFlags (Long) wird, wie Sie sehen können, derzeit nicht genutzt, was auch auf die Felder FileTimeStamp
und FileUrl zutrifft.
Im Feld FileName wird der Name der gespeicherten Datei inklusive der Extension abgelegt, FileType enthält
lediglich die Extension der Datei, was für das schnelle Suchen in den Anhängen recht praktikabel ist (auch
per SQL).
Das folgende Beispiel zeigt, wie Sie Anlagen per VBA hinzufügen bzw. wieder entfernen können.
Wir haben in eine »Personal«-Tabelle ein Anlagefeld mit dem Namen
Fotos
eingefügt, in welchem pro Daten-
satz ein oder auch mehrere Fotos für die jeweilige Person abgespeichert werden können.
Private rsPersonal As Recordset
Private rsFotos As Recordset
Pro Person können Sie einen oder auch mehrere Anlagen (Fotos) hinzufügen. Das Hinzufügen einer Anlage
geschieht in unserem Fall über einen Datei-Öffnen-Dialog (siehe Datei-Kapitel 11):
Private Sub Befehl1_Click()
1
zuzüglich Verwaltungsinformationen
330

Get Microsoft Office Access 2007-Programmierung - Das Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.