首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

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_NAMECATEGORY两个字段的数值。图4-11则是点击了Lookup按钮之后,看到应用程序果然回传了COMMON_NAMECATEGORY这两个字段的数据。

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

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

 

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

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