4

フォーム コントロールから値 (場合によっては文字列の最初の部分のみ) を取得するクエリを動作させようとしています。私が抱えている問題は、完全な文字列が入力されたときにのみレコードを返すことです.

つまり、姓のボックスに gr と入力できるはずです。

グリーングレイグラハム

しかし、現時点では、完全な検索文字列を使用しない限り、何も表示されません。

問題のフォームには 4 つの検索コントロールがあり、ボックスが入力されている場合にのみクエリで使用されます。

クエリは次のとおりです。

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;
4

5 に答える 5

5

そのためのアクセス方法があります!

フォームに「フィルター」コントロールがある場合は、Application.buildCriteria メソッドを使用しないでください。これにより、フィルター条件を文字列に追加し、この文字列からフィルターを作成して、WHERE を作成できます。その場で条項?

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

編集: buildCriteria は (たとえば) を返します:

  • 'field1 = "GR"'コントロールに「GR」と入力すると
  • 'field1 LIKE "GR*"'"GR*"コントロールに入力するとき
  • 'field1 LIKE "GR*" or field1 like "BR*"''LIKE "GR*" OR LIKE "BR*"'コントロールに入力すると

PS: フォームの「フィルター」コントロールが常に同じ構文 (「search_fieldName」としましょう。ここで、「fieldName」は基になるレコードセットのフィールドに対応します) を持ち、常に同じゾーン (formHeader としましょう) に配置されている場合、その後、現在のフォームのフィルターを自動的に生成する関数を作成できます。このフィルタは、フォーム フィルタとして設定したり、別の用途に使用したりできます。

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 ...
于 2008-10-22T09:09:12.393 に答える
5

LIKE 式が逆になっています。クエリを書き直して、不要な IIF コマンドを削除し、LIKE 演算子のオペランドの順序を修正しました。

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

最も可能性の高い状況を複製して、そのクエリを作成しました。前述のフィールドを含むダミーテーブルと、フィールドを含むフォームと、検索ボタンが押されたときに更新される上記のクエリを含むサブフォームを作成しました。必要に応じて、私が作成したサンプルへのダウンロード リンクを提供できます。この例は期待どおりに機能します。J は Jim と John の両方をピックアップしますが、John または Jo は John のレコードのみをプルします。

于 2008-10-21T22:33:16.657 に答える
2

2 つのことが起こっています。比較を逆にする必要があり、文字列を適切に引用していません。

「部分文字列+ワイルドカード」のような【データベースフィールド】のはずです

すべての文字列を引用符で囲む必要があります-クエリがエラーをスローしない理由がわかりません

したがって、次のように動作するはずです。

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

文字列に単一の二重引用符を追加する唯一の方法である """" に注意してください。

于 2008-10-21T22:16:34.317 に答える
0

私の唯一の考えは、おそらく () が同類をグループ化するために必要であるということです

たとえば、最初の部分のスニペット

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

accessを使い始めて随分経ちましたが、真っ先に思い浮かんだのが

于 2008-10-21T21:54:04.253 に答える
0

これは、名前フィールドまたは生年月日フィールドでヌルを許可するために完全に書き直されたものです。数値の customerid フィールドにテキストが入力されている場合、このクエリは複雑すぎて失敗することはありません。

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)
于 2008-10-21T22:09:58.807 に答える