关于TQuery用在主明细表中一连串的问题,有请各位...(100分)

  • 主题发起人 主题发起人 sumingfei
  • 开始时间 开始时间
S

sumingfei

Unregistered / Unconfirmed
GUEST, unregistred user!

有一个生产流程管理的C/S系统中需要四十多种单据,我在阅读本论谈的大量资料后,
采用传说中最佳的主明细连接方式:TQuery (Updates=False and RequestLive=False)+TUpdateSQL.
首先我偿试着改写了Examples/DBTasks/MastApp(原用TTable).

发现了:
(1.) 明细表BeforeEdit时需把主表变成Edit状态,当在程序中
把主表的dsBrowse改成dsEdit时,明细表的记录号会跑到第一条,
这样,如果想直接修改明细表的非第一条数据就不行,最起码输入的
第一个字符无效。
(2.) 在主表AfterPost中ApplyUpdates主、明细表。
奇怪的是:无论你怎么样修改、删除明细表,
在主表AfterPost事件中明细表的UpdatesPending=False,(之前没有提交)
用单步执行时发现在主表BeforePost事件中UpdatesPenging=True,
所以只得在BeforePost开始一个事务提交明细表,到AfterPost中提交主表,才结束事务。
不知你的解决方法?请问事务是不是过长了?
(3.)主表BeforeDelete时删除所有明细数据,一条一条的Delete.但在主表AfterDelete事件中
明细表的UpdatesPening=False,所以不能保存对明细表的删除.好象同上(2)的原因一样.
对于级连删除是在客户端实现好呢?还是用触发器好呢?





 
没有人帮助我吗?
是不是100分太少?
 
敢问富翁们用什么控件连接主明细表?
没有遇到诸如此类的问题吗?
--说句话吧!不然这分我不知给谁?
 
c/s结构中如果有存在主表和明细表的话添加和删除记录最好还是用触发器,这样可以保证
数据的完整性,而且效率高。用事务处理也是行的,应该不是事务处理太长的结果,我以前
写程序也是用了很长的事务处理,并没有发现问题,不过现在都用触发器了,建议你也用。
 
query1.cachedupdate := true ;
Query1.requestlive:= true ;

database.starttransaction
Query1.insert;
...

Query1.post;
Query1.applyupdates;
query2.edit;
...

Query2.post;
Query2.applyupdates;
database.commit ;
Query1.Commitupdates ;
Query2.commitupdates ;





 
感谢terry_lzs的回答。
 
不要设置M/D关系,在Query1的AfterPost事件中写下
with Query2 do
begin
DisableControls;
Close;
ParamByName('P1').AsInteger:=Query1.FieldByName('KEY1').AsInteger;
if not prepared then prepare;
Open;
EnableControl;
end;
保存时
Database1.ApplyUpdates([Query1,Query2]);

 
后退
顶部