Speichern verhindern mit Cancel = True

Hallo zusammen,

ich entwickle in Access eine Schnittstelle zu einer Oracle Datenbank. Wenn in Access Daten gändert werden, werden diese automatisch gespeichert beim verlassen des Fensters. Dabei wird das Form_BeforeUpdate Ereignis aufgerufen. Nun soll durch eine MsgBox der Benutzer gefragt werden ob die Daten in der Datenbank tatsächlich aktualisiert werden sollen. Wenn nicht soll das Ereignis mit Cancel = True abgebrochen werden.
Dummerweise werden dabei auch alle anderen Ereignisse abgebrochen, was zu Fehlern führt.
Wenn sich jemand mit dieser Art des Speicherns auskennt und eine Idee hat was ich besser machen könnte würde ich mich sehr freuen,

schöne Grüße, David

Hallo

Hallo zusammen,

ich entwickle in Access eine Schnittstelle zu einer Oracle
Datenbank. Wenn in Access Daten gändert werden, werden diese
automatisch gespeichert beim verlassen des Fensters. Dabei
wird das Form_BeforeUpdate Ereignis aufgerufen. Nun soll durch
eine MsgBox der Benutzer gefragt werden ob die Daten in der
Datenbank tatsächlich aktualisiert werden sollen. Wenn nicht
soll das Ereignis mit Cancel = True abgebrochen werden.
Dummerweise werden dabei auch alle anderen Ereignisse
abgebrochen, was zu Fehlern führt.

Welche anderen Ereignisse meinst Du? Und welche Fehler treten auf?
Hast Du die Ereignisprozedur Form_BeforeUpdate schon eingebaut?

Poste mal den Code und beschreibe, was genau passieren soll.

Gruß
Franz, DF6GL

Welche anderen Ereignisse meinst Du? Und welche Fehler treten
auf?

Gespeichert wird beim Wechsel eines Datensatzes, dieser Wechsel bringt verschieden Ereignisse mit sich, wie ich im Netz gelesen habe unter
http://msdn2.microsoft.com/en-us/library/aa211264(of…

Hast Du die Ereignisprozedur Form_BeforeUpdate schon
eingebaut?

Ja

Poste mal den Code und beschreibe, was genau passieren soll.

Private Sub Form_BeforeUpdate(Cancel As Integer)

If MsgBox(„Wollen Sie speichern?“, vbYesNo) = vbNo Then
Cancel = True
End If

End Sub

Private Sub Kombinationsfeld116_AfterUpdate()

Me.Recordset.FindFirst "[SKZID] = "
& Str(Nz(Me[Kombinationsfeld116], 0))

End Sub

Kombinationsfeld ist eine ComboBox, beim ändern der Auswahl soll ein neuer Datensatz in die Form geladen werden. Dabei wird das Ereignis Form_BeforeUpdate aktiviert, wenn man nun nicht speichern will, werden alle Ereignisse abgebrochen mit Cancel = True.
Dabei dann aber auch alle Ereignisse die mit dem Datensatzwechsel zu tun haben und ich bekomme eine Fehlermeldung!

Hoffe das hilft jetzt noch mehr, glaube ja das die Lösung auf der von mir geposteten Webseite steht, verstehe es leider nur nicht so gut.

Schöne Grüße

Hallo,

Wenn Du in irgendeinem gebundenen Steuerelement etwas geändert hast und anschließend die Kombisuche ausführst, tritt das Form_Beforeupdate-Ereignis auf. Das ist so und kann nicht geändert werden.

Wenn Du nichts verändert hast und das Kombifeld ist ungebunden(!, sonst wäre das ja eine Änderung) ), dann wird das Form_BeforeUpdate-Ereignis auch nicht ausgeführt.

Gruß
Franz, DF6GL

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Wenn Du in irgendeinem gebundenen Steuerelement etwas geändert
hast und anschließend die Kombisuche ausführst, tritt das
Form_Beforeupdate-Ereignis auf. Das ist so und kann nicht
geändert werden.

Wenn Du nichts verändert hast und das Kombifeld ist
ungebunden(!, sonst wäre das ja eine Änderung) ), dann wird
das Form_BeforeUpdate-Ereignis auch nicht ausgeführt.

PS: Insofern weiß ich nicht genau, was Dir als Ablaufsteuerung in solchem Fall vorschwebt…

Gruß
Franz, DF6GL

Welche anderen Ereignisse meinst Du? Und welche Fehler treten
auf?

Gespeichert wird beim Wechsel eines Datensatzes, dieser
Wechsel bringt verschieden Ereignisse mit sich, wie ich im
Netz gelesen habe unter
http://msdn2.microsoft.com/en-us/library/aa211264(of…

Hast Du die Ereignisprozedur Form_BeforeUpdate schon
eingebaut?

Ja

Poste mal den Code und beschreibe, was genau passieren soll.

Private Sub Form_BeforeUpdate(Cancel As Integer)

If MsgBox(„Wollen Sie speichern?“, vbYesNo) = vbNo Then
Cancel = True
End If

End Sub

Private Sub Kombinationsfeld116_AfterUpdate()

Me.Recordset.FindFirst "[SKZID] = "
& Str(Nz(Me[Kombinationsfeld116], 0))

End Sub

Kombinationsfeld ist eine ComboBox, beim ändern der Auswahl
soll ein neuer Datensatz in die Form geladen werden. Dabei
wird das Ereignis Form_BeforeUpdate aktiviert, wenn man nun
nicht speichern will, werden alle Ereignisse abgebrochen mit
Cancel = True.
Dabei dann aber auch alle Ereignisse die mit dem
Datensatzwechsel zu tun haben und ich bekomme eine
Fehlermeldung!

Hoffe das hilft jetzt noch mehr, glaube ja das die Lösung auf
der von mir geposteten Webseite steht, verstehe es leider nur
nicht so gut.

Schöne Grüße

Hey,

ich glaube mein Problem ist noch nicht ganz klar geworden.
Der Datensatz wird über meine ComboBox gewechselt, wenn Änderungen im Datensatz getätigt wurden, wird das Form_BeforeUpdate Ereignis aufgerufen.
Soweit ist das ja auch gut und verständlich.
Im Form_BeforeUpdate Ereignis wird der Benutzer gefragt ob wirklich gespeichert werden soll. Entscheidet sich der Benutzer für „Nein“, wird das momentane Ereignis mit Cancel = True abgebrochen.
Ich bekomme dann aber die Fehlermeldung: „Diese Aktion wurde durch ein zugeordnetes Objekt abgebrochen“ in der folgenden Zeile:

Me.Recordset.FindFirst "[SKZID] = " & Str(Nz(Me[Kombinationsfeld116], 0))

Was ich bisher im Netz dazu gelesen habe, bringt der Datensatzwechsel über die ComboBox auch verschieden Ereignisse mit sich, die alle abgebrochen werden bei Cancel = True und deswegen ein Fehler kommt.
Also besteht mein Problem darin, das ich nur das Speichern mit Cancel = True unterbinden will, allerdings viel mehr abgebrochen wird, wodurch nichtmal mehr der Datensatz gewechselt werden kann.

Schöne Grüße

Ok, habe grade Cancel = True durch Me.undo ersetz und jetzt funktioniert es so wie ich es will. Vieleicht ist das hier ja eine Hilfe für Leute die auf das gleiche Problem stoßen.

Trotzdem vielen Dank für alle Bemühungen!!!
Schöne Grüße

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

wenn es nur um die Dateneingabe in dem aktuellen Datensatz geht, und dahinter Oracle mit einer ODBC-Schnittstelle haengt, wuerde ich auf das CANCEL = TRUE ganz verzichten und eine Tanzaktionsverwaltung mittels BeginTrans, Rollback, CommitTrans einbauen.
Das ist zwar von der Verwaltung etwas aufwendiger zu programmieren aber auch sicherer.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

wenn es nur um die Dateneingabe in dem aktuellen Datensatz
geht, und dahinter Oracle mit einer ODBC-Schnittstelle haengt,
wuerde ich auf das CANCEL = TRUE ganz verzichten und eine
Tanzaktionsverwaltung mittels BeginTrans, Rollback,
CommitTrans einbauen.

Genau darum handelt es sich. Cancel = True benutze ich auch nicht mehr. Arbeite jetzt mit Me.undo, setze also den Datensatz gegebenfalls vor der Aktualisierung zurück.
Über die Transaktionsverwaltung würde ich trotzdem gerne mehr wissen, da ich noch immer kleiner Probleme habe.
Wie genau gehe ich denn mit den Kommandos um? Kannst du vieleicht ein Code Beispiel schicken oder kennst du eine gute Seite?

Das ist zwar von der Verwaltung etwas aufwendiger zu
programmieren aber auch sicherer.

Das würde ich gerne in Kauf nehmen :smile:

Tschau
Peter

Tschau und danke für die Antwort!

Hallo,

eigentlich reicht die hausinteren Hilfe von VBA und die MSDN aus, um die grundlegenden Funktionen zu verstehen.

Prinzipell ist das Me.Undo ein Kommando, das auf dem Formular basiert, und damit nur auf Umwegen in die Datenspeicherung eingreift.

BeginTran, CommitTrans und Rollback greift direkt in die Datenepeicherung ein und bezieht sich auf ein Workspace-Objet.

Normlerweise verwende ich die Transaktionsfunktionen nicht im Zusammmenhang mit einem gebunden Formular sondern in VBA Routinen. Fuer die Verarbeitung in einem Formular wuerde das bedeuten, das du die Speicherung der Daten in die Oracle Tabelle selber von Hand zu Fuss bewerkstelligen musst. Dies ist zwar aufwendig, aber du hast halt auch viel mehr Einfluss auf die Verarbeitung, wie z.B. Plausisbitiaetspruefungen und Fehlerbehandlungen.

Tschau
Peter