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

ADOQueryCalcFields 問題

尚未結案
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-06 10:46:15 IP:61.228.xxx.xxx 未訂閱
嗨站友,我有一個不解問題    T:=Extended; 如: 借方金額     貸方金額     餘        額 debitmoney   lendermoney  remainingsum 補充說明:(debitmoney,lendermoney,remainingsum 是fileds editor 來新增的計算性欄位, FieldType 為Calculated )    procedure Form1.ADOQuery3CalcFields(DataSet: TDataSet); var T:Char; begin T:=ADOQuery2.FieldByName('htype').AsString[1]; case T of      '1':begin          if DataSet.FieldByName('dltype').AsString = '1' then begin             DataSet.FieldByName('debitmoney').Value:=DataSet.FieldByName('DLMONEY').Value;             ST:=ST+DataSet.FieldByName('debitmoney').AsFloat;             end          else             begin             DataSet.FieldByName('lendermoney').Value:=DataSet.FieldByName('DL_MONEY').Value;             ST:=ST-DataSet.FieldByName('lendermoney').AsFloat;             end;          end; end; DataSet.FieldByName('remainingsum').Value:=ST; 當dbgrid 按PageUp 或 PageDown 時在回上一頁,原remainingsum 值就會不對 因他是加減累計下來,可說是變數,如果要用select * into test ...先去填 remainingsum值在show出來,好像比較不適用,因我不止單一代號 如 93.05.01      2500                      2500 93.05.02                        500     2000 93.05.03      1000                      3000 93.05.04                        200     2800 ........         發表人 - chubby 於 2004/09/06 17:15:27
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-06 18:34:52 IP:61.228.xxx.xxx 未訂閱
我的問題類似 http://delphi.ktop.com.tw/topic.php?topic_id=43818 可是在dbgrid 移動上,下,PageUp,PsgeDn 超過本頁時做處理,都失敗 remainingsum值會等於(debitmoney或lendermoney值沒有累加) ? 懇請有經驗朋友幫忙點一下 發表人 - chubby 於 2004/09/06 20:01:45
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-06 21:35:55 IP:220.135.xxx.xxx 未訂閱
Hi chubby 兄您好: 有沒有想過不要使用CalcField, 而是使用虛擬欄位, 並在OnAfterOpen後, 用回圈填值.    譬如SQL下法

Select F1, F2, F3, '     ' as F4
其中F4為虛擬欄位AfterOpen後

ADOQuery2.First
while Not ADOQuery2.Eof do begin
   ADOQuery2.Edit;
   ADOQuery2.FieldByName('F4').AsInteger := .....
   ADOQuery2.Next;
end;
記得將Query屬性設為Batch Mode 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-07 09:00:37 IP:61.228.xxx.xxx 未訂閱
AfterOpen後 ADOQuery2.First while Not ADOQuery2.Eof do begin ADOQuery2.Edit; ADOQuery2.FieldByName('F4').AsInteger := ..... ADOQuery2.Next; DBGRID 會跟著一筆一筆跑完,如何做到直接顯示結果 ? 謝謝 發表人 - chubby 於 2004/09/07 10:10:45
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-07 12:39:43 IP:220.135.xxx.xxx 未訂閱
Hi chubby 你好: OnAfterOpen與OnCalcFields不同的是, 他只有在DataSet Open後觸發, 而後不管你再怎麼移動Grid, Scroll DataSet都不會影響, 試著將你寫在OnCalcFields那一段代碼稍做修改代入試試 我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/09/07 12:41:13
------


我不是高手, 高手是正在銀幕前微笑的人.
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-07 21:09:32 IP:61.228.xxx.xxx 未訂閱
emainingsum值還是無法顯示 在DBGRID 每個代號多會從頭到尾顯示完後,可有辨法讓視覺不要看 到每個代號(Next或Prior)時,DBGRID就頭到尾顯示完後,可有辨法讓視覺不要看 dbgrid執行過程 我已將檔案zip放(會員求助程式檔案上傳區) 煩請幫忙 謝謝
Chance36
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-07 21:20:19 IP:211.20.xxx.xxx 未訂閱
chubby 你好
  在逐筆運算的前後用AdoQuery2.DisableCOntrols;及Adoquery2.EnableCOntrols;包住即可    AfterOpen後
AdoQuery2.DisableControls;
ADOQuery2.First
while Not ADOQuery2.Eof do begin
   ADOQuery2.Edit;
   ADOQuery2.FieldByName('F4').AsInteger := .....
   ADOQuery2.Next;
....
AdoQuery2.EnableControls;
_______________________________________ 深藍的魚,祝您好運..........連連
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-08 09:04:17 IP:61.228.xxx.xxx 未訂閱
Chance36 版主你好 [code] AfterOpen後 AdoQuery2.DisableControls; ADOQuery2.First while Not ADOQuery2.Eof do begin ADOQuery2.Edit; ADOQuery2.FieldByName('F4').AsInteger := ..... ADOQuery2.Next; end; 可以了,謝謝版主 我本來用(debitmoney,lendermoney,remainingsum 是fileds editor 來新增的計算性欄位, FieldType 為Calculated ) ADOQueryCalcFields 做第一頁dbgrid 速度很快,可是有捲頁動作時,remainingsum值就會回覆到debitmoney或lendermoney 沒有做加總動作 ,我知在ADOQueryCalcFields是不可行的,試想在dbgrid捲頁時對全區變數 來做加減,當dbgrid捲頁一筆,全區變數先做加減remainingsum=全區變數 ,可是pageup,pagedn做不出來,宣告失敗 procedure TForm1.ADOQuery2CalcFields(DataSet: TDataSet); begin if DataSet.FieldByName('dl_type').AsString = '1' then begin DataSet.FieldByName('debitmoney').Value:=DataSet.FieldByName('DL_MONEY').Value; Sa:=Sa DataSet.FieldByName('debitmoney').Value; end else begin DataSet.FieldByName('lendermoney').Value:=DataSet.FieldByName('DL_MONEY').Value; Sa:=Sa DataSet.FieldByName('lendermoney').Value; end; DataSet.FieldByName('tax').Value:=Sa; end; 如果能在dbgrid做捲動時能關掉sa加總就應可以,可是我做不出來 請問版主依版主經驗是否有更好做法,因 while ..再速度上, 在access database 筆數多蠻慢 ms-sql還好 _______________________________________ 發表人 - chubby 於 2004/09/08 09:44:30
Chance36
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-09 01:33:32 IP:203.204.xxx.xxx 未訂閱
引言: 請問版主依版主經驗是否有更好做法,因 while ..再速度上, 在access database 筆數多蠻慢 ms-sql還好
chubby 你好 依你的需求來看,與下列連結的問題蠻類似的,不過沒麼複雜,若依我的經驗(其實是習慣,沒有絕對的對與錯、好與不好),我幾乎都用TClientDataSet來解決資料集的複雜運算問題,即使目前不需要,但預期會有這個需求時,一樣還是用TCLientDataSet來處理問題。 【問題】如何計算balance? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=50681 另外While 速度慢的問題,不管使用TTable、TQuery、TAdoDataSet等資料集元件,由於它都會連著資料表格,所以使用While 跑迴圈時,多少都會影響速度,這是可以理解的;但使用TClientDataSet時,因為它可以與資料表斷開,且所有的資料都是在記憶體中運作,所以速度絕對會比其他資料集元件快,若再配合ClientDataSet的動態索引時,那更是如虎添翼(快的沒話說!),唯一要注意的是,從資料表取得的資料筆數不要太大(一般來說一萬筆以內沒有明顯的差異,兩萬筆以上就會有感覺了,但還是比其他資料集元件快),具體數據我就沒測了。 或者你可以用[ClientDataSet]在本站搜尋,會有一堆的討論供你研究,你評估看看吧! _______________________________________ 深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/09/09 01:46:02
chubby
一般會員


發表:43
回覆:65
積分:21
註冊:2003-05-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-09 20:49:18 IP:61.228.xxx.xxx 未訂閱
謝謝 Chance36 大概理論我以了解 我測看看 ,謝謝讓我學會 ClientDataSet
系統時間:2024-06-29 11:01:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!