MS-ACCESS VBA Критерии множественного поиска - PullRequest
0 голосов
/ 05 марта 2019

В моем графическом интерфейсе у меня есть несколько способов фильтрации базы данных. Из-за недостатка знаний мое программирование на VBA взорвалось вложенными операторами IF. Сейчас я стал лучше пользоваться ACCESS и хотел бы найти более лаконичный способ выполнения нескольких фильтров. Моя форма непрерывна.

Есть ли простой способ выполнить следующую задачу (я сделал пример с игрушечной моделью):

У меня есть поле со списком SITE, где я могу фильтровать по рабочим сайтам A, B, C. После фильтрации по САЙТУ у меня есть три флажка, в которых пользователь может фильтровать по номеру элемента 1-10, 11-20, 21-30, в зависимости от того, что выбрал пользователь.

Есть ли способ добавить несколько фильтров (или отфильтровать отфильтрованные данные)? Например, отфильтруйте по САЙТУ A, затем отфильтруйте A по номеру товара 1-10?

В настоящее время для каждого флажка у меня есть оператор IF для каждого сайта. Который я тогда использую Form.Filter = . . . And . . . и Form.FilterOn = True.

Можно ли использовать SQL на листе свойств для фильтрации, в отличие от использования VBA?

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Что я делаю для этих типов фильтров, так это создаю инструкцию SQL при каждом изменении одного из элементов управления фильтра.Все они ссылаются на одну и ту же подпрограмму для экономии на дублировании кода.

То, что вы делаете с этим оператором SQL, зависит от того, что вы пытаетесь сделать.Доступ довольно универсален;используйте его как 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.

1 голос
/ 05 марта 2019

Делая довольно много предположений (так как вы оставили много информации в своем вопросе), вы можете сделать что-то вроде этого:

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

Опять же, это полностью "воздушный код", не проверено и, возможно, нуждается в некоторых изменениях, так как я некоторое время не касался Access, и мой VBA, вероятно, ржавый. Но это должно поставить вас на правильный путь.

0 голосов
/ 05 марта 2019

Способ, которым я использую комбинированную фильтрацию в доступе, заключается в том, что сначала я проектирую запрос, который содержит все данные, подлежащие фильтрации.Запрос должен содержать поля, которые будут использоваться для фильтрации.QueryAllData => "SELECT Table.Site, Table.ItemNumber, FROM Table;"Затем сделайте копию запроса и назовите его QueryFilteredData и спроектируйте отчет для отображения данных с помощью QueryFilteredData.Затем создайте форму с помощью поля со списком сайтов, поля со списком ItemNumber и объекта подчиненного отчета и назначьте SourceObject имя отчета.Используйте Список значений в качестве поля со списком Тип источника строки и введите значения для источника строки, чтобы он работал.Чтобы получить отчет для обновления, я всегда отменяю назначение 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

после того, как комбинированные блоки сработают, если данные будут меняться как сайт и номер элемента, тоВозможно, вы захотите изменить Источник строки в полях со списком на Использовать запрос, который использует Выбрать отдельный сайт из QueryAllData.Я не знаю, если Filter_Combo_Box2 шаг, поэтому он может нуждаться в некоторой коррекции.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...