鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > delphi > >

Delphi数据库编程新手指南(08)

来源:互联网 作者:佚名 时间:2015-07-05 21:31
如前所述,无论TADOQuery还是TADODatSet(作为数据集组件),都是共用一组通用的方法和事件。这些数据集公开的功能中,拥有可以缩小呈现给用户数据范围的能力。试想一下,你可能拥有一个存有数千条记录的数据库表,但用户只对表中的一小部分数据感兴趣。 接下来

    如前所述,无论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方法。这些方法是搜索已过滤数据集最好的方式,因为每次调用这些方法时过滤器就会被重新应用。因此,如果先前不匹配过滤规则的记录,在修改后,与过滤规则相匹配时,它们将在搜索执行前被纳入数据集。

网友评论
<