ClientdataSet之AddIndex 的使用範例 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
基於多層架構應用系統愈來愈普遍以及複雜運算(難以用SQL一次解決)的需求日益增加,使用Delphi的ClientDataset會是一個很好的解決方案,其中CLientdataSet動態索引的使用更是需求孔急!,小弟厚顏寫了一個ClientDataSet的AddIndex的示範程式,希望對大家有所幫助。 利用ClientdataSet的AddIndex 可以建立多欄位、順向反向、不分大小寫或參雜設定的動態排序功能。 範例程式畫面如下
操作說明 IndexName :動態建立的索引名稱
IndexFields :要建立索引的欄位順序(索引優先順序,欄位間用';'分隔)
Descend Fields:要反向排序的欄位名稱(欄位間用';'分隔)
建立索引 :依上述設定動態建立索引
自動建立 :以滑鼠點選Grid的欄位抬頭時,會即時建立索引。
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
發現一個小問題,當全部的欄位皆為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 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 回報一個可能的 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 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |