Formularfeld Fehleingabe entfernt u.Undo ergibt crash

05/08/2009 - 08:58 von Volker Neurath | Report spam
Hi zusammen,

gerade eben schockte mich Access:

ich habe in einem Formularfeld (Textfeld) eine Eingabe getàtigt, mich
aber umentschlossen, per Backspace gelöscht, dann meinen "undo" button
geklickt[1]. Ergebnis: crash mit Laufzeitfehler 94 "unzulàssige
verwendung von NULL".

Zu erwàhnen ist, dass in der "vor aktualisierung" eigenschaft mittels
DLOOKUP in einer Tabelle nachgesehen wird, ob der wert (Schlüsselfeld)
schon mal Vorkommt - wenn ja, erhàlt der Anwender eine Nachricht.

Der code:

Private Sub txtQuotationNr_BeforeUpdate(Cancel As Integer)

Dim strBoxPrompt As String, intBoxStatus As Integer

strBoxPrompt = Me!txtQuotationNr & " ist bereits vorhanden!"

'Existiert zu diese Quotation-Nr schon ein Eintrag?
If Not IsNull(DLookup("lngQuotationNr", "tblQuotMaster",
"lngQuotationNr = " & str(Me!txtQuotationNr))) _
And Me!txtQuotationNr <> Nz(Me!txtQuotationNr.OldValue) _
Then
intBoxStatus = MsgBox(strBoxPrompt, vbOKOnly + vbExclamation,
"Duplikat!")
Cancel = True
End If

'Eingabe numerisch?
If IsNumeric(Me!txtQuotationNr.Value) = False Then
MsgBox "Die Quotation-Nummer darf nur Ziffern enthalten!", _
vbOKOnly + vbExclamation, "Eingabe nicht numerisch!"
Cancel = True
End If

If Cancel Then
Me!txtQuotationNr.Undo
End If

End Sub


Im Debugger ist nach dem Crash die Zeile mit

"IF Not Isnull(Dlookup)..."

markiert.

Frage 1:
warum kommt es zu diesem Fehler?

Frage 2:
warum kommt es nicht zu diesem Fehler, wenn ich nur den "undo" button
betàtige (der letzlich ein Me.Undo ausführt)?

die Frage nach der Fehlerbehandlung stelle ich mal eher nicht... ;)

Volker
[1] Ja ich weiss, dass ich nur den UNDO Button betàtigen muss. War eine
Art "Reflexhandlung" ... die ich noch abfangen muss.

Wenn es vom Himmel Zitronen regnet -- lerne, Limonade zu machen.
 

Lesen sie die antworten

#1 Josef Poetzl
05/08/2009 - 09:41 | Warnen spam
Hallo!

Volker Neurath schrieb:
[...]
Ergebnis: crash mit Laufzeitfehler 94 "unzulàssige
verwendung von NULL".


[...]
If Not IsNull(DLookup("lngQuotationNr", "tblQuotMaster",
"lngQuotationNr = " & str(Me!txtQuotationNr))) _
And Me!txtQuotationNr <> Nz(Me!txtQuotationNr.OldValue) _
Then


[...]
Im Debugger ist nach dem Crash die Zeile mit
"IF Not Isnull(Dlookup)..."
markiert.



Tipp:
Sobald mehrere Anweisungen in einer "Zeile" vorhanden sind, ist das
Aufteilen in mehrere einzelne Anweisungen für die Fehlersuche
hilfreich.

dim strKrit as string
strKrit = "lngQuotationNr = " & str(Me!txtQuotationNr)
debug.print strKrit '!!! bei Me!txtQuotationNr = NULL
If Not IsNull(DLookup("lngQuotationNr", "tblQuotMaster", strKrit) ...

=> du kannst abbrechen, sobald Me!txtQuotationNr NULL ist, da du
vermutlich nicht den NULL-Wert nicht mit DLookup suchen willst.


Frage 1:
warum kommt es zu diesem Fehler?



DLookup("lngQuotationNr", "tblQuotMaster", "lngQuotationNr = ")
.. mit diesem Filterausdruck wird DLookup nicht viel anfangen können.
;-)


Frage 2:
warum kommt es nicht zu diesem Fehler, wenn ich nur den "undo" button
betàtige (der letzlich ein Me.Undo ausführt)?



Weil damit das Ereignis BeforeUpdate von txtQuotationNr nicht
ausgelöst werden wird.
... das hàttest du aber selbst feststellen können, wenn du Haltepunkte
verwendest oder mit debug.print arbeitest bzw. eine MsgBox anzeigen
làsst.

die Frage nach der Fehlerbehandlung stelle ich mal eher nicht... ;)



Brauchst du auch nicht, da du diesen Fehler vermeiden kannst. ;-)

mfg
Josef


EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen