在 AfterInsert DataMaco 中使用 VBA 调用时引用刚刚添加的记录

Posted

技术标签:

【中文标题】在 AfterInsert DataMaco 中使用 VBA 调用时引用刚刚添加的记录【英文标题】:Referencing Just Added Record When Using Call to VBA in AfterInsert DataMaco 【发布时间】:2019-03-19 20:32:48 【问题描述】:

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

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

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

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

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

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

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

datamacro 如何在“Transactions For Analysis”表中创建行,基于迭代“Induced Transaction Queries”表并将查询结果插入应用于原始中新添加行的每一行“交易表”

谢谢

【问题讨论】:

【参考方案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 代码中做您想做的事情。

【讨论】:

感谢 Albert 入住!如果我在这里“大声输入”......因为出于维护原因我想在查询中保留业务规则,如果我传入刚刚创建的行的所有数据,那么在 vba 端插入作为行传入的数据进入一个临时表,然后要么有基于该临时表的查询,要么读入querydef并通过记录集等将源表更改为该临时表......在vba代码中,这应该给我查询的输出以可以直接插入决赛桌的形式......我认为可以解决这个问题......将在几分钟内更新 在几次适应和开始之后,我有一个最低限度的工作示例,使用基于临时表的查询路径,并使用传入的“新行数据”来填充临时表vba。对于发现此问题的任何其他人,我必须在 vba 中的临时表中创建行 - 使用 datamacro 中的“createrecord”功能(应用于临时表)有同样的问题 - 创建的行在内部不可见vba 代码。再次感谢您的帮助,是的,请记住无限循环的陷阱。

以上是关于在 AfterInsert DataMaco 中使用 VBA 调用时引用刚刚添加的记录的主要内容,如果未能解决你的问题,请参考以下文章

第39课 thinkphp5完成商品会员价格功能(后置勾子afterInsert)

SqlServer Tigger

在 AFTER INSERT 触发器中删除表

触发器的死锁问题

如何在 JSF 2.0 中使会话无效?

在 UITableViewCell 中使 UIView 出队