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?
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 (https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/me-keyword)
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.
Hallo Konrad,
eine Lösung wäre, beim Öffnen des Dialogfeldes den Filter als Where-Condition mitzugeben.
Gruß Ulrich
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/