我有一个包含以下字段的数据库: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;
可能导致此问题的原因以及如何解决此问题?
答案 0 :(得分:0)
首先,你的答案,然后是小费:
建议:
删除嵌套的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的良好属性,因此您的第一个检查将始终按预期工作。