我用delphi写一个程序
程序如下:
procedure Tfr_shoufei.BitBtn7Click(Sender: TObject);
begin
  datamodule1.ado_shoufri.Active:=true;
  if self.e_zhuhuname.Text='' then
    begin
      showmessage('请输入住户名字才可以操作');
    end
  else if self.e_zhuhufh.Text='' then
    begin
      showmessage('请输入房间号才可以操作');
    end
  else if self.Edit15.Text='' then
    begin
     showmessage('请输入电视费');
    end
  else if datamodule1.ado_zhuhu.Locate('zhuhu',e_zhuhuname.Text,[])then
    begin
      if datamodule1.ado_zhuhu.Locate('fangmenhao',e_zhuhufh.Text,[])then
        begin
          if datamodule1.ado_shoufri.Locate('zhuhu',self.e_zhuhuname.text,[])then
            begin
              datamodule1.ado_shoufri.Edit;
              datamodule1.ado_shoufri.Fields[6].Value:=self.Edit15.Text;
              datamodule1.ado_shoufri.Post;
            end
          else
            begin
              datamodule1.ado_shoufri.Close;
              datamodule1.ado_shoufri.Active:=true;
              datamodule1.ado_shoufri.insert;
              datamodule1.ado_shoufri.Fields[0].Value:=self.e_zhuhuname.Text;
              datamodule1.ado_shoufri.Fields[6].Value:=self.Edit15.Text;
              datamodule1.ado_shoufri.Fields[8].Value:=self.e_zhuhufh.Text;
              datamodule1.ado_shoufri.Post;
            end;
        end
      else
        begin
          showmessage('该住户和房间号不吻合');
        end;
     end
   else
     begin
      showmessage('住户名出错或是不存在');
     end;
end;运行是出错如下
project wygl.exe raised exception class Eoleexception with message’row cannot
be located for updating. Some values may have been changed since it was last
read’.process stopped user step or run to continue.
请高手帮个忙解决

解决方案 »

  1.   

    查询的时候用QUERY比用TABLE要好,
    if self.e_zhuhuname.Text='' then
        begin
          showmessage('请输入住户名字才可以操作');
        end
      else if self.e_zhuhufh.Text='' then
        begin
          showmessage('请输入房间号才可以操作');
        end
      else if self.Edit15.Text='' then
        begin
         showmessage('请输入电视费');
        end
    ELSE 
      begin
       WITH QUERY1 DO//在窗口上访一个QUERY1
       begin
        close;
        sql.clear;
        sql.add('select * from 表名');
        sql.add('where 字段一='+#39+zhuhu.text+#39'');
        prepare;
        open;
       end;
      if query1.recordcount=0 then 
      begin
       showmessage('住户不存在或者住户名出错');
       exit;
      end;
     WITH QUERY1 DO//在窗口上访一个QUERY1
       begin
        close;
        sql.clear;
        sql.add('select * from 表名');
        sql.add('where 字段一='+#39+zhuhu.text+#39'');
        sql.add('and 字段二='+#39+e_zhuhufh.text+#39'');
        prepare;
        open;
       end;
      if query1.recordcount=0 then 
      begin
       showmessage('该住户和房间号不吻合');
       exit;
      end;
      
     再做一次判断,加上最后一个条件,方法和上面的一样。
      end;
      

  2.   

    else if datamodule1.ado_zhuhu.Locate('zhuhu',e_zhuhuname.Text,[])then
        begin
          if datamodule1.ado_zhuhu.Locate('fangmenhao',e_zhuhufh.Text,[])then
            begin
              if datamodule1.ado_shoufri.Locate('zhuhu',self.e_zhuhuname.text,[])
    >>>你的这几个locate好像是没有什么实际的意义的
    你本来的意思是三个条件同时成立的 但是实际上不是的 就是说你的第一个条件成立的
    但是你的第二个不是在并不是在你的第一个条件基础上查询的 而是只是寻找该字断有没有匹配的结果的建议用adoquery查询出fangmenhao字段为e_zhuhufh.Text的值 然后判断其他字段的值是否相等进行操作
      

  3.   

    再有就是datamodule1.ado_shoufri.Post后 最好在关掉close
      

  4.   

    Some values may have been changed since it was last read
      

  5.   

    像上面老兄说的一样, 做insert ,update ,select 语句query比tabel好多了您的程序在开头datamodule1.ado_zhuhu 这个tabel您都没有active:=true;
    在多人用您的程序的时候, 您insert 语句可能有相同的纪录insert
    update 的时候您的没有字段可能别别人覆盖了.
    像hncx一样用query比较好’
      

  6.   

    datamodule1.ado_shoufri.Locate在同一个事件中写了三次你都没有对数据集进行CLOSE操作建议单独写一个涵数来执行你的LOCATTE操作!