Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

11.5 Dateien per VBA in Anlage-Felder importieren und exportieren

11.5.1 Importieren von Dateien in Anlage-Felder

Die nachfolgend vorgestellte Funktion können Sie universell für das Importieren beliebiger Dateien in Anlage-Felder verwenden. Sie erwartet die folgenden Parameter:

  • strFileName: Verzeichnis und Name der zu importierenden Datei
  • strTable: Name der Tabelle, in der sich das Anlage-Feld befindet
  • strFieldAttach: Name des Anlage-Feldes
  • boolEdit: Gibt an, ob die Anlage in einem bestehenden Datensatz gespeichert werden soll
  • strIDField: Name des Primärschlüsselfeldes der Tabelle
  • varID: Wert des Primärschlüsselfeldes für den Datensatz, zu dem eine Anlage hinzugefügt werden soll
  • strAttachment: Name des Attachments, das gegebenenfalls überschrieben werden soll
  • Wenn Sie eine Datei in einem neuen Datensatz speichern möchten, verwenden Sie etwa diesen Aufruf:

    StoreBLOB2007 CurrentProject.Path & "\Bilder_01.tif", "tblAnlagen", "Anlagen"

    Zum Anfügen einer Datei in einem vorhandenen Datensatz setzen Sie diese Anweisung ab - wobei 2 der Primärschlüsselwert des Zieldatensatzes ist:

    StoreBLOB2007 CurrentProject.Path & "\Bilder_01.tif", "tblAnlagen", "Anlagen", True, "AnlageID", 2

    Schließlich können Sie auch ein Attachment mit einem bestimmten Dateinamen in der Tabelle überschreiben. Auch dies erfordert die Angabe des Datensatzes und zusätzlich den Namen des bereits vorhandenen Attachments:

    StoreBLOB2007 CurrentProject.Path & "\Bilder_02.tif", "tblAnlagen", "Anlagen", True, "AnlageID", 2, "Bilder_01.tif"

    Die Routine hat übrigens noch ein weiteres Feature, das eine völlig unverständliche Eigenschaft von Anlage-Feldern ausschaltet: Und zwar dürfen nur Dateien mit bestimmten Dateiendungen importiert werden. Und das ist wörtlich zu nehmen:

    Der Inhalt der Datei spielt keine Rolle, Sie brauchen die Datei nur vor dem Speichern im Anlage-Feld umzubenennen und dies anschließend wieder rückgängig zu machen. Und genau das macht diese Funktion auch, indem sie den beim Speichern einer Datei mit einer nicht erlaubten Dateiendung auftretenden Fehler entsprechend behandelt.

    Der Zugriff auf die Anlagen erfolgt mit DAO. Der grundlegende Ablauf ist, dass Sie zunächst ein Recordset-Objekt auf Basis der Tabelle mit dem Anlage-Feld erstellen und ein weiteres auf Basis der Value-Eigenschaft des Anlage-Feldes. Letzteres muss unbedingt ein Recordset2-Objekt sein, ebenso wie das Field-Objekt mit dem Anlage-Feld die neue Version Field2 braucht.

    Die Prozedur sieht wie folgt aus:

    Function StoreBLOB2007(strFileName As String, strTable As String, _
        strFieldAttach As String, Optional boolEdit As Boolean, _
        Optional strIDField As String, Optional varID As Variant, _
        Optional strAttachment As String) As Boolean

        Dim fld2 As DAO.Field2
        Dim rstDAO As DAO.Recordset2
        Dim rstACCDB As DAO.Recordset2

        On Error GoTo ErrHandler
        
        Set rstDAO = CurrentDb.OpenRecordset("SELECT * FROM [" & strTable _
            & "]", dbOpenDynaset)
        If boolEdit Then
            If IsNull(varID) Then Err.Raise vbObjectError + 1, , _
                "Keine Datensatz-ID angegeben!"
            rstDAO.FindFirst "CStr([" & strIDField & "])='" & CStr(varID) & "'"
            If rstDAO.NoMatch Then Err.Raise vbObjectError + 2, , _
                "Datensatz mit ID " & varID & " nicht gefunden!"
            rstDAO.Edit
        Else
            rstDAO.AddNew
        End If
        
        Set rstACCDB = rstDAO(strFieldAttach).value
        If boolEdit Then
            If rstACCDB.EOF Then
                'Fall 1: Es gibt noch keine Anlagen; > neue Anlage
                rstACCDB.AddNew
            Else
                rstACCDB.FindFirst "[FileName]=' & strAttachment" & "'"
                'Fall2: Es gibt keine Anlage mit dem Namen in sAttachment: >
                'neue Anlage
                If rstACCDB.NoMatch Then
                    rstACCDB.AddNew
                'Fall3: Anlage gefunden; dann editieren
                Else
                    rstACCDB.Edit
                End If
            End If

        Else
            rstACCDB.AddNew
        End If
        
        Set fld2 = rstACCDB.Fields!FileData
        On Error Resume Next
        fld2.LoadFromFile (strFileName)
        If Err.Number = -2146697202 Then    
            'Unerlaubte Dateiendung! Spezialbehandlung...
            On Error GoTo ErrHandler
            'Datei zuerst mit erlaubte Endung ".dat" anfügen
            Name strFileName As strFileName & ".dat"
            'Datei laden
            fld2.LoadFromFile (strFileName & ".dat")
            'Umbenennung rückgängig machen
            Name strFileName & ".dat" As strFileName    
            rstACCDB.Fields!FileName = Mid(strFileName, _
                InStrRev(strFileName, "\") + 1)    'Anlagename setzen
            rstACCDB.Update
        Else
            On Error GoTo ErrHandler
            rstACCDB.Update
        End If
        rstDAO.Update
        StoreBLOB2007 = True    'Rückgabe True = Alles ok.

    Finally:
        On Error Resume Next
        rstACCDB.Close
        rstDAO.Close
        Set rstACCDB = Nothing
        Set rstDAO = Nothing
        Set fld2 = Nothing
        Exit Function

    ErrHandler:
        MsgBox Err.Description, vbCritical
        Resume Finally
    End Function

    Listing 11.1: Flexibles Speichern von Dateien im Anlage-Feld

    Nächster Abschnitt:

    11.5.2 Exportieren von Dateien aus dem Anlage-Feld

    © 2006-2008 André Minhorst Alle Rechte vorbehalten.