TClientDataSet[8]: 关于索引与排序

索引的目的有三: 快速定位、排序、建立主从表. 下面是相关属性与方法:
IndexDefs; { }
IndexFieldCount; { }
IndexFieldNames; { }
IndexFields[]; { }
IndexName; { }

AddIndex(); { }
DeleteIndex(); { }
GetIndexInfo(); { }
GetIndexNames(); { }

添加索引的方法有二:
1、用 IndexFieldNames 通过字段名(多个字段用 ; 隔开)指定临时索引;
2、通过 IndexDefs.AddIndexDef 或 AddIndex 建立索引, 然后用 IndexName 指定为当前索引.

两种方法都可以在设计时完成; 后者会有更多功能, 譬如倒排序; 两种方法是互斥的, 指定一个会自动取消另一个.

TClientDataSet 会自动生成两个默认索引: DEFAULT_ORDER、CHANGEINDEX; 它们都不允许用户删改.
CHANGEINDEX 是用于 Delta(日志)的.

DEFAULT_ORDER 可用于恢复默认排序; 它可能已经和某些字段关联, 如(xml 源码):
<PARAMS DEFAULT_ORDER=“1” PRIMARY_KEY=“1” … /> 或
<PARAMS DEFAULT_ORDER=“1 2” PRIMARY_KEY=“1 2” … />

关于临时索引最常用的代码是在 DBGrid 的 OnTitleClick 事件中更换索引, 如:

{ 根据当前字段排序 }
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
beginif not Column.Field.IsBlob then { 不能给大二进制字段建立索引或排序 }ClientDataSet1.IndexFieldNames := Column.FieldName;
end;{ 恢复默认排序 }
procedure TForm1.Button1Click(Sender: TObject);
beginClientDataSet1.IndexName := 'DEFAULT_ORDER';
end;使用 IndexFieldNames 可指定多个字段, 如: ClientDataSet1.IndexFieldNames := '字段x; 字段y; 字段z';
此时顺序很重要, 这里会先按 "字段x" 排序; 在 "字段x" 的值相同时会按 "字段y" 排序; 在 "字段y" 的相同时...IndexFieldNames 没有更多了, 更复杂的排序就需要建立排序对象(TIndexDef)了.实现倒排序的例子:
{ 下面是在 holdings.xml 的基础上建立的两个索引; ACCT_NBR、SYMBOL 是其中的两个字段 }
procedure TForm1.FormCreate(Sender: TObject);
beginClientDataSet1.AddIndex('Index_1', 'ACCT_NBR; SYMBOL', []);             { 正序 }ClientDataSet1.AddIndex('Index_2', 'ACCT_NBR; SYMBOL', [ixDescending]); { 倒序 }ClientDataSet1.IndexName := 'Index_1';
end;{ 切换上面建立的两个索引 }
procedure TForm1.Button1Click(Sender: TObject);
beginif ClientDataSet1.IndexName = 'Index_1' thenClientDataSet1.IndexName := 'Index_2'elseClientDataSet1.IndexName := 'Index_1';ClientDataSet1.First;
end;{ 上面的 TForm1.FormCreate 过程也可以写作(另一种建立方法) }
procedure TForm1.FormCreate(Sender: TObject);
beginwith ClientDataSet1.IndexDefs.AddIndexDef dobeginName := 'Index_1';Fields := 'ACCT_NBR; SYMBOL';end;with ClientDataSet1.IndexDefs.AddIndexDef dobeginName := 'Index_2';Fields := 'ACCT_NBR; SYMBOL';Options := [ixDescending];end;ClientDataSet1.IndexName := 'Index_1';
end;关于 AddIndex:
AddIndex(const Name: string;          { 索引名称; 不能重名 }const Fields: string;        { 索引字段; 多个字段用分号隔开; 默认升序排列 }Options: TIndexOptions;      { 选项 }const DescFields,            { 按降序排列的字段; 须先在 Fields 中列出 }const CaseInsFields: string; { 不区分大小写的字段; 须先在 Fields 中列出 }const GroupingLevel: Integer { 分组级别, 用于分组统计的 }
);//Options:
IxPrimary         { 主索引 }
IxUnique          { 字段值无重复 }
ixDescending      { 降序 }
ixCaseInsensitive { 不区分大小写 }
ixExpression      { 无用 }
ixNonMaintained   { 无用 }
{ 可选空值 [], 最多不能多于两个选项 }
{ 若是两个选项, 其中之一须是: ixDescending 或 ixCaseInsensitive }AddIndex 的一些用法(都是先 F1 后 F2):
//F1、F2 降序, 两种写法一样:
AddIndex('Index_1', 'F1; F2', [ixDescending]);
AddIndex('Index_2', 'F1; F2', [], 'F1; F2');//F1、F2 不区分大小写排序(不指定降序则默认升序):
AddIndex('Index_1', 'F1; F2', [ixCaseInsensitive]);
AddIndex('Index_2', 'F1; F2', [], '', 'F1; F2');//F1 升序, F2 降序:
AddIndex('Index_1', 'F1; F2', [], 'F2');
AddIndex('Index_2', 'F1; F2', [ixDescending], 'F2'); { 此时 [ixDescending] 被忽略 }//F1 降序, F2 升序:
AddIndex('Index_1', 'F1; F2', [], 'F1');
AddIndex('Index_2', 'F1; F2', [ixDescending], 'F1');

Delphi7-TClientDataSet[8]: 关于索引与排序相关推荐

  1. pandas中dataframe索引排序实战:pandas中dataframe索引降序排序、pandas中dataframe索引升序排序

    pandas中dataframe索引排序实战:pandas中dataframe索引降序排序.pandas中dataframe索引升序排序 目录

  2. mysql 排序后 下一条记录_什么是MySQL InnoDB 二级索引的排序?|附实例详解

    概述 今天主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 每个InnoDB表具有一个特殊的索引称为聚簇 ...

  3. ClientDataSet建立索引和排序

    可用ClientDataSet.AddIndex或ClientDataSet1.IndexDefs.AddIndexDef建立索引. AddIndex( const Name:string;     ...

  4. 影响索引的mysql函数_mysql索引对排序的影响实例分析

    本文实例讲述了mysql索引对排序的影响.分享给大家供大家参考,具体如下: 索引不仅能提高查询速度,还可以添加排序速度,如果order by 后面的语句用到了索引,那么将会提高排序的速度. 测试 1. ...

  5. 学习 | MongoDB 索引和排序

    小小又开始学习了,这次学习的内容是索引和排序. 索引 先给users集合插入两条记录,然后用users集合来进行索引管理的演示: > user1={"name":" ...

  6. 对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗...

    原文:对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗 本文之外可参考另外一篇文章作为补充:http://www.cnblogs.com/wy123/p/6 ...

  7. order by使用索引列排序时会失效吗?

    order by使用索引列排序时会失效吗? 在使用order by对某列进行排序时, 其sql一定进行了多表联查的操作. 说白了肯定做了表关联. 既然有表关联, 那order by排序就可以对任意的表 ...

  8. pandas使用read_csv函数读取csv数据、sort_index函数基于多层行索引对数据排序(设置ascending参数列表指定不同层行索引的排序方向)

    pandas使用read_csv函数读取csv数据.index_col参数指定作为行索引的数据列索引列表形成复合(多层)行索引.sort_index函数基于多层行索引对数据排序(设置ascending ...

  9. php 排序不影响索引,为什么不能通过索引避免排序操作呢??

    谢谢各位的回复,尤其是棉花糖ONE! 忘了说了,我的数据库版本是:10.2.0.4 的 刚才做了一个10053事件.CASE WHEN STOCK_NUM>0 THEN 1 ELSE 0 END ...

最新文章

  1. 小眼睛适合大框还是小框眼镜_北京潘家园眼镜城良心商家推荐
  2. oracle批处理参数调用,bat调用jar包并传入多个参数
  3. 3.集--LinkedTransferQueue得知
  4. java 百度网盘上传_使用pcs api往免费的百度网盘上传下载文件的方法
  5. httpclient 3.0初步研究
  6. Ubuntu 16.04源码搭建ELK日志分析系统(Elasticsearch+Logstash+Kibana)
  7. 为什么环境变量中设置了JDK版本为1.7,但是在cmd中java -version 是1.8版本
  8. 微软收缩nano服务器容器图像,微软将推出全新服务器操作系统:Nano Server
  9. matlab 稀疏矩阵 乘法,Matlab 矩阵运算
  10. ubuntu16.04 lidar_align实现三维激光雷达和Imu联合标定
  11. python字体设置不了_设置字体样式
  12. werfault.exe出现的原因与解决办法以及werfault.exe 该内存不能为written如何解决?
  13. 前后端交互node服务器
  14. Circos从入门到精通
  15. 论文翻译——Rapid 2D-to-3D conversion——快速2D到3D转换
  16. 什么是消费者需求研究
  17. python3如何实现一行输入,空格隔开
  18. OpenBot开源小车
  19. 【UV打印机】电气之负压系统(一)
  20. 专题一:Labview表格控件 及 应用(一)

热门文章

  1. fatal: unable to access ‘https://github.com/PanJiaChen/vue-element-admin.git/‘
  2. wps js宏模拟cookie绕过网站登录验证请求数据
  3. tf 2.0 --activations--elu
  4. App市场运营三步曲
  5. 世界上最小的微电子机器人由“喷气发动机”推动
  6. 动态壁纸 Living Wallpaper HD for Mac 4.5.4 中文共享版 –精美壁纸
  7. “如果你有1000万头猪,你打算怎么管?”——特驱集团数据化养猪
  8. 成熟短视频直播APP软件开发必备接口
  9. GitHub年度报告发布,JavaScript高居榜首!
  10. 网易新闻为何高居榜首,利用好大数据是关键