Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Bernd Sowa am Mai 03, 2020, 19:45:46

Titel: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 03, 2020, 19:45:46
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
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: DF6GL am Mai 03, 2020, 20:08:37
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.


Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Beaker s.a. am Mai 04, 2020, 17:13:09
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
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 13, 2020, 18:27:52
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?
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: DF6GL am Mai 14, 2020, 08:09:09
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 & ")"
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 14, 2020, 13:52:55
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...
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: DF6GL am Mai 14, 2020, 14:16:18
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.
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 14, 2020, 15:09:09
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.
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Beaker s.a. am Mai 14, 2020, 18:08:48
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
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 14, 2020, 18:32:17
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
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Beaker s.a. am Mai 14, 2020, 18:51:01
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
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 14, 2020, 19:45:53
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.
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Beaker s.a. am Mai 14, 2020, 21:07:50
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
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 15, 2020, 07:56:17
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.
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 15, 2020, 08:33:52
Eine (sehr) stark abgespeckte Version der Datenbank...
Das Problem tritt auch hier auf.
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: DF6GL am Mai 15, 2020, 11:33:08
Hallo,


schreib mal so:
Zitat.
.
.
            For Each varItem In .Listenfeld.ItemsSelected
                sCriteria = sCriteria & "'" & .Listenfeld.Column(0, varItem) & "', "
.
'oder       sCriteria = sCriteria & "'" & .Listenfeld.ItemData(varItem) & "', "
.
            Next varItem
.
.
.
Titel: Re: Im Formular durch Mehrfachauswahl filtern
Beitrag von: Bernd Sowa am Mai 15, 2020, 12:50:54
Hallo Franz und Ekkehard,
jetzt funzt es... Hurra!
Vielen Dank für eure Geduld mit mir...
Ich habe ja nur ganz selten mal mit Access zu tun und mit Makros (soweit einsetzbar) komme ich ja einigermaßen klar aber in meinem Alter fällt es schwer VBA noch zu lernen.
Vielleicht wenn man mal an die Hand genommen wird und jemand erklärt etwas Auge in Auge.
Aber ganz alleine und nur durch Bücher oder WWW fällt es schwer.
Häufig (und das schließt diese Seite auch ein) werden Lösungsvorschläge gemacht die ein gewisses Maß an VBA Kenntnisse voraussetzen die, zumindest bei mir, einfach nicht vorhanden sind.
Also noch einmal "Danke sehr für eure Mühen"...
LG
Bernd