扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:张在建 来源:yesky 2007年11月1日
关键字:
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. |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者