Orderdb.Rollback;//如果发生意外,那么回滚这个事务,退出该过程
exit;
end;
OrderDB.Commit;//如果没有发生意外,那么完成事务提交
TBOrder.commitUpdates;//清空TBOrder表的客户缓冲区
TBDetail.commitUpdates;// 清空TBDetail表的客户缓冲区
end;
procedure TOrderForm.TBDetailNewRecord(DataSet: TDataSet);
{当新增一个明细表记录时所完成的动作。}
begin
TBDetail.FieldByName(''OrderID'').AsInteger:=TBOrder.FieldByName(''OrderID'').AsInteger;
file://将主表的orderID字段赋给明细表的orderID字段,这个字段是两个表的关联字段
end;
procedure TOrderForm.TBDetailUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
{当实际更新数据库表时,需要同时进行的操作在onUpdateRecord事件中定义,
在本例当中是进行明细表和库存表的级联更新操作。
注意:在本过程当中所进行的操作是在实际更新数据库时所进行的动作,
而不是更新客户端的缓存数据时所进行的动作}
Var temp_query:TQuery;
begin
if UpdateKind=ukInsert then file://如果更新类型是插入一个新的记录,那么更新相应的库存量
with temp_query do
begin
close;
SQL.clear;
SQL.add(''update storage set stocks=stocks-:amount'');
SQL.add('' where commondityID=:commondityID'');
paramByName(''amount''):=TBOrder.FieldByName(''amount'').AsFloat;
ParamByName(''commondityID''):=TBDetai.FieldByName(''commondityID'').AsInteger;
execSQL; file://执行更新库存的sql语句,将相应的库存量减去。
end;
end;
procedure TOrderForm.TBDetailAfterPost(DataSet: TDataSet);
{当对明细表的记录进行修改,并提交(post)之后,执行本过程中的语句。
注意:这种提交是针对客户端数据的,并没有真正反映到数据库中去。
在本例当中,实现的功能是计算主表的总金额字段}
begin
TBOrder.FieldByName(''money''):=0;
with TBDetail do
begin
first;
while not eof do
begin
TBOrder.FieldByName(''money''):=TBOrder.FieldByName(''money'')+
FieldByName(''price'').AsFloat*FieldByName(''amount'');
file://将明细表的金额累加到主表的金额字段
next;
end;
end;
end;
end.