Frage

Ich versuche, eine Abfrage zum Laufen zu bringen, die die Werte (manchmal nur der erste Teil eines Strings) von einer Form der Kontrolle übernimmt. Das Problem, das ich habe ist, dass es nur Datensätze zurückgibt, wenn die vollständige Zeichenfolge in eingegeben wird.

d. im Namen Box soll ich in der Lage sein, gr zu geben, und es bringt

grün grau graham

aber derzeit bringt es nicht auf irgendetwas uless die vollständige Suchbegriff verwendet wird.

Es gibt 4 Such Steuerelemente auf dem Formular in Frage, und sie werden nur in der Abfrage verwendet, wenn das Feld ausgefüllt wird.

Die Abfrage ist:

SELECT TabCustomers.*,
       TabCustomers.CustomerForname AS NameSearch,
       TabCustomers.CustomerSurname AS SurnameSearch,
       TabCustomers.CustomerDOB AS DOBSearch,
       TabCustomers.CustomerID AS MemberSearch
FROM TabCustomers
WHERE IIf([Forms]![FrmSearchCustomer]![SearchMember] Is Null
          ,True
          ,[Forms]![FrmSearchCustomer]![SearchMember]=[customerid])=True
      AND IIf([Forms]![FrmSearchCustomer].[SearchFore] Is Null
              ,True
              ,[Forms]![FrmSearchCustomer]![SearchFore] Like [customerforname] & "*")=True
      AND IIf([Forms]![FrmSearchCustomer]![SearchLast] Is Null
              ,True
              ,[Forms]![FrmSearchCustomer]![SearchLast] Like [customersurname] & "*")=True
      AND IIf([Forms]![FrmSearchCustomer]![Searchdate] Is Null
              ,True
              ,[Forms]![FrmSearchCustomer]![Searchdate] Like [customerDOB] & "*")=True;
War es hilfreich?

Lösung

Es gibt eine Zugriffsmethode für das!

Wenn Sie Ihren „Filter“ Steuerelemente auf dem Formular haben, warum Sie nicht die Application.buildCriteria Methode verwenden, das Ihnen erlaubt, Ihre Filterkriterien in eine Zeichenfolge hinzuzufügen, machen dann einen Filter aus dieser Zeichenfolge und bauen Sie Ihre WHERE-Klausel 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: die Buildcriteria zurückkehren wird (zum Beispiel):

  • 'field1 = "GR"', wenn Sie "GR" in der Steuerung
  • eingeben
  • 'field1 LIKE "GR*"' wenn Sie "GR*" in der Steuerung
  • eingeben
  • 'field1 LIKE "GR*" or field1 like "BR*"' wenn Sie 'LIKE "GR*" OR LIKE "BR*"' in der Steuer Typ

PS: Wenn Ihr „Filter“ Steuerelemente auf dem Formular immer die gleiche Syntax haben (wir „search_fieldName“ sagen, wo „Feldname“ in der zugrunde liegenden Datensatzgruppe auf dem Spielfeld entspricht) und sind immer in der gleichen Zone befindet (lassen Sie uns sagen formHeader) ist es dann möglich, eine Funktion zu schreiben, die automatisch einen Filter für die Stromform erzeugt. Dieser Filter kann dann als Formfilter eingestellt wird, oder für etwas verwendet, sonst:

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 ...

Andere Tipps

Sie haben Ihre LIKE-Ausdruck zurück. Ich habe die Abfrage neu geschrieben, die unnötigen IIF Befehle zu entfernen und Ihre Bestellung von Operanden für den LIKE-Operator zu beheben:

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 & "*");

baute ich die Abfrage, indem den wahrscheinlichste Umstand zu replizieren: Ich habe eine Dummy-Tabelle mit den genannten Bereichen und ein Formular mit den Feldern und ein Unterformular mit der Abfrage oben aufgeführten aufgefrischt, wenn die Suchtaste gedrückt wurde. Ich kann einen Download-Link zum Beispiel biete ich erstellt, wenn Sie möchten. Das Beispiel funktioniert wie erwartet. J nimmt nur bis beide Jim und John, während John oder Jo nur den Rekord John zieht.

Zwei Dinge geschehen -. Die comparisions rückgängig gemacht werden sollen und Sie zitieren nicht Strings richtig

Es sollte [Datenbankfeld] wie "Teilstring + Wild Card"

sein

und alle Strings müssen in Anführungszeichen gesetzt werden - nicht sicher, warum Ihre Anfrage keine Fehler wirft

So sollte folgendes funktionieren:

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

Beachten Sie die „“ „“ dass der einzige Weg ist, ein einzelnes Anführungszeichen in einen String anzuhängen.

Meine einzige thoguht ist, dass vielleicht ein () zu einer Gruppe benötigt wird, die wie

Zum Beispiel ein Ausschnitt auf dem ersten Teil

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

Es ist schon eine Weile her, dass ich Zugang benutzt habe, aber es ist das erste, was in den Sinn kommt

Dies ist eine komplette Re-write für NULL-Werte in den Namensfeldern oder den Geburtsdatum Feldes zu ermöglichen. Diese Abfrage wird nicht als zu komplex ausfallen, wenn Text in der numerischen customerid Feld eingegeben wird.

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top