简体   繁体   中英

MS Access multi field search with empty fields

I have a problem very similar to this one , but I just can't seem to solve it!

In MS Access (2003), I want to search a table based on entries in a number of fields, some of which may be empty.

I have:

  • text fields
  • date fields
  • integer fields, and
  • a memo field (but we can probably not bother searching this one if it is difficult).

They map onto a table exactly.

I am trying to create a query that will return matching rows when data is entered into one or more of these fields, but some fields can be left blank. How the heck do I do this?

A query like the one on the linked question works for text fields, but what do I do about the number fields, date fields (and possibly even the memo field)?

To give a clear example, the following code block works for TextField1, but not NumberField1:

PARAMETERS [Forms]![SearchForm]![FilterTextField1] Text ( 255 ), [Forms]![SearchForm]![FilterNumberField1] Text ( 255 );
SELECT Table1.[TextField1], Table1.[NumberField1], Table1.[TextField2], Table1.[TextField3], Table1.[DateField1], Table1.[DateField2], Table1.[DateField3]
FROM Table1
WHERE (Len([Forms]![SearchForm]![FilterTextField1] & '')=0 OR Table1.[TextField1] Like '*' & [Forms]![SearchForm]![FilterTextField1] & '*') AND (Len([Forms]![SearchForm]![FilterNumberField1] & '')=0 OR Table1.[NumberField1] Like '*' & [Forms]![SearchForm]![FilterNumberField1] & '*');

I do hope you can help. I'm sure I'm missing something really obvious, but for some reason my brain feels like it is leaking out of my ears at the moment.

Thank you!


If you need it, this is the basic design of the relevant entities:

Table1

  • SomePrimaryKeyWeDontCareAboutRightNow
  • TextField1
  • TextField2
  • TextField3
  • NumberField1
  • DateField1
  • DateField2
  • DateField3
  • MemoField1

SearchForm

  • FilterTextField1
  • FilterTextField2
  • FilterTextField3
  • FilterNumberField1
  • FilterDateField1
  • FilterDateField2
  • FilterDateField3
  • FilterMemoField1

您可以检查null值或将其强制转换为字符串

You could certainly spend a great deal of time crafting a huge and very hard to debug SQL query for this, or just jump into VBA and write some code to construct just the SQL you need.

VBA is there just for these kinds of scenario, where something is either impossible or becoming too complex to do otherwise.

With VBA, you can use an initial SELECT query that collect all the data, and then construct a WHERE clause based on the content of your search form to filter it.

For instance, I have a form like this, that allows the user to enter any criteria to filter a list of prices:

筛选表格样本

Some code to implement this could look like:

' Call this whenever the use click the Apply button '
Private Sub btApply_Click()
    ' Construct the filter '
    Dim filter As String

    If Not IsBlank(cbSupplierID) Then
        If Not IsBlank(filter) Then filter = filter & " AND "
        filter = filter & "(SupplierID=" & cbSupplierID & ")"
    End If

    If Not IsBlank(txtPartNumber) Then
        If Not IsBlank(filter) Then filter = filter & " AND "
        filter = filter & "(PartNumber LIKE '*" & txtPartNumber & "*')"
    End If

    If Not ckShowLocked Then
        If Not IsBlank(filter) Then filter = filter & " AND "
        filter = filter & "(NOT PriceLocked)"
    End If

    ' ... code snipped, you get the jest ... '

    ' Now re-construct the SQL query '
    Dim sql As String
    sql = "SELECT * FROM Price"

    If Not IsBlank(filter) Then
        sql = sql & " WHERE " & filter
    End If

    SubForm.Form.RecordSource = sql
End Sub

It may seem like a lot of code, but each block only does one thing, and it's a lot easier to debug and maintain than cramming everything into a query.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM