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

[自動編號] 要如何實現一口氣寫入時才產生自動編號呢?

尚未結案
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-29 20:50:06 IP:61.222.xxx.xxx 未訂閱
各位前輩大家好,在下遇到了一些問題… 也查過板中各類相似題型… 但,仍有些未能解決我困惱的問題…    先說明一下我的環境: WinXP、Delphi5、Oracel     問題是這樣的… 我寫了一支建檔程式,其建檔畫面是採用DBGrid的方式讓user建檔… 其中,Query的CachedUpdates已設定為True, 即表示,當user把所有想輸入的資料,都輸入後,並按下「儲存」鍵, 後端的資料庫才進行正式的儲存commit。 我試過自己寫自動編號的方式…以及Sequences來使用… 但,相繼發現一個問題… 第一, 使用自己寫的自動編號… 我的方法是先過濾資料庫中最大編號(Max(Form_No))然後 1 接著,再將最大值帶入自己寫的函式中進行運算…
function TARCMSVX1p.f_RowNum(Num:String) :String;
begin
  if (a = 0 ) then begin
    a:=StrToInt(Num);
  end;
  a:=a 1;
  Result:=IntToStr(a);
end;
如果這是在一台電腦中執行的話,是可行的… 因為,在資料尚未寫入資料庫中,這些所抓的最大值都是正確的… 最大值只能抓到儲存後的最後一筆!!! 但,我發覺,user不可能每key一筆就按一次儲存!! 而且key了幾筆後,才會按下儲存… (此時,前台序號可能已累績到30了,但資料庫的序號才用到5而已) 並且,考慮到公司不止只有一台電腦… 如果,有二台電腦同時建檔,那就完蛋了!!!! 因為,抓到的最大值可能是同一筆… 第二個,使用Sequences,發覺也有問題… 因為,如果user在key完資料後,發覺這些資料又不需要了… 而按下「取消」…那…這些seq就浪費掉了…< > 不曉得,上述的問題是否前輩們能瞭解…< > 是否有最好的方式能改善呢? 因為取得最大值的程式,我是寫在QueryBeforePost底下… 但,資料庫序號都尚未更新,即使取得最大值,仍是不準確的,更何況還要累加1 (form_no 唯一值:1、2、3、4、....99999)… 一直困惑在這裡…希望前輩們能給予指點解惑…謝謝… 發表人 -
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 09:11:11 IP:61.222.xxx.xxx 未訂閱
嗚…不曉得是不是自己的表達能力不夠好…:: >< :: 這樣好了…我簡單表達… 也就是如標題所說的… 要如何實現一堆資料寫入前才逐一分配編號呢? 如果當我資料一大堆都key在DBGrid時, 那,當觸發「儲存」時,它們是一筆一筆寫入的、還是全部一口氣寫入呢? 如果是一筆一筆寫入,我該在哪個Events底下撰寫呢? 因為,希望能抓到正確的最大序號…謝謝… m(__ __)m
cxh17895
初階會員


發表:13
回覆:37
積分:25
註冊:2003-03-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-30 09:12:42 IP:210.68.xxx.xxx 未訂閱
如果依你的要求,只有寫成, 資料寫入的一瞬間,再給予編號, 若要改成這樣,有兩個方法, 一,不要用dbgrid,改成別的stringgrid,寫入時,再給予編號 二,dbgrid不變,寫入至暫存檔,待使用者確定時,再一口氣寫入,由暫存檔寫入至正式檔時再給予編號 以上二種方法可以解決即使取得最大值,仍是不準確的的問題, 供你參考. 發表人 - cxh17895 於 2004/11/30 09:15:28
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-30 09:15:25 IP:61.222.xxx.xxx 未訂閱
引言: 以上二種方法可以解決即使取得最大值,仍是不準確的的問題, 供你參考.
謝謝cxh17895前輩,我這就試試 發表人 -
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-30 10:52:31 IP:61.218.xxx.xxx 未訂閱
to uuujj: 如果你的系統是多人"同時"使用,建議不要以Delphi(前端)來解決編號的問題,再怎麼解,你也沒辦法去處理這個問題. 要解決,只能在Oracle(後端資料庫)動手腳,你可以寫一個trigger,在insert時才去產生那個編號,然後在trigger裡才去取得你的Sequences. 總之,就流程上來說,自動編號,一定是在寫入資料庫時才會做編號的動作的.參考看看
chihsingchu
一般會員


發表:0
回覆:1
積分:0
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-23 08:22:45 IP:61.62.xxx.xxx 未訂閱
如果你的編號是不需要給客戶看到的話, 建議使用Sequence的解法 Sequence的跳號, 本來就是在保證每次取得都是唯一, 何必自找麻 煩自己搞一套呢呢?而且要讓Sequence爆掉應該不容易吧 不過用Sequence最大的問題是, 你的程式就不能跨DB了 這個是最討厭的一點
系統時間:2024-07-02 5:30:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!