0

MS Access データベースに検索ページを作成するための VBA を書いていますDoCmd.ApplyFilterが、Search_Click()サブで問題が発生しています。

ここに画像の説明を入力 私のコードは次のようになります

Private Sub Search_Click()
DoCmd.ApplyFilter "", _
    "([site] = [Forms]![SWP Search]![txtSite] " & _
          " Or IsNull([Forms]![SWP Search]![txtSite])) " & _
    "AND " & _
    "([asset] = [Forms]![SWP Search]![txtAsset] " & _
        " Or IsNull([Forms]![SWP Search]![txtAsset]))"
End Sub  

または擬似コードで...

 Shows results where true...
([site column] = txtbox1 OR isnull(txtbox1)) 
AND 
([asset col  ] = txtbox2 OR isnull(txtbox2))

明らかに、望ましい機能は次のとおりです...

  1. サイトが選択され、アセットが空白 -> サイトのみでフィルター
  2. 選択されたサイト、選択されたアセット -> 両方でフィルター
  3. サイトが空白、アセットが空白 -> すべての行を返す
  4. サイトが空白、アセットが選択されている -> アセットのみでフィルタリング

しかし、実際に起こっていることは...

  1. サイトが選択され、アセットが空白 -> 作品
  2. 選択されたサイト、選択されたアセット -> 作品
  3. サイトが空白、アセットが空白 ->行が返されない
  4. サイトが空白、アセットが選択されている ->行が返されない

そのため、Site が空白の場合、IsNull() は true と評価されていないように見えるため、フィルターの最初の部分は FALSE であり、その場で終了します。

理由はありますか?

4

1 に答える 1

1

IsEmpty()違いを生む代わりに使用してみてくださいIsNull()、すなわち

      "(IsEmpty([Forms]![SWP Search]![txtSite]) " & _
      " Or [site] Like [Forms]![SWP Search]![txtSite] )" & _
"AND" & _
    "( IsEmpty([Forms]![SWP Search]![txtAsset])" & _
    " Or [asset] Like [Forms]![SWP Search]![txtAsset] )"

空のtxtboxは、期待どおりにNULLではなく、空の文字列を返す可能性があるためです。または、おそらくtrim()最初に使用して、テキストボックスの値を空の文字列と比較します。

于 2011-09-18T10:21:54.453 に答える