PDA

Vollständige Version anzeigen : Prüfen von Pflichfeldern und Ausgabe in Messagebox welche noch fehlen


Biegel
14.12.2006, 15:15
Hallo,

hier mal ein kleines Beispiel um zu prüfen welche Pflichtfelder beim Ausfüllen vergessen wurden.

Private Sub btn_test_Click()
Dim Felder As Variant
Dim x As Variant
Dim Feldbezeichnung As Variant
Dim Ausgabe As String

Felder = Array(Pflichtfeld1, Pflichtfeld2, _
Pflichtfeld3, Pflichtfeld4)

Feldbezeichnung = Array("Name Feld 1", "Name Feld 2", _
"Name Feld 3", "Name Feld 4", _
"Ende")


ausgabe = ""

Do Until Feldbezeichnung(x) = "Ende"


If IsNull(Felder(x)) Then ausgabe = ausgabe & Chr(13) & Feldbezeichnung(x)

x = x + 1

Loop

MsgBox ("Folgende Felder wurden vergessen!" & Chr(13) & ausgabe)

End Sub

Ereigniss einfach zum Testen bspw. beim schliessen einbauen.

LG Biegel

rookie1717
27.01.2008, 19:00
Hallo,

habe gerade dieses Codebeispiel gefunden und begeistert in ein Formular eingebaut (beim Ereignis "BeforeUpdate"). Prinzipiell funktioniert es, allerdings mit dem Nebeneffekt, dass man das Formular nach dem Bestätigen der Messagebox ohne Einträge in den Pflichtfeldern verlassen kann. Das soll bei Pflichtfeldern ja nicht passieren. Habe bereits versucht, direkt im Anschluss den Focus auf ein Feld im Formular zu setzen, erhalte dann aber den Laufzeitfehler 438 (Objekt unterstützt Eigenschaft oder Methode nicht).

Hat jemand eine Idee, was ich falsch mache bzw. ergänzen müsste?

Danke für eure Hilfe

Gruß
Helen

TommyK
28.01.2008, 03:23
Hallo Helen,

ich hab mal folgende Änderungen gemacht:

Option Compare Database
Option Explicit

Dim bClose As Boolean

Private Sub Form_Load()
bClose = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
If bClose = False Then Cancel = True
End Sub

Private Sub btn_test_Click()
Dim Felder As Variant
Dim x As Variant
Dim Feldbezeichnung As Variant
Dim Ausgabe As String

Felder = Array(Pflichtfeld1, Pflichtfeld2, _
Pflichtfeld3, Pflichtfeld4)

Feldbezeichnung = Array("Name Feld 1", "Name Feld 2", _
"Name Feld 3", "Name Feld 4", _
"Ende")
Ausgabe = ""

Do Until Feldbezeichnung(x) = "Ende"
If IsNull(Felder(x)) Then Ausgabe = Ausgabe & Chr(13) & Feldbezeichnung(x)
x = x + 1
Loop

If Ausgabe = "" Then
bClose = True
DoCmd.Close
Else
MsgBox ("Folgende Felder wurden vergessen!" & Chr(13) & Ausgabe)
End If

End Sub

Im Kopf wird die Variable bClose deklariert. Diese wird im Load-Ereignis auf False gesetzt und soll verhindern das, dass Form mit einem Klick auf das X geschlossen werden kann.
Im Button Code wird geprüft ob alle Felder ausgefüllt sind und das Form kann geschlossen werden. Sonst nicht.

rookie1717
03.02.2008, 20:23
Hallo TommyK, vielen Dank für deinen Lösungsvorschlag! Ich bin leider erst heute dazu gekommen, deinen Code auszuprobieren. Er funktioniert, doch es geht sogar noch einfacher: Die Variable "bClose" kann man sich sparen.

Bei mir sieht der Code jetzt folgendermaßen aus:

Option Compare Database
Option Explicit

Dim Felder As Variant
Dim x As Variant
Dim Feldbezeichnung As Variant
Dim Ausgabe As String

Private Sub btn_close_Click()

Felder = Array(Pflichtfeld1, Pflichtfeld2, Pflichtfeld3, Pflichtfeld4)

Feldbezeichnung = Array("Name Feld 1", "Name Feld 2", "Name Feld 3", "Name Feld 4", "Ende")
Ausgabe = ""

Do Until Feldbezeichnung(x) = "Ende"
If IsNull(Felder(x)) Then Ausgabe = Ausgabe & Chr(13) & Feldbezeichnung(x)
x = x + 1
Loop

If Ausgabe <> "" Then
MsgBox ("Folgende Felder wurden vergessen!" & Chr(13) & Ausgabe)

Else
DoCmd.close 'Hier können dann beliebige Befehle folgen.

End If

End Sub



Da es in meinem Formular mehrere Schaltflächen gibt, bei denen ich den Code einsetzen will, habe ich die Deklaration der Variablen in den Kopf gestellt und den letzten Teil des Codes etwas umformuliert, so dass ich das Ganze "am Stück" bei allen Schaltflächen einbauen kann.

Herausgefunden hab ich das Ganze, da die Variable "bClose" in meinem Formular eine Störung verursacht hat: Ich konnte nicht mehr in die Entwurfsansicht wechseln. Keine Ahnung, was das war. Ich habe eine kleine Test-DB gebastelt, die ich hochladen wollte, und da trat das Phänomen nicht mehr auf. Als ich dann weiter experimentiert habe, bin ich auf die obige Lösung gekommen, die nun auch in meiner Real-Umgebung funktioniert.

Nochmals vielen Dank für deine Hilfe!!!

Gruß Helen

TommyK
04.02.2008, 06:50
Hallo,

Herausgefunden hab ich das Ganze, da die Variable "bClose" in meinem Formular eine Störung verursacht hat: Ich konnte nicht mehr in die Entwurfsansicht wechseln. Keine Ahnung, was das war.
Das war eigentlich Sinn und Zweck der Sache.
Man kommt nicht mehr aus dem Form raus ohne das alle Plichtfelder gefüllt sind. Auch nicht in die Entwurfsansicht. ;)

rookie1717
04.02.2008, 13:18
Hallo TommyK,

das hab ich schon verstanden. Ich konnte das Formular aber auch nach dem Befüllen aller Felder nicht mehr verlassen und nicht in die Entwurfsansicht wechseln. Ich hab ziemlich viel Code in meinem Formular und vermute eine Wechselwirkung. Jedenfalls ist es nicht mehr passiert, als ich zu Testzwecken alles andere aus dem Formular entfernt hatte. Dein Code tut also, was er soll!

Viele Grüße
Helen

styrasurf
11.11.2008, 18:15
Ok, da gibts noch einiges zu grübeln.

Für heute muß ich aber mal weg. 12 Stunden vor der Kiste sollten reichen...
(obwohl: ganz offensichtlich reichen sie bei MIR nicht)

Wie auch immer. besten Dank vorerst für Eure Hilfe. Wenn ich auch im Moment noch nicht wirklich schlau draus werde.
Und : mit prüfen ob alle Felder irgendwas drinstehen haben ist es ja nicht getan, da gibts auch ein paar andere Abhänigkeiten (z.b. wenn das eine nicht "ja" dann das nächste deaktiviert und so Zeug).

Ja, ich bevormunde die User. Aber glaubt mir, was immer ich bisher getan habe, war noch zu wenig. Die finden immer wieder Mittel und Wege Mistdaten in die DB zu hämmern :-(

ciao für heute

PSViolon
24.11.2008, 06:32
Guten Morgen,

ich habe den Code bei mir eingebaut und finde es hat einen Schönheitsfehler:
Die Msgbox kommt nur ein einziges Mal! Wenn mehrere Felder fehlen und der User etwas unkonzentriert arbeitet, klickt er rum und ist sich keiner Schuld bewusst.
Kann man die MsgBox so einstellen, dass bei jedem Speicher- bzw. Beendenversuch die noch fehlenden Felder gelistet werden?

anfänger2
16.12.2008, 12:55
@PSVilion

Ja! Es geht.

Ich habe x einfach auf 0 gesetzt. Dann kommt die Abfrage mit den fehlenden Feldern immer wieder.


Option Compare Database
Option Explicit

Dim Felder As Variant
Dim x As Variant
Dim Feldbezeichnung As Variant
Dim Ausgabe As String

Private Sub btn_close_Click()

Felder = Array(Pflichtfeld1, Pflichtfeld2, Pflichtfeld3, Pflichtfeld4)

Feldbezeichnung = Array("Name Feld 1", "Name Feld 2", "Name Feld 3", "Name Feld 4", "Ende")
Ausgabe = ""

Do Until Feldbezeichnung(x) = "Ende"
If IsNull(Felder(x)) Then Ausgabe = Ausgabe & Chr(13) & Feldbezeichnung(x)
x = x + 1
Loop

If Ausgabe <> "" Then
MsgBox ("Folgende Felder wurden vergessen!" & Chr(13) & Ausgabe)
x = 0
Else
DoCmd.close 'Hier können dann beliebige Befehle folgen.

End If

End Sub


Alternativ könntest Du es auch so versuchen:


Dim Ctl As Control

For Each Ctl In Me.Controls
If Ctl.Tag = "x" Then
If Len(Nz(Ctl, "")) = 0 Then
MsgBox ("Eine Eingabe in '" & Ctl.Name & "' fehlt!")
Exit Sub
End If
End If
Next Ctl


Allerdings musst Du dann in der Feldeigenschaft die Marke des Feldes auf "X" setzen. Du kannst natürlich auch jeden anderen Buchstaben verwenden. Und es werden nicht mehrere Felder auf einmal angemekert. Sondern immer schön eins nach dem anderen.

Ich hoffe das hilft Dir noch, da Dein Beitrag schon etwas älter ist.

PSViolon
26.01.2009, 15:09
Hallo Anfänger2,

dein Code gefällt mir Aufgrund der Kürze und Einfachheit mit der ich Pflichtfelder verwalten kann wesentlich besser. Allerdings kommt die Meldung(en) auch nur ein einziges Mal. Zwar Nacheinander aber eben nur einmal.

Hast da noch eine Optimierung? ;)

anfänger2
27.01.2009, 06:05
@Peter
Wo hast Du den Code verbaut? Ich habe Ihn im BeforeUpdate-Ereignis des Formulares eingefügt. Hier kommt die Meldung solange, bis alle Felder gefüllt sind.

Ich hab das jetzt auch mal "beim klicken" probiert. Er prüft immer alle Felder auf Inhalt!

PSViolon
27.01.2009, 08:46
Ich ebenso, mein Code sieht jetzt folgendermaßen aus.

Private Sub Form_BeforeUpdate(Cancel As Integer)

Dim Ctl As Control

For Each Ctl In Me.Controls
If Ctl.Tag = "X" Then
If Len(Nz(Ctl, "")) = 0 Then
MsgBox ("Eine Eingabe in '" & Ctl.Name & "' fehlt!")
Exit Sub
End If
End If
Next Ctl
'If MsgBox("Änderungen speichern?", vbYesNo, "Speichern?") = vbNo Then
'Me.Undo 'rückgängig
'Cancel = True 'Ereignisse verhindern
'End If
'bClose = True
End Sub

bClose habe ich testweise abgeschaltet. Dadurch kann das Formular nach bestätigen der ersten Fehlermeldung verlassen werden. Wenn "bclose" Aktiv ist, kommt ebenfalls eine Meldung pro Feld. Wenn dann ein erneuter Versuch gestartet wird, passiert beim Speichern nichts weiter und beim Verlassen des Formlares eine korrekte Meldung und dann beim zweiten Versuch das Formular zu verlassen: Das Jet Datenbankmodul konnte das Objekt " nicht finden... Letzteres kommt dann aber bei jedem Versuch, das Formular zu verlassen. B

anfänger2
27.01.2009, 11:38
@ Peter
Vielleicht fehlt Dir einfach eine Aktualisierung im bClose.
Oder Du fügst den Code direkt in das bClose Ereignis ein.

Hier noch eine kleine Variante, die ich in diesem Fall verwende.
Der Anwender kann sich entscheiden die Eingaben zu löschen (z.B. bei versehentlicher Eingabe) oder
der Cursor springt direkt in das noch auszufüllende Feld.


Private Sub bClose_Click()
For Each ctl In Me.Controls
If ctl.Tag = "x" Then
If Len(Nz(ctl, "")) = 0 Then
If MsgBox("Eine Eingabe in '" & ctl.Name & "' fehlt!" & vbCrLf _
& "Sollen die Eingaben rückgängig gemacht werden?", vbYesNo, "Fehlende Eingaben") = vbYes Then
Me.Undo
Exit Sub
Else
ctl.SetFocus
If ctl.ControlType = acComboBox Then
ctl.Dropdown
End If
Cancel = True
Exit Sub
End If
End If
End If
Next ctl

DoCmd.Close acForm, Me.Name
End Sub


PS: Ich glaube wenn wir hier weitermachen bekommen wir Ärger! Das ist schließlich das Code-Archiv! Bei weiteren Fragen solltest Du einfach ein neues Thema eröffnen.

Klaus B aus D
28.04.2013, 23:52
Hallo Marco,

ich fand heute deinen Beitrag und hab' die Code-Alternative (#9 unten) versuchsweise in ein Formular eingefügt, in welchem drei Pflichfelder zu füllen sind.
Prinzipiell fünktioniert der Ablauf wie beschrieben beim Ereignis BeforeUpdate, allerdings erfolgt bereits mit Bestätigung des letzten Hinweises auf ein noch leeres Feld schon ein Wechsel zu einem neuen leeren DS, obwohl das letzte Feld leer bleibt (man muss erst zurückblättern, um der Aufforderung nachzukommen, das Feld zu füllen).

Mein Formular wird so aufgerufen, dass sofort ein neuer DS eingegeben werden kann. Wenn ein Anwender nun einfach mal einen Blick auf seinen letzten DS werfen möchte und zurückblättert, dann erscheint die Meldung nach einem fehlenden Eintrag (hier "Kunde") und nach Bestätigung der Meldung wird sein letzter gefüllter DS gezeigt.

Wie lässt sich das Verhalten so verbessern, dass tatsächlich zunächst alle Felder gefüllt werden, bevor zu einem neuen leeren bzw. einem vorhandenen Datensatz gesprungen werden kann?

MfG
Klaus

anfänger2
29.04.2013, 08:16
@Klaus

Hallo Klaus,

dieser Code (Nr 9 unten) bringt eine reine Meldung und ist nicht dafür Gedacht, das weiterblättern zu verhindern. Vielleicht machst Du die Felder einfach zu Pflichtfeldern. Dann ist ein Blättern nicht möglich. So hab ich das gemacht.
Oder Du erweiterst den Code statt nur "Exit sub". Für einen Tipp in der Richtung, bräuchte ich die DB von Dir. Ich muss da auch immer ein bisschen probieren, Acc ist nur ein Hobby von mir, für das ich die letzten Jahre nicht viel Zeit hatte deshalb bin ich im Moment nicht so im Thema.

Alf1988
08.05.2013, 14:03
Ich hab ein Code gefunden, das mir auch sehr gut gefällt .

Dim Felder As Variant
Dim x As Variant
Dim Feldbezeichnung As Variant
Dim Ausgabe As String

Private Sub btn_close_Click()

Felder = Array(Pflichtfeld1, Pflichtfeld2, Pflichtfeld3, Pflichtfeld4)
farbe = Array(Pflichtfeld1_Bezeichnungsfeld,Pflichtfeld2_Bezeichungsfeld,....)
Feldbezeichnung = Array("Name Feld 1", "Name Feld 2", "Name Feld 3", "Name Feld 4", "Ende")
Ausgabe = ""

Do Until Feldbezeichnung(x) = "Ende"
If IsNull(Felder(x)) Then Ausgabe = Ausgabe & Chr(13) & Feldbezeichnung(x)
farbe(x).ForeColor = vbRed
x = x + 1
Loop

MsgBox ("Bitte folgende Pflichtfelder noch füllen:" & Chr(10) & Ausgabe)

End Sub



Es klappt alles wunderbar.

Allerdings habe ich ein Pflichtfeld das nicht immer Enabled = True ist.

d.h.
Pflichtfeld1 ist eine Kombifeld und sobald ein bestimmter Wert(z.B. NEU) angewählt wird, ist Pflichfeld4 für die Eingabe gesperrt im Formular gesperrt.(Enabled = False)

Jetzt möchte ich natürlich, das sobald Pflichtfeld 4 im Formular gesperrt ist, soll dies nicht als Pflichtfeld in der MsgBox erscheinen.
Wie mache ich das?
Habe schon verscheidene If-verzweigungen ausprobiert. Kriege es aber nicht hin..

Würde mich über ein Vorschlag freuen

Lg Alf