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

數據過濾

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章