Hallo Access-O-Maniacs,
versuche mit u.g. Code die Pflichtfelder, welche nicht ausgefüllt wurden Gelb zu markieren und ein speichern zu verhindern. Funktioniert soweit (Felder werden Gelb), jedoch wenn in ein Kombinationsfeld befüllt war und dann der Inhalt wieder gelöscht wurde, kann der Datensatz gespeichert werden. In der Tabelle steht "Eingabe erforderlich" auf "Ja" und die Marken sind auch entsprechend gesetzt.
Vielleicht hat einer von euch ein Tipp / Link.
Private Sub cmd_datensatz_speichern_Click()
On Error GoTo Err_cmd_datensatz_speichern_Click
Dim Red As Long
Dim Save As Boolean
For Each ctl In Me
If ctl.Tag = "X" Then ' alle controls mit marke x auf Nullwert prüfen und entsprechend einfärben.
If IsNull(ctl.Value) = False Then ctl.BackColor = vbWhite Else ctl.BackColor = vbYellow
End If
Next ctl
For Each ctl In Me
If ctl.Tag = "X" Then ' alle controls mit marke x auf Nullwert prüfen und save auf wahr oder falsch setzen.
If IsNull(ctl.Value) = False Then Save = True Else Save = False
End If
Next ctl
If Save = True Then
'Auftrag speichern
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
'Meldung ausgeben
MsgBox "Die Daten wurden erfolgreich gespeichert!"
Else
'Meldung ausgeben
MsgBox "Bitte ALLE gelb markierten Felder ausfüllen. Ansonsten können Ihre Eingaben nicht gespeichert werden."
End If
Exit_cmd_datensatz_speichern_Click:
Exit Sub
Err_cmd_datensatz_speichern_Click:
MsgBox Err.Description
Resume Exit_cmd_datensatz_speichern_Click
End Sub
Gruss
Atuatuca
Hallo,
solche Plausi-Prüfungen sollten im Form_BeforeUpdate-Ereignis erledigt werden...
Sub Form_BeforeUpdate(Cancel as Integer)
Dim ctl as Control
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
If IsNull(ctl.Value) = False Then
ctl.BackColor = vbWhite
Else
ctl.BackColor = vbYellow
Cancel = True
End If
End if
Next ctl
If Cancel Then
MsgBox "Bitte ALLE gelb markierten Felder ausfüllen. Ansonsten können Ihre Eingaben nicht gespeichert werden."
End If
End Sub
Hallo Franz,
funktioniert jetzt. Danke dafür. Das 2 Felder trotz deines Codes nicht gelb wurden, lag daran, dass in der Tabelle ein Standartwert =0 eingetragen war. :'(
Jetzt noch die Navigationleiste ausblenden und STRG+F4 sperren
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 115 And Shift = 2 Then
KeyCode = 0
End If
End Sub
Danke und noch ein schönen Abend.
Gruss
Atuatuca
Hallo Franz,
kann mann den o.g. Code auch abgeändert verwenden um 5 Kontrollkästchen zu überprüfen und wenn eines der 5 Kontrollkästchen angehakt ist das Speichern zulassen ?
Wenn keins der 5 Kontrollkästchen angehakt ist, dann Speichern verhindern, Hintergrundfarbe des Rahmens Geld und MsgBox zeigen.
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
If IsNull(ctl.Value) = False Then
ctl.BackColor = vbWhite
Else
ctl.BackColor = vbYellow
Cancel = True
End If
End If
[b][color=red] If ctl.Tag = "CBX" Then
If ctl.Value = False Then
Cancel = True
Else
End If
End If[/color][/b]
Next ctl
[code]If Me!cbx_konstruktion = True Or Me!cbx_freigabe_db = True Or Me!cbx_beschaffung = True Or Me!cbx_montage = True Or Me!cbx_gewaehrleistung = True Then
MsgBox "Bitte mindestens bei einer der u.g. Kästchen ein Haken setzen:" & Chr(10) & Chr(10) & "- Konstruktion" & Chr(10) & "- Freigabe DB" & Chr(10) & "- Beschaffung" & Chr(10) & "- Montage" & Chr(10) & "- Gewährleistung", vbOKOnly + vbExclamation, "Eingabefehler !!"
Me!rahmen_bereich_gewaehrleistung.BackColor = vbWhite
Cancel = True
Else
Me!rahmen_bereich_gewaehrleistung.BackColor = vbYellow
End If
If Cancel Then
Select Case MsgBox("Bitte ALLE gelb markierten Felder ausfüllen." & Chr(10) & "Ansonsten können Ihre Eingaben nicht gespeichert werden !!" & Chr(10) & Chr(10) & "Möchten Sie Ihre Eingaben verwerfen ?", vbYesNo + vbExclamation, "Eingabefehler !!")
Case vbYes
'Änderungen werden verworfen
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
ctl.BackColor = vbWhite
Else: End If
Next ctl
Me!rahmen_bereich_gewaehrleistung.BackColor = vbWhite
Me.Undo
Case vbNo
'nichts tun heisst es wird gespeichert
Cancel = True
End Select
End If
If Me.[cbx_Leistung_Konstruk_Mehraufwand] = True Then
If Nz(Me.[aufwand_in_STD]) = "0" Then
MsgBox "Anzahl der Stunden für den Mehraufwand" & Chr(10) & "wurden nicht eingetragen !"
Me.[aufwand_in_STD].SetFocus
Cancel = True
End If
End If
End Sub[/code]
Hallo,
sobald ein KK angehakt ist, hat es den Wert -1.
Also sollte sich prüfen lassen, ob die Summe der KK(-Werte) = 0 ist (d. h. kein KK angehakt ist) oder die Summe < 0 (mindestens ein KK angehakt) ist.
Hallo Franz,
das ist ja simple und einleuchtend. Könnte von mir sein :D
Nun müsste man es noch in VBA umsetzen. Der Versuch:
Dim SummeCBX as Integer
If ctl.Tag = "CBX" Then
SummeCBX = DSum (*)
If SummeCBX < 0 then
Cancel = False
Else
Cancel = True
End If
End If
Dann stellt sich noch die Frage, an welcher Stelle bei "Form_BeforeUpdate"
Gruss
Atuatuca
Hallo,,
Dsum ist ja ziemlich fehl am Platz.. Dsum ist eine Domänenaggregat-Funktion und betrachtet Tabellenspalten....
SummeCBX = Me!KK1 + Me!KK2 + Me!KK3 + Me!KK4 + Me!KK5
An welcher Stelle in der Prozedur der Codeschnipsel steht, ist belanglos (allerdings außerhalb der Controls-Schleife)..
Dim SummeCBX as Long
SummeCBX = Me!KK1 + Me!KK2 + Me!KK3 + Me!KK4 + Me!KK5
If SummeCBX = 0 then
Cancel = True
End If
Hallo Franz,
versuche es gerade mit deinem Code, aber jetzt zickt er rum bei dem ersten "Cancel". Er meckert "Variable nicht deklariert"
Ich verstehe nur Bahnhof ohne Beleuchtung :D
Habe unteren Code einmal bei im Formular bei "Vor Aktualisieren" und einmal bei dem Speichern Button
Wenn ich zwischen den () bei "...speichern_Click()" ein "Cancel as Integer einfüge, dann geht die Form nicht mehr. Bin ratlos
Private Sub cmd_datensatz_speichern_Click()
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
If IsNull(ctl.Value) = False Then
ctl.BackColor = vbWhite
Else
ctl.BackColor = vbYellow
Cancel = True
End If
End If
Next ctl
Dim SummeCB As Long
SummeCB = Me!cbx_konstruktion + Me!cbx_freigabe_db + Me!cbx_beschaffung + Me!cbx_montage + Me!cbx_gewaehrleistung
If SummeCB = 0 Then
Cancel = True
End If
If Me!cbx_konstruktion = True Or Me!cbx_freigabe_db = True Or Me!cbx_beschaffung = True Or Me!cbx_montage = True Or Me!cbx_gewaehrleistung = True Then
Cancel = True
Else
Me!rahmen_bereich_gewaehrleistung.BackColor = vbYellow
End If
If Cancel Then
Select Case MsgBox("Bitte ALLE gelb markierten Felder ausfüllen." & Chr(10) & "Ansonsten können Ihre Eingaben nicht gespeichert werden !!" & Chr(10) & Chr(10) & "Möchten Sie Ihre Eingaben verwerfen ?", vbYesNo + vbExclamation, "Eingabefehler !!")
Case vbYes
'Änderungen werden verworfen
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
ctl.BackColor = vbWhite
Else: End If
Next ctl
Me!rahmen_bereich_gewaehrleistung.BackColor = vbWhite
Me.Undo
Case vbNo
'nichts tun heisst es wird gespeichert
Cancel = True
End Select
End If
End Sub
Gruss
Atuatuca
Hallo atuatuca,
Die Ereignisprozedur einer Schalfläche hat keinen Parameter "Cancel". Den musst Du da selbst erzeugen:
Dim intCancel as Integer
hth
gruss ekkehard
Hallo Beaker s.a.,
habe, bis auf das Speichern, alle Ereignisse rausgenommen. Jetzt funktionert alles.
Danke & Gruss
Atuatuca
Hallo zusammen,
jetzt könnte ich doch ohne weiteres das Eingabe erforderlich in der Tabelle rausnehmen oder ?
Gruss
Atuatuca
Hallo Access-O-Maniacs,
versuche mit u.g. Code einige Angaben (= Felder mit Tag "X") und 5 Kontrollkästchen zu prüfen in ein Formular zu prüfen und wenn erfolgreich, dann das Formular zu schliessen.
Leider klappt es so nicht. Hat jemand ein Tipp ?
If intCancel Then hier hängt der code.
beim Ereignis "klicken" von der Schaltfläche (hängt bei dem roten Text:
Private Sub cmd_formular_schliessen_Click()
Dim ctl As Control
Dim SummeCB As Long
Dim intCancel As Integer
If Me!cbx_Erledigt = False Then
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
If IsNull(ctl.Value) = False Then
ctl.BackColor = RGB(255, 255, 220)
Else
ctl.BackColor = vbYellow
intCancel = True
End If
End If
Next ctl
SummeCB = Me!cbx_konstruktion + Me!cbx_freigabe_db + Me!cbx_beschaffung + Me!cbx_montage + Me!cbx_gewaehrleistung
If SummeCB = 0 Then
intCancel = True
Me!rahmen_bereich_gewaehrleistung.BackColor = vbYellow
Else
Me!rahmen_bereich_gewaehrleistung.BackColor = RGB(255, 255, 220)
DoCmd.Close
End If
If intCancel Then ´<=hier hängt er
Select Case MsgBox("Bitte ALLE gelb markierten Felder ausfüllen." & Chr(10) & "Ansonsten können Ihre Eingaben nicht " & _
"gespeichert werden !!" & Chr(10) & Chr(10) & "Bei dem Feld mit den Kontrollkästchen (Konstruktion, Freigabe DB etc....) muss " & _
"mindestens 1 Kontrollkästchen in der oberen Reihe ausgewählt werden." & Chr(10) & Chr(10) & "Möchten Sie Ihre Eingaben " & _
"verwerfen ?", vbYesNo + vbExclamation, "Fehlende Angaben !!")
Case vbYes
'Änderungen werden verworfen
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
ctl.BackColor = RGB(255, 255, 220)
Else
End If
Next ctl
Me!rahmen_bereich_gewaehrleistung.BackColor = RGB(255, 255, 220)
Me.Undo
DoCmd.Close
Case vbNo
'nichts tun heisst es wird gespeichert
intCancel = True
End Select
End If
End If
End Sub
Folgendes steht beim Ereignis "vor aktualisieren"
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
Dim SummeCB As Long
If Me!cbx_Erledigt = False Then
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
If IsNull(ctl.Value) = False Then
ctl.BackColor = RGB(255, 255, 220)
Else
ctl.BackColor = vbYellow
Cancel = True
End If
End If
Next ctl
SummeCB = Me!cbx_konstruktion + Me!cbx_freigabe_db + Me!cbx_beschaffung + Me!cbx_montage + Me!cbx_gewaehrleistung
If SummeCB = 0 Then
Cancel = True
Me!rahmen_bereich_gewaehrleistung.BackColor = vbYellow
Else
Me!rahmen_bereich_gewaehrleistung.BackColor = RGB(255, 255, 220)
End If
If Cancel Then
Select Case MsgBox("Bitte ALLE gelb markierten Felder ausfüllen." & Chr(10) & "Ansonsten können Ihre Eingaben nicht " & _
"gespeichert werden !!" & Chr(10) & Chr(10) & "Bei dem Feld mit den Kontrollkästchen (Konstruktion, Freigabe DB etc....) muss " & _
"mindestens 1 Kontrollkästchen in der oberen Reihe ausgewählt werden." & Chr(10) & Chr(10) & "Möchten Sie Ihre Eingaben " & _
"verwerfen ?", vbYesNo + vbExclamation, "Eingabefehler !!")
Case vbYes
'Änderungen werden verworfen
For Each ctl In Me.Controls
If ctl.Tag = "X" Then
ctl.BackColor = RGB(255, 255, 220)
Else
End If
Next ctl
Me!rahmen_bereich_gewaehrleistung.BackColor = RGB(255, 255, 220)
Me.Undo
Case vbNo
'nichts tun heisst es wird gespeichert
Cancel = True
End Select
End If
End If
End Sub
hallo,
der Code bleibt nicht einfach so "hängen", gibt es keine Fehlermeldung dazu?
Was passiert, wenn du die Ausführung mit F8 fortsetzt?
Hallo Atuatuca,
Versuche Mal statt If IsNull(ctl.Value) ...
If Len(ctl.Value & vbNullString) > 0 Then
'oder
If Nz(ctl.Value, vbNullString) = vbNullString Then
Kombis sind gerne mal Empty statt NULL, wenn man den Inhalt auf
dem Formular löscht. Und setze an den Anfang mal einen Default
intCancel = False
dann siehst Du an der Stelle wo es jetzt hängt, ob der Else-Zweig wo
diese Variable auf True gesetzt wird überhaupt zum tragen kommt.
hth
gruss ekkehard