Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Herby1949 am November 12, 2020, 22:33:57

Titel: Fehlende Eingabe in einem SubForm behandeln
Beitrag von: Herby1949 am November 12, 2020, 22:33:57
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?
Titel: Re: Fehlende Eingabe in einem SubForm behandeln
Beitrag von: MzKlMu am November 12, 2020, 23:33:55
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.
Titel: Re: Fehlende Eingabe in einem SubForm behandeln
Beitrag von: Beaker s.a. am November 13, 2020, 15:03:26
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
Titel: Re: Fehlende Eingabe in einem SubForm behandeln
Beitrag von: Herby1949 am November 21, 2020, 10:39:48
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
Titel: Re: Fehlende Eingabe in einem SubForm behandeln
Beitrag von: Beaker s.a. am November 21, 2020, 13:01:36
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