在修改了dataset中的值后,如何提交?  在dbgrid中删除了一行或多行的记录,想让别的行的序号自动更改序号值。下面这段代码哪儿有问题呢?
procedure TDataModule1.Table1AfterDelete(DataSet: TDataSet);
var
  book : Tbook;
  num : integer;
begin
  try
    num:=1;
    book:=mainform.DBGrid1.Datasource.Dataset.GetBook;
    Table1.DisableControls;
    if not Table1.isempty then
    begin
      Table1.first;
      while not Table1.eof do
      begin
        Table1.FieldByName('xh').asinteger:=num;  //报错说:Table1:dataset not in edit or insert mode.  这个问题如何解决呢?
        num:=num+1;
        showmessage('hhh');
        Table1.next;
      end;
    end;
    mainform.DBGrid1.Datasource.Dataset.gotobookMark(book);
  finally
    Table1.enableControls;
    mainform.DBGrid1.Datasource.Dataset.freebook(book);
  end;
end;

解决方案 »

  1.   

    while not Table1.eof do 
    begin 
      table1.edit;//
      Table1.FieldByName( 'xh ').asinteger:=num;  //报错说:Table1:dataset not in edit or insert mode.  这个问题如何解决呢? 
    .....
      

  2.   

    procedure TDataModule1.Table1AfterDelete(DataSet: TDataSet);
    var
      book : Tbook;
      num : integer;
    begin
      try
        num:=1;
        book:=Table1.GetBook;
        Table1.DisableControls;
        Table1.first;
        while not Table1.eof do
        begin
          if Table1.State=dsBrowse then Table1.Edit;    //**让记录集处于可编辑状态。**
          Table1.FieldByName( 'xh ').asinteger:=num;
          num:=num+1;
          Table1.Next;   //**移动记录时,数据集将自动提交,所以可以不用if Table1.State<>dsBrowse then Table1.Post;
        end;
      finally
        Table1.GotobookMark(book);
        Table1.Freebook(book);
        Table1.EnableControls;
      end;
    end; 
      

  3.   

    procedure TDataModule1.Table1AfterDelete(DataSet: TDataSet); 
    var 
      book : Tbook; 
      num : integer; 
    begin 
      try 
        num:=1; 
        book:=mainform.DBGrid1.Datasource.Dataset.GetBook; 
        Table1.DisableControls; 
        if not Table1.isempty then 
        begin 
          Table1.first; 
          while not Table1.eof do 
          begin 
              Table1.Edit;
              Table1.FieldByName( 'xh ').asinteger:=num;  //报错说:Table1:dataset not in edit or insert mode.  这个问题如何解决呢? 
            num:=num+1; 
            showmessage( 'hhh '); 
            Table1.next; 
          end; 
        end; 
        mainform.DBGrid1.Datasource.Dataset.gotobookMark(book); 
      finally 
        Table1.enableControls; 
        mainform.DBGrid1.Datasource.Dataset.freebook(book); 
      end; 
    end; 
      

  4.   

    while not Table1.eof do 
    begin 
      table1.edit;//
      Table1.FieldByName( 'xh ').asinteger:=num;   
      table1.post;//
      

  5.   

    谢谢各位兄台啊!  再帮我解决一下,我的table1里的记录每次在dbgrid里打开的都是部分记录,如当前打开的是年月为2007-10的记录,我现在只想对10月的记录的序号进行更改,而上面的那段代码是对所有的历史记录的序号的更改。如何对条件进行限定?因为数据量大,所以不想对整个table都遍历,只想遍历当前月份对应的数据!   接分啊!!!
      

  6.   

    8楼的兄弟,把过滤器Filter加到上面的代码里应该怎么写呢?
      

  7.   

    table1.filtered:=false;
    table1.filter:='日期='+Quotedstr(过滤的日期);//过滤条件
    table1.filtered:=true;
      

  8.   

    应该把上面的条件加到哪儿呢? 我加到这句前面: if not Table1.isempty then
    还是循环的出不来啊
      

  9.   

    建议用query控件,不需要数据就不要查询出来,也就是把你所需要的比如 2007-10 数据查询出来。
    既然查询出来,删除后又过滤,会给用户造成错觉。
      

  10.   

    为什么循环总是出不来呢?  
          while   not   Table1.eof   do 
            begin 
                if   Table1.State=dsBrowse   then   Table1.Edit;         //**让记录集处于可编辑状态。** 
                Table1.FieldByName(   "xh   ").asinteger:=num; 
                num:=num+1; 
          //      Table1.Next;       //注释掉这句话后,直接加了exit也不能退出,报错说list index out of bounds 
                exit;
            end;