为啥在更新 DSUM 之后在更新值之前

Posted

技术标签:

【中文标题】为啥在更新 DSUM 之后在更新值之前【英文标题】:Why is After Update DSUM Before Update Value为什么在更新 DSUM 之后在更新值之前 【发布时间】:2010-10-13 06:38:41 【问题描述】:

我有一个子表单,aContinuous Form,由字段 JobItemId 过滤,具有字段 Price,在价格更新后,我希望确定 JobItemId 的新总价格并将其传递给其他地方处理。

我有这个代码:

Private Sub Price_AfterUpdate()
   Dim TotalCost As Currency
   Dim strFilter As String
   strFilter = "[JobItemID] = " + Str(JobItemID.Value)
   TotalCost = DSum("[Price]", Me.Recordset.Name, strFilter)
   Me.Parent.Total = TotalCost
   Me.Parent.Update_FinalPrice
End Sub

我在 TotalCost 上设置了一个监视,以便我可以验证正在传递的值,并发现总计是更新之前的值。为什么会这样,更新总数后我需要做什么才能得到正确的结果?

【问题讨论】:

您确定需要将此数据存储在父记录中,因为它可以随时从子记录中计算出来吗? 我将总数推到父级,然后乘以最终金额的边距。问题是计算值没有触发最终成本的级联更新的事件,正如您在我的另一个问题中看到的那样。所以在某些方面,这只是解决这个问题的方法。 从子窗体中获取总计的常用方法是在子窗体的页脚中使用隐藏控件(即控件和页脚的高度为 0),并在适当的字段上使用 Sum(),并且然后从父窗体引用该控件。这将可靠地更新(尽管当您在父表单中从一条记录移动到下一条记录时,您可能会在屏幕上看到它层叠)。 当我只有一个子表单时,这种方法很好,我有五个子表,有时还有两个子表单,我将总数存储到数据库中。这完全取决于父表的子类型。我知道你在说什么,我会再考虑一下。感谢您的建议。 确认,子类型/超类型。我很久以前就得出结论,这些都是有问题的,因为要查看所有这些列表一起需要 UNION 或一大堆非常低效的 LEFT JOIN。也就是说,我倾向于尽可能避免子类型/超类型结构。 【参考方案1】:

您的代码在控件的 AfterUpdate 事件中触发。您需要将其移至表单的 AfterUpdate 事件(即Form_AfterUpdate)。

DSum 对提交给数据库的记录进行操作,但即使您的价格已在 Price 控件的 AfterUpdate 事件中更新,它还没有提交给数据库(Access 通过在记录选择器)。提交更新的记录后立即触发 Form_AfterUpdate 事件。

【讨论】:

谢谢我通过刷新解决了这个问题!这显然是正确的做法。

以上是关于为啥在更新 DSUM 之后在更新值之前的主要内容,如果未能解决你的问题,请参考以下文章

CE 更新事件:有啥方法可以将之前/之后的属性值传递给工作流?

为啥vue在nexttick之后不更新数据?

pushl%esp是否在存储之前或之后更新ESP?

当我更新我的列表时,它没有在后端更新列表的数量仍然相同,为啥?

为啥 ADODB 在更新时插入 NULL 值?

为啥在 Django 中更新我的 HTML 之前必须重新加载两次?