4.1.2 Lookup
Lookup方法和上一节介绍的Locate方法在使用上非常地类似,它们的差别是当Locate找到查寻的数据后,它会把目前的记录位置移动到找到的这笔数据上,但是当Lookup找到查寻的数据后,它会回传找到的数据的特定字段数值,却不会移动目前的记录位置。下面即是Lookup方法的原型:
function
Lookup(const KeyFields: String; const KeyValues: Variant; const
ResultFields: String): Variant;
Lookup方法的第一个参数也是用户欲查寻的字段命名,每一个欲查寻的字段也是使用分号分隔。第二个参数则是欲查寻的字段数值,如果欲查寻多个字段,那么这个参数可以是Variant数组。Lookup方法的第一个和第二个参数的意义和前面Locate方法是一样的。
Lookup方法的第三个参数则是指定当Lookup找到欲查寻的数据之后,要回传这笔数据的那些字段数值。如果开发人员想要Lookup回传多个字段数值,那么每一个字段也是以分号分隔。
至于Lookup方法回传的数值则是第三个字段指定的字段数值,如果Lookup回传多个字段的话,那么这个回传数值就是一个Variant数组,每一个回传的字段便储存在这个Variant数组的元素之中。
现在就让我们看看使用Lookup方法查寻数据。首先以简单的单一字段来查寻数据。
单字段查寻
请使用鼠标双击图4-5窗体中的【Lookup】按钮,并且在它的事件处理函数中撰写如下的程序代码:
try
edtReturn.Text :=
dmFindData.sqlcdsTest.Lookup('SPECIES_NO', edtID.Text, 'COMMON_NAME');
except
on e : Exception do
ShowMessage(E.Message);
end;
上面的程序代码以Lookup方法查寻BIOLIFE数据表中的SPECIES_NO字段,并且以用户在edtID这个TEdit控件中输入的数值作为查寻的目标,要求Lookup方法在查寻到数据之后回传COMMON_NAME这个字段的数值,并且把回传数值显示在edtReturn这个TEdit控件中。
图4-8便是执行范例应用程序并且输入90100查寻数据的画面。从画面中可以看到当Lookup找到90100这笔数据之后,它果然会回传COMMON_NAME字段的数值“Ornate Butterflyfish”,但是目前记录的位置仍然停留在原先的记录上,而不会移动到90100这笔数据上。

图4-8 以数个字段条件来查寻数据
使用Lookup查寻并且回传单一字段的数据是非常简单的,让我们继续看看如何查寻和回传多个字段的数据。
多字段查寻
请修改上一小节的Lookup按钮的事件处理函数为如下的程序代码:
procedure TfrmMain.btnLookup2Click (Sender: TObject);
var
sFields : String;
vResult : Variant;
iCount : Integer;
begin
lStart := GetTickCount;
if (CanSearch) then
begin
sFields := GetSearchFields;
vResult :=
dmSearchData.sqlcdsTest.Lookup(sFields, GetSearchValues,
edtReturn.Text);
if (VarIsArray(vResult)) then
begin
sFields := '';
for
iCount := VarArrayLowBound(vResult, 1) to VarArrayHighBound(vResult,
1) do
begin
sFields := sFields + ';' + vResult[iCount];
end;
Delete(sFields, 1, 1);
edtReturn.Text := sFields;
end
else
edtReturn.Text := vResult;
end;
lEnd := GetTickCount;
Self.Caption := FloatToStr((lEnd - lStart) /1000.0);
end;
上面的程序代码先调用GetSearchValues,并从主窗体中的TCheckListBox中取得所有用户欲查寻的字段和数值,再从edtResult中取得用户欲取得的查寻字段回传值,然后调用Lookup方法。由于用户可以在edtReturn中输入多个字段,因此当Lookup执行完毕之后,我们先检查回传的是否是一个Variant数组,如果是,就进入一个循环,调用VarArrayLowBound以及VarArrayHighBound取得数组中实际的元素值范围,然后再一一从元素中取出Lookup回传字段数值,最后再把这些回传的数值显示在edtReturn控件之中。
图4-9至图4-11便是执行范例应用程序的画面。图4-9是以新修改过的程序代码查寻并且回传一个字段数据的画面;而图4-10则是以TOPOTYPE字段查寻“China”的数据,并且要求回传COMMON_NAME和CATEGORY两个字段的数值。图4-11则是点击了【Lookup】按钮之后,看到应用程序果然回传了COMMON_NAME和CATEGORY这两个字段的数据。

图4-9 以Lookup方法查寻一个字段并且回传一个字段的数据

图4-10 以Lookup方法查寻一个字段并且回传数个字段的数据

图4-11 以Lookup方法查寻一个字段并且回传数个字段的数据
请注意的是,Lookup并不像Locate一样可以使用模糊查寻,Lookup一定要使用一样的字段数值才能够查寻到数据。因此,如果你使用部分字符串来查寻数据的话,那么Lookup不会找到数据,而会产生一个查寻错误的异常。






