【发布时间】:2015-06-22 04:23:49
【问题描述】:
我的数据库中有一个名为Employees 的表,包括这4 个字段:Manager_Name1 和Manager_Name2 以及相应的经理部门Department1 和Department2。表中的每个员工最多可以有 2 个经理。除 Manager_Name1 和 Department1 字段外,表中的其余字段可以为 NULL。
在名为 Master 的单独表中,我有一个包含公司所有经理及其各自部门的主表,其中包含名为 ManagerID 和 DepartmentID 的字段。我需要验证 Manager_Name : department 组合是否有效 - 该组合是否存在于所有经理的主表中。
我的 VBA 代码的 sn-p 如下:
Public Function validateManagers(manager1 As string, department1 as String, Optional manager2 as String = VbNull, Optional department2 as String = vbNull)
dim db As DAO.database
dim rs As DAO.Recordset
dim sqlString1 As String
dim sqlString2 As String
set db = CurrentDb
sqlString1 = "SELECT [ManagerID] FROM [Master] WHERE [ManagerID] LIKE ""*" & manager1 & "*"" And [DepartmentID] Like ""*" & department1 & "*"""
set rs = dbs.OpenRecordset(sqlString1)
If Not rs.EOF Then
validateManagers = "Valid manager"
Else
validateManagers = manager1 & "is not a valid manager for department" & department1
Exit Function
End If
rs.close
set rs = Nothing
类似上面的if...then结构用于验证manager2和department2,将sql字符串中的manager2和department2代入,db.OpenRecordset参数中的sqlString1代入sqlString2。
我在 MS Access 查询中调用此 VBA 函数。在使用 IIF 子句组合这两个检查时,我得到了意想不到的查询结果
Sql语句如下:
SELECT IIF([Manager_Name2] Is Not Null,validateManagers([Manager_Name1],[department1],[Manager_Name2],[department2]),
IIF([Manager_Name2] Is Null And [ManagerName1] Is Not Null,validateManagers([ManagerName1], [department1]))) AS Validate_Managers, *
FROM Employees;
在 VBA 中使用 debug.print,我看到 ManagerID 和 DepartmentID 都是 1???任何字段中都没有尾随或前导空格。 VBA 在打开选项显式标志的情况下编译得很好。两个表中的所有字段都是字段类型文本。字段名称被验证为存在于Employees 和Master 这两个表中,单词之间没有空格。
如何修复代码中的错误?感谢您的帮助?
【问题讨论】:
-
错误是什么?
ManagerID和DepartmentID是数字,而不是字符串?或者在不期望的情况下返回匹配项? -
@MarkWickett ManagerID 和 DepartmentID 都是字符串。 ManagerID 和 DepartmentID 都返回 1。因此函数结果是“1 不是部门 1 的有效经理”
-
如果你在你的 sql 语句上设置一个断点然后告诉我们变量是什么,它会更容易..我不确定你为什么使用通配符 - 你是没有正确连接你的字符串。它们应该像
'" & manager1 & "'等。