如何根据表单中的子表(带子表单)更新主表中的字段?

问题描述 投票:-1回答:1

我有两个表,一个名为Sales的父表记录事务,一个名为SalesDetail的子表记录每个事务的所有项。

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

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

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

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

故事的寓意是,某些项目对特定客户免征增值税(15%),这就是我不能将增值税直接纳入价格的原因。只有那些不能免税的人才需要支付增值税,这将在booVAT复选框中进行检查。

每次勾选booVAT复选框时,SalesDetail中15%的金额字段将添加到销售中的增值税字段中,如果未选中,则将推导出相同的金额。

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

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

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

ms-access access-vba
1个回答
0
投票

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

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

forSales!Vat = forSales!ctrVAT

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

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

您可能需要将VATAmount添加为子窗体中的隐藏字段/列。

© www.soinside.com 2019 - 2024. All rights reserved.