Я обычно использую свои формы фильтрации, используя следующие принципы:
1) Сначала я создаю запрос, который включает в себя все поля, которые я хочу отобразить, и все поля, по которым я хочу фильтровать.Можно использовать более одной таблицы.Я не устанавливаю никаких критериев (предложение WHERE) в этом запросе, если нет условия, которое всегда нужно применять, несмотря ни на что.
2) Затем я создаю форму таблицы данных на основе этого запроса и сохраняю ее, присвоив ему имя, указывающее, что это подчиненная форма.
3) Затем я создаю несвязанную основную форму и добавляю несвязанные элементы управления, такие как текстовые поля, комбо, списки, флажки и т. д., которые будут использоваться для фильтрацииразные поля.Один элемент управления может потенциально позволить пользователю выполнять поиск по нескольким полям в зависимости от того, как вы пишете свою процедуру фильтрации в VBA.
4) Теперь пришло время написать код в главной форме, чтобы все это работало.По сути, код должен проверить, есть ли значения в каком-либо из элементов управления, и если это так, он создает предложение WHERE (без ключевого слова WHERE) и в самом конце устанавливает свойство фильтра подчиненной формы и поворачивает свойство FilterOn подчиненной формы.TRUE.
Вот пример кода.Это было взято из примера базы данных, которую я сделал только для демонстрации фильтрации (см. Ниже).В этом примере не используются нечеткие поиски (звездочки), и каждый элемент управления в главной форме фильтрует только одно поле в подчиненной форме.
Private Sub cmdFilter_Click()
'You can also call the FilterSubForm function on a control's AfterUpdate event.
Call FilterSubform
End Sub
Private Sub FilterSubform()
Dim strFilter As String
'Note: We have to wrap field names in brackets if they contain spaces or
'special characters. These fields are in Northwind Traders 2007 from Microsoft
'I would never consider naming my fields with spaces or special characters
'in them.
'Company
If Nz(Me.txtCompany, "") <> "" Then
strFilter = strFilter & "Company = '" & PQ(Me.txtCompany) & "' And "
End If
'First Name
If Nz(Me.txtFirstName, "") <> "" Then
strFilter = strFilter & "[First Name] = '" & PQ(Me.txtFirstName) & "' AND "
End If
'Last Name
If Nz(Me.txtLastName, "") <> "" Then
strFilter = strFilter & "[Last Name] = '" & PQ(Me.txtLastName) & "' AND "
End If
'Business Phone
If Nz(Me.txtBusinessPhone, "") <> "" Then
strFilter = strFilter & "[Business Phone] = '" & PQ(Me.txtBusinessPhone) & "' AND "
End If
'City
If Nz(Me.cboCity, "") <> "" Then
strFilter = strFilter & "City = '" & PQ(Me.cboCity) & "' AND "
End If
'State/Province
If Nz(Me.cboStateProvince, "") <> "" Then
strFilter = strFilter & "[State/Province] = '" & PQ(Me.cboStateProvince) & "' AND "
End If
'Order Date
If Nz(Me.txtOrderDate, "") <> "" Then
If IsDate(Me.txtOrderDate) = True Then
strFilter = strFilter & "[Order Date] = #" & Me.txtOrderDate & "# AND "
End If
End If
'Ship Name
If Nz(Me.txtShipName, "") <> "" Then
strFilter = strFilter & "[Ship Name] = '" & PQ(Me.txtShipName) & "' AND "
End If
'Ship City
If Nz(Me.txtShipCity, "") <> "" Then
strFilter = strFilter & "[Ship City] = '" & PQ(Me.txtShipCity) & "' AND "
End If
'Ship State/Province
If Nz(Me.cboShipStateProvince, "") <> "" Then
strFilter = strFilter & "[Ship State/Province] = '" & PQ(Me.cboShipStateProvince) & "' AND "
End If
'Product Code
If Nz(Me.cboProductCode, "") <> "" Then
strFilter = strFilter & "[Product Code] = '" & PQ(Me.cboProductCode) & "' AND "
End If
'Quantity
If Nz(Me.txtQuantity, "") <> "" Then
If IsNumeric(Me.txtQuantity) = True Then
strFilter = strFilter & "Quantity = " & Me.txtQuantity & " AND "
End If
End If
If Right(strFilter, 5) = " AND " Then strFilter = Left(strFilter, Len(strFilter) - 5)
If strFilter <> "" Then
Me.subformOrderSearch.Form.Filter = strFilter
Me.subformOrderSearch.Form.FilterOn = True
Else
'Clear the filter
Me.subformOrderSearch.Form.Filter = ""
Me.subformOrderSearch.Form.FilterOn = False
End If
End Sub
Private Function PQ(s As String) As String
'This function is used to "pad quotes" for SQL
PQ = Replace(s, "'", "''")
End Function
Я собрал пример базы данных, в которой есть несколько разных примеров, основанных на том, что я выложил здесь.Вы можете скачать эту базу данных здесь: http://www.utteraccess.com/forum/Search-filtering-Examples-t1968063.html