var OrderForm: TOrderForm; implementation {$R *.dfm} {下面的内容为主要的程序框架} procedure TOrderForm.FormCreate(Sender: TObject); {将主表与明细表的缓存更新选项设为true} begin TBOrder.CachedUpdates:=true; TBDetail.CachedUpdates:=true; end; procedure TOrderForm.TBOrderAfterPost(DataSet: TDataSet); {在提交Order表的更新后,执行本过程内容,本过程实现对主表和明细表的实际提交的事务。 注意:如果一个数据集的cachedUpdates属性为true, 那么post这个动作仅仅是在客户端缓冲区中进行一个提交动作, 而不是真正的提交给实际的数据库。要实现真正的提交, 需要用到applyUpdates语句。} begin OrderDB.StartTransaction;//更新事务开始执行 try TBOrder.ApplyUpdates;//对主表进行实际的更新 TBDetail.ApplyUpdates;//对明细表进行实际的更新 except 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.
这里是保存程序 if not data.Database1.InTransaction then begin data.Database1.StartTransaction; try query1.ApplyUpdates; data.database1.Commit; Application.MessageBox('Êý¾ÝÐ޸ijɹ¦','ËÄͨ¹ÜÀíϵͳ',MB_ICONINFORMATION); except Application.MessageBox('±£´æÊý¾Ý³ö´í','ËÄͨ¹ÜÀíϵͳ',MB_ICONINFORMATION); query1.CancelUpdates; data.Database1.Rollback; raise; end; query1.CommitUpdates; end;
是啊!我提交记录有298条,没有保存,请问缓存更新记录有记录数限制吗?
unit Order;
{单元名称}
interface
uses
{引用的模块}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls, ToolWin, ActnMan, ActnCtrls,
ActnMenus, DB, DBTables;Type
{声明的变量、添加的控件以及定义的方法和过程}
TOrderForm = class(TForm)
TBOrder: TTable;
TBDetail: TTable;
OrderDB: TDatabase;
ActionMainMenuBar1: TActionMainMenuBar;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
procedure TBOrderAfterPost(DataSet: TDataSet);
procedure TBDetailNewRecord(DataSet: TDataSet);
procedure TBDetailUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
procedure TBDetailAfterPost(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
OrderForm: TOrderForm; implementation {$R *.dfm}
{下面的内容为主要的程序框架} procedure TOrderForm.FormCreate(Sender: TObject);
{将主表与明细表的缓存更新选项设为true}
begin
TBOrder.CachedUpdates:=true;
TBDetail.CachedUpdates:=true;
end; procedure TOrderForm.TBOrderAfterPost(DataSet: TDataSet);
{在提交Order表的更新后,执行本过程内容,本过程实现对主表和明细表的实际提交的事务。
注意:如果一个数据集的cachedUpdates属性为true,
那么post这个动作仅仅是在客户端缓冲区中进行一个提交动作,
而不是真正的提交给实际的数据库。要实现真正的提交,
需要用到applyUpdates语句。}
begin
OrderDB.StartTransaction;//更新事务开始执行
try
TBOrder.ApplyUpdates;//对主表进行实际的更新
TBDetail.ApplyUpdates;//对明细表进行实际的更新
except
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.
绶存更新主细表我做过。我这里缓存是一个货品表goods.db ,是以在一种货品价格为基础打扣,修改其他价格,所以会同时修改多条记录,我发现修改记录多时会出现上面提示,保存不成功,修改记录少时,保存成功。所以我问你缓存更新记录有记录数限制吗?
if not data.Database1.InTransaction then
begin
data.Database1.StartTransaction;
try
query1.ApplyUpdates;
data.database1.Commit;
Application.MessageBox('Êý¾ÝÐ޸ijɹ¦','ËÄͨ¹ÜÀíϵͳ',MB_ICONINFORMATION);
except
Application.MessageBox('±£´æÊý¾Ý³ö´í','ËÄͨ¹ÜÀíϵͳ',MB_ICONINFORMATION);
query1.CancelUpdates; data.Database1.Rollback;
raise;
end;
query1.CommitUpdates; end;
我想应该有限制的,哪我只能用sql语句,直通更新了。