首页 文章

在MS Access中选择查询,使用VBA模块返回意外结果

提问于
浏览
0

我的数据库中有一个名为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子句组合两个检查时, I get unexpected results for the query

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,两个单词之间没有空格 .

How can I fix the error in my code? 感谢您的帮助?

1 回答

  • 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的字段之间设置适当的参照完整性 .

相关问题