天天看點

Delphi Locate 詳解

TDataSet控件以及它的繼承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在結果資料集中查尋資料。程式首先必須使用SQL指令從後端資料庫中取得資料并且形成結果資料集,然後才使用Locate方法查尋資料。

當使用Locate方法查尋資料時,開發人員可以使用任何的字段條件來查尋,而無須理會這個字段是不是索引字段。當然,當開發人員使用索引字段來查尋資料時,Locate會直接使用索引來幫助查尋,是以速度會非常快速。如果開發人員使用非索引字段查尋資料,那麼Locate也将使用目前它知道最好的方式來查尋資料。

此外,Locate方法不隻能夠查尋一個單一的字段,它同時還能以數個字段的條件來查尋資料。開發人員可以組合數個字段的查尋條件在結果資料集中查尋資料。

由于Locate能夠查尋各種不同資料類型的字段,是以Locate方法在設定查尋條件時是以Variant類型的變量來儲存查尋數值的。當開發人員要使用多個字段來查尋資料時必須建立一個Variant數組來儲存查尋數值。

此外,Locate方法在查尋資料時也能夠使用模糊條件标準來尋找特定的資料,例如開發人員可以要求Locate在查尋資料時不分大小寫,或是以部分字元串來查尋資料,這樣就為開發人員提供了非常大的彈性空間。

下面就是Locate的方法原型:

function Locate(const KeyFields: String; const KeyValues:Variant;

Options: TLocateOptions): Boolean;

Locate方法接受三個參數。第一個參數KeyFields是開發人員要查尋的字段名稱。如果開發人員要查尋單一字段,那麼隻需要直接傳入此字段名稱。如果要以多個字段條件來查尋,那麼便需傳入所有的字段名稱,并且以分号分隔每一個字段名稱。

第二個參數KeyValues是指開發人員欲查尋的條件數值。它的類型是Variant,因為Variant幾乎可以代表任何的類型,是以開發人員可以查尋整數、小數、字元串,或是布爾值的條件。同樣,如果開發人員隻查尋一個條件數值,那麼就可以直接在這個參數位置傳入。如果是以多個字段條件來查尋,那麼開發人員必須建立一個Variant數組,然後在這個數組中的每一個元素中指定條件數值,再傳遞Variant數組到這個參數中。至于Variant數組則可以使用VarArrayOf方法,或是使用VarArrayCreate方法來建立,在稍後的範例中會有程式代碼說明。

Locate方法的最後一個參數TLocateOptions則是讓開發人員在查尋字元串字段時,指定以什麼标準來查尋資料。開發人員可以指明不分大小寫來查尋字元串資料,或是以部分字元串數值來查尋資料。下面就是TLocateOptions的類型定義:

type

TLocateOption = (loCaseInsensitive, loPartialKey);

TLocateOptions = setof TLocateOption;

在使用Locate時,如果使用loCaseInsensitive就代表不分大小寫查尋資料;如果使用loPartialKey就代表要以部分字元串來查尋資料。

Locate方法的回傳數值是布爾值,它代表Locate方法是否成功找到了要查尋的資料。如果找到,就回傳True,否則就回傳False。當Locate方法成功地查尋到資料之後,它就會移動目前的記錄位置到這筆資料上,否則就會停留在Locate開始查尋之前的記錄位置上。

請注意Locate方法查尋資料的結果是一筆資料,是以,如果你想查尋符合條件的一群資料,那麼你可以使用稍後将介紹的過濾器(Filter)功能。

現在,讓我們使用數個範例來說明如何使用Locate方法。下面的範例程式代碼即是以一個字段來查尋資料,它是以資料表的NAME字段來查尋擁有“李維”數值的這筆資料,由于最後一個參數是空集合,是以,這代表NAME字段必須擁有一模一樣的“李維”這個數值才算查尋成功。

aSQLClientDataSet.Locate('NAME', '李維' , []);

下面的程式代碼則以City和District兩個字段來查尋資料,查尋的條件是City字段擁有“台北”數值,而District字段擁有“大安區”數值的資料。

aSQLClientDataSet.Locate('City;District',VarArrayOf(['台北,大安區']),[]);

下面的程式代碼和第一個範例非常相像,隻是這個程式代碼查尋的是第一筆在NAME字段以“李”數值開頭的資料。

aSQLClientDataSet.Locate('NAME', '李', [loPartialKey]);

最後一個範例則是查尋ID字段中任何以“A12”數值開頭的第一筆,而且是不分A大小寫的資料。

aSQLClientDataSet.Locate('ID', 'A12', [loCaseInsensitive,loPartialKey]);

繼續閱讀