14.5.1 使用GotoKey方法查找数据记录
使用Gotokey方法查询数据库中的记录的具体步骤如下:
1、确保要查找的字段是关键字或已经为它定义了辅助索引,并保证TTable部件的属性列表中有关键字段名或辅助索引名。
2、通过调用GotoKey方法,把要查找的TTable部件置成查找模式。
3、把查找值送进被查找的Field的查找缓冲区。
4、调用TTable部件的GotoKey方法,并测试它的返回值判断查找是否成功。
如果查找成功,GotoKey返回一个True值,并且表中的记录指针指向找到的记录。如果查找失败,GotoKey返回False,表中的记录指针不发生变化。
在这里要注意的是如何给Field的查找缓冲区赋值,我们知道字段对象是不可见的对象,它们没有自己的名字,在大多数情况下,要使用TTable部件的FieldByName 方法到字段列表中查找字段对象以便为它赋值。但字段缓冲区也是没有名字的,当TTable部件处于查找模式时,我们只要把查找值赋给字段对象的AsString属性就可以了。AsString的作用不只是它的表面意思。它是一个转换属性,任何赋给字段对象的AsString属性的字符串都将转换成该字段对象应于数据库表中的字段的数据类型。当然AsString不能将查找值转换成BLOB、Bytes、Memo和Graphic类型的数据,用户一般也不会查找这种数据类型的字段。
下面便是说明使用Gotokey方法查找数据记录的例子。
例14.3 当用户在Edit1部件中输入客户号码并单击查找按钮,程序便开始在Table1中查找这个客户号。如果查找成功,查找信息“查找成功”便会显示在标签Label1上,被查询到的客户的电话号码显示在标签Label2上。表中的记录指针将转移到该客户记录处。并且在网格DBGrid1中以高亮度显示这一条记录。
查询数据库中的记录
下面的程序清单是查询按钮上的OnClick事件的处理程序,它是使用Gotokey方法查找数据库中的记录的。
procedure TForm1.Button1OnClick(Sender:TObject);
begin
with Table1 do
begin
Label1.Caption:=' ';
Label1.Caption:=' ';
IndexFieldName:='CustNo';
setkey;
FieldByName('CustNo').AsString:=Edit1.Text;
If GotoKey then
begin
Label1.Caption:='查找成功';
Label1.Caption:=FieldByName('Phone').AsString;
end;
else
Label1.Caption:='查找失败';
end;
查询数据库中的记录
14.5.2 使用FindKey方法查找数据库中的记录
虽然使用上面的Gotokey方法在数据库中查找记录效果不错,但是Delphi 还提供了一种更加容易的查找方法,这就是Findkey方法,两种方法虽然很相似,但是Findkey方法更简单明了一些。
例14.4 我们可以使Findkey方法代替上面例子中的处理程序,下面是程序代码:
procedure TForm1.Button1OnClick(Sender:TObject);
var
SeekValue:string;
begin
with Table1 do
begin
Label1.Caption:=' ';
Label1.Caption:=' ';
IndexFieldName:='CustNo';
SeekValue:=Edit1.Text;
If FindKey([SeekValue]) then
begin
Label1.Caption:='查找成功';
Label1.Caption:=FieldByName('Phone').AsString;
end;
else
Label1.Caption:='查找失败';
end;
Findkey方法和Gotokey方法的根本区别在于查找值要作为参数传递给Findkey 函数。而GOtokey是不带参数的,它假定用户已经把查找值赋给了代表着被查找到的字段的查找缓冲区。
Findkey接受的参数是放在方括号中的,是用逗号分开的查找值数组。数组中的每一个值都对应于特定列的查找值,即参数中允许有多个查找值,Findkey 允许用户同时查找数据库表中的多个列。上面的程序清单中的Findkey函数只接受了变量Seekvalue这一个查找值,这个查找值对应表中的字段CustNo,CustNo是表中的关键字段。如果要同时查找表中的多个字段,必须把要查找的多个字段名赋给TTable部件的IndexFieldName属性,并用逗号分开各字段,然后把每个字段的查找值赋给Findkey的参数数组中。
14.5.3 利用GotoNearest和FindNearest执行不精确查找
在我们上面讨论的查找中,要么查找成功要么查找失败,因为我们查找的是特定查找值的一个精确匹配值。Delphi还提供了一种查找方法,即不精确查找,这样的查找绝对不会失败,它总是给用户查找出一个结果来,也许这结果并不是用户需要的,但这个查找出来的结果是最接近用户要求的。在Delphi中是利用GotoNearest和FineNearest两种方法来执行不准确查找的,它们总是从数据库中查找出与查找值最接近的匹配值。如果它们查找到与查找值精确匹配的值,那当然最好不过了,如果他们找不到精确匹配的值,它们就会把与用户指定的查找值最接近的记录提交给用户。
GotoNearest的使用方法和Gotokey一样,FindNearest的使用方法和Findkey一样。跟Gotokey一样,使用GotoNearest时必须要把查找值赋给字段的查找缓冲区,两者的不同之处在于查找值的说明方式不一样,使用GotoNearest时,说明的查找值可以是完整的也可以是不完整的,如果要对'Dunteman'进行不精确查找,在给字段的查找缓冲区赋查找值时,可以使用'Dunteman'、'Dun'或者`Du'作为查找值,这样查找出来的结果会尽可能地接近这个值的。
如果没有找到与用户指定的查找值精确匹配的记录,Delphi会调整记录指针并停留在与查找值最接近的第一个记录上。例如如果查找`Dunteman'时,没有找到精确匹配的值,记录指针可能会停留在`Dunwoody'上或者停留在更远一些的'Event'上;如果查找'Du' 没有找到精确匹配的值,记录指针可能停留在‘Duncan’上,甚至‘Dunteman'之前,总之Delphi会自己地调整记录指针,使之指向最接近查找值的记录并将该记录作为查找的结果提交给用户。
GotoNearest和FindNearest都返回一个Boolean值以表明查找是否成功。它们一般都是成功的,它们总是要把记录指针移到某处。
下面的例子是用GotoNearest方法进行不精确查找。
例14.5 创建好的窗体,在编辑框中输入一个不完整的客户所在的公司名称,并且按“不精确查找”按钮,然后观察一下查找的结果并注意记录指针指向那一条记录。反复试验几次便会理解GotoNearest是如何工作的。