Hallo,
Ich möchte einen Datensatz nur speichern wenn alle Pflichtfelder ausgefüllt sind.
Dazu mache ich eine Abfrage auf Änderungen und prüfe nun ob alle Pflichtfelder ausgefüllt sind. Wennn nicht kommt einem Meldung die darauf hinweist dass diese noch ausgefüllt werden müssen.
Das funktioniert soweit auch alles. Mein Problem ist jetzt folgendes:
User gibt Daten ein und verläßt das Ufo, dann kommt die Meldung "Änderungen speichern?" User klickt auf "Ja". Da aber nicht alle Pflichtfelder ausgefüllt wurden kommt die Meldung " Bitte alle erforderlichen Felder ausfüllen!".
Jetzt füllt der User nur einen Teil der Pflichtfelder aus und verläßt wieder das Ufo. Bei der jetzigen Frage ob er die Änderungen speichern will klickt er auf Nein.
Jetzt werden aber nur die Änderung rückgängig gemacht die nach der Meldung "Bitte alle erforderlichen Felder ausfüllen!" gemacht wurden. Die Daten die am Anfang eingegeben wurden sind gespeichert.
Wie kann ich diese Daten auch zurücksetzen?
Ich hoffen Ihr versteht mein Problem.
Hier die Datenbank falls von nöten -> Motordatenbank (http://www.weber-computerhilfe.de/temp/Motordatenbank21_2.zip)
Tom
Hi,
denkbar wäre doch, das erste Speichern nur zuzulassen, wenn alle erforderlichen Felder ausgefüllt sind.
Dann wäre ein "Rückspeichern" von unvollständigen Infos nicht nötig.
Harald
Zitat von: bahasu am Dezember 07, 2013, 19:24:52
denkbar wäre doch, das erste Speichern nur zuzulassen, wenn alle erforderlichen Felder ausgefüllt sind.
Dann wäre ein "Rückspeichern" von unvollständigen Infos nicht nötig.
Das sind ja alles gebundene Formularfelder, also wird ja sofort alles gespeichert.
Und ich möchte nicht alle Felder zurücksetzen nur weil eins nicht ausgefüllt wurde, sonst muss man ja immer alles neu eingeben.
Tom
hI;
Deine Routinen stehen an der falschen Stelle: nicht bei CLOSE
sondern bei "vor Aktualisierung"
Dort ist if me.dirty unnötig {wie schon zuvor erwähnt}
Eine Anweisung in der Art:
Cancel = CheckInput = FALSEgehört dorthin. Und auch noch:
If cancel then MsgBox "Bitte füllen Sie alle erforderlichen (roten) Felder aus!", vbInformation + vbOKOnly, "Hinweis"
Harald
PS die Gänsefüße bei "false" habe ich entfernt, da die Test-Routine einen Wahrheitswert liefert. Die Krücke über einen Text-String halte ich für suboptimal. Gilt zumindestens, wenn der Teil aus der anderen Anfrage umgesetzt wird. ;D
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
Deine Routinen stehen an der falschen Stelle: nicht bei CLOSE
sondern bei "vor Aktualisierung"
Verstehe ich das richtig ich muss die Routinen aus _BeforeUpdate nach _Close verschieben?
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
Dort ist if me.dirty unnötig {wie schon zuvor erwähnt}
Hab ich schon entfernt :)
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
Eine Anweisung in der Art:
Cancel = CheckInput = FALSEgehört dorthin. Und auch noch:
If cancel then MsgBox "Bitte füllen Sie alle erforderlichen (roten) Felder aus!", vbInformation + vbOKOnly, "Hinweis"
Wo soll diese Anweisung hin?
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
PS die Gänsefüße bei "false" habe ich entfernt, da die Test-Routine einen Wahrheitswert liefert. Die Krücke über einen Text-String halte ich für suboptimal. Gilt zumindestens, wenn der Teil aus der anderen Anfrage umgesetzt wird. ;D
Hab ich auch schon geändert da es auf einem anderem System zu Problemen führte.
Tom
Zitat von: -Tom- am Dezember 09, 2013, 20:27:54
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
Deine Routinen stehen an der falschen Stelle: nicht bei CLOSE
sondern bei "vor Aktualisierung"
Verstehe ich das richtig ich muss die Routinen aus _BeforeUpdate nach _Close verschieben?
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
Dort ist if me.dirty unnötig {wie schon zuvor erwähnt}
Hab ich schon entfernt :)
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
Eine Anweisung in der Art:
Cancel = CheckInput = FALSEgehört dorthin. Und auch noch:
If cancel then MsgBox "Bitte füllen Sie alle erforderlichen (roten) Felder aus!", vbInformation + vbOKOnly, "Hinweis"
Wo soll diese Anweisung hin?
Zitat von: bahasu am Dezember 08, 2013, 12:12:17
PS die Gänsefüße bei "false" habe ich entfernt, da die Test-Routine einen Wahrheitswert liefert. Die Krücke über einen Text-String halte ich für suboptimal. Gilt zumindestens, wenn der Teil aus der anderen Anfrage umgesetzt wird. ;D
Hab ich auch schon geändert da es auf einem anderem System zu Problemen führte.
Tom
Nein: Die Überprüfungsroutine auf unvollständige Daten darf nicht bei Close stehen, sie muss bei vor Aktualisierung stehen, damit Du eine Chance hast, vor dem Speichern darauf zu reagieren, wenn noch nicht vollständig.
Harald
Zitat von: bahasu am Dezember 09, 2013, 21:38:22
Nein: Die Überprüfungsroutine auf unvollständige Daten darf nicht bei Close stehen, sie muss bei vor Aktualisierung stehen, damit Du eine Chance hast, vor dem Speichern darauf zu reagieren, wenn noch nicht vollständig.
Aber die steht doch außer im Hfo immer im BeforeUpdate-Ereignis!
Das passiert z.B. im Ufo Getriebedaten. Wenn dort etwas geändert wird und so wie oben beschrieben verfahren wird, dann wird ein unvollständiger DS gespeichert.
Tom
Hi Tom,
wenn Du den Inhalt Deiner Überprüfungsroutine dem Parameter Cancel zuweist (siehe weiter oben), wird das Speichern verhindert, sofern Cancel auf TRUE gesetzt worden war.
Cancel ist True, wenn "CheckInput = FALSE" gilt.
CANCEL ist als Parameter in der Kopfzeile des Ereignisses deklariert.
Harald
Moin,
und nun ein Beispiel für das Formular "frm01MotorErfassungUfoMechDat"
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim CheckInput As String
Dim strMsgBox As Integer
If 1 = 2 Then ' damit werden die folgenden Zeilen deaktiviert
If Me.Dirty = True Then
strMsgBox = MsgBox("Änderungen speichern?", vbQuestion + vbYesNo, "Änderungen speichern")
If (strMsgBox = 6) Then 'JA wurde gedrückt
CheckInput = MechDatenPruefen_neu()
If (CheckInput = "FALSE") Then
'DoCmd.Undo
' Registerwechsel unterbinden bis alle Felder ausgefüllt sind
RegChgAllow = 0
MsgBox "Bitte füllen Sie alle erforderlichen (roten) Felder aus!", vbInformation + vbOKOnly, "Hinweis"
Exit Sub
Else
' Registerwechsel erlauben
RegChgAllow = 99
End If
Else
' Registerwechsel erlauben RegChgAllow = 99
Me.Undo
End If
End If
' ***************************************************************************************************
Else ' hier beginnt die alternative Routine
If MechDatenPruefen_neu() = True Then ' alle Daten korrekt eingetragen
Cancel = False
' Registerwechsel erlauben
RegChgAllow = 99
Else
' Registerwechsel unterbinden bis alle Felder ausgefüllt sind
RegChgAllow = 0
MsgBox "Bitte füllen Sie alle erforderlichen (roten) Felder aus!", vbInformation + vbOKOnly, "Hinweis"
strMsgBox = MsgBox("Änderungen speichern?", vbQuestion + vbYesNo, "Änderungen speichern")
If (strMsgBox = 6) Then 'JA wurde gedrückt
' Registerwechsel erlauben
RegChgAllow = 99
Cancel = False
Else
Cancel = True
End If
End If
End If ' hier endet die alternative Routine
End Sub
Die Abfrage, ob die Daten auch bei Unvollständigkeit gespeichert werden sollen, habe ich drin gelassen, um die Möglichkeit aufzuzeigen, dass trotzdem auf Nachfrage gespeichert werden kann {auch wenn ich das nicht für sinnvoll erachte}.
Harald
Danke für das Beispiel!
-Tom-