Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: KonradR am April 16, 2023, 11:50:48

Titel: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: KonradR am April 16, 2023, 11:50:48
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?
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: andyfau am April 16, 2023, 12:24:19
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
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: PhilS am April 16, 2023, 12:43:53
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.
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: Beaker s.a. am April 16, 2023, 13:20:38
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
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: KonradR am April 16, 2023, 21:11:58
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.
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: ebs17 am April 17, 2023, 09:11:28
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.
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: KonradR am April 20, 2023, 09:11:31
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
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: Beaker s.a. am April 20, 2023, 09:37:31
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
Titel: Re: Datensatzanzahl im Unterformular wird nicht gezählt wie ich es will
Beitrag von: KonradR am April 20, 2023, 10:44:26
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.