我以前做的程序,现在需要修改一下,但是,出现 BOF或EOF中有一个是"真",或者当前的记录已被删除,所需的操作要求一个当前的记录。以前编译没有出错,现在出现上述问题,代码如下:
procedure TAFX_fysjlr.lg();
var
  i,count:integer;
  node:TdxTreelistnode;
  sum:real;
begin
  if  DBEdit_dw.Text='' then
      begin
      showmessage('请选择单位!');
      exit;
      end ;
   if  DBEdit_xm.Text='' then
      begin
      showmessage('请选择项目!');
      exit;
      end ;
  sum:=0.0;
  //以下提取数据库中已经存在的符合条件的数据并重新生成 dxTreeList1的记录
   dxTreeList1.ClearNodes;
   ADOQuery_sj.Close;
   ADOQuery_sj.SQL.Clear;
   ADOQuery_sj.SQL.Text:='select xmmc,special,Unit_price,amonut,sub_price,Provider_name,memo from fyxm_detail where dw_id=:dwid  and fyxm_id=:xmid  and input_date=:d_date';
   ADOQuery_sj.Parameters[0].Value:=pdw(glnode.Data)^.dwid;
   ADOQuery_sj.Parameters[1].Value:=pfyxm(gloabnode.Data)^.fyxmid;
   ADOQuery_sj.Parameters[2].Value:=datetostr(olddate);
   ADOQuery_sj.open;
   count:=ADOQuery_sj.RecordCount;
    if count>0 then
    begin
      ADOQuery_sj.First;
      for i:=0 to count-1 do
        begin
          node:=dxTreeList1.add;
          node.Values[0]:=ADOQuery_sj.Fields[0].AsString;
          node.Values[1]:=ADOQuery_sj.Fields[1].AsString;
          node.Values[2]:=ADOQuery_sj.Fields[2].Asfloat;
          node.Values[3]:=ADOQuery_sj.Fields[3].Asfloat;
          node.Values[4]:=ADOQuery_sj.Fields[4].Asfloat;
          node.Values[5]:=ADOQuery_sj.Fields[5].AsString;
          node.Values[6]:=ADOQuery_sj.Fields[6].AsString;
          sum:=sum+node.Values[4];
          if (ADOQuery_sj.Bof) or (ADOQuery_sj.eof) then exit;
          ADOQuery_sj.Next;
        end;
      edit_sum.Text:=floattostr(sum);
    end;
end;
问题老出现在查询那一步,有几位大虾让我打补丁,但是我打完补丁后ADO组件不能用了,最后还是重新装delphi,我以上的问题该如何解决啊

解决方案 »

  1.   

    ADO补丁的问题,想生成树不如用第三方控件,www.51delphi.com上有
      

  2.   

    请使用delphi 6以上版本开发ado程序
      

  3.   

    我打了ADO补丁后ADO组件面板找不到了啊,添加也添加不上啊,请教确认是否是ADO补丁的问题啊,急!!!非常感谢
      

  4.   

    补丁问题,实在不行的话改BDE,开个玩笑,那样工作量可能大了一点。
      

  5.   

    正常的情况如果的确有记录存在当然是不会有问题的.  但我记得一次在写一个面向Oracle8.17写一个程序出现过类似问题, 就是虽然没有记录, 但Eof它不为false, 而且recodecout返回的根本就不准确.  之后逼得我改用如下方法来判断合乎条件的记录数:
      ADOQuery_sj.Sql.add('select count(1) as C from .... where....');
      ADOQuery_sj.open;
      
    if ADOQuery_sj.Fields.FieldByName('C').AsInteger > 0 then
      ....
      

  6.   

    试一下将这部分改为:
    ------------------------------------------------------------
       count:=ADOQuery_sj.RecordCount;
        if count>0 then
        begin
          ADOQuery_sj.First;
          for i:=0 to count-1 do
            begin
              node:=dxTreeList1.add;
              node.Values[0]:=ADOQuery_sj.Fields[0].AsString;
              node.Values[1]:=ADOQuery_sj.Fields[1].AsString;
              node.Values[2]:=ADOQuery_sj.Fields[2].Asfloat;
              node.Values[3]:=ADOQuery_sj.Fields[3].Asfloat;
              node.Values[4]:=ADOQuery_sj.Fields[4].Asfloat;
              node.Values[5]:=ADOQuery_sj.Fields[5].AsString;
              node.Values[6]:=ADOQuery_sj.Fields[6].AsString;
              sum:=sum+node.Values[4];
              if (ADOQuery_sj.Bof) or (ADOQuery_sj.eof) then exit;
              ADOQuery_sj.Next;
            end;
          edit_sum.Text:=floattostr(sum);
        end;
    ---------------------------------------------------------------
      while not ADOQuery_sj.Eof do
      begin
              node:=dxTreeList1.add;
              node.Values[0]:=ADOQuery_sj.Fields[0].AsString;
              node.Values[1]:=ADOQuery_sj.Fields[1].AsString;
              node.Values[2]:=ADOQuery_sj.Fields[2].Asfloat;
              node.Values[3]:=ADOQuery_sj.Fields[3].Asfloat;
              node.Values[4]:=ADOQuery_sj.Fields[4].Asfloat;
              node.Values[5]:=ADOQuery_sj.Fields[5].AsString;
              node.Values[6]:=ADOQuery_sj.Fields[6].AsString;
              sum:=sum+node.Values[4];
              ADOQuery_sj.Next;
      end;
      edit_sum.Text:=floattostr(sum);