如何更新master/detail的从表(50分)

  • 主题发起人 主题发起人 李璋琦
  • 开始时间 开始时间

李璋琦

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠请帮一个忙:
一个master/detail表,
想让主表更新Key时从表自动更新。
在主表的BeforeEdit中写了如下代码:
procedure TForm1.Table1BeforeEdit(DataSet: TDataSet);
begin
table2.first;
table2.edit;
while not table2.eofdo
begin
table2.fieldbyname('id').asstring:=table1.fieldbyname('id').asstring;
table2.next;
end;
end;

但只能更新第一个记录。
我觉得以上代码有毛病,但百思不得其解。
表结构如下:
table1 key :id C 4; name C 8
table2 key : id c 4; detail C 30
 
呀,你到底想干什么?
master/detail不是会自动更新的吗?
如果你要自己手动编程,也是应该
MasterTable.OnScroll :
如果是onEdit,要等到什么时候才触发啊?
如果你是指在master表中,某一项被用户改了,
那可以用Query,
SQL :
Update table2 set id=:newid
where id=:oldid
比自己写程序简单又安全。
 
用户改动时触发,如果用query我还不如用触发器。我提问时忘了加上只能用Ttable
 
天啊!用DBMS自己的功能不就解决了?如果一定用TTABLE,那就用个TABLE3
 
cj
您的回答一样行不通;
>procedure TForm1.Table1BeforeEdit(DataSet: TDataSet);
>begin
>table2.first;
>//table2.edit;//删除这句
>while not table2.eofdo
>begin
TABLE2.EDIT;//进入修改状态
> table2.fieldbyname('id').asstring:=table1.fieldbyname('id').asstring;
->此时table1.fieldbyname('id').asstring是修改以前的值,这时虽然修改了
但没有用处。
TABLE2.POST;//保存修改
> table2.next;
希望有大侠给我指点迷津,这不是很难的问题呀!
>end;
>end;
 
就用SQL语句嘛,
update Detail set id=NewId where id=OldId
试过,没问题的!
 
劳驾!我用TABLE基本把程序写完了,不想换了。
BTW 不过query我也不大会,在哪个事件中写如上代码?
 
procedure TForm1.Table1BeforeEdit(DataSet: DataSet);
begin
table2.first;
while not table2.eofdo
begin
Table2.Edit;
Table2.fieldbyname'id').asstring:=
table1.fieldbyname'id').asstring;
table2.Post;
end;
end;
 
和我的有什么区别?
我早说用 QUERY 了,可偏偏喜欢TTABLE
我说用个TABLE3了,先根据TABLE做FILTER然后WHILE
或者,在WHILE中判断。的确不难可是:((
 
Cj:
Table3就不必用了,master/detail表中detail表是已经过滤过的。从
recordcount属性可以看出。只是在Table中找不到相应的触发器。
我是这样写代码的:
detailtb.first;
for I:=0 to detailtb.recordcount-1do
begin
Table2.Edit;
Table2.fieldbyname'id').asstring:=aftereditstr;
//aftereditstr是table1.fieldbyname'id').asstring修改后的值;

table2.next;
end;
关键是在beforeedit中table1.fieldbyname'id').asstring是未改过的值。
在afteredit中table2的记录已改变。必须自己再过滤。我的主表有十万条
记录,从表不下50万条。
由于在dbgrid中修改master表,有时BeforeEdit不触发。
我将DBGRID的readonly设为true.再调用一个对话框来改。
在对话框中先读出目标值,再先改TABLE2,
再改table1.实在是一个笨办法。
自己写代码,有没有适合的触发器,没法在网格上直接编辑。
eof 这个属性在table2中是不稳定的(跟踪一下就会发现,差点把我害死)
我还想允许dbgrid编辑。
请教各位大虾,有什麽好办法?
or:那位大虾,把用query解决的代码写的详细一点。我看不懂。
象:Update table2 set id=:newid where id=:oldid
在什麽时候触发?
 
用Query的话,
在master的beforeedit时存储一下oldid,
在afterpost时执行上述SQL语句即可。
 
李璋琦我开枪为你送行!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部