如前所述,无论TADOQuery还是TADODatSet(作为数据集组件),都是共用一组通用的方法和事件。这些数据集公开的功能中,拥有可以缩小呈现给用户数据范围的能力。试想一下,你可能拥有一个存有数千条记录的数据库表,但用户只对表中的一小部分数据感兴趣。

接下来,按照前面章节所描述的方法在数据窗体中放置核心组件(数据访问和数据感知)。下面的代码示例,假定你已将ADOTable组件指向数据库中的Applications表。

过滤(Filtering)

过滤,是排除从数据集中得到的一些数据,只在视图上显示那些符合特定条件的记录的方法。过滤使你能够生成不同数据内容的视图,而不会实际影响到该数据集中的数据。在设计和运行期间,过滤规则可通过数据集组件(TADOTable或TADOQuery)的Filter属性进行设置。 Filter属性是一个字符串,它定义了过滤器的规则。

例如,若想限制所显示的数据(来自Applications表)——只显示免费的应用程序(cost $0.00),下面的过滤器将只显示符合条件的记录:


[delphi] 
ADOTable1.Filter := 'Cost = 0'; 

ADOTable1.Filter := 'Cost = 0';
在此基础上,还可以为过滤器添加过滤条件。使数据集过滤后只显示某些特定程序类型的免费应用程序。如下进行设置:


[delphi]
ADOTable1.Filter := 
  'Cost = 0 AND Type = ' + QuotedStr(Edit1.Text);   
//'Delphi''s Pascal'; //ShowMessage为Delphi'sPascal  
// QuotedStr(’Delphi''s Pascal’);//ShowMessage为 'Delphi''s Pascal' 

ADOTable1.Filter :=
  'Cost = 0 AND Type = ' + QuotedStr(Edit1.Text); 
//'Delphi''s Pascal'; //ShowMessage为Delphi'sPascal
// QuotedStr(’Delphi''s Pascal’);//ShowMessage为 'Delphi''s Pascal'
通过组合使用下列运算符,可以创建相当复杂的过滤器。


[delphi] 
运算符  含义 
<           小于 
>           大于 
>=         大于或等于 
<=         小于或等于 
=           等于 
<>         不等于 
AND      都为真。 
NOT      不为真 
OR        至少有一个为真 

运算符  含义
<           小于
>           大于
>=         大于或等于
<=         小于或等于
=           等于
<>         不等于
AND      都为真。
NOT      不为真
OR        至少有一个为真
Filtered, FilterOptions, FilterGroup,OnFilterRecord

  Filtered属性是一个布尔值(True或False),决定是否启用“Filter”属性中的规则对数据集进行筛选。当Filtered为False时,将忽略过滤规则,而将整个数据集提供给应用程序。

  FilterOptions具有两个值——都用于过滤字符串字段。值为foCaseInsensitive时,“Filter”属性中的条件字符串文字与字段值进行比较时,不区分大小写。 foNoPartialCompare强制Delphi将星号(*)解释为原义字符而非通配符。默认情况下,FilterOptions设置为空集。

  OnFilterRecord事件,每次过滤规则起作用时触发。通常,在不能使用Filter属性来实现过滤时,使用该事件。


[delphi]
procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet; var Accept:Boolean); 
var AppZipSize : Single; 
begin 
  AppZipSize :=ADOTable1.FieldByName('size').Value; 
  Accept := (AppZipSize < 10); 
end; 

procedure TForm1.ADOTable1FilterRecord(DataSet: TDataSet; var Accept:Boolean);
var AppZipSize : Single;
begin
  AppZipSize :=ADOTable1.FieldByName('size').Value;
  Accept := (AppZipSize < 10);
end;
  这里的关键因素是Accept参数。任何你需要显示的行,需将其Accept设为“True”。前面代码中,Size字段值小于10(所有大小小于10KB的应用程序)的Accept为True。

FilterGroup集属性可以根据它们的状态来筛选记录。

(过滤或不过滤)To filter or notto filter

(需要注意的)Note that

  •Filter属性的行为很像一个SQL语句中的WHERE子句。

  •可以拥有多个条件,在Filter属性中用AND或OR运算符分隔。

  •通常应该避免使用过滤器,除非取得的记录集是小型的。使用过滤器,可能会也可能不会使用当前索引(过滤器适用于检索数据集中的每一个记录中)。

  •在客户机/服务器类型的上很少使用过滤器,应使用SQL查询(TADOQuery)来达到过滤器对本地数据库那样的效果。

  •一般情况下,不应在数据模块(datamodules)上的数据集中使用过滤器。在特定情况中,过滤表不在其他窗体中显示,或表使用的范围、排序顺序,不在除应用程序外的任何地方使用——应避免使用数据模块。

  •搜索已过滤的数据集,可使用FindFirst、FindNext、FindPrior或FindLast方法。这些方法是搜索已过滤数据集最好的方式,因为每次调用这些方法时过滤器就会被重新应用。因此,如果先前不匹配过滤规则的记录,在修改后,与过滤规则相匹配时,它们将在搜索执行前被纳入数据集。