database問題一問 |
尚未結案
|
jacosun
一般會員 發表:42 回覆:64 積分:21 註冊:2003-04-18 發送簡訊給我 |
資料庫 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: jacosun 你好 原程式碼,由於update 的部份沒有Where 的條件,造成整個Stock的所有記錄皆會更新到,假設Table1有100筆記錄,Stock也有100筆記錄,則從DataBase1.StartTransaction 開始到最後,將更新10000筆記錄,恐怕Transaction的緩衝空間早就爆了,所以就停在那不理你了。版大 拍謝啦~~其實我有設WHERE條件,在這裡漏打了啦 真素拍謝 @@!! 在STOCK裡是整個庫存檔,Table1只是一個暫存的表,登打出貨或者是進貨資料用的。請問版大該怎麼做會好些呢??目前我是把database拿掉不設,可是這樣怕在寫入資料庫寫到一半會造成資料不正確 @@!! 能否提供一下方向謝謝 ^^將程式改成如下(加上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的記錄筆數(很奇怪的設計),同樣的也要注意同一交易控管中不要包含太多筆記錄的更新,免得它又不理你了。 _______________________________________ 深藍的魚,祝您好運..........連連 |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
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的資料筆數_______________________________________ 深藍的魚,祝您好運..........連連 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |