代码如下:
procedure TForm1.ClientDataSet1AfterApplyUpdates(Sender: TObject;
  var OwnerData: OleVariant);
begin
  ClientDataSet1.open;
  ClientDataSet1.first;
  StrSQL:='select * from Output';
  ClientDataSet2.CommandText:=StrSQL;
  while not ClientDataSet1.eof do
  begin
  if ClientDataSet1.Fields[9].AsBoolean = True and ClientDataSet1.Fields[11].AsBoolean = True then
      begin
          ClientDataSet2.Open;
          ClientDataSet2.Append;
          ClientDataSet2.FieldByName('序号').AsString:=ClientDataSet1.FieldByName('序号').AsString;
          ClientDataSet2.FieldByName('点号').AsString:=ClientDataSet1.FieldByName('点号').AsString;
          ClientDataSet2.post;
          ClientDataSet2.ApplyUpdates (0);
       end;
  end;
          ClientDataSet1.Next;
end;

解决方案 »

  1.   

     ClientDataSet2.ApplyUpdates (-1); 试一下
      

  2.   

    ApplyUpdates只需要传递一个参数叫MaxErrors,用于指定一个整数,当遇到无法更新的记录超过这个数时,此次更新就中止。如果 MaxErrors参数设为0,表示只要遇到一个错误更新就中止,客户端的日志保持不变。如果MaxErrors参数设为-1,当应用服务器发现有错误的 记录,就尝试更新下一个记录,等所有的记录都尝试过以后才返回。
    ApplyUpdates会自动调用Reconcile函数,进而调用应用服 务器上的TProvider构件的ApplyUpdates函数去更新远程的数据库服务器。没有被DBMS服务器认可的记录通过Reconcile返回给 客户端,此时将在客户端触发OnReconcileError事件让您更正错误。最后,ApplyUpdates函数返回仍然没有被认可的记录数。
      

  3.   

    谢谢,现在我的问题是加入ClientDataSet1.ApplyUpdates (0)后就出现上述错误,代码如下
    while not ClientDataSet1.eof do
      begin
      if ClientDataSet1.Fields[9].AsBoolean = True and ClientDataSet1.Fields[11].AsBoolean = True then
          begin
              ClientDataSet2.Open;
              ClientDataSet2.Append;
              ClientDataSet2.FieldByName('序号').AsString:=ClientDataSet1.FieldByName('序号').AsString;
              ClientDataSet2.FieldByName('点号').AsString:=ClientDataSet1.FieldByName('点号').AsString;
              ClientDataSet2.post;
              ClientDataSet2.ApplyUpdates (0);
              ClientDataSet1.Delete;
              ClientDataSet1.ApplyUpdates (-1);
              end;
           end;
      end;
              ClientDataSet1.Next;
    end;
      

  4.   

    去掉ClientDataSet1.ApplyUpdates (0)有什么影响呢
      

  5.   

    界面上是可以删除的但是数据库里面删除不掉。删除后,执行一下post
      

  6.   

    删除后,执行一下post
    运行后会出现not in edit or insert mode的错误。
      

  7.   

    运行后会出现not in edit or insert mode的错误。  cds_1.Delete;
      cds_1.ApplyUpdates(0)  ;
      

  8.   

    运行后会出现not in edit or insert mode的错误。  cds_1.Delete;
      cds_1.ApplyUpdates(0)  ;
    改掉后之后,运行程序会出现clientdataset1“Record not found or changed by another user的错误
      

  9.   

    运行后会出现not in edit or insert mode的错误。  cds_1.Delete;
      cds_1.ApplyUpdates(0)  ;
    改掉后之后,运行程序会出现clientdataset1“Record not found or changed by another user的错误不应该啊,把你的demo发过来试试
      

  10.   

    你的clientdataset2是如何连接到数据库的
      

  11.   

    ClientDataSet2——>DataSetProvide——>ADOquery其中DataSetProvide与ADOquery用的是同一个。
      

  12.   

    ClientDataSet2——>DataSetProvide——>ADOquery其中DataSetProvide与ADOquery用的和ClientDataSet1是同一个。
      

  13.   

    procedure TForm1.Button10Click(Sender: TObject);
    var
      StrSQL,Todata:string;
    begin
      StrSQL:='select * from Output';
      ClientDataSet2.CommandText:=StrSQL;
      ClientDataSet1.open;
      ClientDataSet1.first;
      while not ClientDataSet1.eof do
      begin
          if ClientDataSet1.Fields[9].AsBoolean = True then
           begin
           ClientDataSet1.Edit;
           ClientDataSet1.FieldByName('运维班核对人').AsString:=loginForm.edit2.Text;
           ClientDataSet1.Post;
           end;
           if ClientDataSet1.Fields[11].AsBoolean = True then
           begin
           Todata:=datetostr(Date());
           ClientDataSet1.Edit;
           ClientDataSet1.FieldByName('监控核对人').AsString:=loginForm.edit2.Text;
           ClientDataSet1.FieldByName('核对日期').AsString:=Todata;
           ClientDataSet1.Post;
           end;
            if ClientDataSet1.Fields[9].AsBoolean = True  then
            begin
            if ClientDataSet1.Fields[11].AsBoolean = True then
              begin
              ClientDataSet2.Open;
              ClientDataSet2.Append;
              ClientDataSet2.FieldByName('运维班核对人').AsString:=ClientDataSet1.FieldByName('运维班核对人').AsString;
              ClientDataSet2.FieldByName('监控核对人').AsString:=ClientDataSet1.FieldByName('监控核对人').AsString;
              ClientDataSet2.FieldByName('核对日期').AsString:=ClientDataSet1.FieldByName('核对日期').AsString;
              ClientDataSet2.post;
              ClientDataSet2.ApplyUpdates (0);
              ClientDataSet1.Delete;
              ClientDataSet1.ApplyUpdates (0);
              end;
            end;
             ClientDataSet1.next;
      end;
    end;
      

  14.   


    lz注意下,这可能有两种原因
    1.TDataSetProvidor UpdateMode请设置成upWhereKeyOnly,ResolveToDataSet设置成false,服务器的query打开后需要设置主键,和数据库相同即可,如
        qry1.Open;
        qry1.FieldByName('JobType').ProviderFlags := qry1.FieldByName('JobType').ProviderFlags+[pfInKey];
        qry1.FieldByName('JobNo').ProviderFlags := qry1.FieldByName('JobNo').ProviderFlags+[pfInKey];
        qry1.FieldByName('BoardNo').ProviderFlags := qry1.FieldByName('BoardNo').ProviderFlags+[pfInKey];
    2.你要更新的表如果有触发器的话,可能触发器写的有问题,里面没有加头尾加
    set rowcount off
    ....
    set rowcount on
      

  15.   

    ClientDataSet2——>DataSetProvide——>ADOquery其中DataSetProvide与ADOquery用的是同一个。你的ClientDataSet1和ClientDataSet2连接了同一个数据源,导致了操作某个ClientDataSet时另一个ClientDataSet已被更新