全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1020
推到 Plurk!
推到 Facebook!

Filtered := True时修改资料出错?

尚未結案
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-08 18:29:55 IP:218.2.xxx.xxx 未訂閱
dset.Filter := 'Male=True'; dset.Filtered := True; dset.First; while not dset.Eof do begin dset.Edit; dset.FieldValues['Male'] := False; dset.FieldValues['Name'] := 'Unknown'; dset.Post; <---------------此行报错 dset.Next; end; 共计两笔资料满足过滤条件,结果第二次执行到Post时报错,说是遇到了Eof?
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-08 19:35:30 IP:211.20.xxx.xxx 未訂閱
引言: dset.Filter := 'Male=True'; dset.Filtered := True; dset.First; while not dset.Eof do begin dset.Edit; dset.FieldValues['Male'] := False; dset.FieldValues['Name'] := 'Unknown'; dset.Post; <---------------此行报错 dset.Next; end; 共计两笔资料满足过滤条件,结果第二次执行到Post时报错,说是遇到了Eof?
lovelypp 你好 Delphi 好像是在你變更到Filter的條件欄位時即已發生作用,故當你要Post該筆記錄時已被Filter掉了,因而造成如上的錯誤。建議改成如下的處理邏輯:
dset.Filter := 'Male=True';
dset.Filtered := False; //先不過濾
dset.First;
while not dset.Eof do
begin
  // 改在迴圈中判斷
  If dset.FieldByname('Male').AsBoolean Then Begin
    dset.Edit;
    dset.FieldValues['Male'] := False;
    dset.FieldValues['Name'] := 'Unknown';
    dset.Post; 
  End;
  dset.Next;  
end;
dset.Filtered := True;//過濾功能打開
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-08 20:58:01 IP:218.2.xxx.xxx 未訂閱
这样效率比较低,库中共10000笔, 只有两笔资料:=True时???
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-08 20:59:30 IP:218.2.xxx.xxx 未訂閱
有无可能在Filtered:=True时完成象顶楼那样得修改记录?
kevin622
一般會員


發表:0
回覆:22
積分:9
註冊:2003-10-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-08 22:01:17 IP:210.244.xxx.xxx 未訂閱
建議你用 query 下 sql 的方式去處理。 update table set Male=false, Name='Unknown' where Male=true §§§ 量力而為 §§§ 當覺得力量不足時,就是該為自己充電的時候了。
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-09 03:04:37 IP:203.204.xxx.xxx 未訂閱
引言: 这样效率比较低,库中共10000笔, 只有两笔资料:=True时???
lovelypp 你好 其實自已跑迴圈的動作並不比Filter的動作慢(附註),程式碼比較長倒是真的,但可以自由控制,比較不受牽絆(如此例),或許你也可以如kevin622大大所述用個SQL指令直接更新資料(如果你的需求不再增加或複雜化),但日後若需求增加了或複雜了,又該如何呢?為此,不管什麼狀況,我都是自已用個迴圈來處理這類的問題,當真有需要時,就可以很容易的加入新的需求(反正程式碼抄過來改幾個字就OK了,也不太累)。這是我的習慣,提供你作參考。 ps:動作前先要DisableControls及記下目前的記錄指標,完成後再EnableControls及還原記錄指標。如果還有影響速度的事件(如After(Befor)Scroll等),也先行缷下待完成後再行掛上。
系統時間:2024-05-21 20:16:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!