如何將SQL撈出的資料作區間Append |
答題得分者是:pedro
|
rany
一般會員 發表:15 回覆:26 積分:8 註冊:2007-05-05 發送簡訊給我 |
腦筋打結了,請教各位大大.....麻煩囉!! 我下SQL撈出某月份的資料,然後用while Not Query.Eof do 針對每一筆資料作判斷後Append。 但是,因為資料量很大,擔心執行過程中會有突發狀況產生導致程式中斷,所以想請問我要如何修改我的程式讓所有的資料可以針對每一天的資料作StartTransaction並可以利用Label在Form上,隨著執行時顯示目前執行的日期呢?(環境:D7,BDE,Oracle,WinXP) [code delphi] QueryA.Close; QueryA.Sql.Clear; QueryA.Sql.Add('SELECT *FROM A......'); QueryA.Open; if Not QueryA.IsEmpty then begin DataBase.StartTransaction; while Not QueryA.Eof do begin QueryB.Close; QueryB.Sql.Clear; QueryB.Sql.Add('SELECT *FROM B......'); QueryB.Open; if QueryB.IsEmpty then begin QueryC.Append; ..... QueryC.Post; end; QueryA.Next; end; try DataBase.Commit; except DataBase.Rollback; end else ShowMessage('無資料!!'); [/code] |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
試看看下列這樣流程,ADOQueryC的Connection需設成ADOConnection1(ADOQuery,ADOConnection對應如你所述Query及DataBase)
[code delphi] ADOConnection1.BeginTrans; try QueryA.open while not QueryA.eof do begin QueryB.open while not QueryB.eof do begin ADOQueryC.SQL='Insert xxxxxxxx'; ADOQueryC.ExecSQL; end; //顯示日期 end; ADOConnection1.CommitTrans; except ADOConnection1.RollbackTrans; end; [/code] ===================引 用 rany 文 章=================== 我下SQL撈出某月份的資料,然後用while Not Query.Eof do 針對每一筆資料作判斷後Append。 的資料作StartTransaction並可以利用Label在Form上,隨著執行時顯示目前執行的日期呢?(環境:D7,BDE,Oracle,WinXP) QueryA.Close; QueryA.Sql.Clear; QueryA.Sql.Add('SELECT *FROM A......'); QueryA.Open; if Not QueryA.IsEmpty then begin DataBase.StartTransaction; while Not QueryA.Eof do begin QueryB.Close; QueryB.Sql.Clear; QueryB.Sql.Add('SELECT *FROM B......'); QueryB.Open; if QueryB.IsEmpty then begin QueryC.Append; ..... QueryC.Post; end; QueryA.Next; end; try DataBase.Commit; except DataBase.Rollback; |
rany
一般會員 發表:15 回覆:26 積分:8 註冊:2007-05-05 發送簡訊給我 |
pedro大大的意思是每新增一筆就Commit,對嗎?
把程式改成下面這樣是不是也雷同?? QueryA.Close; QueryA.Sql.Clear; QueryA.Sql.Add('SELECT *FROM A......'); QueryA.Open; if Not QueryA.IsEmpty then begin while Not QueryA.Eof do begin DataBase.StartTransaction; QueryB.Close; QueryB.Sql.Clear; QueryB.Sql.Add('SELECT *FROM B......'); QueryB.Open; if QueryB.IsEmpty then begin QueryC.Append; ..... //這中間還很多判斷,所以下Insert語法的模式不適合 QueryC.Post; end; try DataBase.Commit; except DataBase.Rollback; QueryA.Next; end; end else ShowMessage('無資料!!'); |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
rany
一般會員 發表:15 回覆:26 積分:8 註冊:2007-05-05 發送簡訊給我 |
pedro大大,如果改這樣哩??
[code delphi] QueryA.Close; QueryA.Sql.Clear; QueryA.Sql.Add('SELECT *FROM A......'); QueryA.Open; if not QueryA.IsEmpty then begin QueryA.First; DM.dbServer.StartTransaction; try while Not QueryA.Eof do begin //判斷是否重複條件**** QueryB.Close; QueryB.Sql.Clear; QueryB.Sql.Add('SELECT *FROM B......'); QueryB.Open; if QueryB.IsEmpty then begin QueryC.Append; //.......其他判斷條件 QueryC.Post; end; labDate.Caption:='目前執行日期'; DM.qryDay.Next; end; DM.dbServer.Commit; except DM.dbServer.Rollback; end; end; [/code] |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
想辦法把判斷寫成欄位, 或寫個 stored functions 來做這些判斷
才是發揮 sql 整批處理的優點 會把問題簡單化 ===================引 用 pedro 文 章=================== 開題的大大有提到一行"撈出某月份的資料,然後用while Not Query.Eof do 針對每一筆資料作判斷後Append。" ===================引 用 st33chen 文 章=================== 好像可以用 insert into tableb (fld1, fld2, ..., fldn) 一個 statement 解決掉
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
rany
一般會員 發表:15 回覆:26 積分:8 註冊:2007-05-05 發送簡訊給我 |
最後謝謝pedro & pedro,謝謝您們大力相挺呦!!....
因為不想大規模的修改,所以答題得分就給pedro 大大囉 pedro:QueryC的database是設成dbServer麼? Re:Yes,因為我都習慣發問時用元件原本的Name,但是這個沒改過來(還有DM.qryDay=QueryB) st33chen:想辦法把判斷寫成欄位, 或寫個 stored functions 來做這些判斷 Re:對於 stored functions 不太懂說,以及pedro 說的規則檔也???!!!....等有時間會再來爬文~~ pedro:請發問者說明這段批次處理會用在什麼案例? Re:這只是筆對及結合倆個Table間的資料,再Append到另一個總和的Table去,其實沒有什麼特別的,只不過資料量很大,大約每一個月要60幾萬多筆的問題。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |