Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Eingabeformular mit Warnmeldung bei Datensatzänderung

Begonnen von Sebastian5, November 27, 2024, 11:03:34

⏪ vorheriges - nächstes ⏩

Sebastian5

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


MzKlMu

Hallo,
mit Me.cboVertrag.UnDowird der alte Wert wieder verwendet.
Code nach (oder vor) Cancel = True
Gruß Klaus

Knobbi38

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

Beaker s.a.

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 Sub
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Knobbi38

@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?


Sebastian5

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Knobbi38

@Ekkehard:

Ich hatte ja schon geschrieben, daß er sich das nochmal anschauen sollte. Da läßt sich sicherlich noch etwas vereinfachen.

VG
Ulrich

MzKlMu

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.
Gruß Klaus