【问题标题】:Select query in MS Access returning unexpected results with VBA module使用 VBA 模块在 MS Access 中选择查询返回意外结果
【发布时间】: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 这两个表中,单词之间没有空格。

如何修复代码中的错误?感谢您的帮助?

【问题讨论】:

  • 错误是什么? ManagerIDDepartmentID 是数字,而不是字符串?或者在不期望的情况下返回匹配项?
  • @MarkWickett ManagerID 和 DepartmentID 都是字符串。 ManagerID 和 DepartmentID 都返回 1。因此函数结果是“1 不是部门 1 的有效经理”
  • 如果你在你的 sql 语句上设置一个断点然后告诉我们变量是什么,它会更容易..我不确定你为什么使用通配符 - 你是没有正确连接你的字符串。它们应该像 '" & manager1 & "' 等。

标签: sql ms-access vba


【解决方案1】:

如你所愿:

manager1 As string, _
department1 as String, _
Optional manager2 as String = VbNull, _
Optional department2 as String = vbNull)

这些都不会是 Null。此外,vbNull 是数字 1,这在这里没有意义。

此外,您不会使用 Like 进行精确比较,但是:

sqlString1 = "SELECT [ManagerID] FROM [Master] WHERE [ManagerID] = '" & manager1 & "' And [DepartmentID] = '" & department1 & "'"

更糟糕的是,告诉你的老师,整个概念没有实际意义,因为你会设计你的表架构,在包含经理 ID 和部门 ID 的字段之间具有适当的引用完整性。

【讨论】:

  • 除 manager1 和 department1 外,其余变量可以为空。如果未提供值,则 VbNull 只是参数的默认值...
  • @Anthony 不能为 Null 的不是变量,而是数据类型。如果要将 Null 作为参数传递,请使用 Variant
  • 还有@Gustav,虽然我同意你对模式设计的看法,但在实践中,我遇到了一些没有发生这种情况的例子,例如具有工资单数据库以及保存由业务的不同部分设计和运营的公司层次结构的数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多