Neuigkeiten:

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

Mobiles Hauptmenü

Combo-Box-Liste entsprechend Filterung des Formulars

Begonnen von Stele4, Mai 12, 2025, 17:14:34

⏪ vorheriges - nächstes ⏩

Stele4

Hallo!

In einem Formular sind ungebundene Combo-Boxes zum Filtern des Formulars.
Die Liste einer Combobox soll den gruppierten Werten des zugeordneten Tabellenfeldes entsprechen.
Wird im Formular gefiltert, soll auch die Combo-Box-Liste gefiltert werden.

Die Idee war, eine Abfrage auf Me.Recordset anzuwenden.
Das scheint aber nicht moeglich zu sein.

Wie kann die Combo-Box aktualisiert werden?

Gruss
Stele

knobbi38

Hallo Stele,

ZitatDie Idee war, eine Abfrage auf Me.Recordset anzuwenden.
Das das nicht gehen kann, sollte klar sein. Um die Kombobox mit anderen Werten zu laden, mußt du entweder ein neues Recordset erstellen und dieses der Recordset-Eigenschaft der Kombobox zuwweisen oder der Rowsource-Eigenschaft einen anderen SQL-String übergeben.

Gruß Knobbi38

Stele4

Hallo Knobbi!
Die RecordSource des Formulars ist fuer mich ein RecordSet.
Wenn das Formular gefiltert wird, aendert sich meines Erachtens dieses RecordSet.
Fuer die Liste einer ComboBox brauche ich von diesem RecordSet eine Spalte (gruppiert).
Eigentlich eine simple Abfrage auf das aktuelle RecordSet des Formulars.

Set rst = Me.Recordset
...???

Wie lautet der Code mit 'rst', der zum Ziel fuehrt?
Oder muss ich die ungefilterte RecordSource (Bsp. tblDat) noch einmal mit dem FilterString des Formulars filtern?

Set Me.cmbFld1.RowSource = CurrentDb.OpenRecordset "SELECT Fld1 FROM " & Me.RecordSource & " WHERE " & Me.Filter & " GROUP BY Fld1"
Gruss
Stele

knobbi38

Hallo Stele,

du kannst das Formular.Recordset durchlaufen und mit .AddItem die gewünschten Feldinhalte hinzufügen, analog diesem Code:
https://www.access-o-mania.de/forum/index.php?msg=166948

Gruß Knobbi38

Stele4

Hallo Knobbi!
Bei 10000 Datensaetzen ist die Schleife nicht meine 1. Wahl.
Es bleibt dann wohl doch bei der OpenRecordset-Variante.
Bei 10 ComboBoxes muss die gesamte ungefilterte Tabelle 10x abgefragt werden.

    Set dbs = CurrentDb
   
    With Me
        If .Filter = "" Then
            sSql = "SELECT Fld2ID, Fld2 FROM " & .RecordSource & " GROUP BY Fld2Id, Fld2 ORDER BY Fld2"
        Else
            sSql = "SELECT Fld2ID, Fld2 FROM " & .RecordSource & " WHERE " & .Filter & " GROUP BY Fld2Id, Fld2 ORDER BY Fld2"
        End If
       
        Set .cmbFld2_Fltr.Recordset = dbs.OpenRecordset(Name:=sSql, Type:=dbOpenSnapshot)
    End With
   
    Set dbs = Nothing

Dank und Gruss
Stele

knobbi38

Hallo Stele,

sicherlich kann man das auch so machen. Wird denn die Recordsource in deinem Formular überhaupt geändert? Eigentlich kann das bei der Syntax ja nur ein Tabellennamen sein. Den könnte man das auch fest eintragen. 

Eine andere Variante wäre, für den Filter ein TempVar zu verwenden, dann kann bräuchte man bei den Komboboxen nicht mehr die Datenquelle ändern, sondern nur noch der TempVar die neue Filterbedingung zuzuweisen und die Komboboxen mit .Requery zu aktualisieren.

Gruß Knobbi38

Stele4

Hallo Knobbi!
den 2. Absatz habe ich nicht verstanden.

Soll bei der ComboBox im Editor in die RowSource eine Abfrage mit Parameter eingetragen werden?


Gruss
Stele

Beaker s.a.

Hallo Stele,
Set Me.cmbFld1.RowSource = CurrentDb.OpenRecordset "SELECT Fld1 FROM " & Me.RecordSource & " WHERE " & Me.Filter & " GROUP BY Fld1"Leicht angepasst sollte das schon funzen.
Die RowSource erwartet einen String und kein RS, also einfach
Me.cmbFld1.RowSource = "SELECT Fld1 FROM " & Me.RecordSource & " WHERE " & Me.Filter & " GROUP BY Fld1"Hatte Ulrich auch schon vorgeschlagen
Zitatoder der Rowsource-Eigenschaft einen anderen SQL-String übergeben.

Ulrichs Variante mit einer TempVar überzeugt mich nicht. Warum soll ich den Filter erst
in eine TempVar schreiben, wenn ich den auch direkt vom Form übernehmen kann. Und
das .Requery ist bei Zuweisung einer neuen RowSource auch obsolet.

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)

knobbi38

@ekkehard:

möglicherweise ist die Idee mit den Tempvars noch nicht ganz verstanden worden, denn dabei wird die Rowsource überhaupt nicht verändert. Wenn aber die Rowsource nicht verändert wird, ist ein Requery unbedingt notwendig.

Hallo Stele,

ZitatSoll bei der ComboBox im Editor in die RowSource eine Abfrage mit Parameter eingetragen werden?
Nein, eine Parameterabfrage könnte man auch verwenden, wäre aber umständlicher.
Wenn ich schreibe, daß die Datenquelle (Rowsource/Recordset) nicht mehr geändert werden muß, dann habe ich das auch so gemeint. Vor einiger Zeit habe ich in einem anderen Forum bereits verschiedene Möglichkeiten aufgezeigt, wie eine Listbox bzw. Kombobox gefiltert werden könnte, u. a. auch mit Tempvars. Gerade diese Methode finde ich eigentlich sehr elegant.

Im Anhang mal ein entsprechendes Beispiel für eine Listbox. Eine Komboxbox verhält sich diesbezüglich analog.

Gruß Knobbi38

Beaker s.a.

Hallo Ulrich,

Bezügl. des Verständnisses von TempVars will ich dir nicht widersprechen, - ich
bevorzuge öffentl. Properties oder Funktionen.
Das ohne Zuweisung einer neuen RowSource ein .Requery nötig ist, ist
mir klar.
Wie man sieht, führen auch hier viele Wege nach Rom.

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)

knobbi38

@ekkehard:

Sicherlich kann man auch Properties und Funktionen nehmen, aber dafür wir immer VBA Code in einem Modul gebraucht.
Möchte man damit Filterbedingungen umsetzen und dieses dynamisch machen, sind Properties weniger geeignet und auch Funktion könnten dann nur eine globale Variable zurückgeben. Dann kann aber aber auch gleich eine TempVar nehmen, ganz ohne weiteren VBA Code.

IMHO

Ulrich
 

Stele4

Hallo!
Danke fuer die Hilfestellungen!
In der DB werden so einige Kniffe verwendet.
'TempVar' ist neu fuer mich. War mir noch nicht untergekommen?!

Die urspruengliche Frage (sinngemaess): "Kann man das Recordset eines Formulars filtern und davon ein Feld als RowSource einer ComboBox zuweisen?" ist mit "Nein" beantwortet.
Wegen der Menge der ComboBoxes und der moeglichen Komplexitaet des Filters tendiere ich zur Abfrage per VBA.

Gruss und Dank
Stele