下载本文示例代码
p> 从大量的数据中筛选出具有某种特征的数据是设计数据库应用程序经常碰到的问题,对它的处理方法也是多种多样的。下面介绍几种常见的方法。
设定范围
所谓范围,就是指定一个上下界,筛选出落在上下界内的一组连续记录。为方便说明,我们先生成一个项目,并在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的方法来改变范围的上下界。
使用范围的唯一? 是,设定范围的字段必须已建索引(Rainbow的话:这些使用范围的时候必须的)。对没有建立索引的字段使用范围是不允许的。
使用过滤器
过滤器筛选出来的记录可以是连续的,也可以是非连续的。过滤器不受索引的限制,而且即使有索引,过滤器也不依赖,也就是说,过滤出来的记录是未经排序的。过滤器的使用非常简单,可以直接在Table组件的Filter属性中写入包含过滤条件的字符串,并把Filtered属性置为True来启动过滤器。在上例中,我们可以在Table1的Filter的属性框内写入:(CustNo1000) and (CustNo2000) ,当我们把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 (CustNo1000) and (CustNo2000)
使用SQL语言可以实现条件很复杂的筛选,当记录数量很大或条件很复杂时,应尽量使用SQL语言来查询。
和前两种方法相比,使用查询更加灵活多变,适应性更强,而且也不受索引的限制。但这种通过SQL语句的筛选是一次性的。当调用TQuery的Open方法(或Active:=true)后,TQuery返回查询结果集,之后就失去了对结果集的范围限制。当结果集中的某些记录发生改变(如某条记录的Custom变为3000),不满足筛选条件时,这种方法不能马上察觉,必须再次调用TQuery的Open方法才能实现。
p> 从大量的数据中筛选出具有某种特征的数据是设计数据库应用程序经常碰到的问题,对它的处理方法也是多种多样的。下面介绍几种常见的方法。
设定范围
所谓范围,就是指定一个上下界,筛选出落在上下界内的一组连续记录。为方便说明,我们先生成一个项目,并在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的方法来改变范围的上下界。
使用范围的唯一? 是,设定范围的字段必须已建索引(Rainbow的话:这些使用范围的时候必须的)。对没有建立索引的字段使用范围是不允许的。
使用过滤器
过滤器筛选出来的记录可以是连续的,也可以是非连续的。过滤器不受索引的限制,而且即使有索引,过滤器也不依赖,也就是说,过滤出来的记录是未经排序的。过滤器的使用非常简单,可以直接在Table组件的Filter属性中写入包含过滤条件的字符串,并把Filtered属性置为True来启动过滤器。在上例中,我们可以在Table1的Filter的属性框内写入:(CustNo1000) and (CustNo2000) ,当我们把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 (CustNo1000) and (CustNo2000)
使用SQL语言可以实现条件很复杂的筛选,当记录数量很大或条件很复杂时,应尽量使用SQL语言来查询。
和前两种方法相比,使用查询更加灵活多变,适应性更强,而且也不受索引的限制。但这种通过SQL语句的筛选是一次性的。当调用TQuery的Open方法(或Active:=true)后,TQuery返回查询结果集,之后就失去了对结果集的范围限制。当结果集中的某些记录发生改变(如某条记录的Custom变为3000),不满足筛选条件时,这种方法不能马上察觉,必须再次调用TQuery的Open方法才能实现。
下载本文示例代码
Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据Delphi筛选数据
阅读(211) | 评论(0) | 转发(0) |