我有两个表,一个名为Sales的父表记录事务,一个名为SalesDetail的子表记录每个事务的所有项。
表销售具有以下字段:SalesID,Customer,CustomerInfo,VAT:
表SalesDetail具有以下字段:SalesDetailID,SalesMasterID,ItemName,UnitPrice,Qty,Amount,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并不是很优雅:在后台运行一个宏可能会对低端计算机有点负担。
有什么方法可以解决这个问题吗?我希望计算尽可能自动,以避免人为错误。
由于ctrVAT
的值仅在更新/添加SalesDetail表单中的Amount字段时更改,因此您可以使用子表单的AfterUpdate事件。
在SalesDetail子表单的AfterUpdate事件中,您可以执行以下操作:
forSales!Vat = forSales!ctrVAT
您需要更新子表单所基于的查询,添加一个计算字段:VATAmount: iif([booVAT], [Amount]*0.15, [Amount])
然后将ctrVAT
的控制源更新为=Sum([subSalesDetail.Form!VATAmount])
。
您可能需要将VATAmount
添加为子窗体中的隐藏字段/列。