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

關與 transation 包法

答題得分者是:timhuang
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-06 09:34:05 IP:61.229.xxx.xxx 未訂閱
請教各位前輩!!如下: 三個 table post a 之前必須先 post b , post b之前必須 post c 所以我目前的作法是如下: 在 a 與 b 之 onbeforepost 寫入如下 code ,但問題若 b.post 若真我要如何嚷 a 結束 post 並直行 aposterror?? procedure dm1.abeforepost begin try b.post except showmessage('b post error'); end; end; procedure dm1bbeforepost begin try c.post execpt showmessage('c post error') end; end;
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-06 09:46:25 IP:61.221.xxx.xxx 未訂閱
建議你可以在這三個 TTable 所連的 TDatabase 元件上起 Trasaction, 程式碼如下:    
  try
    database1.StartTransaction;
    table1.Post;
    table2.Post;
    table3.Post;
    database1.Commit;
  except
    database1.Rollback;
  end;
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-06 10:26:36 IP:61.229.xxx.xxx 未訂閱
引言: 建議你可以在這三個 TTable 所連的 TDatabase 元件上起 Trasaction, 程式碼如下:
  try
    database1.StartTransaction;
    table1.Post;
    table2.Post;
    table3.Post;
    database1.Commit;
  except
    database1.Rollback;
  end;
謝謝您但如此 程式會將 table1 之流程走完而到 table1 之 afterpost 所以 table1 之修改將會存入
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-06 11:09:56 IP:210.58.xxx.xxx 未訂閱
一般來說, transaction 的包裝應由 database 端來實現, 若是由 ap 本身來進行的話, 除是是資料庫不支援, 否則要 考慮的點太多而不易實作!!    就您前面所提的方式, 若要自行維護該 transaction 的話, 可以 在 beforepost 中使用 abort , 將程式改寫如下:
procedure dm1.abeforepost
begin
  try
    b.post;
  except 
    //showmessage('b post error');
    a.abort;
  end;
end;    procedure dm1bbeforepost
begin
  try 
    c.post;
  execpt
    //showmessage('c post error');
    b.abort;
  end;
end;    
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-06 12:55:03 IP:61.229.xxx.xxx 未訂閱
引言: 一般來說, transaction 的包裝應由 database 端來實現, 若是由 ap 本身來進行的話, 除是是資料庫不支援, 否則要 考慮的點太多而不易實作!! 就您前面所提的方式, 若要自行維護該 transaction 的話, 可以 在 beforepost 中使用 abort , 將程式改寫如下:
procedure dm1.abeforepost
begin
  try
    b.post;
  except 
    //showmessage('b post error');
    a.abort;
  end;
end;    procedure dm1bbeforepost
begin
  try 
    c.post;
  execpt
    //showmessage('c post error');
    b.abort;
  end;
end;    
謝謝 timhuang 前輩,我是否可在 abort 後或前結束此 dataset 之 inser or edit 成 browse ,要如何做到,真的 Transation 在 ap 做真的蠻累的
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-06 17:02:14 IP:211.76.xxx.xxx 未訂閱
引言: 謝謝 timhuang 前輩,我是否可在 abort 後或前結束此 dataset 之 inser or edit 成 browse ,要如何做到,真的 Transation 在 ap 做真的蠻累的
你可以用 RevertRecord 這個函數來還原至尚未編輯前!!
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-06 17:18:36 IP:61.229.xxx.xxx 未訂閱
引言:
引言: 謝謝 timhuang 前輩,我是否可在 abort 後或前結束此 dataset 之 inser or edit 成 browse ,要如何做到,真的 Transation 在 ap 做真的蠻累的
你可以用 RevertRecord 這個函數來還原至尚未編輯前!!
不知用 ROLLBACK DATASET.CANCEL 是否會有問題!!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-06 17:45:07 IP:211.76.xxx.xxx 未訂閱
CANCEL 必須是在 dsEdit 下使用. 但是你的 dataset 可能已經回到了 dsBrowse 的狀態, 所以沒有辦法使用 cancel!! 其實 revertrecord 的原碼你可以追一下, 他也是會利 用 cancel, 如下:    
procedure TBDEDataSet.RevertRecord;
var
  Status: DBIResult;
begin
  if State in dsEditModes then Cancel;
  Status := ProcessUpdates(dbiDelayedUpdCancelCurrent);
  if not ((Status = DBIERR_NONE) or (Status = DBIERR_NOTSUPPORTED)) then
    Check(Status);
  Resync([]);
end;
QOO10
初階會員


發表:59
回覆:89
積分:29
註冊:2002-12-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-06 20:56:22 IP:61.229.xxx.xxx 未訂閱
引言: CANCEL 必須是在 dsEdit 下使用. 但是你的 dataset 可能已經回到了 dsBrowse 的狀態, 所以沒有辦法使用 cancel!! 其實 revertrecord 的原碼你可以追一下, 他也是會利 用 cancel, 如下:
procedure TBDEDataSet.RevertRecord;
var
  Status: DBIResult;
begin
  if State in dsEditModes then Cancel;
  Status := ProcessUpdates(dbiDelayedUpdCancelCurrent);
  if not ((Status = DBIERR_NONE) or (Status = DBIERR_NOTSUPPORTED)) then
    Check(Status);
  Resync([]);
end;
謝謝您!!
系統時間:2024-07-03 14:53:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!