Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录

Posted

技术标签:

【中文标题】Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录【英文标题】:Select query in Microsoft Access looking up records in another table returning incorrect results 【发布时间】:2015-04-13 04:00:05 【问题描述】:

我有一个数据库,其中包含以下字段:Employee_Manager 和 Manager_Department,位于名为Employees 的表中。我还有一个名为 Managers 的表中的经理及其相应部门的主列表,其中包含名为 Manager_ID 和 Department 的字段。我正在编写一个 VBA 脚本,该脚本将验证员工表中列出的员工经理是否有效 - 存在于经理的主列表中。我正在使用的 VBA 代码如下:

Public sub validateManagers(manager as string, managerDepartment as String)

dim db As DAO.database
dim rs As DAO.recordset
dim sqlString as String
set db = currentDb

sqlString = "SELECT [Manager_ID] FROM [Managers] WHERE [Manager_ID] LIKE ""*" & manager & "*"" And [Department] LIKE ""*" & managerDepartment & "*"""

set rs = db.OpenRecordset(sqlString)

if Not rs.EOF Then
    If (Instr(1, rs.Fields(0), manager, vbTextCompare)) <> 0 Then
        validateManagers = "Valid Manager"
    Else
        validateManagers = manager & "Is not a valid manager in" & managerDepartment
    End if
Else
    validateManager = "No matching roles found"
End if

现在代码只是部分工作。当雇员表中的所有经理都在经理表中找到时,我没有问题。但是,当员工表中列出的经理与经理表中为该经理指定的角色不匹配时,代码会失败。 内部 if 语句中的 else 子句没有像我预期的那样运行。 函数返回外部 if 语句的外部 else 子句中的值。

所有字段都是字符串类型,并且在任何字段值中都没有尾随/前导空格。 VBA 编译得很好,只是那个查询返回了不正确的结果。代码到达 EOF 并返回“未找到匹配的角色”

什么可能导致这个问题,我该如何解决这个问题?

【问题讨论】:

我建议您首先检查您的代码并检查用于评估 IF 的值。数据可能不是您所期望的。请注意,您还可以将此“IF”移动到查询中,这可能会使正在发生的事情更加明显(因为您可以直接在 MS Access 中运行查询) 为什么没有第二个ThenIf 它甚至可以编译吗? @cha 修正了错字。 【参考方案1】:

首先是你的答案,然后是提示:

您的 SQL 受到经理 ID 和部门的限制 一位经理可以有一个或多个部门,但这并不重要 重要的是,如果 SQL 完全返回任何记录,则可以保证您的经理和部门都会在结果中。 但是,按照您设置的方式,如果没有返回结果,您无法判断是经理 ID 错误还是部门错误。你只知道组合是无效的。

建议:

删除嵌套的 If(您的 InStr 测试复制了 SQL Like,并且没有添加额外的特异性):

If Not rs.EOF Then
    validateManagers = "Valid Manager and Department"
Else
    validateManagers = manager & " is not a valid manager in " & managerDepartment
End if

此逻辑现在与 SQL 匹配。

但是,这可能不是您想要的。如果要单独验证经理或部门的存在,则需要编写单独的测试。

现在提示:

set rs = db.OpenRecordset(sqlString)

默认情况下,此代码以动态集的形式打开您的记录集,动态集是一个读/写光标,可让您向前和向后移动。这段代码不需要,所以我建议使用 Forward-Only 游标(只读,只进):

set rs = db.OpenRecordset(sqlString, dbOpenForwardOnly)

这是轻量级的,并且具有自动移动到第一条记录并设置 .EOF 的良好属性,因此您的第一个 if 检查将始终按预期工作。

【讨论】:

以上是关于Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 2010 中的自定义查询

使用传递查询中的数据更新 Microsoft Access 2013 表

Microsoft Access 查询返回序列号

Microsoft Access,在 DataSheet 子表单中自动生成列

Microsoft Access 2016 查询为链接表中的空日期返回 1/1/1800

Microsoft Access - 生成特定查询