如何基于表单(带有子表单)的子表更新主表中的字段?

时间:2019-03-27 09:44:41

标签: ms-access access-vba

我有两个表,一个名为 Sales 的父表记录了交易,还有一个名为 SalesDetail 的子表记录了每个交易的所有项目。

销售具有以下字段:SalesID,Customer,CustomerInfo,VAT:

  • SalesID:主键
  • 客户,客户信息:其他信息字段
  • 增值税:交易的增值税(税)值。

SalesDetail 具有以下字段:SalesDetailID,SalesMasterID,ItemName,UnitPrice,Qty,Amount,booVAT:

  • SalesDetailID:主键
  • SalesMasterID:指向父表 Sales
  • 的主键SalesID的查找字段
  • 商品名称,单价,数量:商品名称,单价(不包括增值税)和所选商品的数量。
  • 金额:所选项目的金额(价格)。一个计算字段,其中Amount = UnitPrice * Qty
  • booVAT:布尔值

故事的寓意是,某些商品对特定客户免征增值税(15%),这就是为什么我不能将增值税直接纳入价格中的原因。只有未获豁免的人才需要支付增值税,这将在booVAT复选框中选中。

每次勾选booVAT复选框时, SalesDetail 中的15%的Amount字段将添加到 Sales 中的VAT字段,如果未选中,则相同金额将被推导。

当前,我有一个名为forSales的表单,您可以在其中添加或编辑每个 Sales 交易,以及一个子表单(数据表)为 SalesDetail subSalesDetail的子表单(数据表)每笔交易。我还使用了一些代码和宏,通过使用父窗体的另一个控件(我将此控件称为ctrVAT)使用ctrVAT = Sum([subSalesDetail.Form!Amount])来自动更新 Sales .VAT * 0.15。但是,将ctrVAT更新为 Sales .VAT时,找不到任何解决方法,因为我无法及时了解ctrVAT修改的情况。大多数事件仅针对直接数据修改而触发,而不能通过计算字段或VBA进行动态修改。

我还考虑过使用On Timer事件,但是使用On Timer并不是很优雅:在低端计算机上不断在后台运行宏可能会增加负担。

有什么办法可以解决此问题?我希望计算尽可能自动,以避免人为错误。

1 个答案:

答案 0 :(得分:0)

由于ctrVAT的值仅在更新/添加SalesDetail表单中的Amount字段时才更改,因此可以使用子表单的AfterUpdate事件。

在SalesDetail子窗体的AfterUpdate事件中,您可以执行以下操作:

forSales!Vat = forSales!ctrVAT

您将需要更新子窗体所基于的查询,并添加一个计算字段:VATAmount: iif([booVAT], [Amount]*0.15, [Amount])

然后将ctrVAT的控制源更新为=Sum([subSalesDetail.Form!VATAmount])

您可能需要在子表单中将VATAmount添加为隐藏字段/列。