Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: MetalBeasty am Januar 01, 2020, 12:48:03

Titel: UFO mit mehreren optionalen Filtern
Beitrag von: MetalBeasty am Januar 01, 2020, 12:48:03
Hey Leute,

ich bin relativ neu in Access eingestiegen und probiere mich gerade an einer simplen Datenbank zum auswerten von Rundenzeiten je nach Fahrzeug. Ich möchte meine UFO nach den Kriterien Klasse, Fahrzeugtyp, Marke, Antrieb filtern können, wo bei nicht alle Filter zwingend ausgefüllt werden müssen.

Bisher habe ich für jedes Kombinationsfeld einen Code wie folgt:

Private Sub cboFahrzeugtyp_AfterUpdate()
If Nz(Me!cboFahrzeugtyp) <> "" Then
        Me!sfmFahrzeuge.Form.Filter = "Fahrzeugtyp='" & Me!cboFahrzeugtyp & "'"
        Me!sfmFahrzeuge.Form.FilterOn = True
    Else
        Me!sfmFahrzeuge.Form.FilterOn = False
    End If
End Sub


Mit diesem Code jedoch wird der letzte Filter immer vom neuen Filter überschrieben.

Ich habe schon mehrere Ansätze ausprobiert mir einen "strFilter" aus den Kombinationsfeldern zusammen zu stellen, jedoch ohne Erfolg.

Kann mir da vielleicht jemand weiterhelfen? Schon mal Danke! ;D

Gruß
MetalBeasty
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: Beaker s.a. am Januar 01, 2020, 13:37:58
@MetalBeasty
Zitatmir einen "strFilter" aus den Kombinationsfeldern zusammen zu stellen, jedoch ohne Erfolg.
Woran scheiterst du da? An der Verkettung der einzelnen Kriterien?

Ich würde den Filter auch nicht bei den einzelnen Kombis beim gezeigten
Ereignis setzen (da müsstest du den Filterstring als modulweite Variable im
Modulkopf deklarieren), sondern einen Button-Klick dafür hernehmen.
AfterUpdate könnte man evtl. die anderen Kombis mit einer eingeschränkten
DS-Herkunft versorgen, falls es Sinn macht.
Beim Klickereignis des Buttons prüfst du dann der Reihe nach die Kombis auf
Inhalt und setzt den String entsprechend zusammen, z.B.
strFilter = "Fahrzeugtyp='" & Me!cboFahrzeugtyp & "' AND Marke ='" & Me!cboMarke & "'"
Zum Prüfen/Testen des zusammengesetzten Kriteriums ist das anliegende Tool
i.Ü. sehr hilfreich.

ABER, - dein gezeigter Code macht mich stutzig bezügl. des Datenmodells.
ZitatKlasse, Fahrzeugtyp, Marke, Antrieb
Sollten eine ID besitzen, die das jeweilige Kombi zurückgibt. Denn normal
filtert man damit und nicht mit den Klartexten.

gruss ekkehard
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: DF6GL am Januar 01, 2020, 13:38:21
Hallo,

Prinzipiell so:

Sub btnFiltern_Click()

Me!sfmFahrzeuge.Form.Filter = "Fahrzeugtyp like '" & Me!cboFahrzeugtyp & "*' And [Marke] Like '" & Me!cboMarke & "*' and Antrieb Like '" & Me!cboAntrieb & "*'"
Me!sfmFahrzeuge.Form.FilterOn = True

End Sub



Ohne jetzt den Tabellenaufbau und die Normalisierung der Tabelle(n) zu kennen, befürchte ich Mängel daran.
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: Beaker s.a. am Januar 01, 2020, 13:46:19
Hallo Franz,
"AfterUpdate" eines Kombis, anders als bei "Change", gibt es keine "*" mehr.
Das Kombi gibt immer den kompletten Inhalt der gebundenen bzw. der mit
".Column(n)" gewählten Spalte zurück; - macht "LIKE" IMO keinen Sinn.
Aber, wie gesagt, und auch von dir angemerkt, wird das Datenmodell wohl
Mängel aufweisen.
gruss ekkehard
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: DF6GL am Januar 01, 2020, 13:49:56
Hallo Ekkehard,

sobald ein  Kombifeld gelöscht (geleert) ist oder wird, enthält es NULL, das nicht angemeckert wird, aber zu einem Fehler bei der Filterbedingung führt, wenn denn da nicht das Sternchen stünde..  ;)

Auch wenn man mit Schlüsselfeldern arbeitete, muss der  "NULL-Fall" berücksichtigt/überprüft werden.

Beim TEXT-Vergleich stünden bei leeren Kombis zwar immer noch zwei Hochkommata (Leerstring) zum Vergleich an, was aber zum Anzeigen von keinem DS führte.

.Filter= "Antrieb = ''"

ist was anderes als
.Filter= "Antrieb like '*'"
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: MetalBeasty am Januar 01, 2020, 14:10:11
Danke für die flotten Antworten,

ich konnte das Problem jetzt dank den Antworten von @DF6GL und @Beaker s.a. lösen.

Mein Code sieht jetzt wie folgt aus:

Private Sub btnFiltern_Click()
strFilter = "Klasse Like '" & Me!cboKlasse & "*' AND Fahrzeugtyp Like'" & Me!cboFahrzeugtyp & "*' AND Marke Like '" & Me!cboMarke & "*' AND Antrieb Like'" & Me!cboAntrieb & "*'"
Me!sfmFahrzeuge.Form.Filter = strFilter
Me!sfmFahrzeuge.Form.FilterOn = True
End Sub


Funktioniert so jetzt einwandfrei.

@Beaker s.a.
ZitatABER, - dein gezeigter Code macht mich stutzig bezügl. des Datenmodells.
Zitat
Klasse, Fahrzeugtyp, Marke, Antrieb
Sollten eine ID besitzen, die das jeweilige Kombi zurückgibt. Denn normal
filtert man damit und nicht mit den Klartexten.

Ich hab Tabellen für Klasse, Fahrzeugtyp, Antrieb, Marke und noch eine Tabelle in der Die Fahrzeuge und Rundenzeit eingetragen sind. Ich trage die Fahrzeuge mit Hilfe eines anderen Formulars auch per Kombi-Felder ein. Aus irgendwelchen Gründen trägt er mir dann in die Tabelle der Fahrzeuge nur den Primärschlüssel ein wenn ich mit der ID arbeite ??? Ich weiß nicht warum aber so funktioniert es.

Vielen Dank nochmal für die schnelle Hilfe ;D

Gruß MetalBeasty
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: DF6GL am Januar 01, 2020, 14:21:38
Hallo,
Zitat
Ich hab Tabellen für Klasse, Fahrzeugtyp, Antrieb, Marke und noch eine Tabelle in der Die Fahrzeuge und Rundenzeit eingetragen sind.

Das hört sich zunächst gut an...

Zeig mal den Screenshot des Beziehungsfensters.

ZitatAus irgendwelchen Gründen trägt er mir dann in die Tabelle der Fahrzeuge nur den Primärschlüssel ein

Die Gründe liegen im (vermutlich)rictigen Tabellenaufbau.  Wenn ref. Inter.-Beziehungen zwischen den Tabellen aufgestellt sind, werden nur die Primärschlüsselwerte in Fremdschlüssel-Feldern eingetragen.

Ich vermute, dass die Datenherkunft der Kombifelder nicht korrekt eingestellt ist. Es sollte so sein:

cboAntrieb:

Datenherkunft:  Select AntriebID, Antrieb from tblAntrieb order by Antrieb
gebundene Spalte:  1
Spaltenbreiten:  0cm;5cm

und die Filterung für "Antrieb":

.Filter = " AntriebID = " & nz(Me!cboAntrieb,0)
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: Beaker s.a. am Januar 01, 2020, 14:38:09
Hallo,
@Franz
Aber ob das Feld "leer" (NULL oder '') ist prüft man doch bevor der String
zusammengesetzt wird.

@MetalBeasty
Wie befürchtet, deine Tabellenstruktur ist nicht korrekt. Die Nachschlagefelder
in der Tabelle musst du zu einfachen Textfelder umwandeln, denn das nur der
Fremdschlüssel gespeichert wird ist ja korrekt.
- in der Entwurfansicht löscht du die Datensatzherkunft (Register "Nachschlagen"),
diese sollte eigentlich auch bei deinen Kombis so hinterlegt sein, falls nicht
kopierst du sie von hier dort hinein
- ändere die Eigenschaft "Steuerelement anzeigen" auf "Textfeld"
- prüfe auf dem Register "Allgemein" den Datentyp, sollte und muss LongInteger
sein.
Deine Kombis im Formular musst du nun evtl. noch anpassen, - die wichtigsten
Eigenschaften hat Franz dir aufgeschrieben. Wichtig dabei ist aber auch, dass das
Feld an das FK-Feld des DS gebunden ist.
gruss ekkehard
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: MetalBeasty am Januar 01, 2020, 15:21:05
@DF6GL

ZitatZeig mal den Screenshot des Beziehungsfensters.
Habe noch nicht ganz raus gefunden wie ich einen Screenshot einfüge. Hab ihn jetzt mal in den Anhang eingetragen(hoffentlich richtig ???)

Ich habe die Datensicht der Eigenschaften der Kombifelder auch mal hinzu gefügt.

@Beaker s.a.
Ich konnte dir leider nicht ganz folgen.
Datensatzherkunft Register Nachschlagen konnte ich nirgends finden und auch die Eigenschaft "Steuerelement anzeigen" hab ich nie verwenden und finde diese nicht.
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: MzKlMu am Januar 01, 2020, 16:13:11
Hallo,
die Beziehungen sind ausnahmslos alle falsch. Beziehungen laufen immer über den Primärschlüssel (PS) und einen extra eingefügten Fremdschlüssel (FS), der den gleichen Datentyp haben muss wie der Primärschlüssel. Wenn der PS Autowert ist, so ist der FS eine Zahl (Longinteger). Es ist ja der Sinn des Primärschlüssels diesen für die Beziehungen zu nutzen. Siehe Bild für 2 Beziehungen, die anderen sind dann analog einzurichten. Es ist auch grundsätzlich referentielle Integrität einzustellen.
Gefiltert wird dann über die Schlüsselzahl und nicht über den Klartext. Das Kombi zeigt dann die ID an und den Klartext. Die ID wird mit Spaltenbreite 0cm ausgeblendet, der Klartext ist dann zu sehen. Gebundene Spalte muss dann 1 sein (die ID) Was sich jetzt komplizierter anhört als es ist. Über eine Zahl zu filtern ist für den Ausdruck viele einfacher, weil die ganzen Hochkommas ersatzlos entfallen.

Du solltest Dich mit den Grundlagen beschäftigen.
https://www.access-tutorial.de/
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: MetalBeasty am Januar 01, 2020, 16:55:42
Hey Klaus,

habe die Beziehungen jetzt angepasst wie im Anhang zu sehen.

Meine Kombifelder habe ich umgestellt, die Funktionieren auch soweit nur hab ich jetzt noch das Problem das meine Fahrzeugtabelle nur die Schüssel eingetragen werden und ich dadurch in meinem Unterformular zum filtern auch nur die Primärschlüssel angezeigt bekomme. Habe trotz dem Link von dir noch nicht raus bekommen wie ich das hin bekomme.

Schon mal Danke für die Hilfe!
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: DF6GL am Januar 01, 2020, 17:11:54
Hallo, 

benutze im Unterformular an die Schlüsselfelder gebundene Kombifelder mit passenden Eigenschaften ...


@Ekkehart

ZitatAber ob das Feld "leer" (NULL oder '') ist prüft man doch bevor der String
zusammengesetzt wird

Es gibt viele Wege, das zu prüfen.  Jedenfalls muss es vor der Anwendung des Filterkriteriums passieren. "Vor" kann auch bedeuten, dass die Prüfung innerhalb des an die Filter-Methode übergebenen Strings passiert, wenngleich das zugegebenermaßen etwas unflexibler ist als wenn separate Codezeilen benutzt werden.
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: MetalBeasty am Januar 01, 2020, 19:32:22
Ich habe jetzt einiges Ausprobiert aber bekomme das Unterformular nicht dazu mir die Werte entsprechend der Primärschlüssel anzuzeigen. Wie schon beschrieben sehe ich jetzt überall nur die ID-Nummern außer in den Kombifeldern, da hab ich die zugehörigen Werte zur Auswahl.

Habe auch schon probiert dem Unterformular als Herkunft ein Endlosformular zu geben, jedoch kann ich dann so wie es aussieht im Unterformular alles bearbeiten, da auch die Kombifelder übernommen werden. Habe das ganze auch mit einer Abfrage als Herkunft Probiert aber auch  ohne Erfolg.

Mein Ziel wäre in diesem Unterformular einfach nur eine Liste der Fahrzeuge zu haben, nach denen ich gefiltert habe.

Gruß MetalBeasty
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: DF6GL am Januar 01, 2020, 19:38:03
Hallo,

lad die DB mal hier hoch, vorher komprimiert/repariert und gezippt.
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: MetalBeasty am Januar 01, 2020, 19:53:43
Hab jetzt im Anhang die komprimierte Datenbank als Zip angehängt.

Danke fürs anschauen! :D

Gruß MetalBeasty
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: DF6GL am Januar 01, 2020, 22:23:30
Hallo,

anbei die DB.

Es braucht nur ein Formular mit ungebundenen Kombis zum Suchen (Filtern) und an die Fremdschlüsselfelder gebundene Kombis für die Anzeige.

Das (einzige) Form erhält als Datenherkunft die Fahrzeug-Tabelle.


Weitere Änderungen:   Ref.Integrität bei den Beziehungen.  Reservierte Wörter bei Namen umbenannt. Option Compare Datebase und Option Explizit im Klassenmodul, FilterString auf Basis der Schlüsselfelder.

Das Konzept für die Filterung solltest Du nochmal überdenken. (Filterung nicht über alle Kombis zusammen, eher separate und unabhängig. Wenn Abhängigkeit erwünscht, sind weitere Tabellen, die eben die Abhängigkeiten definieren erforderlich.)
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: MetalBeasty am Januar 02, 2020, 18:19:41
Vielen Dank für das überarbeiten,

das wirkt alles viel aufgeräumter als davor ::)

Nur das Filtern ist das gegenteil von dem was ich versucht hatte aber ich glaube ich habe jetzt verstanden wie ich das hinbekommen kann.

Gefiltert sollte er mir eine Liste anzeigen, damit ich auf einen Blick sehen kann Welche Autos z.b. von BMW welche Zeit gefahren sind, und nicht immer nur ein Datensatz.

Aber vielen Danke für deine Mühe, ab hier sollte ich selber weiterkommen  ;D

Gruß MetalBeasty
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: DF6GL am Januar 02, 2020, 21:02:09
Hallo,


hatte ja die Suchlogik (und nebn dem Tabellenaufaufbau) schon angesprochen.  Es sollten dann mit jedem Kombifeld einzeln (unabhängig von den anderen) gefiltert werden.
Titel: Re: UFO mit mehreren optionalen Filtern
Beitrag von: Beaker s.a. am Januar 02, 2020, 21:16:26
@MetalBeasty
ZitatIch konnte dir leider nicht ganz folgen.
O.K., habe ich ja nur vermutet, dass du Nachschlagefelder in der Tabelle hast.
Hast du nicht, um so besser. Aber trotzdem noch ein paar Anmerkungen zu den
gezeigten Eigenschaften;
- die gebundene Spalte muss die erste sein
- wenn "nur Listeneinträge" auf "Nein" eingestellt ist, musst du auf das Ereignis
"Bei nicht in Liste" reagieren; - Beispiel siehe hier: http://www.donkarl.com?FAQ4.13 (http://www.donkarl.com?FAQ4.13)

gruss ekkehard