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

ClientdataSet之AddIndex 的使用範例

 
Chance36
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-09 22:02:18 IP:211.20.xxx.xxx 未訂閱
基於多層架構應用系統愈來愈普遍以及複雜運算(難以用SQL一次解決)的需求日益增加,使用Delphi的ClientDataset會是一個很好的解決方案,其中CLientdataSet動態索引的使用更是需求孔急!,小弟厚顏寫了一個ClientDataSet的AddIndex的示範程式,希望對大家有所幫助。 利用ClientdataSet的AddIndex 可以建立多欄位、順向反向、不分大小寫或參雜設定的動態排序功能。 範例程式畫面如下 操作說明 IndexName :動態建立的索引名稱 IndexFields :要建立索引的欄位順序(索引優先順序,欄位間用';'分隔) Descend Fields:要反向排序的欄位名稱(欄位間用';'分隔) 建立索引 :依上述設定動態建立索引 自動建立 :以滑鼠點選Grid的欄位抬頭時,會即時建立索引。
  • 若以滑鼠點選欄位抬頭時同時按住[Ctrl]鍵,可設定多欄位的複合索引
  • 同一個欄位第一次點選為升冪排列,第二次點選則為降冪排列,第三次則為取消排序
  • 當然你要在上述Edit自行輸入欄位名稱亦可,但請依格式輸入且不要打錯字,因為這部份沒作安全檢查
至於在欄位抬頭上畫排序的符號,之前已有人發表過了,在此就不再加入了,請自行參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30526 PS:對於ClientDataSet的動態索引的建立,有幾種方法(IndexFieldNames、IndexDefs及AddIndex,各有其優缺點),個人比較喜歡使用AddIndex 的方法來建立動態索引,不止可以昇冪排序還可以降冪排序,不止可以單一欄位排序還可以多欄位排序,而且昇冪降冪參雜的多欄位排序,還可以區分大小寫或不分大小寫,還有GroupLevel(這部份我還不瞭解所以沒有加上)
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-10 11:53:19 IP:211.162.xxx.xxx 未訂閱
真誠感謝Chance36版大的無私奉獻,我又偷學到了許多東東,哈哈,一邊偷著樂去了! < class="code"> =============== 人生在勤,不索何获? ===============
------
人生在勤,不索何获?
Chance36
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-23 02:06:41 IP:203.204.xxx.xxx 未訂閱
發現一個小問題,當全部的欄位皆為Descending時,排序符號竟然畫錯了,下載後請自行修改dbGrid.OnDrawColumn事件程序如下,就可以正確顯示了。
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var
  IndexDef : TIndexDef ;
begin
  If CDS.IndexName = '' Then Exit;
  IndexDef := CDS.IndexDefs.Find(CDS.IndexName) ;
  If Pos(';' Column.FieldName ';',';' IndexDef.Fields ';')> 0 THen Begin
    If ixDescending IN IndexDef.Options Then Begin
      // 全部都是Descending
      ImgLst.Draw(DBGrid1.Canvas,Rect.Right - 18,2,1);
    End Else Begin
      If Pos(';' Column.FieldName ';',';' IndexDef.DescFields ';') = 0 Then Begin
        // Scending
        ImgLst.Draw(DBGrid1.Canvas,Rect.Right - 18,2,0)
      End Else Begin
        // Descending
        ImgLst.Draw(DBGrid1.Canvas,Rect.Right - 18,2,1);
      End;
    End;
  End;
end;
_______________________________________ 深藍的魚,祝您好運..........連.連
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-14 07:22:21 IP:61.70.xxx.xxx 未訂閱
各位大大:     回報一個可能的 Bug,在 n-tier 架構下,大部所採用的資料下載方式是採分段下載的,並不是一次將資料下載完,如果在改變了排序的方式之後,使用者在去下載下一段的資料時,將會造成什麼樣的問題呢? 不知各位大大有何想法? 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福
------
Thomas Chiou
Chance36
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-02 00:54:59 IP:203.204.xxx.xxx 未訂閱
引言: 回報一個可能的 Bug,在 n-tier 架構下,大部所採用的資料下載方式是採分段下載的,並不是一次將資料下載完,如果在改變了排序的方式之後,使用者在去下載下一段的資料時,將會造成什麼樣的問題呢? 不知各位大大有何想法? < face="Verdana, Arial, Helvetica"> 如果ClientDataSet.FetchOnDemand= False;(無狀態物件,GetNextPacket須於適當的時機自行呼叫)應不致於有何影響才對(理論值)。 但是當ClientDataSet.FetchOnDemand= True;(具狀態物件,GetNextPacket會自動呼叫),於AddIndex建立索引時,ClientDataSet會自動取得所有的資料後再予以排序,這對網路的流量確實會有不良的影響,如果資料量不大倒還可以接受,但如遇到大量的資料時,那可就不好玩了。 與此一問題有類似的狀況為[搜尋],不管用SetKey、Locate...等方式來搜尋,也一樣會遇到大量從後端取回資料的情況;若希望同時解決索引及搜尋所產生的大量讀取資料的問題,具體解決的方法,請參考李維大師所著[多層次資料庫應用系統篇](好像是這個書名),裏邊有詳細的說明。 _______________________________________ 深藍的魚,祝您好運..........連連
sundy6719
初階會員


發表:136
回覆:78
積分:42
註冊:2002-07-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-16 06:45:00 IP:211.74.xxx.xxx 未訂閱
ClientDataSet1.AddIndex(Edit1.Text 'Index', Edit1.Text, [ixCaseInsensitive],'','',0); 這個addindex內的那麼多參數各式表什麼意思呢??謝謝
Chance36
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-18 18:36:53 IP:211.20.xxx.xxx 未訂閱
引言: ClientDataSet1.AddIndex(Edit1.Text 'Index', Edit1.Text, [ixCaseInsensitive],'','',0); 這個addindex內的那麼多參數各式表什麼意思呢??謝謝
procedure AddIndex(const Name, Fields: string; Options: TIndexOptions;
     const DescFields: string = ''; const CaseInsFields: string = '';
     const GroupingLevel: Integer = 0 );    參數說明
Name         :索引名稱(不可重複)
Fields       :參與排序的所有欄位名稱,各欄位以';'分隔
Options      :排序選項(見以下說明)
DescFields   :要降冪排序的欄位名稱,各欄位以';'分隔(排序選序有設定
              [ixDescending]時使用)
CaseInsFields:不區分大小寫排序的欄位名稱,各欄位以';'分隔(排序選序
              有設定[ixCaseInsensitive]時使用)
GroupingLevel: 個人尚未完全瞭解(還沒有需求),不敢多做說明    排序選項
  TIndexOption = (ixPrimary, ixUnique, ixDescending,
              ixCaseInsensitive, ixExpression, ixNonMaintained);
  TIndexOptions = set of TIndexOption;    ixPrimary         :建立主鍵索引(dbase不適用)
ixUnique          :建立唯一索引(只能動態索引使用)
ixDescending      :建立包含降冪排序的索引(只能動態索引使用)
ixCaseInsensitive :建立不區分大小寫的索引 (只能動態索引使用)
ixExpression      :依運算結果排序(只適用於dbase)
ixNonMaintained   :當索引欄位有異動時,不會自動重整索引 (只能動態索引
                   使用)
_______________________________________ 深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/11/18 18:38:54
系統時間:2024-04-28 2:43:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!