从ms Access数据宏中的另一个表中获取数据

时间:2018-04-19 00:41:28

标签: sql ms-access

我有一个tblCustomer和一个tblContact,其中的信息最终来自两个不同的其他程序。为了解决复杂的ID问题并为用户提供便利,我正在尝试执行以下操作:

如果更新了tblContact记录中的CompMyobID或Company(查找指向tblCustomer中的主键自动编号)字段,则数据宏将找到相应的tblCustomer记录,并使用主键或MyobID更新非tblContact中的更新字段。

为了达到这个目的,我创建了以下更新后的宏 - 首先是一个如果要确定其中一个字段(以及哪一个)已经更新,那么编辑一个EditRecord别名就不能设置为了编辑当前记录我将其他名称设置为字段...而这就是我被卡住的地方。我试着运行一些sql,但是当我更新任一字段时,实际上没有任何实际发生......

data macro screengrab

编辑:

因为,正如Erik指出的那样,这种方法将我锁定在当前记录之外,并使我接受递归问题,这是另一个尚未起作用的角度:

在更改前数据宏中,以下内容:

enter image description here

1 个答案:

答案 0 :(得分:1)

您在该数据宏中遇到两个主要错误:

  1. 更新后宏中刚刚更新的记录是只读的。这意味着调用 EditRecord 将失败。您可以通过查看刚刚更新的记录来解决这个问题,如here所示,但这需要您

  2. 您不能只将值设置为等于SQL子句,并期望数据库执行该子句。通常,您可以使用DLookUp查找记录,但数据宏使用Look Up A Record In块来查找记录

  3. 最终的宏应该看起来像这样(只更新一个):

    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。