如何在 MS Access 的子表单上应用多个过滤器?
How can I apply multiple Filters on my Subform on MS Access?
我尝试为 Access 中的子窗体制作一个过滤器系统。
如何在一个子表单上连接多个过滤器。过滤器是用 SQL 但在 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
我就是这样做的(从我当前的项目中复制的函数,但您可以轻松地看到每个字段是如何检查的,以查看是否需要将其添加到过滤器代码中):
私有函数 UpdateFilter() 作为布尔值
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
其中 f_FieldName 是管理允许过滤器的控件。然后只需从每个更改过滤器的事件中调用此私有函数即可。
我尝试为 Access 中的子窗体制作一个过滤器系统。
如何在一个子表单上连接多个过滤器。过滤器是用 SQL 但在 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
我就是这样做的(从我当前的项目中复制的函数,但您可以轻松地看到每个字段是如何检查的,以查看是否需要将其添加到过滤器代码中):
私有函数 UpdateFilter() 作为布尔值
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
其中 f_FieldName 是管理允许过滤器的控件。然后只需从每个更改过滤器的事件中调用此私有函数即可。