Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Beim schließen eines Formulars prüfen ob Feld gefüllt

Begonnen von Brusellise, Januar 25, 2017, 10:26:58

⏪ vorheriges - nächstes ⏩

Brusellise

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

DF6GL

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

Lachtaube

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
Grüße von der (⌒▽⌒)

Brusellise

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?

Beaker s.a.

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)

Lachtaube


      ...
      Cancel = True
   ElseIf IsNull(Me.Kunde) Then
      MsgBox "Bite einen Kunden eintragen."
      Cancel = True
   End If
   ...
Optional jeweils zusätzlich DF6GLs SetFocus-Anweisung einbauen.
Grüße von der (⌒▽⌒)

DF6GL

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.

Lachtaube

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.
Grüße von der (⌒▽⌒)

Icemann1970

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
Mfg. Udo

DF6GL

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

Icemann1970

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 ?
Mfg. Udo

DF6GL

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.


Icemann1970

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
Mfg. Udo

Icemann1970

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 ;-)
Mfg. Udo

MzKlMu

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