Filtered := True时修改资料出错? |
尚未結案
|
lovelypp
初階會員 發表:122 回覆:111 積分:46 註冊:2003-02-19 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
lovelypp
初階會員 發表:122 回覆:111 積分:46 註冊:2003-02-19 發送簡訊給我 |
|
kevin622
一般會員 發表:0 回覆:22 積分:9 註冊:2003-10-16 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 这样效率比较低,库中共10000笔, 只有两笔资料:=True时???lovelypp 你好 其實自已跑迴圈的動作並不比Filter的動作慢(附註),程式碼比較長倒是真的,但可以自由控制,比較不受牽絆(如此例),或許你也可以如kevin622大大所述用個SQL指令直接更新資料(如果你的需求不再增加或複雜化),但日後若需求增加了或複雜了,又該如何呢?為此,不管什麼狀況,我都是自已用個迴圈來處理這類的問題,當真有需要時,就可以很容易的加入新的需求(反正程式碼抄過來改幾個字就OK了,也不太累)。這是我的習慣,提供你作參考。 ps:動作前先要DisableControls及記下目前的記錄指標,完成後再EnableControls及還原記錄指標。如果還有影響速度的事件(如After(Befor)Scroll等),也先行缷下待完成後再行掛上。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |