2

私のテーブルtable1FNameには、LName、 、 の3 つのフィールドがありますPhone。SQL クエリの実行に Microsoft Access 2010 を使用しています。一部の行には、空/null の phone 値があります。

検索パラメーターを受け入れる VB フォームがあります。ユーザーは(FName and LName)またはを入力できます(Phone)が、両方を同時に入力することはできません。

私がしようとすると:

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*') ORDER BY table1.LName, table1.FName;

FName指定された (およびLName) パラメータに一致するユーザーのリストが表示されます。それは正常に動作します。

同様に、試してみると:

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*') ORDER BY table1.LName, table1.FName;

Phone指定された ( ) パラメータに一致するユーザーのリストが表示されます。それもうまくいきます。

しかし、これらの両方のクエリを組み合わせると、次のようになります。

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*') AND table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*') ORDER BY table1.LName, table1.FName;

期待した結果が得られません。

(と) と ( ) 検索パラメーターORの間の条件も試しました。うまくいきません。の代わりにすべての検索パラメーターを試しましたが、これまでのところ運がありません。FNameLNamePhonenz(frmSearchMain!Phone,"")%*

MS Access SQL クエリ形式は初めてです。私はこのタイプのクエリを MySQL で何度も使用してきました。しかし、これでは期待した結果を得ることができませんでした。

どんな助けでも大歓迎です。

4

3 に答える 3

0
sql = "SELECT LName, FName, Phone" & _
      "FROM table1" & _
      "WHERE (" & _
      "Phone LIKE ('%" & Forms!frmSearchMain!Phone & "%' )" & _
      "OR ( FName LIKE ('%" & Forms!frmSearchMain!FName & "%' )" & _
            "AND LName LIKE ('%" & Forms!frmSearchMain!LName & "%' ) )" & _
      "ORDER BY LName, FName"

そのクエリを実行すると、正しい名字と姓、または正しい電話番号 (または両方) を持つすべての LName、FName、Phone が返されます。

注:言い換えると、正直なところ、これらの複数行の VBA 文字列を適切に連結する方法がわかりません。

于 2012-06-05T16:18:13.787 に答える
0

単純化すれば、これを整理する方が簡単だと思います。ということで勝手にとりあえず無視してorLNameだけで検索することにしました。FNamePhone

私のバージョンのでは、レコード ソース フィールドとは異なる名前をコントロールに付けたいという理由だけfrmSearchMainで、検索対象の値を保持するテキスト ボックスに名前を付けましたFNametxtSearchFName同様にtxtSearchPhonePhone検索対象のテキスト ボックスを選択しました。

という名前のテーブルが既にあったので、代わりに自分のテーブルTable1を呼び出しtblKeerthiramました。

これらの変更により、このクエリはtxtSearchFNameorに一致する行を返しますtxtSearchPhonetxtSearchFNameとの両方txtSearchPhoneが Null の場合、クエリはテーブルからすべての行を返します...これは私が望むものです。

SELECT
    t1.id,
    t1.FName,
    t1.Phone
FROM tblKeerthiram AS t1
WHERE
           (t1.FName Like "*"
               & [Forms]![frmSearchMain]![txtSearchFName]
               & "*"
        OR [Forms]![frmSearchMain]![txtSearchFName] Is Null)
    AND
           (t1.Phone Like "*"
               & [Forms]![frmSearchMain]![txtSearchPhone]
               & "*"
        OR [Forms]![frmSearchMain]![txtSearchPhone] Is Null)
ORDER BY t1.FName;

このアプローチの結果、 と の両方txtSearchFNametxtSearchPhoneNull でない場合、クエリは両方に一致する行のみを返します。私があなたの説明を理解したように、それはあなたが望むものではありません. 両方を同時にではなく、どちらか一方だけで検索したい。

その場合、2 つの検索テキスト ボックスの更新後イベントを使用して、一方に Null 以外の値が入力されたときにもう一方を Null に設定することをお勧めします。その文がどれほど明確だったかはわかりません。このコードをフォームのモジュールに追加してください。これにより、2 つのテキスト ボックスのうち 1 つだけに Null 以外の値が含まれるようになります。

Option Compare Database
Option Explicit

Private Sub txtSearchFName_AfterUpdate()
    If Not IsNull(Me.txtSearchFName) Then
        Me.txtSearchPhone = Null
    End If
End Sub

Private Sub txtSearchPhone_AfterUpdate()
    If Not IsNull(Me.txtSearchPhone) Then
        Me.txtSearchFName = Null
    End If
End Sub

最後に、それがすべて機能する場合は、対処するために修正するだけですLName。その部分が難しすぎないことを願っています。幸運を。

于 2012-06-05T18:55:37.597 に答える
0

あなたの例では、このクエリは 3 つの条件すべてに一致するレコードの結果を返します。

SELECT table1.LName, table1.FName, table1.Phone FROM table1 WHERE table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*') AND table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*') ORDER BY table1.LName, table1.FName;

(Phone) OR (FName AND LName) に一致するレコードを返したい場合は、次のようにする必要があります。

SELECT table1.LName, table1.FName, table1.Phone FROM table1
WHERE  (table1.Phone Like ('*' & Forms!frmSearchMain!Phone & '*'))
OR (table1.LName Like ('*' & Forms!frmSearchMain!LName & '*') AND table1.FName Like ('*' & Forms!frmSearchMain!FName & '*'))
ORDER BY table1.LName, table1.FName;

それが役立つことを願っています

于 2012-06-04T23:14:50.230 に答える