首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TDataSetProvider.OnUpdateData中修改字段值

如何在TDataSetProvider.OnUpdateData中修改字段值
EN

Stack Overflow用户
提问于 2011-06-30 09:24:58
回答 2查看 5.9K关注 0票数 1

阅读了关于TDataSetProvider.OnUpdateData事件说明的Delphi文件之后:

  1. 检查数据(例如,对于不应该允许的值或数据更改),并引发取消在更新发生之前应用的异常。
  2. 在将数据发送到源数据集或数据库服务器之前更改数据(例如加密或解密值)。

我正在寻找关于如何为更改OnUpdateData的数据的示例代码。我已尽力寻找解决办法。这是我能做到的:

示例1

代码语言:javascript
复制
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then begin
        Dataset.Edit;
        DataSet.FindField('MyField').AsString := 'zzz';
        Dataset.Post;
      end;
    end;
  end;
  DataSet.Next;
end;

问题(例如1):不幸的是,我一直收到一些字段值丢失的错误。在执行了一些调试之后,我发现有一些需要的字段具有空值。

示例2:

代码语言:javascript
复制
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then 
        DataSet.FindField('MyField').NewValue:= 'zzz';     
    end;
    DataSet.Next;
  end;  
end;

例如,问题2:通过这样编写,我们不需要调用DataSet.Edit & DataSet.Post。但是,设置为TField.NewValue的“zzz”值没有保存到数据库中。

我有一些特殊的原因,这个更新必须在OnUpdateData中执行,而不是在BeforeUpdateRecord/AfterUpdateRecord中执行。

请指点。非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2011-06-30 17:05:55

不是

如果DataSet.UpdateStatus = usUnmodified,则开始

如果DataSet.UpdateStatus in usInserted,usModified则

相互排斥?你可能有一个错误的结局--或者没有其他的结局。

票数 0
EN

Stack Overflow用户

发布于 2011-06-30 18:25:34

好吧,让我们从头开始。

在delta中,修改被记录下来(根据我的经验):

已删除和插入的记录存储仅与相应的status在UpdateStatus

  • 1记录上有所不同。

  • 编辑记录的存储方式不同--2条记录以这种方式存储(按该顺序存储),
    • 1记录与UpdateStatus = UpdateStatus = usModified的
      • 1记录--该记录只有--修改字段的值。其他字段都是empty.

如何进行Delta修改

用于插入/删除记录的

将StatusFilter设置为usInserted和/或usDeleted。改变他们。你的任务完成了。

用于修改记录的

将SetStatusFiler设置为usUnModified,将usModified设置为在Delta中查看两条记录。执行一个While not DSDelta.Eof do,并对每个UpdateStatus = usUnModified进行测试。如果是,则继续在下一条记录中进行修改(与您测试的记录对应的UpdateStatus = usModified )。否则,您将使用UpdateStatus = usUnModified查找下一条记录。

编辑:你说得对。如果不包括标记为必需的所有字段,则无法更改被修改记录的增量上的字段。

你的密码是:

代码语言:javascript
复制
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then begin
        Dataset.Edit;
        DataSet.FindField('MyField').AsString := 'zzz';

        If Dataset.UpdateStatus in [usModified] then
        begin
          for i = 0 to Dataset.FieldCount - 1 do
          begin
            If Dataset.Fields[i].Name <> 'MyField' then
            begin
              If Dataset.Fields[i].Required then
                Dataset.Fields[i].Value := Dataset.Fields[i].OldValue; 
            end; 
          end;
        end;
        Dataset.Post;
      end;
    end;
  end;
  DataSet.Next;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6532671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档