程序为两层结构,控件关系如下:
DBGrid1--DataSource1--ClientDataSet1--DataSetProvider1--ADOQuery如上,ClientDataSet1 post后,如何获取ClientDataSet1新增/修改/删除的记录?
注意:ClientDataSet1并不需ApplyUpdates到数据库.

解决方案 »

  1.   

    用ClientDataSet2再取数进行比较
      

  2.   

    笨办法:
    多置一个标记字段到ClientDataSet
    新增的设置为 0 修改的设置为1,删除为假删除,设置为2
    然后filter掉。
    反正不用提交到数据库哦
      

  3.   

    ClientDataSet1内将会有好几千条记录,效率是否比较低呢?
      

  4.   

    修改主键需记录修改前主键
    ---
    Field不是有 OldValue ,NewValue么
      

  5.   

    老王(闭关中)(182274401) 09:14:46
    写在onChange里? 
    小错(37388732) 09:10:19
    OnChange应该不行的。 
    小错(37388732) 09:10:51
    不知道SetText行不行。或者 AfterPost 
      

  6.   

    用ClientDataSet1.Delta来得到ClientDataSet1变动过的记录
      

  7.   

    嗯。可以考虑在
    procedure TForm3.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
      SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
      UpdateKind: TUpdateKind; var Applied: Boolean);
    beginend;
    这个事件下面实现....
    应该是可以的
      

  8.   

    不过你要先调用 ApplyUpdates。
    然后再Applied 控制不提交。
      

  9.   

    to:月亮,哈欠,hu1313(crazyguy
    用ClientDataSet1.Delta来得到ClientDataSet1变动过的记录是可以,但如何知道这些记录那些是修改前的,那些是修改后的,那些是新增/删除的呢?delta没有标记?
    to:小错
    BeforeUpdateRecord当中可以获知字段的状态,可以知道记录状态吗?
      

  10.   

    cdsDefTemp.Data:=cdsSensorDefine.Delta;
     cdsDefTemp.First;
      with cdsDefTemp do
       while not EOF do
        begin      if UpdateStatus = usDeleted then
            Status:='usDeleted';      if UpdateStatus = usInserted  then
            Status:='usInserted';      if UpdateStatus = usModified   then
            Status:='usModified';      if UpdateStatus = usUnmodified   then
            Status:='usUnmodified';
      

  11.   

    with self.ClientDataSet1 do
      begin
        append;
        fieldByName('cid').AsInteger:=12;
        fieldByName('cName').AsString:='12';
        post;  end;
      self.ClientDataSet2.Data:=self.ClientDataSet1.Delta;
      with self.ClientDataSet2 do
      begin
        while not eof do
        begin
          if UpdateStatus = usDeleted then
            showmessage('Deleted ');
          if UpdateStatus = usInserted then
            showmessage('Inserted');
          if UpdateStatus = usModified then
            showmessage('Modified');
          next;
        end;
      end;
      

  12.   

    蹭分蹭分中.....
    参考provider.pas
    function TUpdateTree.DoUpdates: Boolean;