如何在三层中把主从表当前的记录修改后保存为新的记录,不覆盖原记录(100分)

  • 主题发起人 主题发起人 leijh001
  • 开始时间 开始时间
L

leijh001

Unregistered / Unconfirmed
GUEST, unregistred user!
具体做法:服务层用两个ADODataSet把主从表关联后,在客户端用ClientDataSet1,DBGrid1,DBNavigator1,DataSource对应主表,ClientDataSet2,DBGrid对应从表,在执行修改操作时,想把当前修改的数据保存为新记录,不覆盖原记录,请问如何实现?
 
在datasetprovider的beforeupdaterecord中写SQL,
另:不要使用DBNavigator,这是个不好的习惯。[:D]
 
你可以在中间层的
procedure TSDM.Provider1BeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
begin
if (uppercase(SourceDS.name)='M_adodataset') and (updatekind=ukupdate) then begin
with adodataset5 do begin
parameters[1].value:=DeltaDS.fieldbyname('...').newvalue;
parameters[2].value:=DeltaDS.fieldbyname('...').newvalue;
ExecProc;
end;
Applied:=true;
end else
if (uppercase(SourceDS.name)='d_adodataset') and (updatekind=ukupdate) then begin
......
Applied:=true;
end;

end;

 
不能使用ClientDataSet的ApplyUpdate提交数据,而只能使用Insert into ...直接向
后台数据库增加记录。问题的关键在于如何判断DBGrid中哪些记录是被修改过的。

判断的方法是分析ClientDataSet的Delta属性,Delta是一个OleVariant类的属性,保存的
是ClientDataSet的变动资料。分析它就可以知道哪些记录被修改过,并根据修改的值
产生Insert into ...语句。

由于Delta属性的结构不详,DELPHI未公布,只知道和ClientDataSet的Data属性相同,
因此分析Delta的数据只能是将Delta属性复制到Data中,新建一个ClientDataSet3,让
ClientDataSet3.Data := ClientDataSet2.Delta;分析ClientDataSet3的记录就可以了。

关于Delta属性在李维的分散式多层应用系统篇中有较详细说明,可参考。
 
to xmhch:
我要另存的记录相当于新增数据,不用考虑是否更改.我建一个按钮,在click()中键入
Insert Into clientdataset1 Select * From clientdataset1;
提示出错,请问你是怎样做的(具体一点).
谢谢所有关注的人!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部