在我的GUI中,有几种方法可以过滤数据库。由于我缺乏知识,我的VBA编程中充斥着嵌套的IF语句。我现在越来越擅长使用ACCESS,并希望找到一种更简洁的方式来执行多个过滤器。我的形式是连续的。
有没有一种简单的方法来完成以下任务(我做了一个玩具模型示例):
我有一个组合框SITE,我可以在其中过滤工作网站的A, B, C。在按站点过滤后,我有三个复选框,用户可以在其中根据用户选择的项目编号1-10、11-20和21-30进行过滤。
有没有办法附加多个过滤器(或过滤过滤数据)?例如,按站点A过滤,然后按项目编号1-10过滤A
目前,对于每个复选框,我都有一个针对每个站点的IF语句。然后我使用Form.Filter = . . . And . . .和Form.FilterOn = True。
是否可以使用属性表上的SQL进行筛选,而不是使用VBA?
发布于 2019-03-06 00:55:47
我对这些类型的筛选器所做的是,每当其中一个筛选器控件发生更改时,就构造一条SQL语句。它们都引用相同的子例程,以避免代码重复。
如何处理这条SQL语句取决于您想要做什么。Access使用它是非常通用的;将它用作RecordSource,直接执行它,并将结果用于其他事情,甚至只是将其打印到标签。
为了尝试模块化这个过程,这里有一个我如何做到这一点的示例:
Dim str As String
str = "SELECT * FROM " & Me.cListBoxRowSource
Me.Field1.SetFocus
If Me.Field1.Text <> "" Then
str = AppendNextFilter(str)
str = str & " SQLField1 LIKE '*" & Me.Field1.Text & "*'"
End If
Me.Field2.SetFocus
If Me.Field2.Text <> "" Then
str = AppendNextFilter(str)
str = str & " SQLField2 LIKE '*" & Me.Field2.Text & "*'"
End If
Me.Field3.SetFocus
If Me.Field3.Text <> "" Then
str = AppendNextFilter(str)
str = str & " SQLField3 LIKE '*" & Me.Field3.Text & "*'"
End If
Me.cListBox.RowSource = str变量被编辑来保护有罪的人。
我的AppendNextFilter方法只是检查WHERE是否已经存在于SQL语句中。如果是,则附加AND。否则,追加WHERE。
发布于 2019-03-06 00:29:58
做一些假设(因为你在问题中遗漏了很多信息),你可以这样做:
Dim sSql as String
sSql = "Select * from MyTable"
Set W = Me.cboSite.Value
sSql = sSql & " WHERE MySite = " & W & ""
Set X = Me.Chk1
Set Y = Me.Chk2
Set Z = Me.Chk3
If X = True Then
sSql = sSql & " And MyItem between 1 and 10"
If Y = True Then
sSql = sSql & " And MyItem between 11 and 20"
If Z = True Then
sSql = sSql & " And MyItem between 21 and 30"
End If
DoCmd.ExecuteSQL sSql同样,这完全是“空气代码”,没有检查,可能需要一些编辑,因为我已经有一段时间没有接触访问了,我的VBA可能已经生锈了。但它应该会让你走上正确的道路。
发布于 2019-03-06 03:05:48
我在access中使用组合框筛选的方法是首先设计一个包含要筛选的所有数据的查询。查询必须包含要用于筛选的字段。QueryAllData => "SELECT Table.Site,Table.ItemNumber,FROM Table;“,然后复制查询并将其命名为QueryFilteredData,并设计报表以使用QueryFilteredData显示数据。然后创建一个包含站点ComboBox、ItemNumber组合框和子报表对象的窗体,并为SourceObject分配报表名称。使用Value List作为组合框Row Source type,然后键入Row Source的值以使其正常工作。为了更新报告,我总是取消分配SubReport.SourceOject,更新QueryFilteredData,然后重新分配SubReport.SourceObject
Combobox_Site_AfterUpdate()
Combobox_ItemNumber_AfterUpdate
End Sub
Combobox_ItemNumber_AfterUpdate()
Select Case Combobox_ItemNumber.value
Case Is = "1-10"
Store_Filters 1,10
Case Is = "11-20"
Store_Filters 11,20
Case Is = "21-30"
Store_Filters 21,30
Case Else
Store_Filters 1,10
End Sub
Private Sub Store_Filters(Lowest as integer, Highest as integer)
Dim SRpt_Recset As Object
Dim Temp_Query As Variant
Dim Temp_SourceObject as Variant
Temp_SourceObject = SubReport.SourceObject
SubReport.SourceObject =""
Set SRpt_Recset = CurrentDb.QueryDefs("QueryFilteredData")
Filter_Combo_Box1 = " ((QueryAllData.[Sites])= " & Chr(39) & Combo_Box1 & Chr(39) & ") "
Filter_Combo_Box2 = (Filter_Combo_Box1 AND (QueryAllData.ItemNumber <= Highest)) OR (Filter_Combo_Box1 AND (QueryAllData.ItemNumber >= Lowest));"
Temp_Query = " SELECT " & Query_Name & ".* " & _
"FROM " & Query_Name & " " & _
"WHERE (" & Filter_Combo_Box2 & ") ORDER BY [Field_Name_For_Sorting];"
SRpt_Recset.SQL = Temp_Query
'Debug.print Temp_Query
SubReport.SourceObject = Temp_SourceObject
End Sub在组合框工作后,如果数据要更改,如Site和Item Number,那么您可能希望更改组合框的Row Source,以使用使用Select Distinct Site From QueryAllData的查询。我不知道Filter_Combo_Box2是否有步长,所以它可能需要一些修正。希望这能有所帮助。
https://stackoverflow.com/questions/55007046
复制相似问题