微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MS 访问:VBA 太快导致字段更新只有在代码中切换断点,需要计时器吗?

如何解决MS 访问:VBA 太快导致字段更新只有在代码中切换断点,需要计时器吗?

我目前正在 Access 下执行采购订单“软件”,但在更新商品数量 (qty) 后计算金额时遇到问题。

当我在“更新后”事件的 VBA 代码中切换断点时,在更新 qty = 5 并通过代码行后,我从子表单一(这是总和)正确更新了父文本字段的“总价”字段)。 代码包含一个 Refresh 以添加正确的值而不是旧值:

PB1

PB2

.

.

但是,当我删除切换断点时,我认为 VBA 代码没有足够的时间完全处理刷新命令,该命令使用错误(旧)值更新父文本字段。

此问题导致实际子表单计算的总数与添加到父表的值之间存在差异(这里我删除了切换断点,并在第二行项目上添加了 1,但计算结果给出了 250 而不是251):

PB3

当我查看代码中的值时,当断点在更新行时,可以看到该字段的值是正确的,但'watch'字段显示的是旧值:

PB4

.

.

你们有没有办法确保在进入下一行之前更新所有字段?

我正在考虑使用某种延迟或“应用程序等待处理完成”类型的命令,但我找不到任何实际工作的东西;

告诉我,

干杯!

编辑 1:

  • “预期总成本”绑定到名为“curPOExpectedTotalCost”的表字段,这就是我使用 VBA 代码将数据填充到其专用文本框(称为“txtcurPOExpectedTotalCost”)的原因。

  • 主要目标只是让这个绑定字段正确更新;我希望能够更改数量或单价并自动将正确的总采购订单价格填充到绑定到表格的“预期总成本”中;问题是当我使用代码中的断点逐行运行每一行时,它运行良好,但在删除它们时不起作用;这告诉我它可能太快了,因此是一种延迟下一个命令或等待处理完成的命令的方法

编辑 2:

我找到了一种解决方法,但对于我试图实现的这个简单任务来说,它似乎有些力不从心;好的一面是它删除了中间人(汇总所有总价的子表单文本框):

我打开一个记录集并迭代一个变量,直到我可以将结果填充到专用的“预期总成本”绑定文本框中:

DoCmd.runcommand (acCmdRefresh)

Dim RS As DAO.Recordset
Dim sql As String

sql = "SELECT numPONumberAndRevID,numPOContentQtyOrdered,numPOContentPrice FROM tblPOSCONTENT WHERE numPONumberAndRevID = " & Nz(Me.Parent.MasterPOID.Value)
Set RS = CurrentDb.OpenRecordset(sql)

do while Not RS.EOF
    ExpectedCalculatedcost = ExpectedCalculatedcost + RS("numPOContentQtyOrdered") * RS("numPOContentPrice")
    RS.MoveNext
Loop
RS.Close
Set RS = nothing

Me.Parent.txtcurPOExpectedTotalCost.Value = ExpectedCalculatedcost

解决方法

我们可以用简单的方式来安排。

我们将详细输入子表单控件命名为sfrmDetail,主总控件可以使用.ControlSource来分配,例如:

Me.txtcurPOExpectedTotalCost.ControlSource="=[sfrmDetail].[Form].[txtSubFormExpectedTotalCost]"

txtnumPOContentQtyOrdered 更新时,您的主表单会立即更改,无需任何 VBA 代码。

在子窗体中,比如说 sfrmDetail,它将作为子窗体控件 sfrmDetail(是的,同名)嵌入到主窗体中,我们为控件 txtSubFormExpectedTotalCost 分配一个 .ControlSouce=Sum(Qty*UnitPrice),在子表单的页脚处。


解决方案二

正如@June7 在评论中指出的那样,可以动态计算的总成本应该只用于显示更好(表单输入显示,报表打印,但不保存在磁盘中)。

好的,现在我们想不惜一切代价在字段 tblMain.curPOExpectedTotalCost 中存入总成本,并带有轻微的数据冗余,因此在主表单中我们有 Me.txtcurPOExpectedTotalCost.ControlSource="curPOExpectedTotalCost"

在子表单 sfrmDetail 中,我们可以更新:

Option Compare Database
Option Explicit
    
Private Sub txtnumPOContentQtyOrdered_AfterUpdate()
  Me.Recalc
  Me.Parent.txtcurPOExpectedTotalCost.Value = Me.txtSubformExpectedTotalCost.Value
End Sub

Me.Recalc() 在我们更改目标主表字段之前更新 sfrmDetail 的所有计算字段。

enter image description here

关于数据冗余,请同时咨询Is storing counts of database record redundant?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。