MS-ACCESS VBA Критерии множественного поиска

Это не настоящий ответ на вопрос прямо сейчас, но с достаточной поддержкой он может когда-нибудь быть.

<seg> short для «сегмента». Как и в, сегменты линии.

с полиполнением:

<style> seg { display: inline-block; } </style>

Было бы неплохо, если бы был официальный, но нет, так что вот best (IMO) предложил название для такого элемента, о котором я знаю.

0
задан Shinobii 5 March 2019 в 16:10
поделиться

3 ответа

Что я делаю для этих типов фильтров, так это для создания оператора 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.

0
ответ дан fbueckert 5 March 2019 в 16:10
поделиться

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

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
ответ дан Johnny Bones 5 March 2019 в 16:10
поделиться

Способ, которым я использую комбинированную фильтрацию в доступе, заключается в том, что сначала я разрабатываю запрос, который содержит все данные, подлежащие фильтрации. Запрос должен содержать поля, которые будут использоваться для фильтрации. 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 шаг, поэтому он может нуждаться в некоторой коррекции. Надеюсь, это поможет.

0
ответ дан Double E CPU 5 March 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: