说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi筛选数据

HTML文档下载 WORD文档下载 PDF文档下载
Delphi筛选数据

从大量的数据中筛选出具有某种特征的数据是设计数据库应用程序经常碰到的问题,对它的处理方法也是多种多样的。下面介绍几种常见的方法。

·设定范围·

所谓范围,就是指定一个上下界,筛选出落在上下界内的一组连续记录。为方便说明,我们先生成一个项目,并在Form1中放入如下组件:

组件名 属性

Table1 DatabaseName:=DBDEMOS

TableName:=Customer.db

DataSource1 DataSet:=Table1

DBGrid1 DataSource:=DataSource1

本例中我们使用了Delphi自带的别名'DBDEMOS'下的一个数据库:Customer.db,这是一个记录顾客基本信息的数据库。当我们把Table1的Active属性置为True时,在DBGrid1中会显示出该库的内容。下面我们往Form1中放入一个Button1,编写Button1的OnClick事件如下:

procedure TForm1.Button1Click(Sender: TObject);

begin

with Table1 do

begin

KeyExclusive:=True;// 为True时不包括边界值,为False时包括边界值,缺省为False;

SetRangeStart;

Fieldbyname('CustNo').AsString:='1000'; //设定范围上界

SetRangeEnd;

FieldbyName('CustNo').AsString:='2000'; //设定范围下界

ApplyRange; //使范围生效

end;

end;

以上是设定范围的很典型的一组语句。运行程序,单击按钮后,顾客号在1000至2000之间的顾客记录被筛选了出来。范围一旦被设定,在整个应用程序执行过程中都是有效的。当然,我们可以调用CancelRange方法来暂时使范围失效,以后需要范围生效时,可直接调用ApplyRange方法,而不需要再次设定范围的上下界。另外,我们可以调用EditRangeStart和EditRangeEnd的方法来改变范围的上下界。

使用范围的唯一条件是,设定范围的字段必须已建索引。对没有建立索引的字段使用范围是不允许的。

·使用过滤器·

过滤器筛选出来的记录可以是连续的,也可以是非连续的。过滤器不受索引的限制,而且即使有索引,过滤器也不依赖,也就是说,过滤出来的记录是未经排序的。过滤器的使用非常简单,可以直接在Table组件的Filter属性中写入包含过滤条件的字符串,并把Filtered属性置为True来启动过滤器。在上例中,我们可以在Table1的Filter的属性框内写入:(CustNo>1000) and (CustNo<2000)

当我们把Table1的Filtered属性置为True时,DBGrid1内将显示出顾客号在1000至2000之间的顾客记录。当过滤条件比较复杂时,我们可以通过编写Table1的OnFilterRecord事件来实现。例如:

procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);

begin

Accept:=(DataSet[′CustNo′]>1000) and (DataSet[′CustNo′]<2000) and (DataSet[′Country′]=′US′);

end;

运行程序,所有CustNo在1000至2000之间并且Country='US'的顾客记录被筛选了出来。在OnFilterRecord事件中,我们可以使用条件分支语句或者循环语句,因而非常灵活,便于完成条件很复杂的记录筛选工作。和范围一样,过滤器一旦设定,就将维持到应用程序的结束。当然,我们可以将Filtered属性置为False来使过滤器失效。

和范围相比,过滤器方便灵活,而且不受索引限制,但正是因为没有索引支持,当记录数量比较大时,过滤器的速度会受影响。因此

范围和过滤器各有各的适用场合。

·使用查询·

即通过TQuery组件来使用SQL语句实现记录的筛选。大家可能对这种方法比较熟悉,这里只做简单说明,如上例中的记录筛选用一条很简单的SQL语句就能实现:

Select * from Customer

Where (CustNo>1000) and (CustNo<2000)

使用SQL语言可以实现条件很复杂的筛选,当记录数量很大或条件很复杂时,应尽量使用SQL语言来查询。

和前两种方法相比,使用查询更加灵活多变,适应性更强,而且也不受索引的限制。但这种通过SQL语句的筛选是一次性的。当调用TQuery的Open方法(或Active:=true)后,TQuery返回查询结果集,之后就失去了对结果集的范围限制。当结果集中的某些记录发生改变(如某条记录的Custom变为3000),不满足筛选条件时,这种方法不能马上察觉,必须再次调用TQuery的Open方法才能实现。

社交媒体的力量:Wood Camera登上iOS付费榜首之谜 屏蔽GitHub是互联网时代的“闭关锁国”吗? 巧妙利用空白设计案例分享(多图) 用友发布2013/新三年业务策略 力推UAP/CSP云平台 AWS集群计算新增内存分析EC2实例 语音聊天室里的 全双工语音 是怎么个做法 菜鸟问题,怎么做POPMENU菜单? 虚心求教,百分相赠,(有关循环单链表) vb程序问题 很想结识一些学习C++的朋友. 50求树状控件Dome. 急问存储过程在VC++中调用??谢谢! 高手们,请进来看看关于Connection. 的事务问题??? 已经有2个硬盘(20G+40G),2个光驱(CD+DVD),还不够用,是再买个CD-RW好,还是买个120G硬盘好呢? 求30和-30的原码 反码 补码 移码小弟急用啊 +0或者-0的源码、反码、补码分别是什么?补码是一 原码 反码 补码假设某台计算机的机器数占8位,试写 -1的原码,反码,补码,移码是什么?4为二进制补码 分别用原码,补码,反码表示有符号数+102和+10 若采用8位二进制补码表示十进制整数-128.则其表 若采用8位二进制补码表示十进制整数-128.则其表 请给出十进制数“-42”的补码表示形式,采用8位二 原码 反码 补码 移码-27/32的原码反码补码移 参议员贪污风波袭扰加拿大 哈珀政府骑霍英东家族争产风波再掀波澜 大哥三弟英首相:媒体爆料美监听丑闻是“资敌”平等对话才能改善美伊关系华人血腥灭门案惊扰纽约 落魄凶手因嫉红木产品强制性标准执行情况专项检查问11家企业首发申请获批文司机老师儿,你握方向盘的姿势对吗?俄罗斯夫妇爬3000米火山拍震撼溶岩胡志强回应政见抄袭:汗水比口水重要(王爷求交往惟我神尊灌篮高手之梦想与坚持我是傀儡皇帝魔海风云般若寺旅游龙首山旅游彭德怀故居旅游雨湖公园旅游半屏山旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘