Problem mit On Error Handling

31/03/2010 - 17:04 von Johannes C. Laxander | Report spam
Hallo,

beim Ausführung des folgenden Codes tritt eine Situation ein, die ich nicht
nachvollziehen kann, und auch nicht weiss, wei ich den Fehler beheben kann.

In der Funktion PersonedatenHInzufuegen tritt beim AddNew der Fehler
-2147217887 auf, der in der Error-Routine Err_PersonendatenHinzufuegen
abgefangen wird. Im JA-Zweig der MsgBox-Antwort-Abfrage tritt dann bei
rsPersonen.Find wieder ein Fehler auf. Der wird aber von der Fehler-Routine
Err_btnTeilnehmerHinzufuegen_Click der aufrufenden Prozedur abgefangen.
Err.Number zeigt den gleichen Fehler wie zuvor an (was bei einem rs.Find ja
eigentlich nicht sein kann) !

Warum làuft das Programm in diese Fehlerroutine und nicht in die
Fehlerroutine Err2_PersonendatenHinzufuegen????

Private Sub btnTeilnehmerHinzufuegen_Click()
On Error GoTo Err_btnTeilnehmerHinzufuegen_Click
'Eingabe prüfen und Datensaetze in tblPersonen und tblEventteilnehmer anlegen

Dim lngPersonenID As Long

'Prüfen, ob Personendaten aus Liste übernommen wurden
If Len(Nz(Me!sfrmNeuerEventteilnehmer!PersonenID, "")) = 0 Then
'Personendaten noch nicht vorhanden - neu anlegen
lngPersonenID = PersonendatenHinzufuegen
If lngPersonenID = 0 Then Exit Sub
Else
'Personendaten bereits vorhanden - ID übernehmen
lngPersonenID = CLng(Me!sfrmNeuerEventteilnehmer!PersonenID)
End If

Exit_btnTeilnehmerHinzufuegen_Click:
Exit Sub

Err_btnTeilnehmerHinzufuegen_Click:
MsgBox Err.Number & " - " & Err.Description, vbCritical,
MSGTITLE_VERARBEITUNGSFEHLER
Resume Exit_btnTeilnehmerHinzufuegen_Click

End Sub

Private Function PersonendatenHinzufuegen() As Long
On Error GoTo Err_PersonendatenHinzufuegen

Dim cn As ADODB.Connection
Dim rsPersonen As ADODB.Recordset
Dim intAntwort As Integer

Set cn = CurrentProject.Connection
Set rsPersonen = New ADODB.Recordset

'Personendatensatz anlegen
rsPersonen.Open "tblPersonen", cn, adOpenKeyset, adLockOptimistic
rsPersonen.AddNew
...

Exit_PersonendatenHinzufuegen:
'If rsPersonen.State = adStateOpen Then rsPersonen.Close
Set rsPersonen = Nothing
Set cn = Nothing
Exit Function

Err_PersonendatenHinzufuegen:
Dim lngErrorNumber As Long
lngErrorNumber = Err.Number
On Error GoTo 0
On Error GoTo Err2_PersonendatenHinzufuegen

Select Case lngErrorNumber
Case Is = -2147217887
'Person bereits angelegt (doppelter PersonenMatchcode:
Name,Vornam,Ort geleich)
intAntwort = MsgBox("Personendaten für diesen Teilnehmer
existieren bereits. Soll der Teilnehmer mit diesen Daten angelegt werden?!", _
20, MSGTITLE_HINWEIS)
If intAntwort = vbYes Then
rsPersonen.Find "[Name]='" +
Trim(Me!sfrmNeuerEventteilnehmer!Name) + "' AND " + _
"[Vorname]='" +
Trim(Me!sfrmNeuerEventteilnehmer!Vorname) + "' AND " + _
"[Ort]='" +
Trim(Me!sfrmNeuerEventteilnehmer!Ort) + "'"
If rsPersonen.EOF Then
MsgBox "Personen-Matchcode doppelt, trotzdem kein
Datensatz gefunden!", _
vbCritical, MSGTITLE_VERARBEITUNGSFEHLER
PersonendatenHinzufuegen = 0
Else
PersonendatenHinzufuegen = rsPersonen!ID
End If
Else
PersonendatenHinzufuegen = 0
End If
Case Else
PersonendatenHinzufuegen = 0
MsgBox Err.Number & " - " & Err.Description, vbCritical,
MSGTITLE_VERARBEITUNGSFEHLER
End Select
Resume Exit_PersonendatenHinzufuegen

Err2_PersonendatenHinzufuegen:
PersonendatenHinzufuegen = 0
MsgBox Err.Number & " - " & Err.Description, vbCritical,
MSGTITLE_VERARBEITUNGSFEHLER
Resume Exit_PersonendatenHinzufuegen

End Function

Gruß, Johannes.
 

Lesen sie die antworten

#1 Thomas Möller
31/03/2010 - 17:29 | Warnen spam
Hallo Johannes,

Am 31.03.2010 17:04, schrieb Johannes C. Laxander:
beim Ausführung des folgenden Codes tritt eine Situation ein, die ich nicht
nachvollziehen kann, und auch nicht weiss, wei ich den Fehler beheben kann.

In der Funktion PersonedatenHInzufuegen tritt beim AddNew der Fehler
-2147217887 auf, der in der Error-Routine Err_PersonendatenHinzufuegen
abgefangen wird. Im JA-Zweig der MsgBox-Antwort-Abfrage tritt dann bei
rsPersonen.Find wieder ein Fehler auf. Der wird aber von der Fehler-Routine
Err_btnTeilnehmerHinzufuegen_Click der aufrufenden Prozedur abgefangen.
Err.Number zeigt den gleichen Fehler wie zuvor an (was bei einem rs.Find ja
eigentlich nicht sein kann) !

Warum làuft das Programm in diese Fehlerroutine und nicht in die
Fehlerroutine Err2_PersonendatenHinzufuegen????



das wird so leider nicht funktionieren.

Zitat aus der Online-Hilfe:

Wenn ein Fehler auftritt, wàhrend eine Fehlerbehandlungsroutine aktiv
ist (also zwischen dem Auftreten des Fehlers und der Ausführung einer
Resume-, Exit Sub-, Exit Function- oder Exit Property-Anweisung), kann
die Fehlerbehandlungsroutine den Fehler nicht bearbeiten. Das Programm
wird in der aufrufenden Prozedur fortgesetzt.

Die Lösung Deines Problem besteht darin, den Code, den Du jetzt in der
Fehlerbehandlung stehen hast, der den zweiten Fehler auslöst, in eine
eigene Prozedur auszulagern. Dort kannst Du wiederum eine eigene
Fehlerbehandlung definieren und de zweiten auftretenden Fehler sauber
abfangen.

Select Case lngErrorNumber
Case Is = -2147217887
Call Nachfragen
Case Else ...
End Select


HTH
Thomas

Homepage: www.Team-Moeller.de

Ähnliche fragen