我有一个tblCustomer和一个tblContact,其中的信息最终来自两个不同的其他程序。为了解决复杂的ID问题并为用户提供便利,我正在尝试执行以下操作:
如果更新了tblContact记录中的CompMyobID或Company(查找指向tblCustomer中的主键自动编号)字段,则数据宏将找到相应的tblCustomer记录,并使用主键或MyobID更新非tblContact中的更新字段。
为了达到这个目的,我创建了以下更新后的宏 - 首先是一个如果要确定其中一个字段(以及哪一个)已经更新,那么编辑一个EditRecord别名就不能设置为了编辑当前记录我将其他名称设置为字段...而这就是我被卡住的地方。我试着运行一些sql,但是当我更新任一字段时,实际上没有任何实际发生......
编辑:
因为,正如Erik指出的那样,这种方法将我锁定在当前记录之外,并使我接受递归问题,这是另一个尚未起作用的角度:
在更改前数据宏中,以下内容:
答案 0 :(得分: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
一个强烈的警告:这个宏将以你设计的方式递归调用自己!如果您更新公司,宏将编辑CompMyobID,触发宏,然后再次更新公司,再次触发它等等。
Access具有针对递归宏的保护,因此除了您触发的错误之外,您可能不会注意到递归,并且它不会导致性能问题。我强烈建议不要依赖这种保护,不要存储可以查找的信息,而是使用关系来查找相应的公司名称。
最后,在下面的评论讨论之后,我们使用了 Before Change 数据宏,这避免了在更改之前查找已更改的记录的需要,并避免了宏调用的机会本身是因为Before Update
宏在更新之前编辑当前记录,而不是在更新后再次更新它。我们更改了宏以检查值是Null
还是零长度字符串,因为Updated
在更新之前的宏中不可用。
最终解决方案等同于问题的上次修改,但使用Company & "" = ""
代替Company = ""
来计算Null值除外。
您可以阅读有关Null vs零长度字符串here的更多信息。本质上,零长度字符串只是一个包含0个字符的字符串,但Null是一个没有输入值的地方。 Null表现得有点奇怪,当你将它与任何东西进行比较时返回Null。这意味着Null = "A"
为空,并被视为false,但Null <> "A"
也为空,并且也被视为false。