调用locate()返回true时,为什么table1.RecNo还是等于-1???

解决方案 »

  1.   

    你代码如何写的procedure TForm1.btn4Click(Sender: TObject);
    begin
     adoTB1.Close;
         adoTB1.TableName :='areacode';
         adoTB1.Open;     while not adoTB1.Eof do
         begin
              if adoTB1.Locate('area','宜昌',[loPartialKey]) then
              showmessage(IntToStr(adoTB1.RecNo));
              adotb1.next;
         end;
    end;我的得出实际的位置,不是-1
      

  2.   

    void __fastcall TForm1::SetLastFlag(int ID)
    {
      Set<TLocateOption,0,1> flags;
      if(!Table1->Active)
        Table1->Open();
      Table1->DisableControls();
      Table1->First();
      while(!Table1->Eof)
      {
        Table1->Edit();
        Table1->FieldByName("LastOpenFlag")->AsBoolean = false;
        Table1->Post();
        Table1->Next();
      }
      if(Table1->Locate("ID",ID,flags))
      {
        Table1->Edit(); //这里出错!!提示“At end of table.”
        Table1->FieldByName("LastOpenFlag")->AsBoolean=true;
        Table1->Post();
      }
      Table1->EnableControls();
    }明明Locate()返回true,怎么可能是end of table呢
      

  3.   

    你locate()是定位函数,查找到了,就返回true,而实际数据的位置并不确定,
    你在 if(Table1->Locate("ID",ID,flags))
      {
        Table1->Edit(); //这里出错!!提示“At end of table.”
        Table1->FieldByName("LastOpenFlag")->AsBoolean=true;
        Table1->Post();
      }
    前面加上 table1->first;
      

  4.   

    加上first()照样出现同样错误啊
      

  5.   

    TLocateOptions Opts;
    Opts.Clear();
    Opts << loPartialKey;
    CustTable->Locate("ID", ID,Opts);
    这样写试试。。
    -------------------------------
    加不加first应该都一样。代码应该没有问题。注意一下locate的最后一个参数.
    ----------------------------------
    如果依然不能解决,看看你的表中有索引吗?如果有,用findkey
      

  6.   


    Table1->First();
    加在前面
    if(Table1->Locate("ID",ID,flags))
      

  7.   

    代码应该没有问题,我用上面你的代码,在机器上试验了一下,没问题。你在机器上重新弄个测试表,就只有username,passwd,然后试验试验。。没有索引的,跟索引有关系吗?
    太纳闷了
    ------------------
    findkey是使用索引的。
    locate是循环查询,不使用索引
      

  8.   

    可能是你不小心设置了控件的某些属性。。删除你那个table,然后重新放一个上去,应该就没问题了。
      

  9.   

    用BDE连ORACLE/SQLSERVER等大型数据库,table1.RecNo是不可用的(永远为-1),与locate没关系
    1.改用ADO
    2.用关键字(ID)代替RecNo
      

  10.   

    删了重新放Table1,还是出错啊,!!!!
    要是就这个地方倒无所谓,改用其他方法,问题是这个工程有近200个地方调用了Locate(),无法判断其他地方是否也有同样问题啊!!
      

  11.   

    to keiy():
    不是RecNo等不等于-1的问题,是locate()返回true之后,table1.edit()老是出错。
    改用ado可以,但是工程里近200个地方用到locate,N多个TTable.....
      

  12.   

    要是就这个地方倒无所谓,改用其他方法,问题是这个工程有近200个地方调用了Locate(),
    ------------------------------------------那就要自信研究研究了,不过单独看你的这一段代码应该是没有问题的。
      

  13.   

    返回值为-1说明table1.RecNo根本没改变~!
      

  14.   

    to noelse520(飘~~~~~~~~~~~~~~!) :
      怎么可能没改变,
    前面几个兄弟说先first()再locate(),我试了还是出错,说明locate()是有改变当前记录位置的。我在另外的工程里单独调用这段代码,是可以正确定位到记录的。
      

  15.   

    代码应该没问题,使用loCaseInsensitive试试,看能不能返回true,或者随变建一个别的表,从新写段代码试试
      

  16.   

    if(Table1->Locate("ID",ID,flags))
      {
        Table1->Edit(); //这里出错!!提示“At end of table.”
        Table1->FieldByName("LastOpenFlag")->AsBoolean=true;
        Table1->Post();
      }
    在使用前先关闭table,在打开列