Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Else am Juli 10, 2015, 11:54:46

Titel: Pflichtfeld bei "falscher" Änderung automatisch wieder mit Ursprungswert belegen
Beitrag von: Else am Juli 10, 2015, 11:54:46
Hallo zusammen und vielen Dank für die Aufnahme in diesem Forum.

Ich benutze Access 2013 und habe ein Problem mit den Pflichtfeldern in einem gebundenen Formular. (Die Pflichtfeld-Eigenschaft ergibt sich aus der Eigenschaft des jeweiligen Tabellenfeldes, programmiert hab ich hierzu bislang nichts.)
Wenn ich mit diesem Formular die gebundenen Datensätze bearbeite und nun den Wert eines Pflichtfeldes lösche, bekomme ich, wenn ich versuche, das Feld zu verlassen, richtigerweise die Messagebox "Geben Sie einen Wert in das Feld ein".
So ist es ja auch von Access vorgesehen, aber das macht mich nicht froh, denn Access "kennt" ja einen Wert für dieses Feld, der besser ist als nichts, nämlich den vorherigen Eintrag. Ich möchte deshalb gerne erreichen, dass das Feld bei unzulässiger Eingabe auf den Ursprungswert zurückspringt, anstatt eine quengelige Textbox anzuzeigen und den Nutzer auf dem Textfeld festzunageln.

Welchen Event-Handler muss ich hierzu benutzen? Ich hab den Eindruck, was auch immer ich tue, kommt mir die Access-eigene Prüfroutine zuvor. Oder kann ich den Fehler gezielt abfangen?

Ich würde mich freuen, wenn mir jemand einen Wink in die richtige Richtung geben könnte, damit ich Montag mit neuem Schwung weiterarbeiten kann. Momentan werde ich nur immer wirrer im Kopf und werfe mit Sachen. ;-)

Viele Grüße
Irene
Titel: Re: Pflichtfeld bei "falscher" Änderung automatisch wieder mit Ursprungswert belegen
Beitrag von: el_gomero am Juli 10, 2015, 12:21:38
Hallo Irene,

im BeforeUpdate Event des Steuerelements kannst du auf einen gültigen Wert prüfen und den ggf ersetzen.

Beispiel von MS (https://msdn.microsoft.com/en-us/library/office/ff822421.aspx)

Private Sub ProductName_BeforeUpdate(Cancel As Integer)
    If(Not IsNull(DLookup("[ProductName]", _
        "Products", "[ProductName] ='" _
        & Me!ProductName & "'"))) Then
        MsgBox "Product has already been entered in the database."
        Cancel = True
        Me!ProductName.Undo
    End If
End Sub

Titel: Re: Pflichtfeld bei "falscher" Änderung automatisch wieder mit Ursprungswert belegen
Beitrag von: DF6GL am Juli 10, 2015, 18:08:05
Hallo,

Zitat
denn Access "kennt" ja einen Wert für dieses Feld, der besser ist als nichts, nämlich den vorherigen Eintrag.

Na, das ist ja auch eine Plausibilitäts-Sichtweise   ;) :o 8)

Was hat denn der "vorherige" Datensatz mit dem aktuellen zu tun?

Wie auch immer, das Formular-Ereignis "Bei Fehler" ("Form_Error(...)") könnte auch zur Behandlung der auftretenden Fehlersituation benutzt werden.
Titel: Re: Pflichtfeld bei "falscher" Änderung automatisch wieder mit Ursprungswert belegen
Beitrag von: MaggieMay am Juli 10, 2015, 23:53:44
Hi,
ZitatWas hat denn der "vorherige" Datensatz mit dem aktuellen zu tun?
so wie ich das verstanden habe, geht es nicht um den vorherigen Datensatz sondern um den vorherigen Inhalt des Datenfeldes vor der Änderung bzw. Löschung des Inhalts, also um die OldValue-Eigenschaft.
Die ließe sich wie bereits erwähnt mit UnDo leicht wiederherstellen.
Titel: Re: Pflichtfeld bei "falscher" Änderung automatisch wieder mit Ursprungswert belegen
Beitrag von: DF6GL am Juli 11, 2015, 08:14:06
Ja, vermutlich ist das auch so gemeint....
Titel: Re: Pflichtfeld bei "falscher" Änderung automatisch wieder mit Ursprungswert belegen
Beitrag von: Else am Juli 13, 2015, 14:31:49
Hallo zusammen,

@Jürgen: Herzlichen Dank, ich hab jetzt das BeforeUpdate-Event benutzt und es funktioniert. (Ich hatte das schon früher versucht, aber dabei Cancel nicht auf True gesetzt, deshalb hatte es da nicht geklappt und ich wähnte mich auf dem falschen Weg.)

@Franz: Ups, ich meinte nicht den vorherigen Datensatz als Auffangwert, sondern den ursprünglichen, also den OldValue. Sorry für die unklare Ausdrucksweise. Danke für den Tipp, das Form_Error-Ereignis zu benutzten, das werde ich als Alternativweg unbedingt ausprobieren.

@MaggieMay: hat mich zum Glück richtig verstanden, dankesehr! :-)

So hab ich's jetzt gemacht:


Public Function pruefeLeer(eingabe As Variant) As Boolean

    eingabe = Trim(eingabe)
    If (IsEmpty(eingabe) = True) Or (eingabe = "") _
        Or (IsNull(eingabe) = True) Or (Format(eingabe) = vbNullString) Then
        pruefeLeer = True
    Else
        pruefeLeer = False
    End If

End Function

Private Sub txtTitel_BeforeUpdate(Cancel As Integer)

    If pruefeLeer(Me!txtTitel) = True Then
        Cancel = True
        Me!txtTitel.Undo
    End If
   
End Sub


Viele Grüße und eine schöne Woche
Irene