可用ClientDataSet.AddIndex或ClientDataSet1.IndexDefs.AddIndexDef建立索引。
AddIndex(
const Name:string; //索引名
const Fields:string; //索引字段,多个用;隔开
options:TIndexOptions; //选项[IxPrimary,IxUnique,ixDescending,ixCaseInsensitive]
const DescFields:string; //降序排列字段
const CaseInFields:string //不区分大小写字段
const GroupingLevel:integer //分组级别
);
AddIndexDef用法跟上面类似,在with...do中设置相应属性
with ClientDataSet1.IndexDefs.AddIndexDef do
begin
name:string;
CaseInsFields: string ;
DescFields: string;
Expression: string ;
Fields: string;
Options: TIndexOptions;
GroupingLevel: Integer;
end;
下例中使用AddIndex方法,如图:
***************************************************************************************************************************
具体操作:
***************************************************************************************************************************
DBGrid1.DataSource->DataSource1.DataSet->ClientDataSet1.ProviderName->DataSetProvider1.DataSet->
SQLDataset1.SQLConnection->SQLConnection1具体数据库(这里连接的是oracle中的EMP表);
SQLDataSet1.CommandText:=SELECT * FROM EMP;ClientDataSet1.Active:=true;
***************************************************************************************************************************
主要代码:
***************************************************************************************************************************
procedure TForm3.Button1Click(Sender: TObject); begin if ClientDataSet1.IndexName='Index1' then begin Button1.Caption:='ENAME升序EMPNO降序'; ClientDataSet1.IndexName:='Index2'; end else begin ClientDataSet1.IndexName:='Index1'; Button1.Caption:='EMPNO升序ENAME降序'; end; end; procedure TForm3.DBGrid1TitleClick(Column: TColumn); begin if not Column.Field.IsBlob then // 不能给大二进制字段建立索引或排序 ClientDataSet1.IndexFieldNames := Column.FieldName; end; procedure TForm3.FormCreate(Sender: TObject); begin //EMPNO升序排序ENAME降序排列 ClientDataSet1.AddIndex('Index1','EMPNO;ENAME',[],'ENAME'); //也可写成 // ClientDataSet2.AddIndex('Index1','EMPNO,ENAME',[ixDescending],'ENAME');//ixDescending被忽略 // ENAME升序,EMPNO降序 ClientDataSet1.AddIndex('Index2','EMPNO;ENAME',[],'EMPNO'); ClientDataSet1.IndexName:='Index1'; end;
注意:如果只想对当想缓冲区中的数据排序要用TempClientDataSet.CloneCursor方法克隆到TempClientDataSet或直接用TempClientDataSet.Data:=ClientDataSet1.Data,把ClientDataSet1缓冲区中的数据复制到TempClientDataSet中,ClientDataSet2中的数据就与数据源分离了,再对TempClientDataSet排序。如果不分离数据源就排序,ClientDataSet1会把表中的所有数据读到本地再排序。