Hallo liebe Accessfreunde,
ich habe ein Hauptformular und ein Unterformular. Ich möchte die Datensätze im Unterformular zählen und daran entsprechende Aktionen knüpfen. Das Ganze habe ich mit VBA gelöst. Leider funktioniert es nur bedingt. Ich verweise im Unterformular je Datensatz über 2 Kombinationsfelder auf zwei Nachschlagetabellen (n:1 Beziehung). Meine Herausforderung ist nun, dass alle Datensätze im Unterformular nur dann gezählt werden wenn bei mindestestens einem Datensatz alle Text- oder Kombinationsfelder ausgefüllt wurden. Wie kann das sein?
Hier ein Bild vom Formular, wo von 5 Datensätzen 2 vollständig ausgefüllt sind (Es werden alle 5 Datensätze gezählt):
Screenshot 2023-04-16 114614.png
Hier ein Bild vom Formular, wo von 5 Datensätzen nur die ersten 3 Felder je Datensatz ausgefüllt sind (Es wird kein Datensatz gezählt):
Screenshot 2023-04-16 114837.png
Hier mein Code:
Sub Form_Current()
Dim sfrm As DAO.Recordset
Set sfrm = CurrentDb.OpenRecordset("SELECT mahlzID FROM tblMahlzeit WHERE mahlzTagIDRef = " _
& Forms![frm00BWT_Haupt].Form![lstTag], dbOpenDynaset)
Do Until sfrm.EOF
sfrm.MoveNext
Loop
Select Case sfrm.RecordCount
Case Is >= 5
MsgBox Me.Name & ": " & sfrm.RecordCount & " Datensätze"
Me.AllowAdditions = False
Case Is = 0
MsgBox Me.Name & ": " & " keine Datensätze"
Me.AllowAdditions = True
Case Is < 5
MsgBox Me.Name & ": " & sfrm.RecordCount & " Datensätze"
Case Else
MsgBox "anderer Fall"
End Select
Habt Ihr da eine Idee, wie ich das lösen kann, so dass unabhängig davon ob die letzten zwei Felder eingeben wurden oder nicht, meine angezeigten Datensätze im Unterformular gezählt werden?
Hallo,
Du zählst die Anzahl Datensätze des gesamten Recordsets. Die ist natürlich immer gleich, egal, was in den Feldern steht.
Nutze die DCount-Funktion um bestimmte Feldinhalte einer Domäne zu zählen.
https://support.microsoft.com/de-de/office/dcount-funktion-f6b5d78b-ad0b-4e42-be7a-11a64acbf3d3 (https://support.microsoft.com/de-de/office/dcount-funktion-f6b5d78b-ad0b-4e42-be7a-11a64acbf3d3)
Beste Grüße
Andreas
Zitat von: KonradR am April 16, 2023, 11:50:48Habt Ihr da eine Idee, wie ich das lösen kann, so dass unabhängig davon ob die letzten zwei Felder eingeben wurden oder nicht, meine angezeigten Datensätze im Unterformular gezählt werden?
Ich denke, dein Problem muss eine andere Ursache haben. Ob einzelne Felder ausgefüllt wurden oder nicht, hat keine Auswirkung auf die Anzahl der Datensätze.
Hallo,
Zitatdein Problem muss eine andere Ursache haben
Ja, m.E. die Unklarheit darüber welche DS überhaupt gezählt werden sollen; -
die komplett, teilweise oder gar nicht ausgefüllten DS.
Da das UFo ja schon gefiltert ist (nehme ich an) würde ich den Filter
zum Zählen auf dessen RecordsetClone setzen und dann zählen.
gruss ekkehard
Hallo Phils,
Zitat von: PhilS am April 16, 2023, 12:43:53Ob einzelne Felder ausgefüllt wurden oder nicht, hat keine Auswirkung auf die Anzahl der Datensätze
Die Datensätze sind ja da und die Anzahl ändert sich sicher auch nicht. Nur wird gibt es vielleicht noch andere Faktoren, die eine Rolle auf das Ergebnis haben. Und die Zahl die rauskommt entspricht ja nicht immer den reel vorhandenen Datensätzen.
Wenn Datensätze in einem Formular zu zählen sind, würde man doch auch im Formularrecordset zählen und nicht extra ein völlig anderes Recordset erzeugen, das im Zweifelsfall etwas anderes anstellt. Diesem externen Recordset dann noch einen Namen "sfrm" zu geben, ordne ich unter bewusste Täuschung ein.
Siehe Hinweis von ekkehard (bei einem Unterformular):
With Me.UFoControlName.Form.Recordsetclone
.MoveLast
lCount = .RecordCount
End With
Select Case lCount
' ...ZitatDie Datensätze sind ja da ...
Gegenfragen:
Wenn alle 5 Datensätze da sind: Warum zählst Du die? (Anwendungslogik?)
Bei vorhandenen 5 Datensätzen, die aber unvollständig sind, wird die Bearbeitbarkeit abgeschaltet? (Anwendungslogik?)
Bringe zuerst Deinen Ablaufplan in eine gesunde und funktionelle Logik.
Hallo ebs17,
Zitat von: ebs17 am April 17, 2023, 09:11:28Wenn Datensätze in einem Formular zu zählen sind, würde man doch auch im Formularrecordset zählen und nicht extra ein völlig anderes Recordset erzeugen, das im Zweifelsfall etwas anderes anstellt. Diesem externen Recordset dann noch einen Namen "sfrm" zu geben, ordne ich unter bewusste Täuschung ein.
Ich wusste nicht, dass extra ein Recordset für eine Formular gibt. Daher dieser, für dich vielleicht, befremdlich anmutende Code.
Zitat von: ebs17 am April 17, 2023, 09:11:28Siehe Hinweis von ekkehard (bei einem Unterformular):
Code [Auswählen] Erweitern
With Me.UFoControlName.Form.Recordsetclone
.MoveLast
lCount = .RecordCount
End With
Select Case lCount
' ...
Was den Code betrifft, verstehe ich nicht, was ich für den "UFoControlName" einsetzen soll. "Me" ist ja schon das Unterformular und für "Me" gibt es ja auch die Eigenschaft "Form". Die Variable "lCount" habe ich noch deklariert und jetzt geht es. Mir ist allerdings auch aufgefallen, dass ich den Code, den ich veröffentlicht habe in einer If Verzweigung stehen hatte und immer wenn das Feld "cbomahlzRezepIDRef" Null war, dann sollte ein ungebundenes Textfeld beschriftet werden. Das war dazu gedacht, um im Startfall des Formulars, wenn im Kombinationsfeld "cbomahlzRezepIDRef" noch nichts drin steht, die Fehlermeldung zu umgehen, die dann auftritt. Jetzt habe ich das mit "Screen.ActiveForm" gemacht und es funktioniert auch mit meiner Variante. Hier noch mal mein korrigiert Code mit "Screen.ActiveForm":
Sub Form_Current()
Dim rcsP As DAO.Recordset
Dim sfrm As DAO.Recordset
Dim AktivesFormular As Form
Dim lCount As Long
On Error Resume Next
Set AktivesFormular = Screen.ActiveForm
If Err.Number <> 0 Then
DoCmd.OpenForm "frm00BWT_Haupt"
Set AktivesFormular = Screen.ActiveForm
On Error GoTo 0
Else
If IsNull(Forms![frm00BWT_Haupt]![fsubBWTMahlzeitRezepte_Unter].Form![cbomahlzRezepIDRef].Value) Then
Forms![frm00BWT_Haupt].Form![txtRezepNummer].Value = "Bitte ein Rezept auswählen."
Else
Set rcsP = CurrentDb.OpenRecordset("SELECT * FROM qryRezepteSortiert WHERE rezepID = " & _
Forms![frm00BWT_Haupt]![fsubBWTMahlzeitRezepte_Unter].Form![cbomahlzRezepIDRef].Value, dbOpenDynaset)
'Schleife um das gesamte Recordset nach dem Rezept zu der Nummer cbomahlzRezepIDRef zu durchsuchen
Do Until rcsP.EOF
Forms![frm00BWT_Haupt].Form![txtRezepNummer].Value = rcsP.Fields("rezepName").Value
rcsP.MoveNext
Loop
rcsP.Close
End If
' Set sfrm = CurrentDb.OpenRecordset("SELECT mahlzID FROM tblMahlzeit WHERE mahlzTagIDRef = " _
' & Forms![frm00BWT_Haupt].Form![lstTag], dbOpenDynaset)
'
' Do Until sfrm.EOF
' sfrm.MoveNext
' Loop
With Me.Form.RecordsetClone
.MoveLast
lCount = .RecordCount
End With
Select Case lCount
' Select Case sfrm.RecordCount
Case 5
' MsgBox sfrm.RecordCount & " Datensätze" & vbCrLf &
MsgBox lCount & " Datensätze" & vbCrLf & _
"Me.AllowAdditions = False"
' "Datentyp in cbomahlzRezepIDRef: " & VarType(Forms![frm00BWT_Haupt]![fsubBWTMahlzeitRezepte_Unter].Form![cbomahlzRezepIDRef].Value)
' Forms![frm00BWT_Haupt].Form![lstTag].ItemData(0).Value
Me.AllowAdditions = False
Case 0
' MsgBox sfrm.RecordCount & " Datensätze" & " (noch keine Datensätze vorhanden)" & vbCrLf &
MsgBox lCount & " Datensätze" & " (noch keine Datensätze vorhanden)" & vbCrLf & _
"Me.AllowAdditions = True"
' MsgBox Me.Name & ": " & " keine Datensätze" & vbCrLf '& _
' VarType(Forms![frm00BWT_Haupt]![fsubBWTMahlzeitRezepte_Unter].Form![cbomahlzRezepIDRef].Value)
' Forms![frm00BWT_Haupt].Form![lstTag].Value
Me.AllowAdditions = True
Case Is < 5
' MsgBox sfrm.RecordCount & " Datensätze" & vbCrLf &
MsgBox lCount & " Datensätze" & vbCrLf & _
"Me.AllowAdditions = True" & vbCrLf & _
Me.Name
' MsgBox Me.Name & ": " & sfrm.RecordCount & " Datensätze" & vbCrLf '& _
' VarType(Forms![frm00BWT_Haupt]![fsubBWTMahlzeitRezepte_Unter].Form![cbomahlzRezepIDRef].Value)
' Forms![frm00BWT_Haupt].Form![lstTag].Value
Me.AllowAdditions = True
Case Else
MsgBox sfrm.RecordCount & " Datensätze" & " anderer Fall"
' VarType(Forms![frm00BWT_Haupt]![fsubBWTMahlzeitRezepte_Unter].Form![cbomahlzRezepIDRef].Value)
' Forms![frm00BWT_Haupt].Form![lstTag].Value
Me.AllowAdditions = True
End Select
sfrm.Close
End If
End Sub
Zitat von: ebs17 am April 17, 2023, 09:11:28Wenn alle 5 Datensätze da sind: Warum zählst Du die? (Anwendungslogik?)
Bei vorhandenen 5 Datensätzen, die aber unvollständig sind, wird die Bearbeitbarkeit abgeschaltet? (Anwendungslogik?)
Weil ich dann die Eingabe weiterer Datensätze verhindern will. Es soll nur Frühstück, Snack I, Mittagessen, Snack II und Abendessen eingeben werden können. Wenn z.B. Frühstück fehlt, dann soll das noch ergänzt werden können. Dann sind es ja nur 4 Datensätze.
Allerdings wird, wenn es im Unterformular noch keine Datensätze gibt, nicht gezählt und auch nichts angezeigt. Die Bearbeitung (Me.AllowAdditions) ist auch deaktiviert. Sie wird erst aktiviert, wenn ich vorher im UFO eine Datensatzauswahl mit weniger als 5 Datensätzen habe, wo Me.AllowAdditions auf "True" gesetzt ist und anschließend mit einem Klick auf "lstTag" eine Auswahl mit 0 Datensätzen im UFO auswähle. Weist du, wie ich das lösen kann?
Hier ein Bild dazu:
RezepteUndZuatenAnzeigeUFO.png
Hallo Konrad,
ZitatWeil ich dann die Eingabe weiterer Datensätze verhindern will. Es soll nur Frühstück, Snack I, Mittagessen, Snack II und Abendessen eingeben werden können. Wenn z.B. Frühstück fehlt, dann soll das noch ergänzt werden können. Dann sind es ja nur 4 Datensätze.
Warum legst du dann nicht gleich diese 5 DS automatisch an und stellst
im UFo AllowAdditions generell auf False.
Dann musst du nur noch prüfen ob alle Felder ausgefüllt sind. Und die
Fehlermeldung beim Öffnen des HFo entfällt auch. Ausser du öffnest es
mit "Daten eingeben = Ja".
gruss ekkehard
Hallo ekkehard,
Zitat von: Beaker s.a. am April 20, 2023, 09:37:31Warum legst du dann nicht gleich diese 5 DS automatisch an und stellst
im UFo AllowAdditions generell auf False.
Dann musst du nur noch prüfen ob alle Felder ausgefüllt sind. Und die
Fehlermeldung beim Öffnen des HFo entfällt auch. Ausser du öffnest es
mit "Daten eingeben = Ja".
Das könnte ich so machen und das werde ich wahrscheinlich auch. Ich hatte diese Option, ehrlich gesagt, noch gar nicht betrachtet. Das ich mich noch mit dem Thema befasse, ist sicher auch, weil ich das Ganze als Herausforderung gesehen hatte und meine VBA-Kentnisse in Access erweitern wollte.