建议用计算字段来做,这里用查询来搞反而显得麻烦了。
在子表加入“货款金额”和“税款金额”三个计算字段。
在子表的OnCalculate事件中加入
子表货款金额.value:=子表单价.value*子表数量.value;
子表税款金额.value:=子表货款金额.value*主表税率.value;
还有一个要用计算字段的原因是在主从表结构中常会用到缓存更新,而缓存更新在提交之前
数据并未实际在表中,所以上面那位老兄用QUERY的方法是不可行的。
对于总金额,同样的原因,就要用遍历的方法,计算子表的合计数了,过程如下:
procedure TDM.UpdateTotals(TMain:TDataset;TList:TDataSet);
var
TempTot:extended;
TempSum:Currency;
PrevRecord:TBookmark;
begin
prevrecord:=TList.getbookmark;//记录当前子表记录的位置
try
TList.DisableControls;
TList.First;
TempTot:=0;
TempSum:=0;
//关键是这下面一段,遍历了子表,把合计数放到中间变量中,你只要改改就能用到你自己
//的上面了。
while not TList.Eof do
begin
tempTot:=tempTot+TList.FieldValues['Tot'];
tempsum:=tempsum+TList.FieldValues['Sum'];
TList.Next;
end;
TMain.FieldValues['ListTot']:=TempTot;
TMain.FieldValues['ListSum']:=TempSum;
finally
TLIst.EnableControls;
if prevrecord<>nil then
begin
TList.GotoBookmark(PrevRecord);
TList.FreeBookmark(PrevRecord);
end;
end;
end;