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

database問題一問

尚未結案
jacosun
一般會員


發表:42
回覆:64
積分:21
註冊:2003-04-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-27 17:25:17 IP:61.59.xxx.xxx 未訂閱
資料庫 MS-SQL 資料表格式如下 出貨表(export): thing_no much weight(用table物件連) 庫存表(stock): thing_no much weight(索引 thing_no) 在進貨表輸入資料如下 thing_no much weight 001 2 5 001 2 5 存檔的語法如下 try DataBase1.StartTransaction; Table1.first; while not Table1.eof do begin Query1.close; Query1.sql.clear; Query1.sql.add('select * from stock); Query1.sql.add('where thing_no="' Table1.fields[0].asstring '"'); Query1.open; Query2.close; Query2.sql.clear; Query2.sql.add('update stock set much="' formatfloat('000.00',Query1.fields[1].asfloat-Table1.fields[1].asfloat) '",weight="' formatfloat('000.00',Query1.fields[2].asfloat-Table1.fields[2].asfloat) '"') Query2.execsql; Table1.next; end; DataBase1.Commit; showmessage('成功!!'); except DataBase1.Rollback; showmessage('錯誤!'); end; 在執行到第二筆時,就停住不動了。如果把DataBase1的敘述拿掉的話就正常。 請問各位大大該怎麼做才能讓資料庫回復可以用呢? 補充一下,在table1的thing_no不重覆的話都沒有問題。但是只要有相同的就不動了。請問該如何做呢??
Chance36
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-28 01:28:29 IP:203.204.xxx.xxx 未訂閱
jacosun 你好     原程式碼,由於update 的部份沒有Where 的條件,造成整個Stock的所有記錄皆會更新到,假設Table1有100筆記錄,Stock也有100筆記錄,則從DataBase1.StartTransaction 開始到最後,將更新10000筆記錄,恐怕Transaction的緩衝空間早就爆了,所以就停在那不理你了。
  將程式改成如下(加上Where條件)    // 如果much及weight 是數值欄位可以不用前後加雙引號
.....
Query2.sql.add('update stock set'
     ' much=' formatfloat('000.00',Query1.fields[1].asfloat-Table1.fields[1].asfloat)
     ',weight=' formatfloat('000.00',Query1.fields[2].asfloat-Table1.fields[2].asfloat)
     ' Where thing_no = ''' Table1.fields[0].asstring '''')
    //加上Where 條件
......
以你的程式來看,改過之後在同一個交易控管中會更新到多少資料筆數,端看Table1的記錄筆數(很奇怪的設計),同樣的也要注意同一交易控管中不要包含太多筆記錄的更新,免得它又不理你了。 _______________________________________ 深藍的魚,祝您好運..........連連
jacosun
一般會員


發表:42
回覆:64
積分:21
註冊:2003-04-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-28 19:54:36 IP:210.244.xxx.xxx 未訂閱
引言: jacosun 你好 原程式碼,由於update 的部份沒有Where 的條件,造成整個Stock的所有記錄皆會更新到,假設Table1有100筆記錄,Stock也有100筆記錄,則從DataBase1.StartTransaction 開始到最後,將更新10000筆記錄,恐怕Transaction的緩衝空間早就爆了,所以就停在那不理你了。
  將程式改成如下(加上Where條件)    // 如果much及weight 是數值欄位可以不用前後加雙引號
.....
Query2.sql.add('update stock set'
     ' much=' formatfloat('000.00',Query1.fields[1].asfloat-Table1.fields[1].asfloat)
     ',weight=' formatfloat('000.00',Query1.fields[2].asfloat-Table1.fields[2].asfloat)
     ' Where thing_no = ''' Table1.fields[0].asstring '''')
    //加上Where 條件
......
以你的程式來看,改過之後在同一個交易控管中會更新到多少資料筆數,端看Table1的記錄筆數(很奇怪的設計),同樣的也要注意同一交易控管中不要包含太多筆記錄的更新,免得它又不理你了。 _______________________________________ 深藍的魚,祝您好運..........連連
版大 拍謝啦~~其實我有設WHERE條件,在這裡漏打了啦 真素拍謝 @@!! 在STOCK裡是整個庫存檔,Table1只是一個暫存的表,登打出貨或者是進貨資料用的。請問版大該怎麼做會好些呢??目前我是把database拿掉不設,可是這樣怕在寫入資料庫寫到一半會造成資料不正確 @@!! 能否提供一下方向謝謝 ^^
Chance36
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-28 20:12:43 IP:211.20.xxx.xxx 未訂閱
jacosun 你好
  改成下列方式試試看
try
  DataBase1.StartTransaction; 
  Table1.first;
  while not Table1.eof do
  begin
{
    Query1.close;
    Query1.sql.clear;
    Query1.sql.add('select * from stock);
    Query1.sql.add('where thing_no="' Table1.fields[0].asstring '"');
    Query1.open;
}
    Query2.close;
    Query2.sql.clear;
    Query2.sql.add('update stock set'
       ' much=much-[red]' formatfloat('000.00',Table1.fields[1].asfloat)
       ',[red]weight=weight-' formatfloat('000.00',Table1.fields[2].asfloat) 
       ' Where  thing_no = ''' Table1.fields[0].asstring ''''); 
    Query2.execsql;        Table1.next;
  end;
  DataBase1.Commit;
  showmessage('成功!!');
except
  DataBase1.Rollback;
  showmessage('錯誤!');
end;    PS:還是要注意Table1的資料筆數
_______________________________________ 深藍的魚,祝您好運..........連連
系統時間:2024-05-13 17:43:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!