Search code examples
sqlvbams-accessfiltersubform

How can I apply multiple Filters on my Subform on MS Access?


I try to make a Filter system for a Subform in Access.

How can I connect multiple Filters on one Subform. The Filters were made with SQL but in VBA.

If Me.cboLieferant = "*" Then
SQL = "SELECT Lieferant.LieferantenName, Einkaeufer.Name, Vertrag.VertragsNr, Vertrag.VertragsTitel, Projekt.ProjektName, Vertrag.[1Kuendigungsmoeglichkeit], KraftStatus.Name, Vertrag.Gesamtbetrag " _
    & " FROM KraftStatus INNER JOIN (Projekt INNER JOIN ((EinkauferVertrag INNER JOIN ((LieferantVertrag INNER JOIN Vertrag ON LieferantVertrag.VertragId = Vertrag.ID) INNER JOIN Lieferant ON LieferantVertrag.LiferantId = Lieferant.ID) ON EinkauferVertrag.VertragId = Vertrag.ID) INNER JOIN Einkaeufer ON EinkauferVertrag.EinkauferId = Einkaeufer.ID) ON Projekt.ID = Vertrag.ProjektId) ON KraftStatus.ID = Vertrag.KraftStatusID"
Else
    SQL = "SELECT Lieferant.LieferantenName, Einkaeufer.Name, Vertrag.VertragsNr, Vertrag.VertragsTitel, Projekt.ProjektName, Vertrag.[1Kuendigungsmoeglichkeit], KraftStatus.Name, Vertrag.Gesamtbetrag " _
    & " FROM KraftStatus INNER JOIN (Projekt INNER JOIN ((EinkauferVertrag INNER JOIN ((LieferantVertrag INNER JOIN Vertrag ON LieferantVertrag.VertragId = Vertrag.ID) INNER JOIN Lieferant ON LieferantVertrag.LiferantId = Lieferant.ID) ON EinkauferVertrag.VertragId = Vertrag.ID) INNER JOIN Einkaeufer ON EinkauferVertrag.EinkauferId = Einkaeufer.ID) ON Projekt.ID = Vertrag.ProjektId) ON KraftStatus.ID = Vertrag.KraftStatusID" _
    & " WHERE [Lieferant].[ID] = " & Nz(Me.cboLieferant, 0) & ";"
End If

Me.uFiltering.Form.RecordSource = SQL
Me.uFiltering.Form.Requery

Solution

  • This is how I am doing it (function copied from my current project but you can easily see how each field is examined to see if it needs to be added to the filter code or not):

    Private Function UpdateFilter() As Boolean

    Dim Filter As String: Filter = ""
    If Trim(Nz(Me.f_Name)) <> "" Then Filter = Filter & "HotelName LIKE '" & Qs(Replace(Me.f_Name, "_", " ")) & "*' AND "
    If Not IsNull(Me.f_Location) Then Filter = Filter & "EventLocationID=" & Me.f_Location & " AND "
    If Not IsNull(Me.f_HasEvent) Then Filter = Filter & "HasEvent=" & IIf(Me.f_HasEvent, "True", "False") & " AND "
    If Filter <> "" Then
        Me.Filter = Left(Filter, Len(Filter) - 5)
        Me.FilterOn = True
      Else
        Me.FilterOn = False
      End If
    

    Where f_FieldName are controls to manage the allowable filters. Then just call this private function from every event that changes the filter.