query的主-明细关系的applyupdate.(100分)

  • 主题发起人 主题发起人 DancingAgain
  • 开始时间 开始时间
D

DancingAgain

Unregistered / Unconfirmed
GUEST, unregistred user!
两个TQuery:MasterQry,DetailQry. DetailQry的datasource设为MasterQry的dataset.
DetailQry的sql语句中参数为MasterQry一个列名。
对MasterQry插入一条记录(insert),并对MasterQry和DetailQry edit.
使用了事务处理,(MasterQry与DetailQry的cachedupdate=true)
try
MyDB.StartTransaction;
MasterQry.ApplyUpdates;
DetailQry.ApplyUpdates;
MyDB.Commit;
except
MyDB.Rollback;
raise;
end;
MasterQry.CommitUpdates;
DetailQry.CommitUpdates;
程序不抱错,但只有MasterQry可以正常的插入记录。
而DetailQry并没有插入记录。

若将DetailQry的Datasource设为空,即去掉他们的主-明细关系,就可以。
难道用TQuery构造的主-明细结构缺乏如Ttable构成的主-明细结构的功能?
那该怎么办?
 
改为:

DetailQry.ApplyUpdates;
MasterQry.ApplyUpdates;

就可以了.
 
为什么?
 
按道理做法应该没有问题 ,
你用TUpdateSql控件进行更新试过吗.

我想用TUpdateSql的办法应该没错,
顺序按照你原定的顺序;

Randolph的回答在一种情况下更新会失败,
即Detail和Master设定了主键与外键限制.(当Detail添加时, 外键值在
Master表的主键不存在. 产生错误.
 
> 为什么 ?

因为Master Update后, 应该会刷新Detail ,
而Detail 的真实的结果是没有任何一条,
这时的update Detail 自然就没有任何条目更新了.
 
试试用
MyDB.ApplyUpdates([MasterQry,DetailQry])

代替
MasterQry.ApplyUpdates;
DetailQry.ApplyUpdates;

有可能达到同样的效果.
 
>因为Master Update后, 应该会刷新Detail ,
> 而Detail 的真实的结果是没有任何一条,
> 这时的update Detail 自然就没有任何条目更新了.

但我用两个TTable构成的主-明细关系就可以。
难道MasterQry.applyupdates会使DetailQry的更新缓存清空?

附:我是用了TUpdateSql对明细TQuery进行更新的。
 
对不起,还有一个问题,
当我用两个TTable构成主-明细关系时,主表插入记录时,明细表也自动插入一条记录。
而且明细表中的MasterFields也可自动填上主表相应值。
但用两个TQuery就不行。DetailQry的那些Fields的值须显式填上。
请问是这样吗?


 
DetailQry的那些Fields必须显式填上填上.
 
to SeaSky:
我用了MyDB.ApplyUpdates([MasterQry,DetailQry]);
但不行,和 MasterQry.ApplyUpdates;
DetailQry.ApplyUpdates; 效果一样。
 
道理也是一样,mydb.applyypdates([detailqry,masterqry]);
 
对这种主-明细结构进行删除时,用
DetailQry.ApplyUpdates;
MasterQry.ApplyUpdates;
也不行,虽然不抱错,但仍是主表记录删除了,而明细表的相应记录却未删除。

MasterQry.ApplyUpdates;
DetailQry.ApplyUpdates;
也一样。这该怎么办?

我彻底糊涂了。
 
试试这样:
try
MyDB.StartTransaction;
DetailQry.Datasource = nil ;
MasterQry.ApplyUpdates;
DetailQry.ApplyUpdates;
DetailQry.Datasource = ds_MasterQry ;
MyDB.Commit;
except
MyDB.Rollback;
raise;
end;
 
with DetailQry do
begin
first;
while not eof do
begin
delete;
end;
end;
MasterQry.delete;
try
Mydb.StartTransaction;
DetailQry.ApplyUpdates;
MasterQry.ApplyUpdates;
MyDB.Commit;
except
MyDB.Rollback;
showmessage('不成功!');
raise;
end;
DetailQry.CommitUpdates;
MasterQry.CommitUpdates;
 
try
Mydb.StartTransaction;
with DetailQry do
begin
first;
while not eof do
begin
delete;
end;
end;
DetailQry.ApplyUpdates;
MasterQry.delete;
MasterQry.ApplyUpdates;
MyDB.Commit;
except
MyDB.Rollback;
showmessage('不成功!');
raise;
end;
 
sorry! 以上是我的原程序。
而且我希望知道具体的解释。
我可以再加上100分。
 
我在你之前就已经贴了一个解决办法, 100分就不必了,

你原来不成功的原因是
MasterQry.delete; 后 ,
记录指针变更, DetailQry也变更了, 原来Detail的删除变的无效了,
所以要提前事务处理.
 
我还想问一句,对于TTable构成的主-明细关系也是这样吗?
我在以前用Ttable时好象没有碰到这样的问题。
 
对不起,我极少用TTable, 尤其是Detail表,
对于TTable构成的主-明细关系
从没有试验过,只是知道是基于索引的处理,
具体如何,不得而知,但是我前面提出的方案,同样适用于
TTable
 
猜想:Query是临时的数据集,一旦close前没有ApplyUpdates,数据集的一切状态全部消失
而table不然.
 
后退
顶部