Hi,
ich habe ein Problem mit einem Feld. Das Kombifeld heißt "Bereich".
Hier möchte ich, dass beim schließen des Formulars geprüft ob, ob das Feld ausgefüllt wurde. Wenn es nicht ausgefüllt wurde, soll eine Fehlermeldung erscheinen und das Formular nicht schließen bzw. der Datensatz nicht speichern / erfasst werden.
Kann ich dies per VBA realisieren? Kann mir jemand den Code nennen?
Formularname: frmHal_Vorgangerfassung
Kombifeldname: Bereich
Danke
Hallo,
Vermutlich meinst Du eine Prüfung des Feldes auf Inhalt, bevor der DS gespeichert wird.
Solches kann im Form_BeforeUpdate-Ereignis passieren:
Sub Form_BeforeUpdate(Cancel as Integer)
If IsNull( Me!Bereich) Then
Msgbox "Bitte Bereich ausfüllen", vbOkOnly
Me!Bereich.Setfocus
Me!Bereich.Dropdown
Cancel =True
End If
End Sub
Im groben könnte man so im Formularmodul vorgehen.Private CanClose As Boolean
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.Bereich) Then
MsgBox "Bitte einen Bereich auswählen."
Cancel = True
End If
CanClose = Not Cancel
End Sub
Private Sub Form_Dirty(Cancel As Integer)
CanClose = False
End Sub
Private Sub Form_Undo(Cancel As Integer)
CanClose = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
Cancel = CanClose = False
End Sub
Hi Lachtaube,
ja genau so eine Funktion meine ich.
Geht das ganze auch mit 2 Pflichtfelder?
1x Pflichtfeld Bereich
1x Pflichtfeld Kunde
Wie sieht da der Code aus?
If IsNull(Me.Bereich) Or IsNull(Me.Kunde) Then
...
Cancel = True
ElseIf IsNull(Me.Kunde) Then
MsgBox "Bite einen Kunden eintragen."
Cancel = True
End If
...Optional jeweils zusätzlich DF6GLs SetFocus-Anweisung einbauen.
Hallo,
würde da nicht ElseIf bemühen, sondern für jedes Feld einen eigenen Bedingungsblock (sofern es keine Abhängigkeiten bei den Feldern gibt) einbauen.
Mir genügt das Feststellen einer einzigen Regelverletzung (auch wenn es deren viele gibt), um das Speichern zu verhindern. Wenn die Benutzerführung im Eingabeformular so schlecht ist, dass der Benutzer nur diese eine Korrektur vornimmt, wird er spätestens beim nächsten Speicherversuch auf die nächste bemerkte Regelverletzung hingewiesen, bis keine Ungültigkeiten mehr festgestellt werden.
FWIW: Eine Implementation über die Eigenschaften Gültigkeitsregel/Gültigkeitsmeldung der Steuerelemente wäre bei dieser einfachen Anforderung auch denkbar, wobei die Behandlung dann im Bei Fehler Ereignis des Formulars erfolgen würde.
Hallo zusammen.
Ich möchte vor dem schließen des Formulars prüfen a, ob die "Geräte Nummer" bereits vergeben ist (das funktioniert) und b. dass die Eingabe im Feld "Geräte Nummer" ein Pflichtfeld ist und nicht geschlossen und gespeichert werden kann ( Das funktioniert nicht)
Wo ist da der fehler?
Und ist die abfrage für das Pflichtfeld da richtig oder kommt der Code im btn.Schließen und speichern?
Private Sub Geräte_Nummer_BeforeUpdate(Cancel As Integer)
If DCount("*", "Objekt", "[Geräte Nummer]='" & Me![Geräte Nummer] & "'") > 0 Then
MsgBox "Diese Geräte Nummer ist bereits schon vergeben, bitte eine neue Geräte Nummer anlegen "
Me.Undo
Cancel = True
If IsNull(Me![Geräte Nummer]) Then
MsgBox "Bitte eine Geräte Nummer anlegen"
Me.Undo
Cancel = True
End If
End Sub
Hallo,
besser ist, erst auf NULL zu testen und danach, ob die Nummer schon existiert.
Zudem wirkt der Code nur, wenn tatsächlich im Feld [Geräte Nummer] (Auf Leer- und Sonderzeichen in Namen DRINGEND verzichten!) etwas verändert wird.
Im Form_BeforeUpdate-Ereignis wäre die Prüfung besser aufgehoben,
Private Sub Geräte_Nummer_BeforeUpdate(Cancel As Integer)
If IsNull(Me![Geräte Nummer]) Then
MsgBox "Bitte eine Geräte Nummer anlegen"
Cancel = True
ElseIf DCount("*", "Objekt", "[Geräte Nummer]='" & Me![Geräte Nummer] & "'") > 0 Then
MsgBox "Diese Geräte Nummer ist bereits schon vergeben, bitte eine neue Geräte Nummer anlegen "
Me.Undo
Cancel = True
End If
End Sub
Hallo Franz, vielen dank für die Lösung. Es funktioniert. Das nächste Problem was ich jetzt dabei habe ist wenn ich den Button "Speichern und schließen" drücke (erstellt Makro: Datensatz speichern & Fenster schließen) meldet er bei bedarf die zwei MsgBox. Nach bestätigen durch OK schließt das Fenster und eine Fehlermeldung im Makrofenster erscheint. (Makro anhalten)
Es soll aber doch nur schließen wenn die Pflichtfelder eingegeben wurden. Was habe ich jetzt wieder falsch bedacht ?
Hallo,
naja, Du mußt eben, wenn Du Makros verwendest (davon ist aber abzuraten), auch eine Fehlerbehandlung in den Makroablauf einbauen. Zudem, wenn das Fenster geschlossen werden soll und es eine Fehlersituation gibt, erscheint eben eine Fehlermeldung.
Ich würde nochmal den Vorgang "Speichern und Schließen" logisch durchdenken.
Okay, ich habe versucht mich vom Makro zu lösen und habe einen Code erstellt, mit den Abfragen. Gleiche Problem. Meldet (Richtig) Fehler, wenn die gleiche Geräte Nummer oder keine vorhanden ist. Beim bestätigen schließt sich das Formular ohne zu speichern.
Private Sub SpeichernUndSchliessen_Click()
If IsNull(Me![Geräte Nummer]) Then
MsgBox "Bitte eine Geräte Nummer anlegen"
Cancel = True
ElseIf DCount("*", "Objekt", "[Geräte Nummer]='" & Me![Geräte Nummer] & "'") > 0 Then
MsgBox "Diese Geräte Nummer ist bereits schon vergeben, bitte eine neue Geräte Nummer anlegen "
Cancel = True
End If
DoCmd.Close acForm, "Eingabemaske_Einrichtung", acSaveYes
End Sub
Anstatt zu schließen soll die (noch nicht ausgefüllte Zeile) bearbeitet werden und das schließen muss unterbunden werden.
Habe seit deiner Antwort darüber nachgedacht und getestet. Mag mir einer Helfen wollen.... mit rat und tat ;-)
Hallo,
Du musst dem Vorschlag von Franz aus #9 folgen und das Ereignis "BeforeUpdate" verwenden. Nur in diesem Ereignis kann Cancel=True verwendet werden. In Deinem Code ist das wirkungslos.
Für den Code des Buttons reicht dann:
Private Sub SpeichernUndSchliessen_Click()
DoCmd.Close acForm, "Eingabemaske_Einrichtung"
End Sub
Das acSaveYes ist überflüssig, damit werden keine Daten gespeichert, das betrifft nur den Formularentwurf.
Eventuell muss auch noch im Formularereignis "Beim Entladen" mit Cancel=True das Schließen des Formulars unterbunden werden.
Hallo,
ZitatNur in diesem Ereignis kann Cancel=True verwendet werden. In Deinem Code ist das wirkungslos.
Und wenn das keinen LZ-Fehler erzeugt, weist das darauf hin, das im Modulkopf
das
Option Explicitfehlt.
@icemann
Das geht auch automatisch (s. Abb.); - allerdings nicht nachträglich-
gruss ekkehard
Hey.... ich habe es geschafft !!!
Danke an alle, die mir geholfen und mich zum umdenken beflügelt haben. Habe mich von Makros gelöst und es mit vba geschafft. War viel Arbeit aber wenn ich genau schaue ist es doch nicht all zu schwer und man ist flexibel.
Lösung:
Public Function fncPruefen()
Dim strFehlerText As String, intFehlerzahl As Integer: intFehlerzahl = 1
fncPruefen = True
If IsNull(Me![Geräte Nummer]) Then
strFehlerText = strFehlerText & intFehlerzahl & ". Keine Geräte Nummer angelegt" & vbCrLf
intFehlerzahl = intFehlerzahl + 1
fncPruefen = False
End If
If DCount("*", "Objekt", "[Geräte Nummer]='" & Me![Geräte Nummer] & "'") > 0 Then
strFehlerText = strFehlerText & intFehlerzahl & ". Diese Gerätenummer ist bereits vergeben" & vbCrLf
intFehlerzahl = intFehlerzahl + 1
fncPruefen = False
End If
If fncPruefen = False Then
If intFehlerzahl = 2 Then strFehlerText = Mid(strFehlerText, 3)
Select Case MsgBox("Es gibt noch " & intFehlerzahl - 1 & " Fehler" & vbCrLf & vbCrLf & strFehlerText _
& vbCrLf & vbCrLf & "mit OK zurück, Abbrechen verwirft den begonnenen Datensatz", vbOKCancel)
Case vbCancel
Me.Undo
End Select
End If
End Function
UND DANN MEINE SPEICHER FUNKTION
Private Sub SpeichernUndSchliessen_Click() 'Exit mit Speichern
If fncPruefen = True Then
DoCmd.Close acForm, "Eingabemaske_Einrichtung"
End If
End Sub
Dank Eurer Hilfe und der db pflichtfelder2.mdb hätte ich es nicht geschafft.