線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2143
推到 Plurk!
推到 Facebook!

ADO 使用 CANCELUPDATE  問題

尚未結案
zwsoft
一般會員


發表:20
回覆:17
積分:10
註冊:2002-11-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-18 16:34:00 IP:121.15.xxx.xxx 訂閱
各位兄台,

小弟在取消對ADOQUERY資料的新增時(ADOQUERY LockType =ltBatchOptimistic),
用到cancelupdate,但執行完跳出以下錯誤:
"行句柄引用了一個已被刪除的行或被標識為刪除的行",。不解中。。。

修改就沒有問題。
我想在主表記錄CANCEL時,將明細表中新加入的記錄也清除。
procedure TForm1.Btn_cancelClick(Sender: TObject);
begin
main_query.CancelUpdates ; ---主表
ship_date_query.CancelUpdates; -- 明細表 出錯在這一行
.....
end;
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-18 22:55:16 IP:61.67.xxx.xxx 未訂閱
我猜你的主表與明細應該有做關聯(不知是用那種方法), 一般我們在cancle時, 一定是先從明細下手, 最後才是主表, 因為如果兩者之間有關聯時, 你把主表異動了, 這時明細早就不知道跑到那裡去了, 如果對明細再進行異動?
zwsoft
一般會員


發表:20
回覆:17
積分:10
註冊:2002-11-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-20 08:18:37 IP:59.40.xxx.xxx 訂閱
 謝謝版主幫助,
明細表中新增的數據會進行匯總,如果取消這段代碼,也不會出錯了,但CANCELUPDATES是在賦值之後發生的,這點就搞不明白了。
With DataSource1.DataSet DO //明細表 代碼主要將明細表中幾個數匯總
BEGIN
if NOT ISEMPTY then
BEGIN
First;
while NOT EOF do
BEGIN
Edit;
fieldbyname('CO').VALUE:=G_CO;
fieldbyname('CUS').VALUE:=G_CUS;
fieldbyname('CODE').VALUE:=G_CODE;
if not FieldByName('QTY').IsNull then
i:=i FieldByName('QTY').Value;
if PACK_QTY_DISP_MARK then
begin
if not FieldByName('PACKING_QTY').IsNull then
j:=j FieldByName('PACKING_QTY').Value;
end;
Next ;
END;
if not DataSource1.DataSet.FieldByName('TDATE').isnull then
G_TDATE:=DataSource1.DataSet.FieldByName('TDATE').Value ;
G_QTY:=i ;
G_PACK_QTY:=j;
END
ELSE
BEGIN
G_TDATE:=0;
G_QTY:=0;
G_PACK_QTY:=0;
END;
END;

最後找到一個無奈的作法:

我在主表cancelupdates後加了一行

main_query.CancelUpdates;
main_query.Requery ;
ship_date_query.CancelUpdates;

就不會產生錯誤了。
系統時間:2024-11-23 6:14:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!