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
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
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
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 sAuswahl
Damit 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).
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!Lehrgjahr
Ergebnis (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!Lehrgjahr
Ergebnis (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
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 (https://www.ms-office-forum.net/forum/showthread.php?t=373473)
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
ZitatDas ganze noch mehr zu vereinfachen, werde ich wohl nicht hinbekommen.
Zumindest kannst du die mittleren & weglassen
sAuswahl3 = "(" & sAuswahl1 & ") AND (" & sAuswahl2 & ")"
Toll, dass Dir das Herantasten an den Vorschlag aus #3 (https://www.access-o-mania.de/forum/index.php?topic=26427.msg157746#msg157746) gelungen ist.