我用locate 函数 定位记录(单条记录)并修改某个字段,假如我要找的记录正好是第一行或者是最后一行,它会准确的指向;如果在其他行,就会指向符合条件的那一行的下一行。那位大哥知道怎么回事? 或者推荐一个更好的方法,谢谢!PS:数据库是sql server 2000,用delphi 7
我用的例子,BookTbl.locate('bdate;baddr',vararrayof([date,addr]),[]);

解决方案 »

  1.   

    BookTbl.locate('bdate;baddr',vararrayof([date,addr]),[loPartialKey]);
      

  2.   

    loPartialKey? 不过我要的都是完全匹配,所以才只有一个记录符合。反正老是出错(发生异常),有时候多试几次又可以了我晕啊~~~~
      

  3.   

    要匹配的都是关键字段,用过gotokey,findkey,好象都没有成功过有其他更好的方法吗? 如果问题解决了,分全给!
      

  4.   

    最好Locate的第三个参数加上限制条件
    另外应该确保date,addr两个参数数据的正确性
      

  5.   

    代码如下,试了,它还是指向了下一行!  ??????with StatTable do
          begin
            DatabaseName:='EXPDATA';
            TableName:='StuStatus';
            Open;
            //IndexFieldNames:='StuNo;LessonNo';
            //if not FindKey([StuNo,LessonNo]) then
            //  Response.SendRedirect('/kfsy/DLLHost/STUProc.dll/SShowMsg?MT=OpError&MC=DBQuery')
            if not Locate('StuNo;LessonNo',VarArrayOf([StuNo,LessonNo]),[loPartialKey]) then
              Response.SendRedirect('/kfsy/DLLHost/STUProc.dll/SShowMsg?MT=OpError&MC=DBQuery')
            else
            begin
              Edit;
              FieldByName('TimeLeft').AsString:=inttostr(strtoint(FieldByName('TimeLeft').AsString)-2);
              Post;
            end;
            Close;
          end;
      

  6.   

    看不出来有什么错,if语句换一下试试
    with StatTable do
    begin
      DatabaseName:='EXPDATA';
      TableName:='StuStatus';
      Open;
      if Locate('StuNo;LessonNo',VarArrayOf([StuNo,LessonNo]),[loPartialKey]) then
      begin
        Edit;
        FieldByName('TimeLeft').AsString:=inttostr(strtoint(FieldByName('TimeLeft').AsString)-2);
        Post;
      end
      else
        Response.SendRedirect('/kfsy/DLLHost/STUProc.dll/SShowMsg?MT=OpError&MC=DBQuery')
      Close;
    end;
      

  7.   

    还是没有用啊, 还是把它的下一行的那个字段减掉了!是locate 的原因还是 edit or post 的原因? 数据库?
      

  8.   

    单看代码还真不好找问题,看看是不是在你程序的其他地方,将StatTable的数据的范围缩小了,比如使用了filter等.
      

  9.   

    不用locate,最后还是用findkey 解决了,只是它限制要用索引字段去查。 如下:
    with StatTable do
    begin
      DatabaseName:='EXPDATA';
      Close;
      TableName:='StuStatus';
      IndexFieldNames:='StuNo;LessonNo';
      Open;
      if FindKey([StuNo,LessonNo]) then
      begin
        Edit;
        FieldValues['TimeLeft']:=inttostr(strtoint(FieldByName('TimeLeft').AsString) - 2);
        Post; Close;
      end
      else  Response.SendRedirect('/kfsy/DLLHost/STUProc.dll/SShowMsg?MT=OpError&MC=DBQuery');
    end;