Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Prüfen ob Kombinationsfeld leer ist beim Speichern der Daten

Begonnen von Atuatuca, März 05, 2016, 18:47:53

⏪ vorheriges - nächstes ⏩

Atuatuca

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

DF6GL

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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca

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

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]

DF6GL

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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca

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

DF6GL

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

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca

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

Beaker s.a.

Hallo atuatuca,
Die Ereignisprozedur einer Schalfläche hat keinen Parameter "Cancel". Den musst Du da selbst erzeugen:
Dim intCancel as Integer
hth
gruss ekkehard
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)

Atuatuca

Hallo Beaker s.a.,

habe, bis auf das Speichern, alle Ereignisse rausgenommen. Jetzt funktionert alles.

Danke & Gruss
Atuatuca

Atuatuca

Hallo zusammen,

jetzt könnte ich doch ohne weiteres das Eingabe erforderlich in der Tabelle rausnehmen oder ?

Gruss
Atuatuca

Atuatuca

#11
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

MaggieMay

hallo,

der Code bleibt nicht einfach so "hängen", gibt es keine Fehlermeldung dazu?
Was passiert, wenn du die Ausführung mit F8 fortsetzt?
Freundliche Grüße
MaggieMay

Beaker s.a.

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
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)