你代码如何写的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
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
{
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呢
你在 if(Table1->Locate("ID",ID,flags))
{
Table1->Edit(); //这里出错!!提示“At end of table.”
Table1->FieldByName("LastOpenFlag")->AsBoolean=true;
Table1->Post();
}
前面加上 table1->first;
Opts.Clear();
Opts << loPartialKey;
CustTable->Locate("ID", ID,Opts);
这样写试试。。
-------------------------------
加不加first应该都一样。代码应该没有问题。注意一下locate的最后一个参数.
----------------------------------
如果依然不能解决,看看你的表中有索引吗?如果有,用findkey
Table1->First();
加在前面
if(Table1->Locate("ID",ID,flags))
太纳闷了
------------------
findkey是使用索引的。
locate是循环查询,不使用索引
1.改用ADO
2.用关键字(ID)代替RecNo
要是就这个地方倒无所谓,改用其他方法,问题是这个工程有近200个地方调用了Locate(),无法判断其他地方是否也有同样问题啊!!
不是RecNo等不等于-1的问题,是locate()返回true之后,table1.edit()老是出错。
改用ado可以,但是工程里近200个地方用到locate,N多个TTable.....
------------------------------------------那就要自信研究研究了,不过单独看你的这一段代码应该是没有问题的。
怎么可能没改变,
前面几个兄弟说先first()再locate(),我试了还是出错,说明locate()是有改变当前记录位置的。我在另外的工程里单独调用这段代码,是可以正确定位到记录的。
{
Table1->Edit(); //这里出错!!提示“At end of table.”
Table1->FieldByName("LastOpenFlag")->AsBoolean=true;
Table1->Post();
}
在使用前先关闭table,在打开列