Neuigkeiten:

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

Mobiles Hauptmenü

Im Formular durch Mehrfachauswahl filtern

Begonnen von Bernd Sowa, Mai 03, 2020, 19:45:46

⏪ vorheriges - nächstes ⏩

Bernd Sowa

Hallo zusammen,
ich brauche noch einmal eure Hilfe.
Ich habe eine Tabelle [Tabelle1], eine Abfrage [Abfrage] und ein Formular [For1].
Darin unter Anderem das Feld ,,Status2", und ein Listenfeld
    für eine mögliche Mehrfachauswahl.
    Nun möchte ich, dass mir im Formular nur die Datensätze angezeigt werden, die mit der Mehrfachauswahl übereinstimmen.
    Entweder direkt im Formular oder über die Abfrage.
    Z.B. mit ,,nach Aktualisierung" oder ,,bei Klick" über VBA.
    Ist mir eigentlich egal, Hauptsache es funktioniert.
    Ich hoffe, ich habe mich verständlich ausgedrückt.
    Über ein wenig Zuwendung würde ich mich freuen...
    Ich kriegs nicht hin...

DF6GL

Hallo,

und welche Art von Zuwendung stellst Du Dir vor?

Schreib eine Prozedur, die die markierten Listenfeld-Einträge ausliest und füge die zu einem String zusammen, der eine IN-Where-Condition darstellt und filtere damit das Formular oder füge die in die Abfrage ein.


Suche hier im Forum nach "Itemsselected" oder "ItemData", dann findest Du passende Beispiele.


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

Hallo Bernd,
Da ich befürchte, dass du Franz' Hinweise evtl. nicht so recht umsetzen kannst
ZitatSchreib eine Prozedur
Bei einem Listfeld mit Mehrfachauswahl sind die Ereignisse  "Click"
und/oder "AfterUpdate" nicht gut geeignet. Da ist ein zusätzl. Button besser.
Damit kannst du den Filter auch gleich wieder zurücksetzen, wenn du möchtest.
(Luftcode)
private Sub DeinButton_Click()
    dim sCriteria as String
    dim varItem as Variant

    with me
        sCriteria = "IN ("
        if .deineliste.itemsselected.count > 0 Then
            for each varitem in .deineliste.itemsselected
                sCriteria = sCriteria & varitem & ", "
'wenn varitem vom Datentyp "Text"
'sCriteria = sCriteria & "'" & varitem & "', "
            next varitem
            'letztes komma abschneiden
            sCriteria = Left(sCriteria, Len(sCriteria) -2)
            'String zur Prüfung im Direktfenster ausgeben
            Debug.Print sCriteria    'wenn korrekt dann
            .Filter = "Feldname " & sCriteria
            .FilterOn = True
        else
            .filter = ""
            .filteron = false
        end if
    end with
end sub

Zurücksetzen (Else-Zweig) geht natürlich schneller mit einem zweiten Button,
weil dann die Auswahl nicht einzeln wieder abgewählt werden muss.
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)

Bernd Sowa

#3
Hallo Ekkehard,
ich habe erst heute gesehen, dass du noch auf die Frage geantwortet hast.
Danke dafür.
Ich bin mit dem Tip vom Franz auch nicht wirklich klar gekommen (soll heißen "war ich hoffnungslos überfordert").

Nun habe ich versucht, deinen Code auf mein Formular anzupassen.

das Listenfeld heisst "Listenfeld"
Der Button heisst "Filter1"
das Feld in dem gesucht oder gefiltert werden soll heißt "Status2" und ist vom Tatentyp "kurzer Text"

darin sind eigentlich nur 3 verschiedene Werte: aktiv;ausgeschieden;-/-
Irgendwie ist mir aber ein Fehler unterlaufen. Oder ich habe deine Bemerkungen falsch verstanden...
So sieht es nun aus.

Private Sub Filter1_Click()
    Dim sCriteria As String
    Dim varItem As Variant
    With Me
        sCriteria = "IN ("
        If .Listenfeld.ItemsSelected.Count > 0 Then
            For Each varItem In .Listenfeld.ItemsSelected
                sCriteria = sCriteria & "'" & varItem & "', "
            Next varItem
                     sCriteria = Left(sCriteria, Len(sCriteria) - 2)
                      Debug.Print sCriteria 
            .Filter = "Status2 " & sCriteria
            .FilterOn = True
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
End Sub


Wo liegt mein Fehler?

DF6GL

Hallo,


ZitatIch bin mit dem Tip vom Franz auch nicht wirklich klar gekommen

Das ist natürlich ein dicker Hund  ;) ;) ;D ;D .   Dann bitte gleich "reklamieren"..



Offensichtlich (Debug.Print ansehen!)  fehlt die abschließende Klammer:
Zitat
.Filter = "Status2 " & sCriteria & ")"
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Bernd Sowa

Hallo Franz, Teilerfolg...
In dem Sinne, dass überhaupt etwas passiert.
Nur werden jetzt, nachdem ich ein oder zwei Einträge im Listenfeld ausgewählt habe und danach den Button Filter1 angeklickt habe, alle Datensätze ausgeblendet anstatt zu filtern.
Alles wech...  :o

so sieht der Code nun aus:

Private Sub Filter1_Click()
    Dim sCriteria As String
    Dim varItem As Variant
    With Me
        sCriteria = "IN ("
        If .Listenfeld.ItemsSelected.Count > 0 Then
            For Each varItem In .Listenfeld.ItemsSelected
                sCriteria = sCriteria & "'" & varItem & "', "
            Next varItem
                     sCriteria = Left(sCriteria, Len(sCriteria) - 2)
                      Debug.Print sCriteria
            .Filter = "Status2 " & sCriteria & ")"
            .FilterOn = True
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
End Sub

da ist noch ein Würmchen drinne, fürchte ich...

DF6GL

#6
Hallo,

dann schau mal im Direktfenster nach, was Debug.Print sCriteria dort hinschreibt und C&P das hier...

oder besser noch:
Zitat.
        .FilterOn = True
        Debug.Print .Filter
     
  Else
.

und was bedeutet das:
Zitatalle Datensätze ausgeblendet anstatt zu filtern.

Vermutlich wird so gefiltert, dass es keine DS mit entspr. der Listenfeldauswahl gibt.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Bernd Sowa

Franz, du hast einen Super-DAU am anderen Ende...
Fein, nun weiß ich dass es ein Direktfenster gibt :-)
Also ich habe den Editor geöffnet, setze den Cursor hinter  Debug.Print sCriteria  und klicke auf "ausführen". Danach geht ein Fenster auf und ich werde nach einem Makronamen gefragt?!?!
Der Direktbereich bleibt leer...
Ich fürchte, ich mache etwas falsch...

In der Spalte Status2 gibt es die Einträge aktiv;ausgeschieden;-/-.
Leere Felder gibt es nicht.
Wenn ich nun im Listenfeld z.B. "aktiv" auswähle und den Button betätige werden keinerlei Datensätze angezeigt obwohl es einige mit diesem Eintrag gibt.

Beaker s.a.

Hallo Bernd,
F5 funzt in Formularmodulen nicht. Aber du hast ja den Button.
ZitatIn der Spalte Status2 gibt es die Einträge aktiv;ausgeschieden;-/-.
Wozu brauchst du bei drei Auswahlmöglichkeiten dann eine Mehrfachauswahl?
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)

Bernd Sowa

Hallo Ekkehard,

ich möchte je nach Bedarf mal alle Datensätze sehen, mal nur "ausgeschieden", mal "aktiv" und "-/-".
Da schien mir ein Listenfeld mit Mehrfachauswahl ein gutes Mittel zu sein.
Hast du einen anderen Vorschlag?
Ich bin für alles dankbar.

Gruß
Bernd

Beaker s.a.

Hallo Bernd,
Erstmal sorry für die fehlende Klammer. Aber die Korrektheit von Code
sollte man mit den gegebenen Mitteln (Kompilieren, Debuggen, Einzelschritt-
modus) schon überprüfen. Dabei lernt man ihn auch zu verstehen.
ZitatHast du einen anderen Vorschlag?
Nein. Denn dann ist das mit der Mehrfachauswahl schon o.k.
Was kommt den nun bei Debug.Print heraus?
Aber mal eben was anderes, gibt es für die Status eine Tabelle, und wenn ja,
hat die eine ID? Das Prinzip bleibt zwar das Gleiche, aber für Filter (SQL) sollte
man mit den Schlüsselfeldern arbeiten, denn dazu sind sie da.

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)

Bernd Sowa

nein, leider keine ID zu den Einträgen in Status2.

das mit dem Direktfenster habe ich ja nicht hinbekommen.
Bis heute wusste ich ja noch nicht einmal, dass es so etwas gibt, geschweige denn wie man damit Code überprüft.
Was ich gemacht habe habe ich ja beschrieben, aber access fragt mich immer nach einem Makronamen...
Bin da ratlos.

Beaker s.a.

Hallo Bernd,
Zitatdas mit dem Direktfenster habe ich ja nicht hinbekommen
Öffne das Formular, wähle in der Liste ein-zwei Status aus, klicke auf
den Button und schau dir das Direktfenster an.
Oder versuche es 
'statt mit
Debug.Print .Filter
'mit
MsgBox .Filter


Am Besten du lädst die DB mal mit ein paar Beispieldaten hier hoch.

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)

Bernd Sowa

Mojn Ekkehard

im Direktfenster steht nach Klick auf den Button (ich habe zwei von drei Möglichkeiten ausgewählt):

IN ('0', '2'
Status2 IN ('0', '2')

vielleicht hilft dir das.

Bernd Sowa

Eine (sehr) stark abgespeckte Version der Datenbank...
Das Problem tritt auch hier auf.