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 中运行查询) 为什么没有第二个Then
的If
它甚至可以编译吗?
@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 2013 表
Microsoft Access,在 DataSheet 子表单中自动生成列