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

關於TQuery的RecordCount的問題,以及Master-Detail實做的問題?

答題得分者是:P.D.
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-11 09:46:12 IP:61.219.xxx.xxx 未訂閱
在 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-11 11:02:58 IP:61.66.xxx.xxx 未訂閱
引言: ------------------------------------------------------------- 寫一堆,以下是我主要問的問題如下: 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 方式, 很多啦!
系統時間:2024-05-04 6:24:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!