VB窗体和MS Access SQL通配符搜索(VB Form and MS Access SQL

2019-09-17 18:40发布

我的表table1有3个领域: FNameLNamePhone 。 我使用的是Microsoft Access 2010中运行SQL查询。 有些行具有空/空手机值。

我有一个接受的搜索参数的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;

它给我的用户匹配给定(名单FNameLName )参数。 它工作正常。

同样的,当我尝试:

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 (间条件FNameLName )和( Phone )搜索参数。 它不工作。 我曾尝试nz(frmSearchMain!Phone,"")对所有的搜索参数,可以%而不是* ,但至今没有运气。

我是新来的MS访问SQL查询的格式。 我已经使用这种类型的查询了很多次在MySQL。 但我不能从中得到一个预期的结果。

任何帮助,将不胜感激。

Answer 1:

我认为它应该是更容易,如果我们把它简化到这一个梳理。 所以我擅自决定无视LName现在,做仅基于搜索FNamePhone

在我的版本的frmSearchMain ,我命名保存用于该搜索目标值的文本框FName作为txtSearchFName只是因为我喜欢不同于记录源字段名的控制。 同样,我选择txtSearchPhonePhone搜索目标文本框。

因为我已经有一个表名为Table1 ,我打电话给我tblKeerthiram代替。

这些变化,该查询给了我匹配的行txtSearchFNametxtSearchPhone 。 如果两个txtSearchFNametxtSearchPhone是空,查询从表......这是我希望你要返回所有行。

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;

这种方法的一个后果是,如果两个txtSearchFNametxtSearchPhone非空,查询将返回只匹配这两个行。 当我明白你的描述,这是不是你想要的。 您想在只有一个或另一个,但不能同时在同一时间进行搜索。

在这种情况下,我建议你使用两个搜索文本框后更新事件设置其他空当非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 。 希望这部分不会太艰巨。 祝好运。



Answer 2:

在您的例子此查询给出匹配所有的三个条件,一个记录的结果:

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;

如果你想返回匹配(手机)或(FName参数和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;

希望它能帮助



Answer 3:

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参数,手机,它具有正确的姓和名,或正确的电话(或两者)。

注:套用的是,我真的不知道如何正确地串联那些多行VBA字符串。



文章来源: VB Form and MS Access SQL Wildcard Search