Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Brusellise am Januar 25, 2017, 10:26:58

Titel: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Brusellise am Januar 25, 2017, 10:26:58
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
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: DF6GL am Januar 25, 2017, 11:25:35
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
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Lachtaube am Januar 25, 2017, 11:26:29
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
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Brusellise am Januar 25, 2017, 13:33:07
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?
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Beaker s.a. am Januar 25, 2017, 14:00:09
If IsNull(Me.Bereich) Or IsNull(Me.Kunde) Then
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Lachtaube am Januar 25, 2017, 14:00:15

      ...
      Cancel = True
   ElseIf IsNull(Me.Kunde) Then
      MsgBox "Bite einen Kunden eintragen."
      Cancel = True
   End If
   ...
Optional jeweils zusätzlich DF6GLs SetFocus-Anweisung einbauen.
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: DF6GL am Januar 25, 2017, 15:17:19
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.
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Lachtaube am Januar 25, 2017, 17:17:48
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.
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Icemann1970 am April 08, 2017, 11:52:58
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
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: DF6GL am April 08, 2017, 13:00:09
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
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Icemann1970 am April 08, 2017, 14:10:07
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 ?
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: DF6GL am April 08, 2017, 17:31:18
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.

Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Icemann1970 am April 08, 2017, 22:24:41
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
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Icemann1970 am April 08, 2017, 22:29:00
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 ;-)
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: MzKlMu am April 08, 2017, 22:55:02
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.
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Beaker s.a. am April 08, 2017, 23:26:31
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 Explicit
fehlt.

@icemann
Das geht auch automatisch (s. Abb.); - allerdings nicht nachträglich-

gruss ekkehard
Titel: Re: Beim schließen eines Formulars prüfen ob Feld gefüllt
Beitrag von: Icemann1970 am April 09, 2017, 20:56:47
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.