首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MS-ACCESS VBA多搜索条件

问MS-ACCESS VBA多搜索条件
EN

Stack Overflow用户
提问于 2019-03-06 00:10:20
回答 3查看 1.7K关注 0票数 0

在我的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?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-06 00:55:47

我对这些类型的筛选器所做的是,每当其中一个筛选器控件发生更改时,就构造一条SQL语句。它们都引用相同的子例程,以避免代码重复。

如何处理这条SQL语句取决于您想要做什么。Access使用它是非常通用的;将它用作RecordSource,直接执行它,并将结果用于其他事情,甚至只是将其打印到标签。

为了尝试模块化这个过程,这里有一个我如何做到这一点的示例:

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2019-03-06 00:29:58

做一些假设(因为你在问题中遗漏了很多信息),你可以这样做:

代码语言:javascript
复制
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可能已经生锈了。但它应该会让你走上正确的道路。

票数 1
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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是否有步长,所以它可能需要一些修正。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55007046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档