数据过滤
如前所述,无论TADOQuery还是TADODatSet(作为数据集组件),都是共用一组通用的方法和事件。这些数据集公开的功能中,拥有可以缩小呈现给用户数据范围的能力。试想一下,你可能拥有一个存有数千条记录的数据库表,但用户只对表中的一小部分数据感兴趣。
接下来,按照前面章节所描述的方法在数据窗体中放置核心组件(数据访问和数据感知)。下面的代码示例,假定你已将ADOTable组件指向数据库中的Applications表。
过滤(Filtering)
过滤,是排除从数据集中得到的一些数据,只在视图上显示那些符合特定条件的记录的方法。过滤使你能够生成不同数据内容的视图,而不会实际影响到该数据集中的数据。在设计和运行期间,过滤规则可通过数据集组件(TADOTable或TADOQuery)的Filter属性进行设置。 Filter属性是一个字符串,它定义了过滤器的规则。
例如,若想限制所显示的数据(来自Applications表)——只显示免费的应用程序(cost $0.00),下面的过滤器将只显示符合条件的记录:
ADOTable1.Filter := 'Cost = 0';
在此基础上,还可以为过滤器添加过滤条件。使数据集过滤后只显示某些特定程序类型的免费应用程序。如下进行设置:
ADOTable1.Filter :=
'Cost = 0 AND Type = ' + QuotedStr(Edit1.Text);
//'Delphi''s Pascal'; //ShowMessage为Delphi'sPascal
// QuotedStr(’Delphi''s Pascal’);//ShowMessage为 'Delphi''s Pascal'
通过组合使用下列运算符,可以创建相当复杂的过滤器。
运算符 含义
< 小于
> 大于
>= 大于或等于
<= 小于或等于
= 等于
<> 不等于
AND 都为真。
NOT 不为真
OR 至少有一个为真
Filtered, FilterOptions, FilterGroup,OnFilterRecord
Filtered属性是一个布尔值(True或False),决定是否启用“Filter”属性中的规则对数据集进行筛选。当Filtered为False时,将忽略过滤规则,而将整个数据集提供给应用程序。
FilterOptions具有两个值——都用于过滤字符串字段。值为foCaseInsensitive时,“Filter”属性中的条件字符串文字与字段值进行比较时,不区分大小写。 foNoPartialCompare强制Delphi将星号(*)解释为原义字符而非通配符。默认情况下,FilterOptions设置为空集。
OnFilterRecord事件,每次过滤规则起作用时触发。通常,在不能使用Filter属性来实现过滤时,使用该事件。
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方法。这些方法是搜索已过滤数据集最好的方式,因为每次调用这些方法时过滤器就会被重新应用。因此,如果先前不匹配过滤规则的记录,在修改后,与过滤规则相匹配时,它们将在搜索执行前被纳入数据集。