第十四章-简单数据库应用的创建及MASTAPP介绍(二)(4)

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是如何工作的。

时间: 2024-09-23 13:46:16

第十四章-简单数据库应用的创建及MASTAPP介绍(二)(4)的相关文章

第十四章-简单数据库应用的创建及MASTAPP介绍(一)(1)

Delphi中嵌入的数据库应用开发工具如Database Form Expert具有很强大的功能,我们不需要编写任何程序代码便可以快速地创建一个简单的数据库应用程序,甚至还能创建基于多个数据库表的主要──明细型数据库应用程序. 本章主要介绍用Delphi开发简单的数据库应用程序的一般方法和步骤,首先让读者对Delphi强劲的数据库应用开发工具有一个直观的印象,然后在此基础上进行复杂的数据库应用程序的设计,本章主要包括以下内容: ● 创建数据库应用窗体 包括用Database Form Exper

第十四章-简单数据库应用的创建及MASTAPP介绍(一)(3)

14.3 创建主要──明细数据库应用 我们前面在介绍的基于单个数据库表的数据库应用程序只能对数据库表进行简单的管理,大多数只用来浏览单个数据库表中的记录信息,如果我们想浏览多个相关的数据库表中的记录信息,就必须要创建主要──明细型数据库应用程序. 在主要──明细型数据库应用程序中,一个数据库表作为主要表,其中存放着综合信息,其他的数据库表和主要数据库表相关联,它们当中存放着更详细的信息.例如,当数据库表Customer.DB作为主表,它包含着客户的综合信息如编号.姓名.所在公司的名称等等.而数据

第十四章-简单数据库应用的创建及MASTAPP介绍(三)(3)

14.7 插入和删除记录 虽然我们使用DBD或者在应用程序窗体中用TDBNavigator可以插入.删除表中的记录,但是任何重要的数据库应用程序都是根据最终用户的命令完成此类操作的.同样,如果我们掌握了字段对象及其用法,修改数据库中的记录,插入和删除记录将变得非常容易. 要想删除表中的某一条记录,首先将记录指针移到该记录处,然后调用delete方法,这样,当前指针所在的记录就会被删除,而且我们在进行删除操作时,不必将TTable部件设置成编辑状态.当前指针所在的记录被删除之后,被删除记录下面的所

第十四章-简单数据库应用的创建及MASTAPP介绍(三)(1)

利用GotoNearest方法执行不精确查找 窗体中的"不精确查找"按钮的事件处理过程代码如下: procedure TForm1.Button1Click(Sender: TObject); begin with table1 do begin IndexFieldNames:='Company'; setkey; FieldByName('Company').AsString:=Edit1.text; GotoNearest; label3.caption:=FieldByName

第十四章-简单数据库应用的创建及MASTAPP介绍(二)(2)

14.4.4 字段对象的访问 字段对象在应用程序中有动态生成的,也有通过字段编辑器Fields Editor 创建的永久性的,它们虽然在设计和运行阶段都是不可见,但是它们跟其他的对象一样都拥有自己的属性.方法和事件,因此我们在应用程序中是可以对字段对象进行控制和访问的. 因为动态字段对象是没有自己的名字的,永久性的字段对象有自己的名字,所以对这两种字段对象的访问方法是不一样的. 14.4.4.1 动态字段对象的访问 动态字段对象存在于数据集部件TTable和TQuery部件中,它们是随着磁盘上的

第十四章-简单数据库应用的创建及MASTAPP介绍(一)(4)

14.4 字段对象的使用 Ttable和TQuery部件中有一个TField类型的属性Fiedls,Fields是TField类型的对象的列表,TField对象列表是Delphi数据库中较难以理解的一个对象,它是 TTable 部件和TQuary部件的一部分,它们是不能够选择到窗体中的独立的部件,而且无论是在设计阶段还是在程序运行过程中,它们都没有可见的图像.即使到Object Inspector窗中察看它们也很困难. Tfield对象是在打开磁盘上的数据库表时动态产生的,并在数据库表被关闭时自

第十四章-简单数据库应用的创建及MASTAPP介绍(三)(4)

14.8 输入数据的有效性验证 当用户向一个数据库表中插入新记录或修改原有记录时,我们必须确保用户输入的数据是有效的,为此Delphi通过三种不同的途径用来验证用户输入的数据是否有效. 这三种途径是:基于数据库表的有效性验证.基于字段的有效性验证.基于记录的有效性验证. 基于数据库表的有效性验证: 在用户创建数据库表时就建立有效性验证机制,如在使用DBD创建一个表时,我们可以为创建的数据库表说明一些验证手段,包括字段的最大值,最小值,图形字段的显示格式等等.在设定这些有效性验证机制时,不需要编写

第十四章-简单数据库应用的创建及MASTAPP介绍(三)(2)

14.6.2 实现异常保护的TRY...FINALLY语句 上面的程序存在着潜在的危险,在实际应用过程中,可能因为某些原因使得对数据库表的更新不能进行下去.如当程序试图执行Post方法将修改后的记录写回磁盘时,而又因为某种原因磁盘没有准备好,这时便出现了异常.当出现异常时,应用程序会暂停下来并且会弹出一对话框显示有关的错误信息,在用户单击错误信息对话框之后,程序将继续执行到某一个地方去,而这个地方常常不是用户所能预料到的.在我们的程序中, 在执行Post方法之前,窗体中所有的部件与TTable部

第十四章-简单数据库应用的创建及MASTAPP介绍(二)(3)

14.4.5 设定字段对象的显示格式 我们即可以在设计阶段设定字段对象的显示格式,也可以在运行过程中通过程序代码来设定字段对象的显示格式. 例14.2 在如图14.10所示的窗体中,再增加一个TaxRate字段,并在程序设计过程中设定它的显示格式为0.00%,即设置TaxRate字段对象的DisplayFormat属性为0.00% , 若TaxRate的值为0.085那么在网格部件中其显示的格式为8.50%. 在运行过程中我们通过程序代码来设定字段Phone的显示格式,美国的电话表示形式与中国的