Hallo zusammen,
gerade bin ich dabei meine Datenbank etwas "benutzersicherer" zu gestalten. Bei einem Formular zur Dateneingabe soll bei Änderung eines bestehenden Datensatzes eine Warnmeldung erscheinen "Soll Merkmal wirklich zu ... geändert werten?" Wenn man in der Warnmeldung auf OK klickt, soll der Datensatz geändert werden und beim Klicken auf Abbrechen soll der alte Wert beibehalten werden. In einem Lehrbuch habe ich einen Code gefunden, der dies fast so umsetzt. Hier ist aber vorgesehen, das man beim Klicken auf Abbrechen nur das Eingabefeld nicht verlassen kann. Ich möchte aber, dass dann der alte Wert bestehen bleibt. Ich füge mal den Code bei:
Option Compare Database
Option Explicit
'Neuer Datensatz; prüfen, ob eine Vertragsbezeichnung gewählt wurde.
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNullVertrag() Then
Cancel = True
Exit Sub
End If
End Sub
'In einem bestehenden Datensatz wird die Vertragsbezeichnung geändert.
Private Sub cboVertrag_BeforeUpdate(Cancel As Integer)
Dim strMeldung As String
'Prüfen, ob die Vertragsbezeichnung entfernt wurde.
If IsNullVertrag() Then
Cancel = True
Exit Sub
End If
'Wird die Vertragsbezeichnung erstmalig eingetragen oder wird sie geändert?
If Not IsNull(Me.cboVertrag.OldValue) Then
'Die Vertragsbezeichnung wird geändert
'In der Meldung soll die neue Vertragsbezeichnung namentlich erscheinen.
strMeldung = "Die Vertragsbezeichnung wirklich zu" & vbCrLf _
& """" & Me.cboVertrag.Column(1) & """" & vbCrLf _
& "ändern?"
'Die Meldung ausgeben
If MsgBox(strMeldung, _
vbExclamation + vbOKCancel) _
= vbCancel _
Then
'Es wurde "Abbrechen" oder ESC gedrückt.
'Die nächste Zeile verhindert, dass der Benutzer das
' Komibinationsfeld verlassen kann.
Cancel = True
'Jetzt bleiben dem Benutzer zwei Möglichkeiten:
'1) Das Kombinationsfeld erneut verlassen, diesmal aber die
' Warnmeldung mit OK bestätigen.
'2) ESC drücken, sodass Access die alte Abteilung beibehält.
End If
End If
End Sub
'Die Vertragsbezeichnung darf niemals leer sein.
'Auf NULL-Wert in "cboVertrag" prüfen und ggf. Fehlermeldung ausgeben.
'Rückgabewert: TRUE, falls "cboVertrag" den Wert NULL enthält.
' Andernfalls FALSE
Private Function IsNullVertrag() As Boolean
If IsNull(Me.cboVertrag) Then
MsgBox "Die Vertragsbezeichnung darf nicht leer sein!", _
vbExclamation + vbOKOnly
IsNullVertrag = True
Else
IsNullVertrag = False
End If
End Function
Die Zeile Cancel = true müsste zu "alten Wert beibehalten" geändert werden. Hat da jemand eine Idee?
Viele Grüße
Sebastian
Hallo,
mit Me.cboVertrag.UnDowird der alte Wert wieder verwendet.
Code nach (oder vor) Cancel = True
Hallo Sebastian,
vielleicht noch einen Hinweis: mit der Eigenschaft NewRecord des Formulars kannst du unterscheiden, ob ein neuer DS angeleget oder ein DS geändert wird. Vielleicht hilft dir das ja, deinen Code etwas zu vereinfachen.
Gruß
Ulrich
Hallo,
Das sollte also geklärt sein (Post von Klaus). Ich hätte aber noch eine kleine
"Verbesserung" zu Form_BeforeUpdate.
Du hast doch eine Function, die einen Booleanwert zurück gibt. Den kannst du
auch direkt an den Parameter "Cancel" weiterreichen
Private Sub Form_BeforeUpdate(Cancel As Integer)
Cancel = IsNullVertrag
End Subgruss ekkehard
@Beaker s.a. Das hilft in dem Fall aber nicht wirklich weiter, weil dann ja kein "Exit" erfolgt. Was ist dann mit der zweiten Prüfung?
Hallo zusammen,
wieder großen Dank für die schnelle und kompetente Hilfe. Der Code funktioniert nach der Änderung von Klaus genau so wie er soll. Die anderen beiden Vorschläge probiere ich aber auch noch aus.
Gruß Sebastian
Hallo Ulrich,
Die 2. Prüfung findet aber in einer anderen Prozedur statt. Ich hatte nur
"Form_BeforeUpdate" im Auge.
Da die Prüfung allerdings schon vorher (in "Kombi_BeforeUpdate")
stattfindet bin fast der Meinung, dass die nochmalige Prüfung in
"Form_BeforeUpdate" sogar überflüssig ist.
gruss ekkehard
@Ekkehard:
Ich hatte ja schon geschrieben, daß er sich das nochmal anschauen sollte. Da läßt sich sicherlich noch etwas vereinfachen.
VG
Ulrich
Hallo,
im Normalfall legt man alles was mit Datenvalierung zu tun hat in das Formularereigniss "Vor Aktualisierung".
Dort sammelt man die Eingabe (bzw. auch logische) Fehler und zeigt diese in einer MsgBox zusammengefasst an.
Mit dortigem Cancel=True lässt sich auch das Speichern unvollständiger/falscher Datensätze wirksam verhindern.