procedure TForm7.Button3Click(Sender: TObject);
var
  tmp: string;
  sum: Integer;
  bk: TBookMark;
begin
  sum := 0;
  bk := ADOQuery1.GetBook;
  ADOQuery1.DisableControls;
  ADOQuery1.First;
  while not ADOQuery1.Eof do
  //begin
  //  if ADOQuery1.FieldByName('订单类型').AsString='正常' then
    begin
      tmp := ADOQuery1.FieldByName('订单数').AsString;
      sum := sum+StrToIntDef(tmp,0);
    end;
    ADOQuery1.Next;
  end;
//-------------下行出错!----------
  ADOQuery1.GotoBook(bk);
  ADOQuery1.FreeBook(bk);
  ADOQuery1.EnableControls;
  edit1.text := IntToStr(sum);
end;

解决方案 »

  1.   

    你是想刷新后光标行不变吗?使用 ado.refresh即可。是不是应该这样:
    ADOQuery1.EnableControls;
    ADOQuery1.GotoBook(bk);
    ADOQuery1.FreeBook(bk);
     
      

  2.   

    以下出错:
    ADOQuery1.EnableControls; 亲,出错了!
      

  3.   

    不看错误提示的吗?   begin和end 不对应,建议装个cnpack工具吧
      

  4.   

    游标的作用就是记住记录集当前记录行所处位置,像你这段代码涉及记录集遍历,采用游标记录位置,然后记录集跟UI控件解绑,目的是避免界面那边刷,用户体验不好,其次也影响效率。数据遍历结束后,回到原先记录所指的位置,恢复UI数据感知控件绑定。
      

  5.   

    请问有更好的办法吗?
    我现在是这样处理。
    var
      tmp: string;
      sum,heji: Integer;
      bk: TBookMark;begin
           adoquery1.first;
        while not adoquery1.eof do
         begin
           heji:=heji+adoquery1.fieldbyname('订单数').Asinteger;
            adoquery1.next;
           end;   label1.Caption:= IntToStr(heji);
    //FieldByName('完成数').AsInteger :=FieldByName('完成数').AsInteger+StrToIntDef(fields[i].asstring,0);
    //FieldByName('未完成').AsInteger:=StrToIntDef(FieldByName('订单数').AsString,0) -StrToIntDef(FieldByName('完成数').AsString,0);end;