PDA

Vollständige Version anzeigen : Mehrere Filter mit RecordSource anwenden


Donar
27.01.2008, 08:49
Einen schönen guten Morgen,

seit gestern Abend stehe ich etwas neben mir und finde einfach keinen Ansatz zur Lösung meines kleinen Problems.

Es soll auf einem Formular mehrere Filter angewandt werden.

Der einfache weg funktioniert bei mir folgendermaßen: Es ist ein Button vorhanden, der ein weiteres Formular öffnet. In diesen ist ein Auswahlfeld (cmbLKR), welches den Filter erzeugen soll.

kriterium = Me.cmbFilter

Forms!frmAdresse.RecordSource = "SELECT tblAdresse.IdAdresse, tblAdresse.Unternehmen, tblAdresse.Art
" FROM tblAdresse" & _
" WHERE ((tblAdresse.Art)=" & kriterium & ");"

Es soll nun ein weiterer Filter durch ein anderes Formular angewandt werden:
kriterium = Me.cmbFilter

Forms!frmAdresse.RecordSource = "SELECT tblAdresse.IdAdresse, tblAdresse.Unternehmen, tblAdresse.Art, tblAdresse.Bem
" FROM tblAdresse" & _
" WHERE ((tblAdresse.Bem)=" & kriterium & ");"

Soweit funktioniert es schon ganz gut. Wie setze ich es nun am besten um, damit beide Filter gleichzeitig auf das Hauptformular frmAdresse angewandt werden?

Für eine Hilfestellung bin ich sehr dankbar. Leider sehe ich einfach nicht mehr durch.

Josef P.
27.01.2008, 09:22
Du könntest im Formular "frmAdresse" eine Funktion schreiben, die Filterbedingungen entgegennimmt und anwendet.

Prinzip (Luftcode):
Code in frmAdresse
private const m_conSELECT as String = _
"SELECT tblAdresse.IdAdresse, tblAdresse.Unternehmen, tblAdresse.Art, tblAdresse.Bem FROM tblAdresse"
private const m_conOrderBy as String = ""
private m_Filter as string

public Sub AddFilter(byval sFilter as String, optional FilterSofortAnwenden as boolean = true)
if len(m_Filter)>0 then
m_Filter = m_Filter & " AND "
end if
m_Filter = m_Filter & "(" & sFilter & ")"
' in Klammer, falls in sFilter OR vorhanden ist

if FilterSofortAnwenden then
setDataSource
end if
end sub

private sub setDataSource()
dim strSQL as string
strSQL = m_conSELECT
if len(m_Filter)>0 then
strSQL = strSQL & " WHERE " & m_Filter
end if
if len(m_conOrderBy)>0 then
strSQL = strSQL & " ORDER BY " & m_conOrderBy
end if

me.RecordSource = strSQL

end sub

Aufruf von "außen"
kriterium = Me.cmbFilter
Forms!frmAdresse.AddFilter "tblAdresse.Bem=" & kriterium, True

Donar
27.01.2008, 10:10
Vielen Dank Josef, es ist immer wieder erstaunlich wie präzise und schnell in diesem Forum die Antworten gegeben werden.

Leider ist der Filter noch nicht ganz perfekt. Denn wenn ich einen Filter angewandt habe, kann ich im selben Formular nicht nochmal einen Anwenden. Danach werden mir keine Werte angezeigt. Beispiel, wie die Abfrage nach zweimaligen Anwenden aussieht:

..WHERE ((tblAdresse.Bem) = 1 AND (tblAdresse.Bem)=2;)

Leider hab ich auch vergessen etwas zu erwähnen. Es kann sein, dass ein einzelner Filter wieder ausgesetzt wird. D.h. Wenn der cmbFilter = 0 ist, ist dieser auch nicht mehr anzuwenden.

Josef P.
27.01.2008, 10:30
Dann musst du die Filterbedingungen aus m_Filter wieder wegbekommen.
Da das aber eine lästige Aufgabe ist, würde ich das Zwischenspeichern in einem Array statt einem String versuchen. Der Filterausdruck setzt du dann dynamisch beim Durchlaufen dieses Arrays zusammen.


BTW: das ganze "Herumgeflicke" ist nur notwendig, weil du verschiedene Formulare verwendest. Wenn du nur ein Formular mit mehreren Kombinationsfeldern zum Einstellen des Filters nehmen würdest, könnte man in diesem den Filter um einiges einfacher zusammensetzen.

Donar
27.01.2008, 10:45
Da hast du recht. :rolleyes: Werde alles in ein Filterformular packen. Macht mehr sinn.

Vielen Dank!

Donar
27.01.2008, 12:59
Hab jetzt alles überarbeitet. Es gibt nun ein Formular, indem alle Kombifelder sind. Mein Code ist nun wie folgt beschrieben:
Im Formular frmAdresseFilter wird nun folgender Code übergeben

kriterium = Me.cmbArt
Forms!frmAdresse.AddFilterArt "tblAdresse.Art=" & kriterium 'Fehler

AddFilterArt:

If sFilter = 0 Then
'Kein Filter wird übergeben
Else
Me.AddFilter sFilter, True
End If

Der Rest ist bereits wie von Josef beschrieben. Er zeigt mir nun an, dass die Typen im 'Fehler unverträglich sind. Was ist falsch? Theoretisch muss er doch jetzt alle Filter zusammenführen.

ebs17
27.01.2008, 13:22
Die Feldtypen sind zu beachten. Bei Strings als Kriterium kommen zusätzlich Gänsefüßchen bzw. Hochkommata ins Spiel.

Josef P.
27.01.2008, 13:31
Der Rest ist bereits wie von Josef beschrieben.
Das ist nicht gut, denn mein Beispiel passt nun nicht mehr.

Setze den Filter in dem Form zusammen, in dem die Auswahlfelder sind.
Im Code prüfst du, ob ein Kombinationsfeld einen Wert enthält und wenn ja, dann ergänzt du den Filter.
Irgendwo hier im Forum gibt es dafür eine Beispiel-mdb für per VBA dynamsich zusammengesetze Filterausdrücke. (findest du bestimmt mit der Suche)

Donar
27.01.2008, 13:35
Ok, danke.

ebs17
27.01.2008, 13:36
Wenn ich ergänzen darf:
SEM-Suchformular (http://s-e-m.ch/temp/SEM_Suchformular.zip)
Suche in DBWiki (http://www.dbwiki.de/wiki.php?title=Access_Beispieldatenbanken)

Donar
27.01.2008, 13:43
Welchen unterschied macht es für die public Funktionen, wenn ich diese in den Filter-Formular zusammensetze?

Josef P.
27.01.2008, 14:39
Das Zusammensetzen läuft anders ab. (In meinem Beispiel ging ich davon aus, dass ein einmal gesetzter Filter bestehen bleibt.)
Natürlich kannst du auch die public sub von mir nutzen, wenn du nach jeder Filterwertänderung den String leerst und neu einstellst.

Guck dir einfach das von Eberhard genannte Beispiel an. Aber bitte nicht Abschreiben, sondern verstehen. ;)

Donar
27.01.2008, 15:25
Vielen, vielen Dank für die Hilfe. Durch das Beispiel konnte ich die Filter umsetzten.

Ich wünsche euch noch einen angenehmen Sonntag abend!