關於TQuery的RecordCount的問題,以及Master-Detail實做的問題? |
答題得分者是:P.D.
|
skurama
中階會員 發表:88 回覆:127 積分:73 註冊:2002-07-22 發送簡訊給我 |
在
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=24027
以及
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=29991
知道TQuery的RecordCount與RecNo取出的值都不正確。 請問TQuery是否有其他的辦法取出目前總共有幾筆,目前在第幾筆。
之前有看到網友使用 Query1.Close; Query1.Open;
來做取得最新recordcount的值,
但是這樣一來變成每次都要從新捉取資料?
有其他的方法嗎? 另外請問大家在實做Master-Detail的資料時,
假設主檔為多筆,當主檔換一筆資料時,明細檔也要跟著從新取得新的資料時,大家是在哪一個事件做Detail的資料重新取得? 目前小弟我是寫在Query的AfterScroll,來代出明細檔,
可是只要在Query一Open,捉Detail就會從主檔的第一筆一直跑到最後一筆,
速度很慢,目前只能用一個變數來判斷是否要重新整理detail的資料。
即
[MasterQuery AfterScroll] if b_retrieve then begin
DetailQuery.Close;
DetailQuery.SQL.text := '...';
DEtailQuery.Open;
end;
[主檔起動時的程式 in Form show]
MasterQuery.Close;
MasterQuery.SQL.text := '....';
b_retrieve := false;
MasterQuery.Open;
b_retrieve := true;
MasterQuery.AfterScroll(MasterQuery); 請問還有更好的事件可以寫重整Detail的程式嗎? ------------------------------------------------------------- 寫一堆,以下是我主要問的問題如下:
1. 是否有其他的辦法取出TQuery目前總共有幾筆,目前在第幾筆。
(不要使用 recordcount 與 recno 或有什麼方法可以解決此二
屬性出來資料不正確的方法)
2. 大家是在什麼事件下寫重整Detail的程式嗎? ----------------
快滿一年程設師,
日日工作寫程式,
每買樂透眼框溼,
望能早成系分師。
----------------
------
---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ---------------- |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: ------------------------------------------------------------- 寫一堆,以下是我主要問的問題如下: 1. 是否有其他的辦法取出TQuery目前總共有幾筆,目前在第幾筆。 (不要使用 recordcount 與 recno 或有什麼方法可以解決此二 屬性出來資料不正確的方法) 2. 大家是在什麼事件下寫重整Detail的程式嗎? ---------------- 快滿一年程設師, 日日工作寫程式, 每買樂透眼框溼, 望能早成系分師。 ----------------這個問題, 我初寫程式也是困擾很久, 你應該是以前也用過早期的資料庫 設計程式吧, 以前程式都很方便的提供RecordCount及Recno來給我們做指 標尋找定位, 可是在Delphi中已經喪失這樣的能力, 或許有其他的考量, 也或許是要包容各類資料庫格式吧! 所以你可能要以另外的思考模式設計吧! 利用TQuery要知道總筆數(目前的), 如果你是連結M$SQL, Interbase 可以這樣做 M$SQL寫法 (假設用 ADO) ADOQuery1.Close; ADOQuery1.SQL.Text:= 'select count(0) as TOTREC from TableName where 條件' ADOQuery1.Open; totRecord:= ADOQuery1.FieldbyName('TOTREC').AsInteger; Interbase寫法(假設用 IB) IBQuery1.Close; IBQuery1.SQL.Text:= 'select count(*) from TableName where 條件' IBQuery1.Open; totRecord:= IBQuery1.FieldbyName('COUNT').AsInteger; 如果是連結 db, dbf 檔, 則在條件出來之後直接使用 Query1.RecordCount 即可 至於RecNo, 其實我個人覺得這是拿來做定位用, 你可能必須另用其他 搜尋模式來做定位, 如果你是想知道目前記錄在第幾筆, 那大可不必去花 力氣處理, 因為沒有什麼意義存在! 至於master-detail的關聯, 我一舨也都是在afterscroll內撰寫, 你可以 直接在 Query的 onafterscroll event 中寫, 不必像上面的程式去指定 MasterQuery.AfterScroll(MasterQuery); 不過要注意, afterscroll在記錄異動就會執行(append, delete, move), 所以要特別注意如果你有執行任何會導致記錄指標異動的行為, 請儘量避免 執行afterscroll的內容, 舉例說, 你對query做 order by 的排序, 如果 你沒有對 afterscroll做佷好的控制, 則query在對每一筆記錄排序時都會 去執行afterscroll內容, 那當然速度就很慢, 或者你可以把detail部份寫成一支function, 在需要出現detail的地方再去 執行亦可 也可以用 join 方式, 很多啦! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |