Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Filter Listenfeld und Kombifeld zusammenführen

Begonnen von mad, Januar 09, 2023, 19:48:26

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

aktuell habe ich ein HF ,,frmAusbildliste" mit UF ,,UF_ frmAusbildliste".
Im Listenfeld ,,lstAusbildListe" kann man einen oder mehrere Lehrgänge aus einer Liste auswählen.
Sobald ich den ,,btnFilter" (im HF) betätige wird das UF ,,UF_frmAusbildListe" entsprechend der Auswahl gefiltert.
Code des Bottons ,,btnFilter" (nicht selbst erstellt):

Private Sub btnFilter_Click()

    Dim vItem As Variant
    Dim sAuswahl As String
    Dim MyArr As Variant
    Dim MyNumber As Long
    MyArr = GetSelection(Me.lstAusbildListe, MyNumber)
    If MyNumber > 0 Then
        sAuswahl = "LehrgangTitelID_F=" & Join(MyArr, " OR LehrgangTitelID_F=")
    End If
        Me!UF_frmAusbildListe.Form.Filter = sAuswahl
        Me!UF_frmAusbildListe.Form.FilterOn = True
End Sub
Funktioniert soweit.

Nun soll nachträglich noch das Jahr indem der Lehrgang abgeschlossen wurde gefiltert werden können.
Habe dazu ein Kombifeld ,,Lehrgjahr" mit diversen Jahreszahlen im HF eingefügt.
Datenherkunft: 1991,1992,1993, usw. bis 2030
Standartwert: =DatTeil("jjjj";Datum())


Code für das Kombifeld (selbst erstellt):
Private Sub Lehrgjahr_AfterUpdate()
     With Me!UF_frmAusbildListe.Form
         .Filter = "LehrgJahr = " & Me!Lehrgjahr
         .FilterOn = True
     End With
End Sub
Filter funktioniert soweit.

Das Problem ist, wenn ich das UF zuerst über den ,,btnFilter" filtere und anschliessend mit dem Kombifeld, wird die erste Filterung (btnFilter) zurückgesetzt und das UF nur nach dem ausgewählten Jahr gefiltert.
Umgekehrt ist es der selbe Effekt.

Idealerweise wäre wenn man beide Codes (Filter) zusammenbringt.
In etwas so: Auswahl im Listenfeld ,,lstAusbildListe", danach Jahreszahl im Kombifeld ,,Lehrgjahr" und dann über den Botton ,,btnFilter" das UF ,,UF_frmAusbildListe" entsprechend filtern.
Nur leider weis ich nicht wie ich die beiden Codes zusammenführen kann.

Ich wäre auch zufrieden wenn sich der zuerst gesetzte Filter nicht zurückstellen würde. Aber auch hierfür bräuchte ich Unterstützung.

Danke
mad
  •  

andyfau

Hallo,
der Filterstring sAuswahl  in btnFilter_Click() muss um die Logik "LehrgJahr = " & Me!Lehrgjahr erweitert werden, weil immer nur ein Filter für ein Recordset aktiv ist.
Je nach dem, was gewollt ist, mit AND oder OR verknüpft. AND bindet dabei stärker als OR.
Alernativ sAuswahl mit IF-Schachtelung aufbauen.

Beste Grüße
Andreas
  •  

mad

Hallo,

habe den Filterstring wie folgt erweitert:

sAuswahl = "LehrgangTitelID_F=" & Join(MyArr, " OR LehrgangTitelID_F=") & " AND " & "LehrgJahr = " & Me!Lehrgjahr
funktioniert aber nur, wenn im Listenfeld "lstAusbildListe" nur eine Auswahl getroffen wird.
Bei Mehrfachauswahl, wird das Jahr aus dem Kombifeld "Lehrgjahr" nicht mehr berücksichtig.

Ergänzung: Was auch nicht funktioniert wenn das Kombifeld leer ist. Dann es wie * funktionieren.

Wie müsste der Code aussehen?


Gruss
mad
  •  

ebs17

ZitatWie müsste der Code aussehen?
Primär müsstest Du Dir die Frage stellen und beantworten, wie das ERGEBNIS (korrekter Filter) aussehen muss. Schreib das auf!
Debug.Print sAuswahlDamit kannst Du Dir anschauen, was Du vergleichend dazu produziert hast.
Da Texte zusammensetzen nicht wirklich eine große Herausforderung sein sollte (die Filter sind vor Verwendung nur kleine Texte), kannst Du Dein Tun analysieren und korrigieren, und zwar dann mit einem Plan und nicht nur auf Basis Try&Error, und das auch selbständig, ohne Warten auf einen Rettungsballon.

Sinngemäß sollte ja wie beschrieben folgendes passieren:
sFilter = "(" & sFilter_1 & ")" & _
    " AND " & _
    "(" & sFilter_2 & ")"
Die hier etwas ausführliche (übertriebene) Klammersetzung dient dazu, die interne Logik der Einzelfilter zu bewahren, so wie es auch gerne der Abfrageeditor macht.

Mit etwas Verständnis kann man das auf Übersichtliches einkürzen. Zu einem Verstehen ist es auch nützlich, lesen zu können, was man geschrieben hat. Wenn man weniger Klammern mit den Fingern abzählen muss, schadet das nicht (Hände haben nur eine begrenzte Anzahl an Fingern).
Mit freundlichem Glück Auf!

Eberhard
  •  

mad

#4
Hallo,

habe mal diveres im Internet nachgelesen und den Rat mit "Debug.Print sAuswahl" angewendet.
Leider reichen meine Kenntnisse noch nicht aus um auf die finale Lösung zu kommen.

Nachfolgendes habe ich versucht:

Versuch1
sAuswahl = "LehrgangTitelID_F=" & Join(MyArr, " OR LehrgangTitelID_F=") & " AND " & "LehrgJahr = " & Me!LehrgjahrErgebnis (Debug.Print sAuswahl)
ZitatLehrgangTitelID_F=3 OR LehrgangTitelID_F=5 AND LehrgJahr = 2022
Läuft nicht auf Fehler, aber der Filter wird auf die Auswahl des Listenfelds zurückgesetzt, daß Jahr bleibt unberücksichtigt.


Versuch2
sAuswahl = "LehrgangTitelID_F=" & Join(MyArr, " OR LehrgangTitelID_F=") & " AND " & (" LehrgJahr = " & Lehrgjahr & ")")Ergebnis (Debug.Print sAuswahl)
ZitatLehrgangTitelID_F=3 OR LehrgangTitelID_F=5 AND  & LehrgJahr = 2022)


Versuch3
sAuswahl = "LehrgangTitelID_F=" & Join(MyArr, " OR LehrgangTitelID_F=") & " AND " & (" & Lehrgjahr =")Ergebnis (Debug.Print sAuswahl)
ZitatLehrgangTitelID_F=3 OR LehrgangTitelID_F=5 AND  & Lehrgjahr =


Versuch4
sAuswahl = "LehrgangTitelID_F=" & Join(MyArr, " OR LehrgangTitelID_F=") & " AND " & "LehrgJahr=" & Me!LehrgjahrErgebnis (Debug.Print sAuswahl)
ZitatLehrgangTitelID_F=3 OR LehrgangTitelID_F=5 AND Lehrgjahr=2022

Der Versuch4 gibt zwar die Ergebnisse "=3 =5 =2022" soweit richtig aus, aber das UF aktualisiert sich noch nicht.

Jetzt ist mir noch was eingeschossen an was es event liegen könnte:
Ich muß jeden Lehrgangstitel mit dem Lehrgangsjahr abfragen. Sinngemäß etwa so:

sAuswahl = "LehrgangTitelID_F=" & " AND " & "LehrgJahr=" & Me!Lehrgjahr & Join(MyArr, " OR LehrgangTitelID_F=" & " AND " & "LehrgJahr=" & Me!Lehrgjahr)

Wär das der richtige Weg?


Gruss
mad
  •  

ebs17

Zitatwie das ERGEBNIS (korrekter Filter) aussehen muss. Schreib das auf!
Überlegen fängt von vorne an. Wenn Du gesetzte Grundlagen ignorierst, steigt unheimlich die Wahrscheinlichkeit, dass Du nur im Nebel stocherst. Ein Treffer wäre dann zufällig.
Also: Erst Sinnieren, dann Aktionieren.

LehrgangTitelID_F=3 OR LehrgangTitelID_F=5 AND LehrgJahr = 2022

' um sich dieser Werte zu bedienen
' => AND bindet mehr als OR (ich wiederhole Bekanntes), wird also zuerst logisch verknüpft und ausgeführt
' => meine Hinweise zur Klammerung hast Du komplett ignoriert

' ein korrekter Filter würde so aussehen:
(LehrgangTitelID_F=3 OR LehrgangTitelID_F=5) AND LehrgJahr = 2022
' oder übersichtlicher und tendenziell geringfügig schneller
LehrgangTitelID_F IN (3, 5) AND LehrgJahr = 2022

Das wäre jetzt das Ergebnis, was die VBA-Maßnahmen erbringen sollten.

(LehrgangTitelID_F=3 OR LehrgangTitelID_F=5) AND LehrgJahr = 2022

' könnte man natürlich auch umformen als
(LehrgangTitelID_F=3 AND LehrgJahr = 2022) OR (LehrgangTitelID_F=5 AND LehrgJahr = 2022)
' Aber ist das a) hilfreich (lesbar und verständlich) und b) technisch leicht umsetzbar?

ZitatWär das der richtige Weg?
Kannst Du Dir mit den gegebenen Informationen Deine Frage selbst beantworten?

Zum Vertiefen:
Grundlagen - SQL ist leicht (15) - Mehrfachauswahl zum Filtern umsetzen
Mit freundlichem Glück Auf!

Eberhard
  •  

mad

Hallo Eberhard,

das was man erreichen will das weis man ja meistens, wenigstens so einigermasen. Aber wie man da hinkommt, daß ist für mich in Access doch noch sehr mühsam.

Habe mich jetzt wie folgt herangetastet, ums für mich besser verständlich zu machen.

habe jeden esrtmal für sich erstellt so das jeder für sich erstmal funktioniert.
Anschlissend dann in "sAuswahl3" zusammengeführt.

sAuswahl1 = "LehrgJahr=" & Me!Lehrgjahr
sAuswahl2 = "LehrgangTitelID_F=" & Join(MyArr, " OR LehrgangTitelID_F=")
sAuswahl3 = "(" & sAuswahl1 & ")" & " AND " & "(" & sAuswahl2 & ")"

Und am Ende dann "sAuswahl3" anwenden lassen.

Funktioniert soweit

Final habe ich jetzt "sAuswahl1" und "sAuswahl2" gegen die eigentlichen Codes ausgetausch.
Funktioniert.

Das ganze noch mehr zu vereinfachen, werde ich wohl nicht hinbekommen.


Danke, Danke, Danke
mad
  •  

Beaker s.a.

ZitatDas ganze noch mehr zu vereinfachen, werde ich wohl nicht hinbekommen.
Zumindest kannst du die mittleren & weglassen
sAuswahl3 = "(" & sAuswahl1 & ") AND (" & sAuswahl2 & ")"
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.
  •  

ebs17

Toll, dass Dir das Herantasten an den Vorschlag aus #3 gelungen ist.
Mit freundlichem Glück Auf!

Eberhard
  •