我的问题是:DBGrid显示为
A B C (字段名)
a1 b1 c1
....
其中a1和b1是从A表里取,c1是从C表里取。(C表里也有b1字段)
b1是编码,c1是名称。A表和C表由b1来关联。c1只是显示出来看而已。
在我对DBGrid进行编译时(如新增一条记录),
输入不同的b1就将对应的c1,显示出来。我现在的问题是:现在提交保存时,DBGrid不但对A表进行更新,而且也对C表进行更新。
请问有什么办法可以:提交时只更新A表,对C表无操作。
A B C (字段名)
a1 b1 c1
....
其中a1和b1是从A表里取,c1是从C表里取。(C表里也有b1字段)
b1是编码,c1是名称。A表和C表由b1来关联。c1只是显示出来看而已。
在我对DBGrid进行编译时(如新增一条记录),
输入不同的b1就将对应的c1,显示出来。我现在的问题是:现在提交保存时,DBGrid不但对A表进行更新,而且也对C表进行更新。
请问有什么办法可以:提交时只更新A表,对C表无操作。
from TABLE1 A left join table2 b on A.b1=B.b1
from a,c
where a.b1=c.b1
(A表有几十万条记录的)
我现在不是select语句不会写,是在DBGrid进行更新时不能只对A表更新
而不更新C表。
procedure ExecUpdateSQL(UpdateSQL: TADOQuery; DeltaDS: TCustomClientDataSet);
var
HaveNewValue: Boolean;
I: Integer;
S: string;
Old: Boolean;
Field: TField;
begin
with UpdateSQL do
begin
HaveNewValue := false;
for I := 0 to Parameters.Count - 1 do
with Parameters[I] do
begin
S := UpperCase(Name);
Old := Copy(S, 1, 4) = 'OLD_';
if Old then
System.Delete(S, 1, 4);
Field := DeltaDS.FindField(S);
if Field <> nil then
if Old then
Value := Field.OldValue
else
begin
if VarIsEmpty(Field.NewValue) then
Value := Field.OldValue
else
begin
Value := Field.NewValue;
HaveNewValue := true;
end;
end;
end;
if HaveNewValue then
ExecSQL;
end;
end;中间层里放ADOQuery1,DataSetProvider1,ADOQuery2,ADOQuery3,ADOQuery4
在ADOQuery1里写上:
select A.a1,A.a2, C.c1
from a,c
where a.b1=c.b1
看起来是对a和c两个表操作吧,别急,看后面:
ADOQuery2里写上:
update a set
a1= :a1, //这是什么不要跟我说不知道哦
a2= :a2
where b1 = :OLD_b1
ADOQuery3里写上:
selct a1,a2,b1
from a
ADOQuery4里写上:
select c1,b1
from c
然后在DataSetProvider1的BeforeUpdateRecord()事件里写上:
procedure TxxxxDM.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;UpdateKind: TUpdateKind; var Applied: Boolean);
begin
ExecUpdateSQL(ADOQuery2, DeltaDS);
Applied := true;
end;//哈哈,看似简单吧,实现起来不容易哦,我以前为此走了不少弯路,当你对两个表操作,看起来烦,可是在对多达几十个表的操作中,你就看出来这样做的价值了。个人建议,仅供网友们参考,错误之处,敬请指出。
DataSetProvider1是和ADOQuery1相连的,ADOQuery3、ADOQuery4还要有自己的
DataSetProvider,ADOQuery2是用来做update的不需要DataSetProvider。