Neuigkeiten:

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

Mobiles Hauptmenü

Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will

Begonnen von KonradR, April 16, 2023, 11:50:48

⏪ vorheriges - nächstes ⏩

KonradR

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

Sie dürfen in diesem Board keine Dateianhänge sehen.

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

Sie dürfen in diesem Board keine Dateianhänge sehen.

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?

andyfau

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

Beste Grüße
Andreas
Beste Grüße
Andreas

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

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

KonradR

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.

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

KonradR

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:
Sie dürfen in diesem Board keine Dateianhänge sehen.

Beaker s.a.

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

KonradR

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.