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

时间:2015-04-13 04:00:05

标签: sql vba ms-access access-vba

我有一个包含以下字段的数据库:Employee_Manager,以及名为Employees的表中的Manager_Department。我还在一个名为Managers的表中有一个管理器的主列表及其相应的部门,其中包含名为Manager_ID和Department的字段。我正在编写一个VBA脚本,用于验证employees表中列出的员工经理是否有效 - 存在于经理的主列表中。我正在使用的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

现在代码只是部分工作。在Manager表中找到employees表中的所有管理器时,我没有任何问题。但是,当employees表中列出的管理器与Managers表中为该管理​​器指定的角色不匹配时,代码将失败。 内部if语句中的else子句不会像我期望代码那样运行。而是该函数返回外部if语句的外部else子句中的值。

所有字段都是字符串类型,并且在任何字段值中都没有尾随/前导空格。 VBA编译正常,只是该查询返回不正确的结果。代码到达EOF并返回&#34;找不到匹配的角色&#34;

可能导致此问题的原因以及如何解决此问题?

1 个答案:

答案 0 :(得分:0)

首先,你的答案,然后是小费:

  • 您的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匹配。

但是,这可能不是你想要的。如果要分别验证Manager或Department的存在,则需要编写单独的测试。

现在提示:

set rs = db.OpenRecordset(sqlString)

此代码默认打开您的记录集作为DynaSet,这是一个允许您前后移动的读/写游标。这段代码不需要,所以我建议使用Forward-Only游标(只读,只转发):

set rs = db.OpenRecordset(sqlString, dbOpenForwardOnly)

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