Это не настоящий ответ на вопрос прямо сейчас, но с достаточной поддержкой он может когда-нибудь быть.
<seg>
short для «сегмента». Как и в, сегменты линии.
с полиполнением:
<style> seg { display: inline-block; } </style>
Было бы неплохо, если бы был официальный, но нет, так что вот best (IMO) предложил название для такого элемента, о котором я знаю.
Что я делаю для этих типов фильтров, так это для создания оператора 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
.
Делая довольно много предположений (так как вы оставили много информации в своем вопросе), вы можете сделать что-то вроде этого:
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 скорее всего ржавый. Но это должно поставить вас на правильный путь.
Способ, которым я использую комбинированную фильтрацию в доступе, заключается в том, что сначала я разрабатываю запрос, который содержит все данные, подлежащие фильтрации. Запрос должен содержать поля, которые будут использоваться для фильтрации. 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 шаг, поэтому он может нуждаться в некоторой коррекции. Надеюсь, это поможет.