起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 941|回复: 11

【搞定】关于DeltaDataSet**

[复制链接]
发表于 2007-3-26 16:42:24 | 显示全部楼层 |阅读模式
procedure TMAINFORM.DSBGOODSOUTAfterPost(DataSet: TDataSet);
var lDeltaDataSet : TDeltaDataSet;
     lField1, lField2 : string ;

begin
if not DSBGOODSOUT.DataSet.Active or not DSBGOODSOUT.DataSet.UpdatesPending  then
   Exit;
   lDeltaDataSet:= TDeltaDataSet.Create(DSBGOODSOUT.DataSet);
   try
     while not lDeltaDataSet.Eof do
     begin
       case lDeltaDataSet.UpdateKind of
        //修改
         TUpdateKind.ukModify:
         begin
           //
           lField1 := lDeltaDataSet.FieldByName('goodsid').AsString;
           lField2 := lDeltaDataSet.FieldByName('qty').AsString;
           Business.Forms.Dialogs.ShowMessage(lField1 + ':' + lField2);
         end;
         //插入
         TUpdateKind.ukInsert:
         begin
           lField1 := lDeltaDataSet.FieldByName('goodsid').AsString;
           lField2 := lDeltaDataSet.FieldByName('qty').AsString;
           Business.Forms.Dialogs.ShowMessage(lField1 + ':' + lField2);
         end;
         //删除
         TUpdateKind.ukDelete:
         begin
           lField1 := lDeltaDataSet.FieldByName('goodsid').AsString;
           lField2 := lDeltaDataSet.FieldByName('qty').AsString;
           Business.Forms.Dialogs.ShowMessage(lField1 + ':' + lField2);
         end;
       else
         //
       end;
       lDeltaDataSet.NextStatus
     end;
   finally
     lDeltaDataSet.Free;
   end;
  SysUtils.Abort;


end;

1.以上是我的代码:这个如果放在afterpost中,需要点两下保存才能保存成功,如果放在BeforeApplyUpdates中则点保存按钮则保存不成功,可以循环保存但是无法保存成功.
2对于新增和删除的记录取出来没有问题,但是如果是修改的,我代码中取了两个字段,如果这个字段的值没有变化那么取出来的是空字符串,比如我修改了一条记录的数量(qty),原来是8改成5,但是没有改goodsid,那么取出来的值:goodsid是空字符串,数量是5,而不是8.我希望取出来的值是修改之前的.
回复

使用道具 举报

 楼主| 发表于 2007-3-27 10:43:29 | 显示全部楼层
等待回复中...........
回复 支持 反对

使用道具 举报

发表于 2007-3-27 13:37:09 | 显示全部楼层
第一,不要放到afterPost中,应该是BeforeApplyUpdates,但是不要用showmessage,这样的情况会造成超时,事务回滚,你看看服务端日志就知道了
第二,如果取一个字段的新值旧值,用DeltaDataSet上相邻的两条记录来取
第一条usUnModified
紧接着的就是修改以后的值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-28 10:15:35 | 显示全部楼层
第二,如果取一个字段的新值旧值,用DeltaDataSet上相邻的两条记录来取
第一条usUnModified
紧接着的就是修改以后的值

这个不是很理解,能否具体解释一下
另外一个问题:
//修改
         TUpdateKind.ukModify:
         begin
           //
           lField1 := lDeltaDataSet.FieldByName('goodsid').AsString;
           lField2 := lDeltaDataSet.FieldByName('qty').AsString;
           Business.Forms.Dialogs.ShowMessage(lField1 + ':' + lField2);
         end;
lField1如果没有修改过为什么取出来的值是空字符串,修改过后取出的当前值,但是如果取他的oldvalue的话是可以取到修改前的值的,帮忙解释一下
回复 支持 反对

使用道具 举报

发表于 2007-3-28 11:09:52 | 显示全部楼层
这个是使用TDeltaDataSet的例子
  private
    {private declarations}
    FDelta2: TDeltaDataSet;
... ...
procedure TMainForm.Button2Click(Sender: TObject);
begin
  if not Assigned(FDelta2) then
  begin
    FDelta2 := TDeltaDataSet.Create(DataSetBZSJJ1);
  end;
  FDelta2.First;
  while not FDelta2.Eof do
  begin
    Case FDelta2.UpdateKind of
    TUpdateKind.ukDelete: Dialogs.ShowMessage('this record is Deleted');
    TUpdateKind.ukInsert: Dialogs.ShowMessage('this record is Inserted');
    TUpdateKind.ukModify:
    begin
    Dialogs.ShowMessage('this record is Modified, this is the orgin value');
    FDelta2.NextStatus;
    Dialogs.ShowMessage('this is the new value');
    end;

    else Dialogs.ShowMessage('error');
    end;
    FDelta2.Next;
  end;
end;
回复 支持 反对

使用道具 举报

发表于 2007-3-28 11:14:49 | 显示全部楼层
第二条记录上只有被修改的字段有值,没有被修改的字段都是空
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-28 13:45:38 | 显示全部楼层
那么我要知道我哪几条记录被修改了,这些记录的未修改字段怎么取出来
回复 支持 反对

使用道具 举报

发表于 2007-3-28 14:19:13 | 显示全部楼层
5楼就可以得到对数据集的任何修改
你通过第二条记录可以知道哪些字段被修改了,再找到第一条记录就知道原值是什么了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-28 17:30:39 | 显示全部楼层
这个问题我刚才用了些测试数据跟踪了一下,只测了修改情况下.原来这里记录修改情况都是2条记录成一组,
前面一条记录的是修改前的数据,后面一条记录的修改后的数据.指针默认指向后面一条数据.
而且修改后的那条记录里面的oldvalue没什么参考价值,因为里面记录的是对应数据集的第一条记录的oldvalue,这个算不算bug.
大致情况是否是这样的?!!
回复 支持 反对

使用道具 举报

发表于 2007-3-29 10:26:46 | 显示全部楼层
楼上的理解是基本正确的,但是OldValue本来就不是用在这个场合的
================
Represents the original value of the field (as a Variant).

property OldValue: Variant;

Description

Read the OldValue property to examine or retrieve the original value of the field that was obtained from the dataset before any edits were posted. For example, the following line replaces current pending changes with a field抯 original value:

NewValue := OldValue;

Once records are applied successfully to the database, the old field value cannot be retrieved.

Note:        the OldValue property is only usable when the data is accessed using a TClientDataSet component or cached updates is enabled.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-28 20:20 , Processed in 0.040429 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表