設(shè)定范圍
所謂范圍,就是指定一個上下界,篩選出落在上下界內(nèi)的一組連續(xù)記錄。為方便說明,我們先生成一個項目,并在Form1中放入如下組件:
組件名 屬性
Table1 DatabaseName:=DBDEMOS TableName:=Customer.db
DataSource1 DataSet:=Table1
DBGrid1 DataSource:=DataSource1
本例中我們使用了Delphi自帶的別名DBDEMOS下的一個數(shù)據(jù)庫:Customer.db,這是一個記錄顧客基本信息的數(shù)據(jù)庫。當我們把Table1的Active屬性置為True時,在DBGrid1中會顯示出該庫的內(nèi)容。下面我們往Form1中放入一個Button1,編寫B(tài)utton1的OnClick事件如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
with Table1 do
begin
KeyExclusive:=True;// 為True時不包括邊界值,為False時包括邊界值,缺省為False;
SetRangeStart;
Fieldbyname(CustNo).AsString:=1000; //設(shè)定范圍上界
SetRangeEnd;
FieldbyName(CustNo).AsString:=2000; //設(shè)定范圍下界
ApplyRange; //使范圍生效
end;
end;
以上是設(shè)定范圍的很典型的一組語句。運行程序,單擊按鈕后,顧客號在1000至2000之間的顧客記錄被篩選了出來。范圍一旦被設(shè)定,在整個應(yīng)用程序執(zhí)行過程中都是有效的。當然,我們可以調(diào)用CancelRange方法來暫時使范圍失效,以后需要范圍生效時,可直接調(diào)用ApplyRange方法,而不需要再次設(shè)定范圍的上下界。另外,我們可以調(diào)用EditRangeStart和EditRangeEnd的方法來改變范圍的上下界。
使用范圍的? 是,設(shè)定范圍的字段必須已建索引(Rainbow的話:這些使用范圍的時候必須的)。對沒有建立索引的字段使用范圍是不允許的。
使用過濾器
過濾器篩選出來的記錄可以是連續(xù)的,也可以是非連續(xù)的。過濾器不受索引的限制,而且即使有索引,過濾器也不依賴,也就是說,過濾出來的記錄是未經(jīng)排序的。過濾器的使用非常簡單,可以直接在Table組件的Filter屬性中寫入包含過濾條件的字符串,并把Filtered屬性置為True來啟動過濾器。在上例中,我們可以在Table1的Filter的屬性框內(nèi)寫入:(CustNo1000) and (CustNo2000) ,當我們把Table1的Filtered屬性置為True時,DBGrid1內(nèi)將顯示出顧客號在1000至2000之間的顧客記錄。當過濾條件比較復(fù)雜時,我們可以通過編寫Table1的OnFilterRecord事件來實現(xiàn)。例如:
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事件中,我們可以使用條件分支語句或者循環(huán)語句,因而非常靈活,便于完成條件很復(fù)雜的記錄篩選工作。和范圍一樣,過濾器一旦設(shè)定,就將維持到應(yīng)用程序的結(jié)束。當然,我們可以將Filtered屬性置為False來使過濾器失效。
和范圍相比,過濾器方便靈活,而且不受索引限制,但正是因為沒有索引支持,當記錄數(shù)量比較大時,過濾器的速度會受影響。因此,范圍和過濾器各有各的適用場合。
使用查詢
即通過TQuery組件來使用SQL語句實現(xiàn)記錄的篩選。大家可能對這種方法比較熟悉,這里只做簡單說明,如上例中的記錄篩選用一條很簡單的SQL語句就能實現(xiàn):
Select * from Customer
Where (CustNo1000) and (CustNo2000)
使用SQL語言可以實現(xiàn)條件很復(fù)雜的篩選,當記錄數(shù)量很大或條件很復(fù)雜時,應(yīng)盡量使用SQL語言來查詢。
和前兩種方法相比,使用查詢更加靈活多變,適應(yīng)性更強,而且也不受索引的限制。但這種通過SQL語句的篩選是一次性的。當調(diào)用TQuery的Open方法(或Active:=true)后,TQuery返回查詢結(jié)果集,之后就失去了對結(jié)果集的范圍限制。當結(jié)果集中的某些記錄發(fā)生改變(如某條記錄的Custom變?yōu)?000),不滿足篩選條件時,這種方法不能馬上察覺,必須再次調(diào)用TQuery的Open方法才能實現(xiàn)。
所謂范圍,就是指定一個上下界,篩選出落在上下界內(nèi)的一組連續(xù)記錄。為方便說明,我們先生成一個項目,并在Form1中放入如下組件:
組件名 屬性
Table1 DatabaseName:=DBDEMOS TableName:=Customer.db
DataSource1 DataSet:=Table1
DBGrid1 DataSource:=DataSource1
本例中我們使用了Delphi自帶的別名DBDEMOS下的一個數(shù)據(jù)庫:Customer.db,這是一個記錄顧客基本信息的數(shù)據(jù)庫。當我們把Table1的Active屬性置為True時,在DBGrid1中會顯示出該庫的內(nèi)容。下面我們往Form1中放入一個Button1,編寫B(tài)utton1的OnClick事件如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
with Table1 do
begin
KeyExclusive:=True;// 為True時不包括邊界值,為False時包括邊界值,缺省為False;
SetRangeStart;
Fieldbyname(CustNo).AsString:=1000; //設(shè)定范圍上界
SetRangeEnd;
FieldbyName(CustNo).AsString:=2000; //設(shè)定范圍下界
ApplyRange; //使范圍生效
end;
end;
以上是設(shè)定范圍的很典型的一組語句。運行程序,單擊按鈕后,顧客號在1000至2000之間的顧客記錄被篩選了出來。范圍一旦被設(shè)定,在整個應(yīng)用程序執(zhí)行過程中都是有效的。當然,我們可以調(diào)用CancelRange方法來暫時使范圍失效,以后需要范圍生效時,可直接調(diào)用ApplyRange方法,而不需要再次設(shè)定范圍的上下界。另外,我們可以調(diào)用EditRangeStart和EditRangeEnd的方法來改變范圍的上下界。
使用范圍的? 是,設(shè)定范圍的字段必須已建索引(Rainbow的話:這些使用范圍的時候必須的)。對沒有建立索引的字段使用范圍是不允許的。
使用過濾器
過濾器篩選出來的記錄可以是連續(xù)的,也可以是非連續(xù)的。過濾器不受索引的限制,而且即使有索引,過濾器也不依賴,也就是說,過濾出來的記錄是未經(jīng)排序的。過濾器的使用非常簡單,可以直接在Table組件的Filter屬性中寫入包含過濾條件的字符串,并把Filtered屬性置為True來啟動過濾器。在上例中,我們可以在Table1的Filter的屬性框內(nèi)寫入:(CustNo1000) and (CustNo2000) ,當我們把Table1的Filtered屬性置為True時,DBGrid1內(nèi)將顯示出顧客號在1000至2000之間的顧客記錄。當過濾條件比較復(fù)雜時,我們可以通過編寫Table1的OnFilterRecord事件來實現(xiàn)。例如:
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事件中,我們可以使用條件分支語句或者循環(huán)語句,因而非常靈活,便于完成條件很復(fù)雜的記錄篩選工作。和范圍一樣,過濾器一旦設(shè)定,就將維持到應(yīng)用程序的結(jié)束。當然,我們可以將Filtered屬性置為False來使過濾器失效。
和范圍相比,過濾器方便靈活,而且不受索引限制,但正是因為沒有索引支持,當記錄數(shù)量比較大時,過濾器的速度會受影響。因此,范圍和過濾器各有各的適用場合。
使用查詢
即通過TQuery組件來使用SQL語句實現(xiàn)記錄的篩選。大家可能對這種方法比較熟悉,這里只做簡單說明,如上例中的記錄篩選用一條很簡單的SQL語句就能實現(xiàn):
Select * from Customer
Where (CustNo1000) and (CustNo2000)
使用SQL語言可以實現(xiàn)條件很復(fù)雜的篩選,當記錄數(shù)量很大或條件很復(fù)雜時,應(yīng)盡量使用SQL語言來查詢。
和前兩種方法相比,使用查詢更加靈活多變,適應(yīng)性更強,而且也不受索引的限制。但這種通過SQL語句的篩選是一次性的。當調(diào)用TQuery的Open方法(或Active:=true)后,TQuery返回查詢結(jié)果集,之后就失去了對結(jié)果集的范圍限制。當結(jié)果集中的某些記錄發(fā)生改變(如某條記錄的Custom變?yōu)?000),不滿足篩選條件時,這種方法不能馬上察覺,必須再次調(diào)用TQuery的Open方法才能實現(xiàn)。