我的数据库中有一个名为Employees的表,包括这4个字段:Manager_Name1和Manager_Name2以及相应的管理器部门,Department1和Department2。表中的每位员工最多可以有2位经理。除Manager_Name1和Department1字段外,表中的其余字段可以为NULL。
在一个名为Master的单独表中,我有一个公司所有经理的主表,其各自的部门名为ManagerID和DepartmentID。我需要验证Manager_Name:department组合是否有效 - 该组合存在于所有管理器的Master表中。
我的VBA代码片段如下:
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参数中用sqlString2替换sqlString1。
我在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,两个单词之间没有空格。
如何修复代码中的错误?感谢您的帮助?
答案 0 :(得分:0)
正如你所说:
manager1 As string, _
department1 as String, _
Optional manager2 as String = VbNull, _
Optional department2 as String = vbNull)
这些都不会是空的。此外,vbNull是数字1,这在这里没有意义。
此外,您不会使用Like进行精确比较,但是:
sqlString1 = "SELECT [ManagerID] FROM [Master] WHERE [ManagerID] = '" & manager1 & "' And [DepartmentID] = '" & department1 & "'"
更糟糕的是,请告诉您的老师,整个概念都没有实际意义,因为您可以在拥有经理ID和部门ID的字段之间设置适当的参照完整性的表格架构。