November 30, 2020, 03:03:13

Neuigkeiten:

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


Fehlende Eingabe in einem SubForm behandeln

Begonnen von Herby1949, November 12, 2020, 22:33:57

⏪ vorheriges - nächstes ⏩

Herby1949

November 12, 2020, 22:33:57 Letzte Bearbeitung: November 12, 2020, 22:46:49 von Herby1949
Guten Abend in die Runde
Folgendes Problem (Access2016):
In einer Mitgliederverwaltung gibt es ein Register mit verschiedenen Bereichen, in denen die Daten der Mitglieder erfasst werden. EinRegisterTab ist dafür vorgesehen, dem Mitglied (unter Umständen mehrere) Beiträge zuzuordnen. Dabei gibt es einmalige Beiträge (zum Beispiel Aufnahmegebühr oder auch eine Umlage) und es gibt wiederkehrende Beiträge (zum Beispiel "Jahresbeitrag Erwachsene Mitglieder"). In der Tabelle der Beitragsarten sind wiederkehrende Beiträge im entsprechenden Feld mit "0", einmalige Beiträge mit "9" gekennzeichnet.
Jedem Mitglied muss mindestens ein wiederkehrender Beitrag zugeordnet sein.
Weil fehlende "Standardbeiträge" auf die Dauer negative finanzielle Auswirkungen haben, wenn sie nicht benerkt werden, will ich den User auf seinen Fehler aufmerksam machen.
Ich habe daher im Ereignis "Beim Verlassen des SubForm"  einen Code eingegeben, der sequentiell alle dem Mitglied zugeordneten Beiträge durchgeht und prüft, ob mindestens ein wiederkehrender Beitrag existiert. Ist dies nicht der Fall, wird eine Meldung ausgegeben und der Fokus wieder auf das SubForm gesetzt.
Das Ganze funktioniert nur bedingt. Ein fehlender Beitrag wird zwar zunächst "angemeckert" und der Fokus wieder auf das SubForm gelegt. Dann aber kann man das SubForm verlassen, ohne dass erneut eine Meldung ausgegeben wird. Seltsam.

Der Code:
Private Sub subFrmPersBeitr_Exit(Cancel As Integer)
Dim KeinBeitr As Boolean
Dim DB As DAO.Database
Dim rs As DAO.Recordset
'ANZEIGE
Set DB = CurrentDb()
Set rs = DB.OpenRecordset("Select * FROM reqPersBeitrag Where PB_Person=" & Pe_ID)
KeinBeitr = True
If rs.RecordCount > 0 Then
rs.MoveFirst
 Do Until rs.EOF
  If rs("Ba_Art") = 0 Then KeinBeitr = False
 rs.MoveNext
Loop
End If 'recordcount
if KeinBeitr = true then MsgBox "Dem Mitglied wurde kein (wiederkehrender) Vereinsbeitrag zugeordnen!", vbCritical, "Warnung!"
Set rs = Nothing
Set DB = Nothing
Me.subFrmPersBeitr.SetFocus
Me.Requery
End Sub
 

Kann mir jemand einen Tip geben?

MzKlMu

November 12, 2020, 23:33:55 #1 Letzte Bearbeitung: November 13, 2020, 00:32:37 von MzKlMu
Hallo,
das ist mir nicht ganz klar. Eine Person kann doch mehrere wiederkehrende Beiträge haben.
Es kann also durchaus einer dieser Beiträge fehlen, das wird dann aber nicht gemeldet.
Beschreibe das mal genauer.

Außerdem geht das viel einfacher und kürzer. Du brauchst ja nur zu zählen.
Private Sub subFrmPersBeitr_Exit(Cancel As Integer)
    If DCount("*", "reqPersBeitrag", "PB_Person=" & Pe_ID & " And Ba_Art = 0") = 0 Then
        MsgBox "Dem Mitglied wurde kein (wiederkehrender) Vereinsbeitrag zugeordnet!", vbCritical, "Warnung!"
        Cancel = True
    End If
End Sub
Mit Cancel = True kann das Formular gar nicht erst verlassen werden, das Setzen des Focus ist somit auch überflüssig.
Gruß
Klaus

Beaker s.a.

Hallo,
Für Konsistenzprüfungen jeglicher Art bin ich ja ein Verfechter von
Form_BeforeUpdate
Dieser Fehler kann doch nur bei der Erfassung eines neuen Mitglieds (DS)
auftreten, und sollte IMO deshalb so früh wie möglich abgefangen werden.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

Herby1949

Hallo MzKlMu
Sorry, wenn ich mich erst heute melde. Danke für den Tipp! Hat mir sehr geholfen, vor allen Dingen auch die Reduzierung des Codes. Ich glaube, da sollte ich mein Projekt mal generell überarbeiten.
Vielen Dank

Beaker s.a.

Hallo,
Entschuldigt wenn ich mich hier noch einmal einmische. Klaus' Lösung ist natürlich
nicht falsch und wird auch gebraucht (s.u.), verhindert aber das Nichteintragen m.E.
nicht wirklich. Das UFo ist ja sozusagen ein Pflichtfeld, man muss den Anwender
also zwingen einen DS dort einzugeben. Prüfungen auf Pflichtfelder macht man
üblicherweise vor Aktualisierung des HFo. Das geht hier aber nicht, weil im UFo erst
DSe erfasst werden können wenn der DS im HFo gespeichert ist.
Wenn das immer der gleiche Satz ist könnte man den natürlich auch direkt After_Update
per INSERT in die Tabelle schreiben. Wenn der Satz ausgewählt werden muss, sehe ich da
zwei Möglichkeiten (beide schon selber angewendet) diesen Zwang auszuüben
1. Man erledigt die Neuanlage mit einem Popup, gebunden an die Mitglieder (so wie
das HFo auch) und ungebundenen Feldern für die Beiträge. Die schreibt man dann per
INSERT in die Tabelle.
2. Man weist den Anwender nach Aktualisieren des HFo per Mgsbox darauf hin, das jetzt
noch der Beitrag erfasst werden muss, setzt den Focus ins UFo und verwendet letztlich
Klaus' Code um zu prüfen ob der Anwender den Hinweis befolgt hat.
Dies alles für neue DS. Bestehende DS wird man eh bevor man produktiv geht in einer
Einmalaktion überprüfen und bereinigen.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.