在 ms Access 数据宏中从另一个表中获取数据
Posted
技术标签:
【中文标题】在 ms Access 数据宏中从另一个表中获取数据【英文标题】:Get data from another table in a ms Access data macro 【发布时间】:2018-04-19 00:41:28 【问题描述】:我有一个 tblCustomer 和一个 tblContact,其中的信息最终来自两个不同的其他程序。为了解决复杂的 ID 问题并让用户轻松使用,我正在尝试执行以下操作:
如果更新了 tblContact 记录的 CompMyobID 或 Company(指向 tblCustomer 中的主键自动编号的查找)字段,则数据宏查找相应的 tblCustomer 记录,并使用主键或 MyobID 更新非-更新了 tblContact 中的字段。
为了实现这一点,我创建了以下更新后宏 - 首先是一个 If 来确定其中一个字段(以及哪个字段)是否已更新,然后是一个 EditRecord,未设置别名以编辑当前记录,我将其他名称的字段设置为...,这就是我卡住的地方。我试图只运行一些 sql,但目前当我更新任一字段时实际上什么都没有发生......
编辑:
因为,正如 Erik 指出的那样,这种方法将我锁定在当前记录之外,并使我面临递归问题,这是另一个尚未奏效的角度:
在更改前数据宏中,如下:
【问题讨论】:
【参考方案1】:您在该数据宏中有两个主要错误:
更新后宏中刚刚更新的记录是只读的。这意味着调用 EditRecord 将失败。您可以通过查找刚刚更新的记录来解决此问题,如 here 所示,但这需要您
您不能只将值设置为等于 SQL 子句,并期望数据库执行该子句。通常,您可以使用DLookUp
查找记录,但数据宏使用Look Up A Record In
块来代替查找记录
最终的宏应该如下所示(仅更新一个):
If Updated("CompMyobID") Or Updated("Company") Then
SetLocalVar
NewID
=[ID]
SetLocalVar
NewCompany
=Company
SetLocalVar
NewCompMyobID
=CompMyobID
If Updated("CompMyobID")
Look Up A Record In tblCustomer
Where Condition CompMyobID = NewCompMyobID
Alias T
SetLocalVar
LookupCompany
=T.ID
For Each Record In tblContact
Where Condition ID = NewID
EditRecord
SetField
Company
LookupCompany
End EditRecord
End If
End If
强烈警告:此宏将按照您设计的方式递归调用自己!如果你更新 Company,宏会编辑 CompMyobID,触发宏,然后再次更新 Company,再次触发,等等。
Access 具有针对递归宏的保护,因此除了您触发的错误之外,您可能不会注意到递归,也不会导致性能问题。我强烈建议不要依赖这种保护,也不要存储可以查找的信息,而是使用关系来查找适当的公司名称。
最后,经过下面的评论讨论,我们使用了一个Before Change数据宏,这样就避免了在更改之前需要查找更改的记录,并且避免了宏调用的机会本身是因为 Before Update
宏在更新之前编辑当前记录,而不是在更新后再次更新它。我们更改了宏来检查值是Null
还是零长度字符串,因为Updated
在更新前的宏中不可用。
除了使用Company & "" = ""
而不是Company = ""
来解释 Null 值之外,最终解决方案与问题的最后一次编辑相同。
您可以阅读有关 Null 与零长度字符串 here 的更多信息。本质是零长度的字符串只是一个有0个字符的字符串,但Null是一个没有输入值的地方。 Null 的行为有点奇怪,当你将它与任何东西进行比较时,它会返回 Null。这意味着Null = "A"
为 Null,并被视为 false,但 Null <> "A"
也是 Null,也被视为 false。
【讨论】:
这听起来更合理。我已经分享了从不同表中查找记录的技术,并使用 localvars 将您的记录设置为与这些查找的记录相等。你还需要帮助吗? 是的......它仍然无法正常工作。我想我已经听从了你建议的相关部分,并把它转过来了,但我一定错过了什么...... 不要在 where 条件和字符串连接中使用字符串。这不是 VBA,它是一个数据宏,WHERE
条件被直接解析为 SQL。另外,尝试提供错误。那些被记录在表 USysApplicationLog
我没有看到这样的表。我过去有过,但目前没有,而且我已经做了几次应该触发该宏的事情。我是否需要设置更多变量才能使 where 条件起作用?我之前在宏中的 where 条件中使用了字符串并取得了一些成功......类似:="[Company] LIKE " & "'*" & [SearchInput] & "*'"
宏和数据宏是非常不同的东西。宏更像 VBA 并由应用程序处理,数据宏由数据库引擎处理。你不需要设置任何变量,你只需要删除那些引号。我的示例不包含任何引号,Updated
函数内除外。以上是关于在 ms Access 数据宏中从另一个表中获取数据的主要内容,如果未能解决你的问题,请参考以下文章