程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi數據庫編程新手指南(08)

Delphi數據庫編程新手指南(08)

編輯:Delphi

 如前所述,無論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方法。這些方法是搜索已過濾數據集最好的方式,因為每次調用這些方法時過濾器就會被重新應用。因此,如果先前不匹配過濾規則的記錄,在修改後,與過濾規則相匹配時,它們將在搜索執行前被納入數據集。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved