delphi中locate用法
上一篇 / 下一篇 2008-05-29 15:14:40 / 个人分类:Delphi
AM
_f-Z|,\7|*f0TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据。程序首先必须使用SQL命令从后端数据库中取得数据并且形成结果数据集,然后才使用Locate方法查寻数据。
;G
?Z.r1b3D `S:n0当使用Locate方法查寻数据时,开发人员可以使用任何的字段条件来查寻,而无须理会这个字段是不是索引字段。当然,当开发人员使用索引字段来查寻数据时,Locate会直接使用索引来帮助查寻,因此速度会非常快速。如果开发人员使用非索引字段查寻数据,那么Locate也将使用目前它知道最好的方式来查寻数据。
WKT1Kq7W$pEm0此外,Locate方法不只能够查寻一个单一的字段,它同时还能以数个字段的条件来查寻数据。开发人员可以组合数个字段的查寻条件在结果数据集中查寻数据。51Testing软件测试网8G-Hi*OJ2AR
由于Locate能够查寻各种不同数据类型的字段,因此Locate方法在设定查寻条件时是以Variant类型的变量来储存查寻数值的。当开发人员要使用多个字段来查寻数据时必须建立一个Variant数组来储存查寻数值。
g]-E6H7qK0此外,Locate方法在查寻数据时也能够使用模糊条件标准来寻找特定的数据,例如开发人员可以要求Locate在查寻数据时不分大小写,或是以部分字符串来查寻数据,这样就为开发人员提供了非常大的弹性空间。51Testing软件测试网6Wj Wvqb(J
下面就是Locate的方法原型:
GpvTO
N:Ho
wz%~0function Locate(const KeyFields: String; const KeyValues: Variant;51Testing软件测试网8K5B[0J(l\
Options: TLocateOptions): Boolean;
;Rv+|cT9``*R"s*E0Locate方法接受三个参数。第一个参数KeyFields是开发人员要查寻的字段名称。如果开发人员要查寻单一字段,那么只需要直接传入此字段名称。如果要以多个字段条件来查寻,那么便需传入所有的字段名称,并且以分号分隔每一个字段名称。51Testing软件测试网XMd1I gx}
第二个参数KeyValues是指开发人员欲查寻的条件数值。它的类型是Variant,因为Variant几乎可以代表任何的类型,因此开发人员可以查寻整数、小数、字符串,或是布尔值的条件。同样,如果开发人员只查寻一个条件数值,那么就可以直接在这个参数位置传入。如果是以多个字段条件来查寻,那么开发人员必须建立一个Variant数组,然后在这个数组中的每一个元素中指定条件数值,再传递Variant数组到这个参数中。至于Variant数组则可以使用VarArrayOf方法,或是使用VarArrayCreate方法来建立,在稍后的范例中会有程序代码说明。51Testing软件测试网G3E!V~1GR)R
Locate方法的最后一个参数TLocateOptions则是让开发人员在查寻字符串字段时,指定以什么标准来查寻数据。开发人员可以指明不分大小写来查寻字符串数据,或是以部分字符串数值来查寻数据。下面就是TLocateOptions的类型定义:51Testing软件测试网ElbhW
V
type51Testing软件测试网s!a8K+Jj
TLocateOption = (loCaseInsensitive, loPartialKey);
E;pa"@@$g(^4b5I)r0TLocateOptions = setof TLocateOption;51Testing软件测试网K?~8~)PW
在使用Locate时,如果使用loCaseInsensitive就代表不分大小写查寻数据;如果使用loPartialKey就代表要以部分字符串来查寻数据。51Testing软件测试网#U s2[D&@d{
Locate方法的回传数值是布尔值,它代表Locate方法是否成功找到了要查寻的数据。如果找到,就回传True,否则就回传False。当Locate方法成功地查寻到数据之后,它就会移动目前的记录位置到这笔数据上,否则就会停留在Locate开始查寻之前的记录位置上。51Testing软件测试网.G%Y1} My2`w-~_Y
请注意Locate方法查寻数据的结果是一笔数据,因此,如果你想查寻符合条件的一群数据,那么你可以使用稍后将介绍的过滤器(Filter)功能。
4V9rV:j_k2q0现在,让我们使用数个范例来说明如何使用Locate方法。下面的范例程序代码即是以一个字段来查寻数据,它是以数据表的NAME字段来查寻拥有“李维”数值的这笔数据,由于最后一个参数是空集合,因此,这代表NAME字段必须拥有一模一样的“李维”这个数值才算查寻成功。51Testing软件测试网K)z KNU
aSQLClientDataSet.Locate('NAME', '李维' , []);51Testing软件测试网;p"x5OKB
下面的程序代码则以City和District两个字段来查寻数据,查寻的条件是City字段拥有“台北”数值,而District字段拥有“大安区”数值的数据。
-vXv0x
J/m0aSQLClientDataSet.Locate('City;District', VarArrayOf(['台北,大安区']),[]);51Testing软件测试网
gXA,zZ&yw}sc
下面的程序代码和第一个范例非常相像,只是这个程序代码查寻的是第一笔在NAME字段以“李”数值开头的数据。
F.Z$Ree!L*F0aSQLClientDataSet.Locate('NAME', '李', [loPartialKey]);51Testing软件测试网C,Z;h;eGb?X
最后一个范例则是查寻ID字段中任何以“A12”数值开头的第一笔,而且是不分A大小写的数据。51Testing软件测试网$w4cd4UN,P
aSQLClientDataSet.Locate('ID', 'A12', [loCaseInsensitive ,loPartialKey]);
&R4i#Q#{,[.mu`0现在就让我们使用Locate方法在范例应用程序中查寻数据。
|xj1efV0wK0单字段查寻51Testing软件测试网4w']-iU|G!Y
首先让我们以单一的字段来展示如何查寻数据,稍后再说明如何以多个字段查寻数据。现在请双击图4-3中的【Locate】按钮,并且在它的事件处理函数中撰写如下的程序代码:
;y/FBae0dmSearchData.sqlcdsTest.Locate('SPECIES_NO', edtID.Text, [loCaseInsensitive, loPartialKey]);51Testing软件测试网7QOzz,LO,qF2N
这行程序代码使用数据模块中的TSimpleDataSet来查寻SPECIES_NO字段中包含用户在edtID这个TEdit控件中输入的数值。现在请执行这个范例应用程序,并且在主窗体右边的TEdit控件中输入数值来查寻数据。例如图4-4便是范例应用程序执行的画面。当我们在TEdit控件中输入90100并且点击【Locate】按钮之后,TSimpleDataSet便会立刻找到并且把目前的记录位置移动到这笔数据之上。51Testing软件测试网+{/z/m_;pd8N
e~$Kj{ Q4vc0图4-4 Locate找到90100这笔数据51Testing软件测试网1N G~U(wi/J
使用Locate方法查寻单一字段的数据是非常简单的,现在再让我们看看如何使用多个字段来查寻数据。51Testing软件测试网T ay%M'FI*W
I2t
多字段查寻
$s]*[Z
KtH d0请在Delphi中建立一个应用程序,并与上面的范例一样建立一个数据模块,并且传入TSQLConnection、TSimpleDataSet,连接到相同的范例数据库CHINESEDEMO.GDB。接着在主窗体中放入如图4-5所示的控件。在主窗体中我们使用了一个TComboBox,在这个TComboBox中将会填入范例数据表所有的字段名称,以便让用户可以自由选择要使用来查寻的字段。51Testing软件测试网4_!_c0W+M.fR
另外,主窗体使用了一个TCheckListBox,它主要是用来储存所有用户输入的查寻条件。当用户在查寻字段中选择了一个字段,然后在查寻数值中输入了欲查寻的数值时,那么就可以点击主窗体中往下箭头的按钮把这个查寻条件加入到TCheckListBox中。当用户输入完所有查寻的条件之后,就可以点击主窗体中的【Locate】按钮以开始查寻数据。此时范例应用程序就会分析TCheckListBox中所有的查寻字段和查寻数值,再调用Locate以多个字段条件来查寻数据。
y{^9J&l