Neuigkeiten:

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

Mobiles Hauptmenü

mit Recordsetclone ist leer obwohl im UFO Daten zu sehen sind

Begonnen von KonradR, September 27, 2024, 05:17:44

⏪ vorheriges - nächstes ⏩

KonradR

Hallo liebe Accessfreunde,

ich habe ein Pop-Up-Formular mit einem Unterformularsteuerelement, das ein Endlosformular enthält und möchte nun mit der Recordsetclone-Eigenschaft die aktuell zugrunde liegenende Abfrage mit Filterung auslesen. Leider wird über debug.print nur ein Leerstring angezeigt. Also nichts. Bei meinem Hauptformular (kein Pop-Up-Formular) funktioniert es. Hier mein Versuch, wo es funktioniert:
Private Sub Form_Load()
Dim SQL As String

    Me.txtRezeptAlsZutat.Value = Forms("frm00BWT_Haupt").Controls("cboRezeptAlsZutat").Text 'In 1. Feld den Text vom Kombinationsfeld "Rezepte als Zutaten" anzeigen
    Me.txtRezepID.Value = Forms("frm00BWT_Haupt").Controls("cboRezeptAlsZutat").Value 'In 2. Feld den Wert vom Kombinationsfeld "Rezepte als Zutaten" anzeigen
   
    'im sfrmPopRezeptAlsZutatUnter2 nichts anzeigen(Recordset so sortieren, dass kein DS angezeigt wird)
    SQL = "SELECT * FROM qryZutatenEinkaufsliste WHERE 1=2"
    Me.Controls("sfrmPopRezeptAlsZutatUnter2").Form.RecordSource = SQL

    'Bestätigungsschaltfläche anhand der Auswahl im Kombinationsfeld anpassen
    Me.cmdZutatenUebernehmen.Caption = "Zutaten von " & Forms("frm00BWT_Haupt").Controls("cboRezeptAlsZutat").Text & vbCrLf _
    & " nach" & vbCrLf & Forms("frm00BWT_Haupt").Controls("txtRezepNummer").Value & " übernehmen?"
   
    Dim rcsGPruefen As DAO.Recordset
    Dim strSQL As String
    Dim strQuery As String
    Dim fld As DAO.Field
   
'    strQuery = Forms("frm00BWT_Haupt").Controls("sfrmBWTEinkaufsliste_Unter").Form.Recordset
'    'Alle Zutaten aus der aktuellen Zutatenliste mit "g" als Zutat herausfiltern
'    strSQL = "SELECT * FROM " & strQuery '& " WHERE ZutatSammlgwenameIDRef = 1" 'AND Hier müsste ich noch die aktuelle Filterung des Formulars herausbekommen

    DoCmd.OpenForm "frmPopRezeptAlsZutat"
'    Debug.Print strSQL
   
'    Set rcsGPruefen = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
    Set rcsGPruefen = Forms("frm00BWT_Haupt").Controls("sfrmBWTEinkaufsliste_Unter").Form.RecordsetClone
'    Set rcsGPruefen = Me.sfrmPoPBWTMahlzeitRezepteZutatenErfassen_Unter.Form.RecordsetClone

    If Not rcsGPruefen.EOF Then
        Do Until rcsGPruefen.EOF
            For Each fld In rcsGPruefen.Fields
                Debug.Print "(" & rcsGPruefen("ZutatSammlID").Value & ")" & fld.Name & ":" & rcsGPruefen(fld.Name).Value
            Next
'            Debug.Print vbCrLf
       rcsGPruefen.MoveNext
        Loop
    Else
        Debug.Print "nüscht drin"
    End If
End Sub

Und hier mein Versuch, wo es nicht funktioniert (Es wird der ELSE Zweig der IF-Anweisung ausgeführt und Debug.Print "nüscht drin" ausgeführt):
Private Sub Form_Load()
Dim SQL As String

    Me.txtRezeptAlsZutat.Value = Forms("frm00BWT_Haupt").Controls("cboRezeptAlsZutat").Text 'In 1. Feld den Text vom Kombinationsfeld "Rezepte als Zutaten" anzeigen
    Me.txtRezepID.Value = Forms("frm00BWT_Haupt").Controls("cboRezeptAlsZutat").Value 'In 2. Feld den Wert vom Kombinationsfeld "Rezepte als Zutaten" anzeigen
   
    'im sfrmPopRezeptAlsZutatUnter2 nichts anzeigen(Recordset so sortieren, dass kein DS angezeigt wird)
    SQL = "SELECT * FROM qryZutatenEinkaufsliste WHERE 1=2"
    Me.Controls("sfrmPopRezeptAlsZutatUnter2").Form.RecordSource = SQL

    'Bestätigungsschaltfläche anhand der Auswahl im Kombinationsfeld anpassen
    Me.cmdZutatenUebernehmen.Caption = "Zutaten von " & Forms("frm00BWT_Haupt").Controls("cboRezeptAlsZutat").Text & vbCrLf _
    & " nach" & vbCrLf & Forms("frm00BWT_Haupt").Controls("txtRezepNummer").Value & " übernehmen?"
   
    Dim rcsGPruefen As DAO.Recordset
    Dim strSQL As String
    Dim strQuery As String
    Dim fld As DAO.Field
   
'    strQuery = Forms("frm00BWT_Haupt").Controls("sfrmBWTEinkaufsliste_Unter").Form.Recordset
'    'Alle Zutaten aus der aktuellen Zutatenliste mit "g" als Zutat herausfiltern
'    strSQL = "SELECT * FROM " & strQuery '& " WHERE ZutatSammlgwenameIDRef = 1" 'AND Hier müsste ich noch die aktuelle Filterung des Formulars herausbekommen

    DoCmd.OpenForm "frmPopRezeptAlsZutat"
'    Debug.Print strSQL
   
'    Set rcsGPruefen = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
'    Set rcsGPruefen = Forms("frm00BWT_Haupt").Controls("sfrmBWTEinkaufsliste_Unter").Form.RecordsetClone
    Set rcsGPruefen = Me.sfrmPoPBWTMahlzeitRezepteZutatenErfassen_Unter.Form.RecordsetClone

    If Not rcsGPruefen.EOF Then
        Do Until rcsGPruefen.EOF
            For Each fld In rcsGPruefen.Fields
                Debug.Print "(" & rcsGPruefen("ZutatSammlID").Value & ")" & fld.Name & ":" & rcsGPruefen(fld.Name).Value
            Next
'            Debug.Print vbCrLf
       rcsGPruefen.MoveNext
        Loop
    Else
        Debug.Print "nüscht drin"
    End If
End Sub
Habt ihr da eine Idee?

Knobbi38

Hallo Konrad,

ich gehe jetzt mal davon aus, daß das Popup-Formular nicht im Dialogmodus geöffnet wird.

Daraus ergibt sich dann, daß mit
DoCmd.OpenForm "frmPopRezeptAlsZutat"zwar dein Popup geöffnet wird, dann aber im weiteren Verlauf mit
Set rcsGPruefen = Me.sfrmPoPBWTMahlzeitRezepteZutatenErfassen_Unter.Form.RecordsetClonewegen dem Schlüsselwort Me auf die falsche Instanz des Formulars zugegriffen wird.

Siehe auch:
https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/me-keyword

KonradR

Hallo knobbi38,

Zitat von: knobbi38 am September 27, 2024, 10:06:29wegen dem Schlüsselwort Me auf die falsche Instanz des Formulars zugegriffen wird.
Das würde Sinn ergeben, denn im Hauptformular ist ein Unterformular mit gleichem Inhalt aber einem anderen Filter geöffnet. Dann könnte es vielleicht zu Verwirrungen kommen, welcher Recordsetclone denn nun gemeint ist und ich diesen klar ansprechen.
Ich werde hier mal nachschauen: https://learn.microsoft.com/de-de/office/vba/access/concepts/forms-design/create-multiple-instances-of-a-form.

Ich melde mich, wenn ich eine Lösung habe oder nicht weiterkomme. Danke für den Tip.

Knobbi38

Hallo Konrad,

eine Lösung wäre, beim Öffnen des Dialogfeldes den Filter als Where-Condition mitzugeben.

Gruß Ulrich

KonradR

Hallo Ulrich,

Zitat von: knobbi38 am September 28, 2024, 09:15:54eine Lösung wäre, beim Öffnen des Dialogfeldes den Filter als Where-Condition mitzugeben.
Danke dafür.

Es lag daran, dass mit der "DoCmd.OpenForm"-Methode jedes Formular nur ein mal geöffnet werden kann. Wenn ich ein und das selbe Formular in mehreren Instanzen, weil ich jedes Formular mit anderen Filtern belege, öffnen will, geht das mit der "DoCmd.OpenForm"-Methode nicht, weil jede Instanz (geöffnetes Formular) instanziiert werden muss. Ich habe das nun so gelöst:
   
Dim m_frm As Form

Private Sub cboRezeptAlsZutat_AfterUpdate()
Set m_frm = New Form_frmPopRezeptAlsZutat
    With m_frm
        .Visible = True
    End With
End Sub
Dein Beitrag hat mich auf den richtigen Weg gebracht vielen Dank dafür.

Dabei wird eine Variable als modulöffentliche Variable deklariert, damit das Formular auch zu sehen ist und nach Beendigung der Prozedur und mit Löschung der Variablen nicht geschlossen wird und geöffnet bleibt. Das Kombinationsfeld cboRezeptAlsZutat ist auf dem Hauptformular und löst nach dem AfterUpdate Ereignis das Öffnen des Pop-Up-Formulars aus. Hier der Link zu meiner Rechersche: https://access-im-unternehmen.de/modale_dialoge_nach_wunsch_gestalten/