Eingabepruefung die Zweite

01/10/2008 - 14:16 von Volker Neurath | Report spam
Hallo zusammen,

bin mit meiner Prüfung der Eingabewerte schon ein gutes Stück
weitergekommen, nachdem ich jetzt dank eurer Hilfe weiss, wo die Prüfung
erfolgen muss ;)

Ein Punkt macht mir aber Kopfzerbrechen:

Ich habe in der Form_Errors zunàchst eine eigene Routine erstellt, die
gezielt Fehler in verschiedenen Feldern abfàngt.

Für alle Fehler, die diese Routine NICHT abfàngt, soll jedoch eine
Meldung der Routine "StandardErrors"
(http://www.pdtech.co.uk/products/ge...andler.htm Danke an Jens
Schilling für den Link!) erscheinen.

Nur: dat klappert nich' ;)

Der Knackpunkt ist, dass meine Eigene Routine diverse Pflichtfelder (per
Tag als solche gekennzeichnet) daraufhin abfragt, ob diese überhaupt
gefüllt sind.
Erst im nàchsten Schritt soll die Prüfung auf semantisch korrekte
Eingabe erfolgen, also z.B. ob nicht in einem Zahlenfeld Buchstanben
eingegeben wurden.
Aber: wenn ich in ein Zahlenfeld Buchstaben eingebe, dann "schreit"
schon meine eigene Prüfroutine und meldet - fàlschlicher Weise" - ich
hàtte das betreffende Pflichtfeld /nicht/ gefüllt.

Frage daher: gibt es eine Möglichkeit zwischen "im Feld ist nix drin"
und "im Feld ist das Falsche drin" zu unterscheiden?

Ich könnte latür _erst_ prüfen, ob Buchstaben im Zahlenfeld sind, aber:
was passiert in diesem Fall, wenn der Feldinhalt NULL ist?
IMO müsste es dann zu einem (anderen?) Fehler kommen, denn "nichts" kann
ja schlecht auf "numerisch oder nicht" geprüft werden.

Wohl gemerkt: die Einzelprüfungen meiner Routine funktionieren so wie
ich mir das vorstelle - lediglich diese "Vorabprüfung" làuft nicht so,
wie ich mir das wünsche.


Hier ist meine eigene Routine (ohne Prüfung auf Buchstabe in Zahlen-
oder Datumsfeld - das soll "StandardErrors" machen)

Private Function Validierung() As Boolean
'die Funktion prüft:
'- ob alle Pflichtfelder gefüllt sind
'- ob die Daten stimmig sind, woweit möglich
' (z.B. ob Ausschreibungsdatum >= Erfassungsdatum)

Dim ctl As Control

Dim ans As Long

Validierung = False

For Each ctl In Me.Controls
If ctl.Tag = "pflicht" Then
If IsNull(ctl) Or ctl = 0 Then
MsgBox "Pflichtfeld nicht ausgefüllt. Bitte füllen sie
die " _
& "rot markierten Felder.", vbOKOnly + vbExclamation,
"Fehlendes Pflichtfeld"
ctl.BackColor = vbRed
ctl.SetFocus
Exit Function
End If
End If
Next ctl

If Not IsNull(Me!txtAusschreibungdatum) Then
If Me!txtErfassungsDatum > Me!txtAusschreibungdatum Then
MsgBox "Das Enddatum der Ausschreibung darf nicht vor "
_
& "dem Erfassungsdatum liegen.", vbOKOnly +
vbExclamation, "Falsche Datumseingabe"
Me!txtErfassungsDatum.SetFocus
Exit Function
End If
End If

If Not (IsNull(Me!txtMasterQuotation)) And Not
(IsNull(Me!txtVorgaenger)) Then

If Me!txtMasterQuotation > Me!txtQuotation Then
MsgBox "Die Nummer der MasterQuotation kann nicht größer
sein, " _
& "als die Nummer der aktuellen Quotation. ", vbOKOnly +
vbExclamation, "Falsche Master-Nummer"
Me!txtMasterQuotation.SetFocus
Exit Function
End If

Select Case Me!txtVorgaenger
Case Is > Me!txtQuotationNr
MsgBox "die Vorgànger-Nummer darf nicht größer sein, " _
& "als die Quotation Nr.", vbOKOnly + vbExclamation,
"Fehlerhafte Vorgàngernummer"
Me!txtVorgaenger.SetFocus
Exit Function
Case Is > Me!MasterQuotation
MsgBox "die Vorgànger-Nummer darf nicht größer sein, " _
& "als die Master Nr.", vbOKOnly + vbExclamation,
"Fehlerhafte Master-Nummer"
Me!txtVorgaenger.SetFocus
Exit Function
End Select

End If

If Me!txtAnzGer < 0 Then
MsgBox "Die Geràtezahl kann nicht kleiner als Null sein.",
vbOKOnly + vbExclamation, _
"Ungültige Geràtezahl"
Me!txtAnzGer.SetFocus
Exit Function
End If

Select Case Me!txtErfDauer
Case Is < 0
MsgBox "Die Erfassungsdauer kann nicht kleiner Null sein.",
_
vbOKOnly + vbExclamation, "Erfassungsdauer kleiner Null"
Me!txtErfDauer.SetFocus
Exit Function
Case Is < 20
ans = MsgBox("Die von ihnen eingegebene Erfassungsdauer
betràgt " _
& "weniger als 20 Minuten. Wirklich eintragen?", vbYesNo
+ vbExclamation, _
"Erfassungsdauer kleiner 20 Minuten!")
If ans = vbNo Then
Me!txtErfDauer.SetFocus
Exit Function
End If
Case Is > 240
ans = MsgBox("Die von ihnen eingegebene Erfassungsdauer
betràgt " _
& "mehr als 240 Minuten (4 Stunden). Wirklich
eintragen?", vbYesNo + vbExclamation, _
"Erfassungsdauer größer 240 Minuten = 4 Stunden!")
If ans = vbNo Then
Me!txtErfDauer.SetFocus
Exit Function
End If
End Select


Validierung = True

End Function

und das hier habe ich in "Form_Error" eingetragen:

Private Sub Form_Error(DataErr As Integer, Response As Integer)

If Not (Validierung()) And StandardErrors(DataErr) Then
Response = False
End If

End Sub
-


Nett wàre, wenn mir jemand erklàren könnte, wo diesmal mein Denkfehler
liegt und wie ich das "gerade biegen" kann.


Und bevor jemand fragt: meine Access-Version ist immernoch A03 ;)

Volker

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

Lesen sie die antworten

#1 Henry Habermacher
01/10/2008 - 15:28 | Warnen spam
Hallo Volker

Volker Neurath wrote:
Der Knackpunkt ist, dass meine Eigene Routine diverse Pflichtfelder (per
Tag als solche gekennzeichnet) daraufhin abfragt, ob diese überhaupt
gefüllt sind.
Erst im nàchsten Schritt soll die Prüfung auf semantisch korrekte
Eingabe erfolgen, also z.B. ob nicht in einem Zahlenfeld Buchstanben
eingegeben wurden.
Aber: wenn ich in ein Zahlenfeld Buchstaben eingebe, dann "schreit"
schon meine eigene Prüfroutine und meldet - fàlschlicher Weise" - ich
hàtte das betreffende Pflichtfeld /nicht/ gefüllt.



Der Form_Error schlàgt vermutlich bereits zu, wenn der Input erst im
Control.Text Property und noch nicht im Control.Value Property drin ist,
also beim BeforeUpdate des Controls und nicht beim AfterUpdate des Controls.
Daher wird Deine Routine nichts im Control sehen, es sei denn, diese setze
den Focus auf das Control und werde dann das .Text Property aus.

Ich selber finde das ziemlich umstàndlich. Ich verlege solche Dinge jeweils
in das Form_BeforeUpdate. Das Form soll gefàlligst alle Eingaben fressen.
Ich kann anschliessend einfacher kontrollieren, ob das die richtigen
Eingaben sind. Daher ist bei mir der Form_Error jeweils leer.

Gruss
Henry


11. AEK Anmeldung unter http://donkarl.com/?AEK
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com

Ähnliche fragen