【问题标题】:Multi-Field Search Button (Query) Showing Records With or Without Missing Fields显示有或没有缺失字段的记录的多字段搜索按钮(查询)
【发布时间】:2019-08-09 05:58:03
【问题描述】:

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

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

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 访问不会返回任何记录。有没有解决的办法?

我想到了以下几点:

  1. 使用“If”语句执行不同的查询,具体取决于已输入的数据,但需要从 720 种不同的组合中搜索 6 个不同的字段。

  2. 根据搜索输入构建查询字符串(代码中的 DoCmd.OpenForm 行),但我想不出一种方法让代码知道何时在其间放置“&”。

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

  4. 可能会在所有空白字段中添加“n/a”,但有没有办法自动执行此操作?由于该数据库有一个用户输入部分,如果它会在创建新记录时自动用“n/a”填充空字段,那将是理想的。虽然这会使表格/数据看起来有点凌乱,但更喜欢搜索查询和缺少字段的方法。

任何帮助将不胜感激!提前致谢。

【问题讨论】:

    标签: sql vba ms-access


    【解决方案1】:

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

    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 和通配符在数字字段上无法正常工作。

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

    1. 如果字段为空,则返回值的查询计算 - “N/A”的想法 - 并将过滤条件应用于该字段

    2. 在每个字段的条件中包含OR Is Null,OR 短语两边的括号很重要

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

    标签、名称和组是保留字。不应使用保留字作为名称以避免意外结果。包含在 [ ] 中应该可以解决,但最好避免。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 2014-11-30
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多