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!

9.10 QueryDefs - Auswahl oder Aktion nach Wahl

9.11 Transaktionen

Mit DAO lassen sich mehrere Datenoperationen in einer Transaktion zusammenfassen. Das bedeutet, dass die Änderungen an den Daten erst durchgeführt werden, wenn die Transaktion mit der entsprechenden DAO-Methode ausdrücklich abgeschlossen wird.

In der Praxis ist das interessant, wenn etwa ein Geldtransfer von einem Konto zum anderen Konto abgebildet werden soll. Dazu wird der Kontostand des ersten Kontos vermindert und der des zweiten Kontos erhöht. Es müssen unbedingt beide Aktionen durchgeführt werden, da sonst eine Inkonsistenz entsteht, wenn einer der beiden Vorgänge ohne den anderen durchgeführt wird.

Transaktionen beziehen sich immer auf den angegebenen Workspace. Damit ist sichergestellt, dass immer nur ein Benutzer Änderungen während einer Transaktion durchführt. Sie selbst müssen allerdings dafür sorgen, dass wirklich auch nur die geplanten Datenänderungen innerhalb einer Transaktion erfolgen - anderenfalls verwirft Access gegebenenfalls Änderungen, die vielleicht gar nicht Bestandteil der Transaktion sein sollen.

Das Handhaben von Transaktionen ist eigentlich ganz einfach. Abbildung 9.14 zeigt den prinzipiellen Ablauf einer Transaktion. Der Start erfolgt mit der BeginTrans-Anweisung. Nach dem Ändern der Daten prüft man, ob alle Vorgänge erfolgreich durchgeführt werden konnten, und ruft dann eine der beiden Methoden CommitTrans oder Rollback auf.

Abbildung 9.14: Ablauf einer Transaktion

Im Code sieht das etwa folgendermaßen aus:

Public Sub Transaktion(lngKonto1ID As Long, lngKonto2ID As Long, _
    curBetrag As Currency)

    Dim wrk As DAO.Workspace
    Dim db As DAO.Database
    Dim curKonto1Alt As Currency
    Dim curKonto2Alt As Currency
    Dim curKonto1Neu As Currency
    Dim curKonto2Neu As Currency

    Set wrk = DBEngine.Workspaces(0)
    Set db = wrk.Databases(0)

    ' Transaktion starten
    wrk. BeginTrans

    'Alte Kontostände ermitteln und zwischenspeichern
    curKonto1Alt = FLookup("Kontostand", "tblKonten", _
        "KontoID = " & lngKonto1ID)
    curKonto2Alt = FLookup("Kontostand", "tblKonten", _
        "KontoID = " & lngKonto2ID)

    'Umbuchung vornehmen
    db.Execute "UPDATE tblKonten SET Kontostand = Kontostand - " _
        & curBetrag & " WHERE KontoID = " & lngKonto1ID
    db.Execute "UPDATE tblKonten SET Kontostand = Kontostand + " _
        & curBetrag & " WHERE KontoID = " & lngKonto2ID

    'Neue Kontostände ermitteln und zwischenspeichern
    curKonto1Neu = FLookup("Kontostand", "tblKonten", "KontoID = " _
        & lngKonto1ID)
    curKonto2Neu = FLookup("Kontostand", "tblKonten", "KontoID = " _
        & lngKonto2ID)

    'Prüfen, ob die gewünschten Änderungen durchgeführt wurden
    'und Änderungen entweder durchführen oder verwerfen
    If curKonto1Neu = curKonto1Alt - curBetrag _
        And curKonto2Neu = curKonto2Alt + curBetrag Then
        wrk. CommitTrans
        Debug.Print " Transaktion erfolgreich ."
    Else
        wrk. Rollback
        Debug.Print " Transaktion nicht erfolgreich."
    End If

    Set db = Nothing
    Set wrk = Nothing

End Sub

Listing 9.57: Beispiel einer Transaktion

Die DLookup-Anweisung läuft nicht im gleichen Kontext der Transaktion und ist daher an dieser Stelle nutzlos. Sie kann zwar die Daten vor der Änderung ermitteln, hat aber keinen Einblick in die innerhalb der Transaktion temporär geänderten Daten.

Daher verwendet die Prozedur eine alternative Funktion namens FLookup, die neben der Transaktionsfähigkeit außerdem noch schneller als die klassische DLookup-Funktion ist. Das folgende Listing zeigt den Aufbau der Funktion. Sie liefert genau die gleichen Ergebnisse wie die DLookup-Funktion, enthält allerdings keine Fehlerbehandlung.

Public Function FLookup(strField As String, strTable As String, _
    strCriteria As String) As Variant

    Dim db As DAO.Database
    Dim rst As DAO.Recordset

    Set db = CurrentDb
    Set rst = db.OpenRecordset(strTable, dbOpenDynaset)

    rst.FindFirst strCriteria

    If Not rst.NoMatch Then
        FLookup = rst(strField)
    Else
        FLookup = Null
    End If

    rst.Close

    Set rst = Nothing
    Set db = Nothing

End Function

Listing 9.58: Eine schnelle DLookup-Variante auf DAO-Basis

Der Vollständigkeit halber finden Sie noch eine schnellere Variante, die direkt mit einem SQL-Ausdruck arbeitet:

Public Function FLookup(strField As String, strTable As String, _
    strCriteria As String) As Variant

    Dim strSQL As String

    On Error Resume Next

    strSQL = "SELECT [" & strField & "] FROM [" & strTable & "]"

    If Len(strCriteria) > 0 Then strSQL = strSQL & " WHERE " & strCriteria
    FLookup = DBEngine(0)(0).OpenRecordset(strSQL, dbOpenForwardOnly)(0)

End Function

Ein Praxisbeispiel zum Thema »Transaktionen« finden Sie in Kapitel 4, »Formulare«, Abschnitt 4.7.2, »Undo in Haupt- und Unterformularen«.

[1] CurrentDBC: http://groups.google.com/group/comp.databases.ms-access/msg/9fe9 8bb5d7cba5ea

Beispiele auf CD: Sie finden alle Code-Beispiele dieses Kapitels auf der Buch-CD unter \Kap_09\DAO.accdb im Modul mdlDAO. Die Datenbankdatei enthält auch die für die Beispiele verwendeten Tabellen.

Hinweis: In manchen Fällen benötigen Sie eine zusätzliche Instanz des DBEngine-Objekts - etwa, wenn Sie auf eine geschützte Datei zugreifen möchten. In diesem Fall erzeugen Sie die neue Instanz mit den folgenden zwei Zeilen:

Dim objDBEngine As DAO.DBEngine
Set objDBEngine = New DAO.DBEngine

Mehr zu diesem Thema erfahren Sie in Kapitel 18, »Sicherheit von Access-Datenbanken«.

Hinweis: Die neue DAO-Bibliothek liefert neben dem bekannten Recordset-Objekt noch eine neuere Version namens Recordset2. Dieses müssen Sie immer dann verwenden, wenn die Tabelle, auf der eine Datensatzgruppe basiert, Felder mit neuen Datentypen enthält. Bei den neuen Datentypen handelt es sich um den Attachment- (Anlage) und die Complex-Datentypen (mehrwertige Felder). Um diese Feldtypen zu verwenden, müssen Sie darüber hinaus die Klasse Field2 statt Field verwenden. Da beide Klassen von den älteren Klassen abgeleitet sind und somit alle darin enthaltenen Eigenschaften und Methoden aufweisen, können Sie prinzipiell immer die neuere Variante verwenden (was in diesem Buch auch geschieht).

Alles Wissenswerte zum Thema Aktionsabfragen erfahren Sie in Kapitel 8, »Access-SQL«.

Nächster Abschnitt:

10 ADO

© 2006-2008 André Minhorst Alle Rechte vorbehalten.