PDA

Vollständige Version anzeigen : Fehlerbehandlung


Harry16
16.08.2009, 17:30
Hallo Experten,
da ich noch Anfänger in Sachen VBA bin, weiß ich nicht, wie ich nachfolgende Situation meistern kann:

Ich habe eine Tabelle tblTest mit den Feldern TestID, Test1 und Test2.

Um Duplikate zu vermeiden, habe ich einen gemeinsamen Index für Test1 und Test2 erstellt mit Eindeutig = JA

Im frmTest gebe ich nun einen ersten Datensatz ein
Feld1 = A
Feld2 = B

Mache ich das selbe beim zweiten Datensatz, kommt - wie gewünscht - eine Fehlermeldung:

„Die von Ihnen vorgenommenen Änderungen an der Tabelle ...“ usw.

Ich möchte nun diese Access-Meldung durch eine eigene ersetzen; beispielsweise durch:

MsgBox „Vorsicht, Duplikat. Datensatz kann nicht gespeichert werden“

Dabei weiß ich aber zweierlei nicht:
- Gehört der notwendige Code als Ereignisprozedur zum Ereignis „Bei Fehler“ oder zu einem anderen Ereignis?
- Wie muss codemäßig das „Drumherum“ lauten, damit nur noch die eigene MsgBox erscheint?

Für Hilfe wäre ich euch sehr dankbar.
Harry

hcscherzer
16.08.2009, 17:41
Eine Möglichkeit wäre, das über die Fehlerbehandlung abzufangen.
Eine andere in der Ereignisprozedur Form_BeforeUpdate() selber nach Duplikaten suchen ...

Harry16
16.08.2009, 17:49
Danke für die Antwort. Allerdings hilft mir das nicht so richtig weiter.

Egal erstmal, bei welchem Ereignis - ich kriege den Code nicht hin, der die Access-Meldung unterdrückt und stattdessen meine MsgBox verwendet. Die Access-Hilfe habe ich natürlich durchforscht, doch werde ich daraus nicht schlau.

Könntest du mir ein konkretes Code-Beispiel aufschreiben?

Harry

gpswanderer
16.08.2009, 17:55
Hallo,
am einfachsten im Ereignis "Bei Fehler"

Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 3022 Then
MsgBox "Vorsicht, Duplikat. Datensatz kann nicht gespeichert werden"
Me.Undo 'Nur wenn die Eingabe auch gelöscht werden soll.
Response = acDataErrContinue
Exit Sub
End If
MsgBox Err.Description
End Sub

Der Fehler 3022 (das ist die Doppeleingabe) wird abgefangen, jeder andere angezeigt.

Harry16
16.08.2009, 18:03
Wunderbar!!!

Klappt. Vielen Dank.

Harry

hcscherzer
16.08.2009, 18:11
Wann der Error genau geworfen wird, kann ich Dir leider nicht sagen.

Ich würde es von Hand so prüfen:sub form_beforeupdate(cancel as integer)
if dcount("*", "tbltest", "feld1 = '" & me!feld1 & "' and feld2 = '" & me!feld2 & "'") > 0 then
msgbox "die werte gibts schon"
me.undo
cancel = true
end if
end sub

/EDIT: Aha: Klaus wusste es und war schneller, logischerweise Form_Error ...

ebs17
16.08.2009, 18:45
Ich würde Hans-Christians Lösung bevorzugen und die Fehlerbehandlung nur bei wirklich unvorhersehbaren Fehlern einsetzen.

Die ungewünschte Doppeleingabe von Daten ist nun kein unvorhersehbarer Fehler und kann mit vorheriger Prüfung verhindert werden.

gpswanderer
16.08.2009, 18:54
Hallo,
da mit meinem Vorschlag ja ganz gezielt nur der Fehler 3022 abgefangen wird, sehe ich eigentlich keine Probleme, den Code zu verwenden.