-1

Access 2016,带有 AfterInsert 数据宏的表。

Albert D. Kallal (user:10527) 在对我找不到的上一个问题的评论中指出,如果使用 Set LocalVar 方法在 vba 中调用用户定义的函数,则该 vba“会话”看不到新插入的记录。

即使传入新添加记录的标识,任何引用刚刚添加记录的表的查询都不会看到新插入的记录。

有没有人开发了一种解决方法,例如在构建一个闭包表时,新添加的记录是可见的或可以使用的?

这与 Alberta Kallal 很好地共享了使用“更新后”方法复制现有记录的解决方案的问题非常相似,以解决无法在 for each 循环中创建记录的问题。但是,在这种情况下,我想使用查询结果作为复制/插入的基础,而不仅仅是复制现有行或“硬编码”业务逻辑以修改数据宏(因此很容易如果 vba 方法可以看到刚刚添加的行,请执行此操作)。

具体用例是尝试创建一种在会计应用程序中插入“诱导”记录的方法。一个人赚了一些没有扣除税款的钱,所以很高兴创建一个自动日记帐分录,显示未来有义务缴纳税款。换句话说,表中记录的存在应该自动生成附加记录——这些附加记录的业务逻辑是通过查询定义的。

更具体地说,给定一个包含字段 RegisterID、AccountID、Amount、TrDate 的“事务”表和一个“诱导事务查询”表,该表指定查询以提供具有字段 AutoNumberId、QueryThatDefinesAdditionalTransactions 的诱导事务(以及多行,例如“查询增加自我”,“增加税收责任的查询”,“计算销售税部分的查询”),

数据宏如何基于迭代“Induced Transaction Queries”表并将查询结果插入应用于原始“事务表”中新添加行的每一行中的“Transactions For Analysis”表中创建行

谢谢

4

1 回答 1

1

好吧,虽然在插入事件后从宏调用 VBA 无法获取刚刚插入的行,但该 VBA 例程可以读取 + 更新任意数量的其他行。如果您在 VBA 中写出的新行或数据必须包含刚插入的行中的数据?

将列传递给 VBA 例程。所以它现在可以将所有其他行加起来,然后包括刚刚从数据宏传递的值。

所以数据宏(插入后)可以如下所示:

在此处输入图像描述

因此,VBA 代码看起来像这样:

Public Function AfterU(vid As Variant, Amount As Variant)

  Debug.Print vid, Amount

  Dim rst     As DAO.Recordset
  ' open table, sum data
  ' add Amount passed.

  ' write out data to some table.
  ' caution - don't add reocrds to this table that has the trigger
  ' else you wind up in a endless loop


End Function

上面当然必须放在标准代码模块(而不是表单)中,并且必须按照上面的定义为公共的。

因此,当您发现刚刚添加的记录尚未提交到表(即将提交)时,您仍然可以运行 + 调用一些 VBA 代码。您只是没有得到刚刚(即将)插入的记录。

但是,既然您可以将所需的列(例如金额等)包含在最终总数中?然后,您可以随意编写尽可能多的 VBA 更新和插入代码。所以你可以拉一些记录,建立一个总数,然后更新一些现有的记录,甚至添加一条新记录。只需包括通过的新金额。

如前所述,您不希望将写入具有此类触发器的表与 VBA 插入“纠缠在一起”,因为您很容易陷入无限循环。

但是,对于添加、更新或插入另一个表,您应该可以在 VBA 代码中做您想做的事情。

于 2019-03-20T00:22:16.757 回答