Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
Jade Zork wrote:
請問:
在 TTable.Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
中的 TLocateOptions的 loCaseInsensitive, loPartialKey 代表什麼意思,如何使用? 謝謝∼∼
Deng-Guey Chen <dgchen@ms2.hinet.net>wrote:
Jade Zork 你好!
可以自Delphi Help中,查詢索引TLocateOptions即可得知:
loCaseInsensitive表示搜尋時忽略大小寫 loPartialKey表示搜尋時只須部份值吻合
使用如下:
var Success: Boolean; begin success:=CustTable.Locate('Company','abc',[lopartialkey,locaseInsensitive]); end;
如此,只要Company欄位包含abc三個字且不分大小寫者,則傳回True
我覺得不對喔! 加上 loPartialKey 並不是「包含於」的找法吧! 應該只是開頭含有(開頭相等但長度不等)時仍視為相同的一種找法.
看 OnLine Help 時,一直覺得多欄位的查詢應該也可以, loPartialKey 對於多欄位查詢的影響相信是很有趣的問題, 可惜我一直連語法都通不過, 卡在第二個參數, 通過了在執行期間卻又有例外訊息....
有沒有網友試出多欄位的 locate 呢? 教一下好嗎? 實在是踹不出來了....
我先將單一欄位的心得以比較雞婆的方式分享出來, 用 Locate 方法找資料時, 可以選擇要不要:
![]() |
忽略大小寫(loCaseInsensitive) |
![]() |
是否採用局部相同的找法(loPartialKey). 此時, 只要搜尋條件的字串相等於欄位內容的開頭文字, 即使長度不等, 仍然可判定為相等.(就好像 xBASE 的 set exact off 的情形) |
用以下的例子來說明比較容易懂. 假定 Table1 為:
cu_no | cu_name |
AMKB | 王大同 |
ACJC | 金士欽 |
BDFD | 林火金 |
□若 sTest 為 'AMKB': Table1.Locate('cu_no', sTest, []) ==> 當然可以找到 □若 sTest 為 'AC': Table1.Locate('cu_no', sTest, []) ==> 找不到 Table1.Locate('cu_no', sTest, [loPartialKey]) ==> 找到 'ACJC 金士欽' 這筆記錄. 因為集合中有 loPartialKey 這個項目, 此時, 'AC' 相同於 'ACJC' 的開頭兩個字元, 即使兩者長度不等, 也算找到. □若 sTest 為 'ac': Table1.Locate('cu_no', sTest, [loPartialKey]) ==> 找不到, 因為區分大小寫之故, 所以 'AC' 雖開頭相同於'ACJC', 也不能算作符合條件. Table1.Locate('cu_no', sTest, [loCaseInsensitive, loPartialKey]) ==> 找到 ACJC 金士欽 這筆記錄. 此時不再區分大小寫了. 可以順利找到接近的資料.
簡言之, Locate() 的第三引數如果是空集合, 那表示找到的資料必須大小寫與資料長度均相等, 也就是完全相等的方式搜尋資料; 而集合中的元素, 視情況加入 loCaseInsensitive(不區分大小寫) . loPartialKey(局部相等)則提供了搜尋近似資料的彈性作法.
如果條件只有中文字呢? loCaseInsensitive就沒有什麼意義, 加與不加都不影響結果; 局部搜尋仍是有效的.
Deng-Guey Chen <dgchen@ms2.hinet.net> wrote:
達智兄:
loPartialKey 確實不是「包含於」的意思,而是「開頭含有」.還好你的糾正,以免誤導.
至於多欄位查詢的問題,提出一點作法:
![]() |
1.搜尋值採用Variants,使得搜尋條件可指定不同的資料型態. |
![]() |
2.字串內指定多欄位,以分號隔離各項目. |
![]() |
3.利用VarArrayOf函數,傳入多個搜尋值. |
如同上例:
Table1.Locate('cu_no;cu_name', VarArrayOf(['ac','金']), [loCaseInsensitive, loPartialKey]) ==> 找到 ACJC 金士欽 這筆記錄.
Yes, 承教了, 十分感謝! ^_^
剛才又多玩了一下, Locate 真的有一些使用上的細節(唉! Help與手冊都不提一下嗎? ... )
![]() |
1. Table1.Locate('cu_no;cu_name', ... 如果不小心寫成Table1.Locate('cu_no; cu_name', ... 也就是欄位間多空了一個空格,執行時就有找不到 cu_name的例外訊息... :( 這也是我之前一直試不出來的原因, 唉! 程式設計真是高風險的職業, 錯一個空白就全錯. |
![]() |
2. loPartialKey 在兩個欄位搜尋時, 對於第一搜尋欄位似乎沒有作用,不知大家試的情形是如何呢?
1) 假如用 Table1.Locate('cu_no;cu_name', VarArrayOf(['ac','金']), [loCaseInsensitive, loPartialKey]) ==> 找不到. 2) 假如用 Table1.Locate('cu_no;cu_name', VarArrayOf(['ACJC','金']), [loCaseInsensitive, loPartialKey]) ==> 可以找到 ACJC 金士欽 這筆記錄. loCaseInsensitive對第一欄位仍然有效, 不知道這能不能確認是一個 Bug |
![]() |
3. 可能我擴大解釋了 OnLine Help 的說明, 原本以為兩個欄位以上搜尋時, 雖然其中一項條件不符, 在 loPartialKey 建立時, 應該還是可以找到近似值, 可惜我錯了, 兩個欄位以上時, 只要有一個欄位不對, 就找不到了. |
![]() |
4. 至於加上數值型態的查詢後, loCaseInsensitive 與 loPartialKey 對數值資料無效是意料中的, 但在兩個欄位以上聯合查詢時,按第 3 點的結果如果這個數值條件不能滿足, 即使其他欄位長度字母完全相等, locate的的結果也是 False. |
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |