在 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 数据宏中从另一个表中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Access 中从另一个表的数据创建一个表

在 Visual Studio C# 中从 MS Access 数据库中获取 OLE(位图)对象,我的代码有啥问题?

Access 数据库需要从另一个表中获取最近日期的记录

如何在 ms 访问中的一个查询中从同一个表中获取数据

宏中的 Access 2010 SQL 错误

如何在 Access VBA 中从另一个窗体调用一个窗体的 Form_Load