多字段搜索按钮(查询),显示有或没有缺失字段的记录

时间:2019-03-18 19:17:14

标签: sql vba ms-access

我有一个只有1个表的数据库,该表有27个以上的字段,但并非所有字段都包含值(某些字段为空)。我在导航表单上有一个按钮(“搜索警报”),该按钮执行多字段搜索,用户可以搜索6个不同的字段,并且用户可以同时使用1到6个条件(请参阅照片)。 Search Form
例如,我可以仅按名称搜索,也可以按名称和标记等搜索,即使该记录中还有一些其他缺少的字段,我也希望显示所有包含这些项目的记录。

下面是单击按钮时执行的代码。

varI = DLookup("Tag", "tblAlarms", "Tag Like '*" & Forms![frmHomePage]!inputTag & "*'")
varJ = DLookup("Name", "tblAlarms", "Name Like '*" & Forms![frmHomePage]!inputName & "*'")
varX = DLookup("Plant_Identification_Number", "tblAlarms", "Plant_Identification_Number Like '*" & Forms![frmHomePage]!inputPlantID & "*'")
varY = DLookup("Priority", "tblAlarms", "Priority Like '*" & Forms![frmHomePage]!inputPriority & "*'")
varZ = DLookup("Group", "tblAlarms", "Group Like '*" & Forms![frmHomePage]!inputGroup & "*'")
varK = DLookup("Classification", "tblAlarms", "Classification Like '*" & Forms![frmHomePage]!inputClass & "*'")

        If Not IsNull(varI) And Not IsNull(varJ) And Not IsNull(varX) And Not IsNull(varY) And Not IsNull(varZ) And Not IsNull(varK) Then
            DoCmd.OpenForm "frmAlarms", acNormal, "", "Tag Like ""*"" & [Forms]![frmHomePage]![inputTag] & ""*"" and Name Like ""*"" & [Forms]![frmHomePage]![inputName] & ""*"" and Plant_Identification_Number Like ""*"" & Forms![frmHomePage]!inputPlantID & ""*"" and Priority Like ""*"" & Forms![frmHomePage]!inputPriority & ""*"" and Group Like ""*"" & Forms![frmHomePage]!inputGroup & ""*"" and Classification Like ""*"" & Forms![frmHomePage]!inputClass & ""*""", acEdit, acNormal
            DoCmd.Close acForm, "frmHomePage", acSaveNo
            Me.Visible = False
        Else
            MsgBox "0 Search Results Were Found!"
            Me.Visible = True
        End If

我的问题是,当数据表中缺少字段时,我无法运行查询/搜索(DoCmd.OpenForm行)。

我尝试删除'If'条件,以便无论是否缺少字段都将运行命令,但是ms access不会返回任何记录,除非该记录包含所有字段中的数据。有没有解决的办法?

我想到了以下内容:

  1. 具有“ If”语句,可以根据输入的数据执行不同的查询,但是有6种不同的字段可以从720种不同的组合中进行搜索。

  2. 根据搜索输入构建查询字符串(代码中的DoCmd.OpenForm行),但是我想不出一种方法来使代码知道何时在两者之间添加“&”。

  3. 尝试使用按钮只是运行查询,但是问题仍然是,如果记录中缺少字段,即使搜索条件匹配,该记录也不会显示。例如,如果我搜索标记= 1234的所有记录,则仅当该记录中的所有27个以上字段都包含一个值时,这些记录才会显示。

  4. 是否可以在所有空字段中输入“ n / a”,但是有没有一种自动执行此操作的方法?由于该数据库有一个用户输入部分,因此如果在创建新记录时自动用“ n / a”填充空白字段,则将是理想的选择。尽管这会使表/数据看起来有些混乱,所以还是希望采用一种解决搜索查询和缺少字段的方法。

任何帮助将不胜感激!预先感谢。

1 个答案:

答案 0 :(得分:0)

字符串连接不正确。考虑:

DoCmd.OpenForm "frmAlarms", acNormal, , "[Tag] LIKE '*" & Me.inputTag & _
          "*' AND [Name] LIKE '*" & Me.inputName & _
          "*' AND Plant_Identification_Number LIKE '*" & Me.inputPlantID & _
          "*' AND Priority LIKE '*" & Me.inputPriority & _
          "*' AND [Group] LIKE '*" & Me.inputGroup & _ 
          "*' AND Classification LIKE '*" & Me.inputClass & *'", acEdit, acNormal

LIKE和通配符在数字字段上将无法正常工作。

处理记录选项中的空(空)字段:

    查询中的
  1. 计算,如果字段为null则返回值-“不适用”的想法-对该字段应用过滤条件

  2. 在每个字段的条件中
  3. 包括OR Is Null,OR短语两个部分的括号都至关重要

但是,如果要使用VBA构建标准字符串(与动态参数化查询对象相对),则有条件地构建字符串可能是最好的方法。如果文本框中没有输入,则不包含条件。查看http://allenbrowne.com/ser-62.html

标记,名称和组是保留字。请勿将保留字用作名称,以免发生意外结果。包含在[]中应该可以解决,但最好避免。