数据过滤技术在Delphi中的使用
点击次数:42 次 发布日期:2008-11-09 08:38:29 作者:源代码网
|
源代码网推荐 ---- 1.给字段设置限制值,过滤记录 源代码网推荐 源代码网推荐 ---- 下面是Delphi4帮助中的一个例子,设置了数据表Table1中的"City"字段检索范围,即上限值和下限值。范围一旦被设定,在整个应用程序执行过程中都是有效的。也可以调用CancelRange方法暂时使范围失效,以后需要范围生效时,可直接调用ApplyRange方法,而不需要再次设定范围的上下限。另外,可以调用EditRangeStart和EditRangeEnd的方法来改变范围的上下限。 源代码网推荐 源代码网推荐 with Table1 do 源代码网推荐 begin 源代码网推荐 SetRangeStart; { Set the beginning key } 源代码网推荐 FieldByName("City").AsString := "Felton"; 源代码网推荐 SetRangeEnd; { Set the ending key } 源代码网推荐 FieldByName("City").AsString := "Scotts Valley"; 源代码网推荐 ApplyRange; { Tell the dataset to establish the range } 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 ---- 需要特别说明的是,如果Table1是Paradox表或是dBASE表,在调用SetRangeStart,SetRangeEnd,ApplyRange,CancelRange等方法时,只能为Table1表中的索引字段或定义的索引指定相应的字段值,以设定检索范围,也就是说"City"字段必须是索引字段。另外要说明的是,KeyExclusive属性值为True时不包括边界值,为False时包括边界值,缺省为False。 源代码网推荐 ---- 2.在OnFilterRecord事件中过滤记录 源代码网推荐 源代码网推荐 ---- 例如要对某数据表(Table)的Degree字段进行"工程师"和"高级工程师"的数据过滤(或称筛选数据),可以通过下面的程序具体实现。 源代码网推荐 源代码网推荐 unit Unit1; 源代码网推荐 源代码网推荐 interface 源代码网推荐 源代码网推荐 uses 源代码网推荐 Windows, Messages, SysUtils, 源代码网推荐 Classes, Graphics, Controls, Forms, Dialogs, 源代码网推荐 Grids, DBGrids, Db, DBTables, StdCtrls; 源代码网推荐 源代码网推荐 type 源代码网推荐 TForm1 = class(TForm) 源代码网推荐 DataSource1: TDataSource; 源代码网推荐 Table1: TTable;//指定表,如Demo.db 源代码网推荐 DBGrid1: TDBGrid;//用于显示记录 源代码网推荐 Button1: TButton;//按下后TDBGrid 源代码网推荐 中显示所有"工程师"的记录 源代码网推荐 Button2: TButton;//按下后TDBGrid 源代码网推荐 中显示所有"高级工程师"的记录 源代码网推荐 Button3: TButton;//按下后TDBGrid 源代码网推荐 中显示全部记录 源代码网推荐 Button4: TButton;//按下后退出程序 源代码网推荐 procedure Table1FilterRecord 源代码网推荐 (DataSet: TDataSet; var Accept: Boolean); 源代码网推荐 procedure AnotherFilterRecord 源代码网推荐 (DataSet: TDataSet; var Accept: Boolean); 源代码网推荐 //指定"高级工程师"的事件句柄 源代码网推荐 procedure OtherFilterRecord(DataSet: TDataSet; 源代码网推荐 var Accept: Boolean);//指定"工程师"的事件句柄 源代码网推荐 procedure Button1Click(Sender: TObject); 源代码网推荐 procedure Button2Click(Sender: TObject); 源代码网推荐 procedure Button3Click(Sender: TObject); 源代码网推荐 procedure Button4Click(Sender: TObject); 源代码网推荐 源代码网推荐 private 源代码网推荐 { Private declarations } 源代码网推荐 public 源代码网推荐 源代码网推荐 { Public declarations } 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 var 源代码网推荐 Form1: TForm1; 源代码网推荐 源代码网推荐 implementation 源代码网推荐 源代码网推荐 {$R *.DFM} 源代码网推荐 源代码网推荐 procedure TForm1.Table1FilterRecord 源代码网推荐 (DataSet: TDataSet; 源代码网推荐 var Accept: Boolean); 源代码网推荐 begin 源代码网推荐 accept:=dataset["degree"]="总经理"; 源代码网推荐 //初始的过滤条件 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.AnotherFilterRecord 源代码网推荐 (DataSet: TDataSet; 源代码网推荐 var Accept: Boolean); 源代码网推荐 begin 源代码网推荐 accept:=dataset["degree"]="高级工程师"; 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.OtherFilterRecord 源代码网推荐 (DataSet: TDataSet; 源代码网推荐 var Accept: Boolean); 源代码网推荐 begin 源代码网推荐 accept:=dataset["degree"]="工程师"; 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button1Click(Sender: TObject); 源代码网推荐 begin 源代码网推荐 table1.OnFilterRecord:=Otherfilterrecord; 源代码网推荐 table1.Filtered:=true; 源代码网推荐 refresh;//在Delphi4中Refresh语句可以不用, 源代码网推荐 Ttable组件自动响应并刷新记录。 源代码网推荐 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button2Click(Sender: TObject); 源代码网推荐 begin 源代码网推荐 table1.Filtered:=false; 源代码网推荐 refresh; 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button3Click(Sender: TObject); 源代码网推荐 begin 源代码网推荐 table1.OnFilterRecord:=Anotherfilterrecord; 源代码网推荐 table1.Filtered:=true; 源代码网推荐 refresh; 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button4Click(Sender: TObject); 源代码网推荐 begin 源代码网推荐 close; 源代码网推荐 end; 源代码网推荐 源代码网推荐 end. 源代码网推荐 源代码网推荐 ---- 此方法的主要思路就是:在运行期把OnFilterRecord事件重新指定一个事件句柄(本例中AnotherFilterRecord和OtherFilterRecord),从而使程序按不同的过滤条件过滤记录。这种方法并不要求Table1的degree字段为索引字段,对数据集不大的数据表,非常实用而简便,对数据集中记录很多的,最好还是用查询或者设置检索范围。 源代码网推荐 ---- 3.设置Filter属性,过滤不同的记录 源代码网推荐 源代码网推荐 ---- 以上程序过程显得有些复杂,可简单地指定Filter属性来实现,即不用OnFilterRecord事件,删除两个事件句柄AnotherFilterRecord和OtherFilterRecord的定义及相关过程,直接用过滤Filter串,将Filtered属性值设置为True,并把Button1Click和Button2Click事件修改如下:(另注:两个单引号表示串中的一个单引号) 软件开发网 www.mscto.com 源代码网推荐 源代码网推荐 procedure TForm1.Button1Click(Sender: TObject); 源代码网推荐 begin 源代码网推荐 Form1.Table1.Filtered:=true; 源代码网推荐 Form1.Table1.Filter:="[degree]" "=" """工程师"""; 源代码网推荐 end; 源代码网推荐 源代码网推荐 procedure TForm1.Button2Click(Sender: TObject); 源代码网推荐 begin 源代码网推荐 Form1.Table1.Filter:="[degree]" "=" """高级工程师"""; 源代码网推荐 end; 源代码网推荐 源代码网推荐 源代码网推荐 ---- 这种方法也不要求Table1的degree字段为索引字段,没有索引支持,当记录数量比较大时,过滤的速度会受影响。Filter属性设置还支持通配符,例如:[degree]="E*",与Filter属性设置有关的还有FilterOption属性,它是一个集合属性,有两个成员:foCaseInsensitive(区分大小写),foNoPartialCompare(*不作为通配符)。 源代码网推荐 ---- 4.使用SQL实现数据过滤(不必用Ttable组件) 源代码网推荐 源代码网推荐 ---- 通过TQuery组件来使用SQL语句实现记录的过滤,大家可能对这种方法比较熟悉,这里只做简单说明,如上例中的记录筛选用一条很简单的SQL语句就能实现: 源代码网推荐 源代码网推荐 SELECT * FROM "demo.DB" demo 源代码网推荐 where demo."degree"="工程师" 源代码网推荐 源代码网推荐 ---- 如果在运行期改变查询条件,则要用下面的SQL语句来实现: 源代码网推荐 Query1.Close; 源代码网推荐 Query1.SQL.Clear; 源代码网推荐 Query1.SQL.Add("SELECT * FROM 源代码网推荐 "demo.DB" demo"); 源代码网推荐 Query1.SQL.Add("where demo."degree" 源代码网推荐 ="高级工程师"") ; 源代码网推荐 Query1.ExecSQL; 源代码网推荐 源代码网推荐 ---- 使用SQL语言可以实现条件很复杂的筛选,当记录数量很大或条件很复杂时,应尽量使用SQL语言来查询。这种通过SQL语句的过滤是一次性的。当调用TQuery的Open方法或Active:=true,TQuery返回查询结果集,之后就失去了对结果集的范围限制。当结果集中的某些记录发生改变,不满足过滤条件时,TQuery不能察觉,必须再次调用TQuery的Open方法才能实现刷新记录,过滤掉不符合条件的记录。 源代码网推荐 ---- 以上几种方法各有其特定的使用场合,各有其优劣,这里只作抛砖引玉,具体还要自己仔细琢磨。另外,还可以通过以下函数或方法进行数据过滤,这里就不作介绍了,只给出其函数或过程的形式: 源代码网推荐 源代码网推荐 function FindKey(const KeyValues: 源代码网推荐 array of const): Boolean; 源代码网推荐 procedure FindNearest(const KeyValues: 源代码网推荐 array of const); 源代码网推荐 function GotoKey: Boolean; 源代码网推荐 procedure GotoNearest; 源代码网推荐 function Locate(const KeyFields: string; 源代码网推荐 const KeyValues: Variant; Options: 源代码网推荐 TLocateOptions): Boolean; 源代码网推荐 源代码网推荐 ---- Delphi提供了强大的数据库开发功能,关于数据过滤技术的实现,有很多的方法,此处只是一点个人体会,供大家参考。 软件开发网 www.mscto.com 源代码网推荐 源代码网供稿. |
