Neuigkeiten:

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

Mobiles Hauptmenü

Mehrfacher Filter

Begonnen von KlausMaus, November 15, 2011, 16:46:57

⏪ vorheriges - nächstes ⏩

KlausMaus

Hallo erstmal,

ich habe eine Tabelle mit ca. 10 Feldern erstellt. In einem Formular will ich daraus Datensätze filtern, und zwar nach Vergleichskriterien aller Felder gleichzeitig.

Anbei mal ein Beispielbild. Oben die 10 Filter. Wenn ich z.B. im Filter über "Dateiname" eine "2" eingebe, filtert das System auch Dateien aus, die eine "2" enthalten. Offenbar liegt das daran, dass das Feld "Stichwörter" keinen Inhalt hat. Erst wenn die Filter und Feldinhalt 100% übereinstimmen taucht der Datensatz wieder auf.

Leider kann ich nicht wirklich VBA programmieren, habe nur noch etwas Basic aus den Anfangszeiten der Computerei im Kopf. Ich suche mir solche Codeschnipsel im Internet und versuche sie an meine Bedürfnisse anzupassen, nicht immer weiss ich genau was ich da tue  :-[

Hier mal der Code der unter dem Filter "Dateiname" steht:

-------------------------
Private Sub Text5_Change()
Dim strsuche As String
  Me![Text33].SetFocus
  Me.Filter = "[Rubrik] Like '*" & Me!Text1 & "*'"
  Me.Filter = Me.Filter & " and [Belegart] Like '*" & Me!Text2 & "*'"
  Me.Filter = Me.Filter & " and [Kategorie] Like '*" & Me!Text3 & "*'"
  Me.Filter = Me.Filter & " and [Händler] Like '*" & Me!Text4 & "*'"
  Me.Filter = Me.Filter & " and [Dateiname] Like '*" & Me!Text5 & "*'"
  If [Hersteller] <> "" Then Me.Filter = Me.Filter & " and [Hersteller] Like '*" & Me!Text6 & "*'"
  If [Artikeltyp] <> "" Then Me.Filter = Me.Filter & " and [Artikeltyp] Like '*" & Me!Text7 & "*'"
  If [Modell] <> "" Then Me.Filter = Me.Filter & " and [Modell] Like '*" & Me!Text8 & "*'"
  Me.Filter = Me.Filter & " and [Jahr] Like '*" & Me!Text9 & "*'"
  If [Stichwörter] <> "" Then Me.Filter = Me.Filter & " and [Stichwörter] Like '*" & Me!Text10 & "*'"
  Me.FilterOn = True
  Me![Text5].SetFocus
  If intkeyascii = 32 Then
     Me![Text5] = Me![Text5] & Chr(32)
    End If
  If Me.RecordsetClone.RecordCount = 0 Then
  Else
    Me![Text5].SelStart = Len("" & Me![Text5])
End If
End Sub

Private Sub Text5_KeyPress(KeyAscii As Integer)
intkeyascii = KeyAscii
End Sub
-----------------------------------

Außerdem blenden jedesmal wenn ich ein Zeichen eingebe ganz kurz alle Datensätze auf bevor der Filter wirkt. Es wird also anscheinend kurz wieder "entfiltert" und dann neu gefiltert. Das ist nicht schlimm, stört aber etwas, und wird ev. bei mehreren Tausend Datensätzen viel Zeit brauchen!?

Gruß
Stefan

[Anhang gelöscht durch Administrator]

Hondo

#1
Hallo,
wie du mehrere Filter verknüpft weist du ja bereits, also entweder mit And oder mit Or. Was du nicht vergessen solltest ist den Filter beim Schließen des Formulars zurückzusetzen.
Wenn du die Felder auf die du filterst einen Index setzt (Tabelle/Feldeigenschaften) sollte es keine Geschwindigkeitsprobleme geben. Andererseits benötigen Filter auch Speicherplatz.

Da mit Like filtest, werden auch ähnliche Datensätze gefunden. Wenn du das nicht möchtest schreib statt like einfach "=" und eintferne das "*" vor oder nach dem Ausdruck.

Am einfachsten du erstellst dir eine große TestDB durch Copy/Paste und testest es mal aus.
Gruß Andreas

KlausMaus

Hallo,

danke für die Antwort, weiß aber leider nicht was du mit Index auf Feldeigenschaften meinst, sorry.

Bin aber einen Schritt weiter.
Ich habe für jedes ungebundene Filterfeld eine eigene Ereignisprozedur gesetzt. Ich muss ja, je nachdem in welchem Feld ich gerade schreibe, den Fokus auch immer auf dieses Feld setzen. Das Problem ist wohl, dass ich den Teil wo ich den Filter zusammenstelle überall gleich gelassen habe. Wenn ich aber als erste Bedingung nicht grundsätzlich Me.Filter = "[Rubrik] Like '*" & Me!Text1 & "*'" nehme sondern hier immer zuerst das "Fokusfeld" nehme gibt es keine Verzögerungen. Also z.B. beim Filter für [Rubrik]:

  Me.Filter = "[Belegart] Like '*" & Me!Text2 & "*'"
  Me.Filter = Me.Filter & " and [Rubrik] Like '*" & Me!Text1 & "*'"
  Me.Filter = Me.Filter & " and [Kategorie] Like '*" & Me!Text3 & "*'"

statt

  Me.Filter = "[Rubrik] Like '*" & Me!Text1 & "*'"
  Me.Filter = Me.Filter & " and [Belegart] Like '*" & Me!Text2 & "*'"
  Me.Filter = Me.Filter & " and [Kategorie] Like '*" & Me!Text3 & "*'"

Mit "Like" und "*" muss aber sein, ich will ja nicht nur exakt einen Wert finden, sondern auch alle die dem ähnlich sind.

----------

Was jetzt noch bleibt ist das Problem, dass er Datensätze nicht anzeigt obwohl sie dem eingegebenen Wert ähnlich sind.
In der Tabelle sind ja bei 2 Feldern in manchen Datensätzen keine Werte eingegeben: "Modell" und "Stichwörter".
Wenn ich jetzt die Filterbedingungen für diese beiden Felder lösche, diese also unberücksichtig bleiben, funktioniert alles perfekt.

Es liegt also offenbar an dem Ausdruck
  If [Modell] <> "" Then Me.Filter = Me.Filter & " and [Modell] Like '*" & Me!Text8 & "*'"
mit dem ich versuche nur zu Filtern wenn das Feld nicht leer ist.

Gibt es eine andere Möglichkeit zu sagen, dass ich Me.Filter = Me.Filter & " and [Modell] Like '*" & Me!Text8 & "*'" nur anwenden will, wenn das Feld [Modell] nicht leer ist? Oder den Filter automatisch auf "ja" zu setzen wenn das entsprechende Feld [Modell] leer ist?

In etwas so (von der Idee her): If [Modell] = "" Then Me.Filter = Me.Filter & " and [Modell] = true Else  Me.Filter = Me.Filter & " and [Modell] Like '*" & Me!Text8 & "*'"
Das funktioniert zwar nicht, die Parameterkombination gibt es wohl nicht, aber sowas in der Art.

Gruß
Stefan

bahasu

Moin,

was passiert, wenn Du bei der Filterverknüpfung statt "and" ein "or" verwendest?

  Me.Filter = "nz([Belegart],"") Like '*" & Me!Text2 & "*'"
  Me.Filter = Me.Filter & " or nz([Rubrik],"") Like '*" & Me!Text1 & "*'"
  Me.Filter = Me.Filter & " or nz([Kategorie],"") Like '*" & Me!Text3 & "*'"


oder:

Me.Filter = "([Belegart] Like '*" & Me!Text2 & "*' or isnull([Belegart]))"
  Me.Filter = Me.Filter & " and ([Rubrik] Like '*" & Me!Text1 & "*' or isnull([Rubrik]))"
  Me.Filter = Me.Filter & " and ([Kategorie] Like '*" & Me!Text3 & "*' or isnull([Kategorie]))"


Habe auch noch ein paar nz's spendiert (wegen: "keine Werte eingegeben")

Harald
Servus

KlausMaus

#4
Zitat von: bahasu am November 16, 2011, 07:50:26

was passiert, wenn Du bei der Filterverknüpfung statt "and" ein "or" verwendest?


Das geht gar nicht. Irgendeine Bedingung ist fast immer wahr, mit "or" wird nix mehr gefiltert.


Zitat von: bahasu am November 16, 2011, 07:50:26

Me.Filter = "([Belegart] Like '*" & Me!Text2 & "*' or isnull([Belegart]))"
 Me.Filter = Me.Filter & " and ([Rubrik] Like '*" & Me!Text1 & "*' or isnull([Rubrik]))"
 Me.Filter = Me.Filter & " and ([Kategorie] Like '*" & Me!Text3 & "*' or isnull([Kategorie]))"


Aber das geht gut  :D

Soweit funktioniert das wesentlich besser, allerdings auch mit einem kleinen Nachteil.
Wenn ich in einem Filterfeld etwas eingebe und das zugehörige Datenfeld leer ist, dann wird es trotzdem angezeigt. Ich weiß, das wollte ich um Grunde ja. Es sollte aber so sein:
  Filterfeld leer und Datenfeld leer = Datensatz immer anzeigen (geht)
  Filterfeld voll und Datenfeld leer = Datensatz nicht anzeigen (geht nicht)
  Filterfeld leer und Datenfeld voll = Datensatz immer anzeigen (geht)
  Filterfeld voll und Datenfeld voll = Filtern (geht)

Sonst sieht das so aus wie im Bild anbei.






[Anhang gelöscht durch Administrator]

bahasu

N'abend,

ich bin leicht verwirrt.

"Filterfeld leer": dazu gab es vor kurzem einen Beitrag:
http://www.access-o-mania.de/forum/index.php?topic=14997.msg85932#msg85932
Dort wird abgefragt, ob die Vorgabe zu einem Suchfeld gesetzt ist. Nur wenn das der Fall ist, wird daraus ein Filter gebastelt.

Vielleicht hilft das.

Harald
Servus

KlausMaus

Hallo,

hat etwas gedauert, muss erst mal basteln.

wieso verwirrt, das war doch ein sehr guter Tip, vielen Dank  :)

Ich bekomme es zwar auf dem Weg auch nicht richtig hin, je nachdem was ich in die einzelenen Filterfelder eingebe kommt nicht immer raus was ich will.

Ich habe es jetzt aber mal so versucht, dass ich hinter die einzelenen Filterfelder keine Prozeduren lege sondern eine extra Schaltfläche nehme die den Filter aktiviert. Ich gebe also erst in die Felder ein nach was ich filtern will, dann drücke ich das Knöpfchen:


Private Sub Filtern_Click()
Dim strsuche As String

Me.Filter = ""
Me.Filter = "[Rubrik] Like '*" & Me!Text1 & "*'"
Me.Filter = Me.Filter & " and [Belegart] Like '*" & Me!Text2 & "*'"
Me.Filter = Me.Filter & " and [Kategorie] Like '*" & Me!Text3 & "*'"
Me.Filter = Me.Filter & " and [Händler] Like '*" & Me!Text4 & "*'"
Me.Filter = Me.Filter & " and [Dateiname] Like '*" & Me!Text5 & "*'"
If Not IsNull(Me!Hersteller) Then Me.Filter = Me.Filter & " and ([Hersteller] Like '*" & Me!Text6 & "*' or isnull([Hersteller]))"
If Not IsNull(Me!Artikeltyp) Then Me.Filter = Me.Filter & " and ([Artikeltyp] Like '*" & Me!Text7 & "*' or isnull([Artikeltyp]))"
If Not IsNull(Me!Modell) Then Me.Filter = Me.Filter & " and ([Modell] Like '*" & Me!Text8 & "*' or isnull([Modell]))"
Me.Filter = Me.Filter & " and [Jahr] Like '*" & Me!Text9 & "*'"
If Not IsNull(Me!Stichwörter) Then Me.Filter = Me.Filter & " and ([Stichwörter] Like '*" & Me!Text10 & "*' or isnull([Stichwörter]))"
Me.FilterOn = True

End Sub



Und siehe da, alles scheint bisher perfekt zu funktionieren  :) :)

Mal sehen, wenn ich das jetzt als bei jedem Feld über "Bei Änderung" einfach "anspringe", dann müsste das ja so klappen wie ich es wollte.

Gruß
Stefan

KlausMaus

So, das klappt auch:



Private Sub Text1_Change()

Call Filtern_Click
If Not IsNull(Me!Text1) Then Me!Text1.SelStart = Len(Me!Text1)

End Sub



Herzlichen Dank, hätte ich alleine nicht hinbekommen!

Gruß
Stefan