ADOTable.Locate 使用问题!!(30分)

  • 主题发起人 主题发起人 gamei
  • 开始时间 开始时间
G

gamei

Unregistered / Unconfirmed
GUEST, unregistred user!
我刚学delphi ,最近做一个图书管的管理系统,可在还书这个模块,须检测学生编号,和借阅书号
是否吻合,写了以下语句
if (form1.ADOTable2.Locate('书号',edit4.Text,[]))and
(form1.ADOTable2.Locate('学生编号',edit3.Text,[]))
then
。。。。
可每次记录都指向学生编号的第一个记录,书号却不吻合。

 
adotable2.locate('书号;学生编号',VarArrayOf([edit4.text,edit3.text]),[loPartialKey])
 
if adotable2.locate('书号;学生编号',VarArrayOf([edit4.text,edit3.text]),[loCaseInsensitive])=false
then messagebox('不吻合');
我之所以用[loCaseInsensitive], 是因为你是要验证书号和学生编号是否能对应在一个学生
或者说两者对应同一记录。 用这个选项就是严格匹配的。
例如: 输入书号10115, 学生编号168, 用这个选项, 它只严格匹配书号为10115
并且学号为168的记录, 如果找不到, 则locate返回值为False, 即数据集为空
而楼上用的[loPartialKey]是模糊匹配, 即:它找书号类似10115(例如1,10,101,1011,10115)
或者(注意是“或者”而不是“且”) 学号类似168(例如1,16,168)的所有记录。找到的是一
大堆记录, 根本谈不上对应关系。

另外顺提: 对于locate函数, 它是一个通用的东东, table, clientdataset,adotable
等等都有这个。

帮助原文
VCL Reference
TDataSet.Locate

Implements a virtual method for searching a dataset for a specified record and making it the active record.

function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions
): Boolean; virtual;

Description

This function

Checks whether the dataset is unidirectional, and if so, raises an EDatabaseError exception.
Returns False, indicating that a matching record was not found and the active record was not changed.

Descendant classes that are not unidirectional override this method so that it locates the record where the fields identified by the semicolon-separated list of fields in KeyFields have the values specified by the Variant or Variant array KeyValues. Options indicates whether the search is case insensitive and whether partial matches are supported. Locate returns True if a record is found that matches the specified criteria and that record is now active.

参数说明:
const KeyFields: string; 字段名 表列 例如 '书号;学生编号'
const KeyValues: Variant; 字段值 阵列 例如VarArrayOf([edit4.text,edit3.text])或者VarArrayOf(['10115','168'])
Options: TLocateOptions 定位操作类
返回值:Boolean

关于TLocateOptions的取值
值 含义
[loCaseInsensitive] Key fields and key values are matched without regard to case. 严格匹配
[loPartialKey] Key values can include only part of the matching key field value; for example, 'HAM' would match both 'HAMM' and 'HAMMER.' 模糊匹配

 
代鱼帮助人真是帮到底呀,热心之人,呵呵,帮顶
 
带鱼,大富翁因你而精彩!谢谢
 
只是问题还有点;我还要检查“归还日期”,定义的是文本型,我现在要查到“归还日期”为空时,
写下以下语句,为什么不能执行?
var
empty:string;
.....
enpty:='';
if form1.ADOTable2.Locate('书号;学生编号;归还日期',Vararrayof([edit4.Text,edit3.Text,empty]),[])=false then showmessage('学生编号,图书书号输入不匹配,或者该书还没有归还')
...
这种还不行
if form1.ADOTable2.Locate('书号;学生编号;归还日期',Vararrayof([edit4.Text,edit3.Text,'']),[])=false then showmessage('学生编号,图书书号输入不匹配,或者该书还没有归还')
为什么?
 
你的意图是: 除了检验书号,学生编号是否匹配之外, 还想顺带检查一下是否归还,
即: 归还日期空, 该书没有归还, 是不是?

呵呵, 解决问题的想法,思路是对的, 但是你对locate还是不够了解。
你定义了一个String变量empty, 然后将它做字段值阵列的元素。这些语法都没错,但是
你注意到没有, 你的意图是: 找到该书号, 学生编号匹配的记录, 如果定位到了该记
录, 说明匹配了, 有意义了, 接着就该盘查此人还书了没(哼哼, 休想溜掉), 就是说
在当前定位到的记录上(即locate到的这个记录)检查“归还日期”字段是否有东东。如果
没东西, 那么对不起“恭喜发财, 书拿来”。
if adotable2.locate('书号;学生编号',VarArrayOf([edit4.text,edit3.text]),[loCaseInsensitive])=false
{检查是否吻合,不吻合则只弹个消息, 不继续处理还书事宜}
then messagebox('不吻合')
else {否则吻合, 有必要展开索书大法}
begin //这里即是索书大法了
if (adotable2.fieldvalue=null) or (adotable2.fieldvalue='') then
msgbox('哼,哼, 要想从此过, 留下3x6=18本书来')
else msgbox('你的, 开路开路的!');
end;
从这个示例上你可以看出,解决的办法是: 首先用locate定位记录, 定位不成功, 弹个
消息当然什么也不做(嘿嘿省事啊……)。
然后,如果定位到了当然要处理了。这时候既然人已经找到了, 即已经定位到了, 还有
必要使用locate大法吗? locate是专管定位的, 判断有无只是一个附属功能而已。
因此直接判断它的字段值就OK了。注意:ADOTable下的获取字段值属性是不是fieldvalue咱
不知道, 你自己摸索一下, 反正总有一个的。我想应该异曲同工。

你将empty代进去, 并且判断false, 刚好哪壶不开提哪壶, 本意是发现empty为空,报告
一下, 但按false逻辑locate定位不到则报告, 既然你本来找的是空, 当然locate是找到
的(而你本来就是要它找到), 返回值显然为true, 它一看, 主人叫他找到后闭嘴, 找不
到(false)才告诉。 它吓得不敢告诉你了。

其实我要告诉你的意思是locate的专职是查找和定位。用他判断是否找得到只是一个附加
功能, 有时候能用, 有时候别难为他。

我上面写的那一截忘了告诉你一句, locate的返回值true匹配成功, 即定位到了记录(注
意定位到的记录不一定唯一), false失败, 没有定位到任何记录。

判断字段值是什么, 应该交给fieldvalue之类的获取字段值的属性来做。

另外, 提个小小建议: 赶快把“归还日期”字段改为DateTime类型。 这样用日期做索引
方便得多(你可以用一个DatetimePicker组件来搞定)。 而且不必象String类型那样需要判
断是null还是''。 他只有两个状态:NULL和非NULL。
 
多人接受答案了。
 

带鱼你好,我安装上rm,不会用,怎样学习呢?哪里有比较好的说明书?
或是通过别的途径来学用;论坛上公布的demo网址不能访问,谁能给我指点
一下怎么快速入门,我看了fast report 的教程不太明白。我急着用呢,谢谢!
 
Report machine吗? 我看还不一定比fast report好呢, 我看它是在fast report的基础
上做的改进。虽然满足国人的需要, 但是它的BUG还没有得到验证, 想必不少, 如果用
在自己的程序上, 等发现了也晚了。
其实fast report也可以做中国式的报表, 双击预览界面, 一样可以弹出报表对象编辑
器,其实这些东西本身是fast report的而不是Report machine的。Report machine吹的
牛我看见了, 有点言过其实。
至少fast report经过了无数人的验证, BUG嘛显然不会太多。
另外, 大富翁上fast report的帖子很多, 你瞧上两眼, 想必有心得。
fast report自己有帮助, 可惜是俄文的, 中文windows打不开而已。
 
后退
顶部