Returning records that partially match a value

前端 未结 5 524
悲哀的现实
悲哀的现实 2021-01-06 07:13

I\'m trying to get a query working that takes the values (sometimes just the first part of a string) from a form control. The problem I have is that it only returns records

相关标签:
5条回答
  • 2021-01-06 07:50

    You have your LIKE expression backwards. I have rewritten the query to remove the unnecessary IIF commands and to fix your order of operands for the LIKE operator:

    SELECT TabCustomers.*
    FROM TabCustomers
    WHERE (Forms!FrmSearchCustomer!SearchMember Is Null Or Forms!FrmSearchCustomer!SearchMember=[customerid]) 
    And (Forms!FrmSearchCustomer.SearchFore Is Null Or [customerforname] Like Forms!FrmSearchCustomer!SearchFore & "*") 
    And (Forms!FrmSearchCustomer!SearchLast Is Null Or [customersurname] Like Forms!FrmSearchCustomer!SearchLast & "*") 
    And (Forms!FrmSearchCustomer!Searchdate Is Null Or [customerDOB] Like Forms!FrmSearchCustomer!Searchdate & "*");
    

    I built that query by replicating the most likely circumstance: I created a dummy table with the fields mentioned and a form with the fields and a subform with the query listed above being refreshed when the search button was pushed. I can provide a download link to the example I created if you would like. The example works as expected. J only picks up both Jim and John, while John or Jo only pulls the John record.

    0 讨论(0)
  • 2021-01-06 07:54

    There is an Access Method for that!

    If you have your "filter" controls on the form, why don't you use the Application.buildCriteria method, that will allow you to add your filtering criterias to a string, then make a filter out of this string, and build your WHERE clause on the fly?

    selectClause = "SELECT TabCustomers.* FROM TabCustomers"
    if not isnull(Forms!FrmSearchCustomer!SearchMember) then
        whereClause = whereClause & application.buildCriteria(your field name, your field type, your control value) &  " AND "
    endif
    if not isnull(Forms!FrmSearchCustomer!SearchFore) then
        whereClause = whereClause & application.buildCriteria(...) &  " AND "
    endif
    if not isnull(Forms!FrmSearchCustomer!SearchLast) then
        whereClause = whereClause & application.buildCriteria(...) &  " AND "
    endif
    if not isnull(Forms!FrmSearchCustomer!SearchDate) then
        whereClause = whereClause & application.buildCriteria(...) & " AND "
    endif
    --get rid of the last "AND"
    if len(whereClause) > 0 then
         whereClause = left(whereClause,len(whereClause)-5)
         selectClause = selectClause & " WHERE " & whereClause
    endif
    -- your SELECT instruction is ready ...
    

    EDIT: the buildCriteria will return (for example):

    • 'field1 = "GR"' when you type "GR" in the control
    • 'field1 LIKE "GR*"' when you type "GR*" in the control
    • 'field1 LIKE "GR*" or field1 like "BR*"' if you type 'LIKE "GR*" OR LIKE "BR*"' in the control

    PS: if your "filter" controls on your form always have the same syntax (let's say "search_fieldName", where "fieldName" corresponds to the field in the underlying recordset) and are always located in the same zone (let's say formHeader), it is then possible to write a function that will automatically generate a filter for the current form. This filter can then be set as the form filter, or used for something else:

    For each ctl in myForm.section(acHeader).controls
        if ctl.name like "search_"
            fld = myForm.recordset.fields(mid(ctl.name,8))
            if not isnull(ctl.value) then
               whereClause = whereClause & buildCriteria(fld.name ,fld.type, ctl.value) & " AND "
            endif
        endif
    next ctl
    if len(whereClause)> 0 then ...
    
    0 讨论(0)
  • 2021-01-06 07:56

    This is a complete re-write to allow for nulls in the name fields or the date of birth field. This query will not fail as too complex if text is entered in the numeric customerid field.

    SELECT TabCustomers.CustomerForname AS NameSearch, TabCustomers.CustomerSurname AS SurnameSearch, TabCustomers.CustomerDOB AS DOBSearch, TabCustomers.customerid AS MemberSearch
    FROM TabCustomers
    WHERE TabCustomers.customerid Like IIf([Forms]![FrmSearchCustomer].[Searchmember] Is Null,"*",[Forms]![FrmSearchCustomer]![Searchmember])
    AND Trim(TabCustomers.CustomerForname & "") Like IIf([Forms]![FrmSearchCustomer].[SearchFore] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchFore] & "*")
    AND Trim(TabCustomers.CustomerSurname & "") like IIf([Forms]![FrmSearchCustomer].[Searchlast] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchLast] & "*")
    AND (TabCustomers.CustomerDOB Like IIf([Forms]![FrmSearchCustomer].[SearchDate] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchDate] ) Or TabCustomers.CustomerDOB Is Null)
    
    0 讨论(0)
  • Two things are going on - the comparisions should be reversed and you are not quoting strings properly.

    It should be [database field] like "partial string + wild card"

    and all strings need to be surrounded by quotes - not sure why your query doesn't throw errors

    So the following should work:

    ,[customerforname] Like  """" & [Forms]![FrmSearchCustomer]![SearchFore] & "*""" )=True
    

    Note the """" that is the only way to append a single double-quote to a string.

    0 讨论(0)
  • 2021-01-06 08:11

    My only thoguht is that maybe a () is needed to group the like

    For example a snippet on the first part

    ,[Forms]![FrmSearchCustomer]![SearchFore] Like ([customerforname] & "*"))=True
    

    It has been a while since I've used access, but it is the first thing that comes to mind

    0 讨论(0)
提交回复
热议问题