我用的DLEPHI6+ado+access ,在表单上做了一个按钮,点击按钮实现查询功能,该按钮代码如下:(编译的时候提示[Error] dengjika.pas(108): Undeclared identifier: 'Findkey‘)  望各位大虾给出解决办法。
procedure TF_dengjika.queryClick(Sender: TObject);
begin
ADOTable1.IndexFieldNames:='姓名';
if length(DBEdit1.Text)=0 then
begin
  messagedlg('请输入姓名!',mterror,[mbok],0);
end
else
  if ADOTable1.Findkey([DBEdit1.Text]) then  //该行有问题
  begin
    DBEdit2.Text:=adotable1.fieldbyname('性别');
    DBEdit3.Text:=adotable1.fieldbyname('出生年月').AsString;
    DBEdit4.Text:=adotable1.fieldbyneme('文化程度');
    DBEdit5.Text:=adotable1.fieldbyneme('参加工作时间').AsString;
    DBEdit6.Text:=adotable1.fieldbyneme('连续工龄');
    DBEdit7.Text:=adotable1.fieldbyneme('家庭地址');
    DBEdit8.Text:=adotable1.fieldbyneme('失业原因');
    DBEdit9.Text:=adotable1.fieldbyneme('失业时间').AsString;
    DBEdit10.Text:=adotable1.fieldbyneme('应发月数');
    DBEdit11.Text:=adotable1.fieldbyneme('从').AsString;
    DBEdit12.Text:=adotable1.fieldbyneme('至').AsString;
    DBEdit13.Text:=adotable1.fieldbyneme('实发月数');
    DBEdit14.Text:=adotable1.fieldbyneme('原工作单位');
    DBEdit15.Text:=adotable1.fieldbyneme('编号');
  end
  else
  begin
    messagedlg('输入的姓名不存在',mterror,[mbok],0);
    DBEdit1.Text:='';
  end;
end;

解决方案 »

  1.   

    if ADOTable1.Findkey([DBEdit1.Text]) then改成
    if ADOTable1.locate('姓名',DBEdit1.Text,[])  then
      

  2.   

    Findkey只适合搜索关键字。‘姓名’事关键字吗?不是用Locate函数
      

  3.   

    Findkey([DBEdit1.Text])中的DBEdit1.Text应为索引字(index)
      

  4.   

    ADOTable1.IndexFieldNames:='姓名';这句我已经将‘姓名’设为索引字了。为什么不可以呢?望赐教。
      

  5.   

    附带问一下,DBGRID怎么自动分页呢?就是像csdn帖子列表那样?
      

  6.   

    linzhisong(無聊) 兄:我已经将代码改过来了,虽然能编译通过,但是功能没有实现,点查询按钮没有用,而是把DBEdit中的内容加到数据库的‘姓名’字段了,怎么回事呢?
      

  7.   

    需要使用locate,看看帮助先。
      

  8.   

    我在表单上加了个DBLookupComboBox,用户通过选择DBLookupComboBox的内容,把Edit8赋值(procedure TF_shiyebaoxianfei.DBLookupComboBox1Click(Sender: TObject);
    begin
    Edit8.Text:=DBLookupComboBox1.Text;
    end;),我把那个查询按钮改成如下这段代码,结果第一次点此按钮,可正常查询,再点此按钮,就不能查询到其他记录了,每次都说“没有符合条件的记录”,再查第一次查询的那条记录,又能查到,是怎么回事?
    if length(Edit5.Text)=0 then
        messagedlg('请输入单位全称!',mterror,[mbok],0)
    else
     if length(edit8.Text)=0 then
        messagedlg('请选择填表日期!',mterror,[mbok],0)
     else
    ADOTable1.close;
    ADOTable1.open;
    if ADOTable1.locate('全称;填表日期',vararrayof([Edit5.Text,
                         Edit8.Text]),[]) then
          begin
          Edit1.Text:=adotable1.fieldbyname('单位类型').asstring;
          Edit2.Text:=adotable1.fieldbyname('征收机构').asstring;
          Edit3.Text:=adotable1.fieldbyname('法定代表人').AsString;
          Edit4.Text:=adotable1.fieldbyname('代码').AsString;
          Edit5.Text:=adotable1.fieldbyname('全称').AsString;
          Edit6.Text:=adotable1.fieldbyname('职工总数').AsString;
          Edit7.Text:=adotable1.fieldbyname('开户银行').AsString;
          Edit8.Text:=adotable1.fieldbyname('填表日期').AsString;
          Edit9.Text:=adotable1.fieldbyname('年工资总额').AsString;
          Edit10.Text:=adotable1.fieldbyname('缴费方式').AsString;
          Edit11.Text:=adotable1.fieldbyname('帐号').AsString;
          Edit12.Text:=adotable1.fieldbyname('贷款所属日期从').AsString;
          Edit13.Text:=adotable1.fieldbyname('贷款所属日期至').AsString;
          Edit14.Text:=adotable1.fieldbyname('贷款限缴日期从').AsString;
          Edit15.Text:=adotable1.fieldbyname('贷款限缴日期至').AsString;
          end
        else
          begin
          messagedlg('没有符合条件的记录',mterror,[mbok],0);
       Edit1.text:='';
       Edit2.text:='';
       Edit3.text:='';
       Edit4.text:='';
       Edit5.text:='';
       Edit6.text:='';
       Edit7.text:='';
       Edit8.text:='';
       Edit9.text:='';
       Edit10.text:='';
       Edit11.text:='';
       Edit12.text:='';
       Edit13.text:='';
       Edit14.text:='';
       Edit15.text:='';
          end;
      

  9.   

    晕到,看帮助吧!!!建议用query会好操作点
      

  10.   

    用  query 或 dataset 自己来写SQL 的查询语句可能会好些
      

  11.   

    好像ADO确实不支持findkey,我又不会用query,所以只好用这个笨办法了,拜托大家帮忙解决一下,怎么实现通过两个字段的值查询符合的记录,谢谢。
      

  12.   

    str:string;str:='select * from table1 where name='+quotedstr(edti1.text);
    str:=str+' and sex='+quotedstr(edit2.text);adoquery1.close;
    adoquery1.sql.clear;
    adoqeury1.sql.add(str);
    adoquery1.open;
      

  13.   

    麻烦能不能不用query,就用我以前的方法改过来?特别急!
      

  14.   

    还有,我用投币一元的代码试了,报错“str:string”这一行。
      

  15.   

    ADOTable1.Locate('姓名',DBEdit1.text,[loCaseInsensitive,loPartialKey]);
    if DBEdit1.Text=ADOTable2.FieldValues['姓名'] then
    .
    .
    .
    这样应该没有问题辣
      

  16.   

    在D 中好像不能用fieldbyneme,我试过FIELDVALUES这个属性,可以。
      

  17.   

    open后加一句AdoTable.First
    不过locate效率满低的,会把table中所有的数据下载到当地
      

  18.   

    karach(卡车) :
        现在我想实现通过两个字段的值查询符合的记录,比如我想通过单位全称和该单位缴费的日期查询符合的记录,请问怎么实现?
    if ADOTable1.locate('全称;填表日期',vararrayof([Edit5.Text,
                         Edit8.Text]),[]) then我是这样做的,但是每次查询都说没有符合的记录,为什么?
      

  19.   

    if DBEdit5.Text=ADOTable1.FieldValues['全称'] and Edit8.Text=ADOTable1.FieldValues['填表日期'] then
    应该没有问题了吧
      

  20.   

    还是不行,查询的时候,报错,错误信息如下:project project.exe raised exception class EVarianterror with message 'Invalid variant type conversion'. process stoped. use step or run to continue.
      

  21.   

    在 ADOTable1.Findkey([DBEdit1.Text]) 前面 加上ADOTable1.SetKey