Neuigkeiten:

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

Mobiles Hauptmenü

Filter für Unterformular

Begonnen von Sebastian5, Oktober 23, 2024, 18:36:53

⏪ vorheriges - nächstes ⏩

Sebastian5

Hallo zusammen,

in meiner Datenbank ist folgendes Problem aufgetreten:

Ich habe ein Hauptformular mit einem Unterformular erstellt. Das Hauptformular enthält Kombinationsfelder (DropDownFelder), die das Unterformular filtern sollen. Wenn im Kombinationsfeld keine Eingabe erfolgt, sollen im Unterformular alle Datensätze angezeigt werden und wenn eine Eingabe erfolgt, nur der im Filter-Kombinationsfeld ausgewählte Datensatz.

Die Datensatzquelle des Unterformulars ist eine Abfrage. In der Abfrage erfolgt die Verknüpfung zum Filter-Kombinationsfeld des Hauptformulars über folgende Formel bei "Kriterien" des Felds nach dem gefiltert werden soll:

[Forms]![frmHauptformular]![ctlFilterkombifeld]

Bei dieser Formel wird korrekt nach der Eingabe im Filter-Kombinationsfeld des Formulars gefiltert. Aber wenn keine Eingabe in das Filter-Kombinationsfeld erfolgt, werden im Unterformular auch keine Datensätze angezeigt.

Daher habe ich die Formel in den Kriterien der Abfrage wie folgt geändert:
Wie "*" & [Forms]![frmHauptformular]![ctlFilterkombifeld]

Wenn jetzt keine Eingabe in das Filter-Kombinationsfeld erfolgt, werden alle Datensätze des Unterformulars, wie gewollt, angezeigt. Bei einer Eingabe in das Filter-Kombinationsfeld werden aber nun zu viele Datensätze angezeigt.
Beispiel:
Eingabe im Filter-Kombinationsfeld: 1
Angezeigte Datensätze im Unterformular: 1 und 11 und 21

Egal was ich bisher probiert habe, ich komme einfach nicht auf die Lösung. Kann mir bitte jemand helfen?

Viele Grüße und Danke im Voraus

Sebastian





MzKlMu

#1
Hallo,
entferne den Joker "*".
Also so:
= [Forms]![frmHauptformular]![ctlFilterkombifeld]Warum hast Du da überhaupt ein Ufo ?

Du kannst doch im Formularkopf die Kombis anlegen und das Formular direkt filtern. Das Ufo scheint mir überflüssig. Vereinfacht auch den Filterausdruck. Außerdem kannst Du das Formular auch direkt filtern (ohne Abfrage) indem Du einen Formularfilter zuweist.

Für ein Hafo z.B. so:
Me.Filter = "Feldname = '" & Me.ctlFilterkombifeld & "'"
Me.FilterOn = True


Gruß Klaus

Knobbi38

Hallo Sebastian,

Zitat von: Sebastian5 am Oktober 23, 2024, 18:36:53Die Datensatzquelle des Unterformulars ist eine Abfrage. In der Abfrage erfolgt die Verknüpfung zum Filter-Kombinationsfeld des Hauptformulars über folgende Formel bei "Kriterien" des Felds nach dem gefiltert werden soll
So etwas sollte man grundsätzlich vermeiden, das ist "Bad Practice".

Benutze die Filter-Property des Unterformulars für das Filtern und zum setzen des Filters erstellst du einen Property im Unterformular. Dieser Property weist du im Kombobox_AfterUpdate Event den neuen Filter zu oder setzt ihn auf einen leeren String.

Schau mal hier, wie die Kommunikation zwischen HF und UF laufen kann. In diesem Fall wird zwar etwas ausgelesen und es geht dabei um die Sort-Order, aber das gilt analog auch für einen Filter und in die andere Richtung:
https://www.access-o-mania.de/forum/index.php?msg=164385

Gruß
Knobbi38



Sebastian5

Guten Morgen,

erstmal ein großes Dankeschön an MzKlMu und Knobbi38 für die schnelle Antwort.
Ich habe heute Morgen die beiden Varianten von MzKlMu ausprobiert.

1.Variante:

entferne den Joker "*".
Also so:
[Forms]![frmHauptformular]![ctlFilterkombifeld]

Diese Variante (mit Filter über Kriterienausdruck in der Abfrage) hatte ich bereits selbst ausprobiert (siehe Nachricht von gestern Abend). Es werden zwar die Datensätze korrekt gefiltert, aber bei keiner Eingabe im Kombifilterfeld werden auch keine Datensätze angezeigt. Es sollen aber bei keiner Filtereingabe alle Datensätze angezeigt werden. Daher hatte ich es ja mit Wie "*" &  probiert.

Die zweite Variante:

Für ein Hafo z.B. so:
Me.Filter = "Feldname = '" & Me.ctlFilterkombifeld & "'"
Me.FilterOn = True

filtert die Datensätze zwar ebenfalls korrekt, aber das Problem ist das gleiche, bei keiner Eingabe im Kombifeld werden auch keine Datensätze angezeigt.

Falls ich mit den Ansätzen von  MzKlMu nicht weiter komme, werde ich mich mal an die Lösung von Knobbi38 heranwagen. Leider bin ich noch ein ziemlicher Anfänger. Könnte meine Kompetenzen überschreiten  :-[ .

Viele Grüße

Sebastian





Sebastian5

Noch ein Nachtrag:
Wäre es alternativ möglich im Formular einen Button mit "Filter aktiv/Filter inaktiv" einzufügen? D.h. bei Filter aktiv werden die Datensätze gefiltert und bei inaktiv werden alle Datensätze ungefiltert angezeigt. Der Button müsste dann aber mehrere FilterKombifelder aktivieren/deaktivieren können.

MzKlMu

Hallo,
versuche es mal so:
If IsNull(Me.ctlFilterkombifeld) Then
   Me.Filter = ""
   Me.FilterOn = False
Else
   Me.Filter = "Feldname = '" & Me.ctlFilterkombifeld & "'"
   Me.FilterOn = True
End If

Meine Frage (warum Ufo ?) hast Du nicht beantwortet.
Gruß Klaus

Knobbi38

Hallo Sebastian,

es gibt dutzende von Möglichkeiten, wie man Filter gestaltet. Vielleicht wird es einfacher, wenn man wüßte, wie und nach was du filtern möchtest. Eine Beispiel-DB wäre dazu hilfreich.

Gruß
Knobbi38

Sebastian5

Hallo zusammen,
ich bin leider erst heute wieder zu der Datenbank gekommen. Ich habe den Code von MzKlMu ausprobiert, funktioniert, vielen Dank!

In das Formular versuche ich jetzt mehrere Filter einzubauen. Jeder Filter funktioniert für sich alleine,  aber nicht in Kombination. Ziel wäre es nach mehreren Merkmalen gleichzeitig zu filtern. Also zeige alle Datensätze an, die der Auswahl von Filter 1 und 2 usw. entsprechen. Ich habe dafür eine Befehlsschaltfläche erstellt mit folgendem Code:

Private Sub Befehl60_Click()

If (IsNull(Me.ctlFilterKombifeld1)) Or IsNull(Me.ctlFilterKombifeld2) Then
  Me.Filter = ""
  Me.FilterOn = False

Else
  Me.Filter = "Feld1 = '" & Me.ctlFilterKombifeld1 & "'"
  Me.Filter = "Feld2 = '" & Me.ctlFilterKombifeld2 & "'"
  Me.FilterOn = True
End If

End Sub

Im Else-Teil habe ich versucht ein "AND" einzubauen. Bekomme aber Fehlermeldungen.

Zu der Frage nach dem UFO. Mir ist jetzt auch klar, dass ich das viel zu kompliziert aufgebaut habe. Ein Unterformular ist wahrscheinlich nicht nötig. Ich arbeite mit Deinem Filter jetzt ohne UFO.

Zu der Frage von Knobbi38:
Es handelt sich um eine Datenbank zur Projektverwaltung. Die Projekte haben mehrere Merkmale z.B. Projektname, Auftraggeber etc.. Außerdem habe ich eine Tabelle mit Auftragsbeträgen und eine Tabelle mit Rechnungsbeträgen. (Stark vereinfacht beschrieben)
Ich habe eine Abfrage erstellt, die die Informationen zusammenspielt. Also Projekte und zugehörige Aufträge und Rechnungen. Außerdem wird hier der Umsatz berechnet, d.h. Auftragsbetrag minus Rechnungsbetrag. Für das Formular ist diese Abfrage die Datensatzquelle.
Das Formular soll eine Übersicht über alle Projekte geben mit zugehörigen Merkmalen, Aufträgen, Rechnungen und Umsätzen. Im Formularkopf werden außerdem die Beträge der Aufträge, Rechnungen und Umsätze aller angezeigten Datensätze aufsummiert. Jetzt möchte ich nach mehreren Projektmerkmalen kombiniert filtern können. Nur die jeweils gefilterten Datensätze sollen angezeigt und auch die Summen berechnet werden. Gleichzeitig muss es möglich sein die Filter wieder "auszuschalten", um alle Datensätze wieder zu zeigen.
Aus Datenschutzgründen kann ich die Datenbank so nicht ins Netz zu stellen. Müsste ich erst stark anonymisieren. 

Grüße
Sebastian


Knobbi38

Hallo Sebastian,

diese Button brauchst du nicht. Du rufst nach jeder Änderung einer Kombobox eine Prozedur auf, welche den Filterausdruck komplett neu erstellt und nach Bedarf aktiviert. Lediglich einen Button zum Löschen der Filterbedingen und dem zurücksetzen der Kombos würde den Umgang damit erleichtern.

Natürlich mußt du dabei die einzelnen Kriterien per "AND" zu einem syntaktisch richtigen SQL-Ausdruck zusammensetzen, aber das ist eigentlich nur eine Fließaufgabe. Ist der komplette Filterausdruck leer, kannst du den Filter löschen und deaktivieren - eine extra Abfrage mit isNull() für jede Kombo braucht es nicht.

Gruß
Knobbi38


Sebastian5

Ich muss leider nochmal fragen, weil meine AND Verknüpfung wohl nicht syntaktisch richtig ist.

  Me.Filter = "Feld1 = '" & Me.ctlFilterKombifeld1 & "'" And Me.Filter = "Feld2 = '" & Me.ctlFilterKombifeld2 & "'"

liefert die Fehlermeldung Laufzeitfehler '13': Typen unverträglich

Feld1 und Feld2 sind aber vom gleichen Typ???

MzKlMu

Hallo,
wenn Du das richtig zusammensetzt, sollte das klappen.
Me.Filter = "Feld1 = '" & Me.ctlFilterKombifeld1 & "' And Feld2 = '" & Me.ctlFilterKombifeld2 & "'"
Gruß Klaus

Sebastian5

Hallo,

habe ich geändert. Jetzt funktioniert der Filter aber nur, wenn ich bei beiden Kombifeldern etwas eingebe. Also nur filtern nach Feld1 ohne Eingabe bei ctlFilterKombifeld2 geht nicht. Bei ersetzen von and durch or wird nur noch nach Feld2 gefiltert.

Grüße Sebastian

Sebastian5

Ich schicke mal den gesamten Code (Feld1 und 2 sind vom Typ Integer bzw. AutoWert) :

Private Sub Befehl60_Click()

If (IsNull(Me.ctlFilterKombifeld1)) Or IsNull(Me.ctlFilterKombifeld2) Then
   Me.Filter = ""
   Me.FilterOn = False
Else
   Me.Filter = "Feld1 = " & Me.ctlFilterKombifeld1 & "  And Feld2 = " & Me.ctlFilterKombifeld2 & ""
   Me.FilterOn = True
End If

End Sub

Knobbi38

Hallo Sebastian,

hier mal ein Beispiel, was in einem anderen Thread mein Vorschlag war:
https://www.access-o-mania.de/forum/index.php?topic=27454.msg163962#msg163962
Dort geht es um Textfelder und Textboxen, sollte aber für dich leicht anpassbar sein. Damit ist es dann egal, ob Kombo1 oder Kombo2 leer sind und wenn beide Kombos leer sind wird alles angezeigt.

Gruß
Knobbi38

Sebastian5

Hallo Knobbi38,

ich konnte nach langer Zeit leider erst heute wieder an meiner Datenbank arbeiten.
Ich habe Deinen Code ausprobiert und nach ein paar kleinen Änderungen funktioniert er hervorragend! Vielen, vielen Dank dafür. Mir fällt echt ein Stein vom Herzen.

Grüße
Sebastian