1

在阅读了关于 TDataSetProvider.OnUpdateData 事件解释的 Delphi 帮助文件后:

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

我正在寻找如何更改OnUpdateData 数据的示例代码。我已尽力寻找解决方案。这是我可以实现的:

示例 1

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:

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 中执行,而不是在更新前/更新后记录中。

请指教。非常感谢。

4

2 回答 2

0

不是

如果 DataSet.UpdateStatus = usUnmodified 然后开始

如果 [usInserted, usModified] 中的 DataSet.UpdateStatus 则

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

于 2011-06-30T17:05:55.190 回答
0

好吧,让我们从头开始。

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

  • 已删除和已插入记录的存储仅在 UpdateStatus 上有所不同
    • 1 条具有相应状态的记录
  • 编辑的记录以不同的方式存储 - 以这种方式存储 2 条记录(并按此顺序
    • UpdateStatus = usUnModified 的 1 条记录
    • UpdateStatus = usModified 的 1 条记录 - 此记录包含已修改字段的值。其他字段全部为空。

如何进行 Delta 修改

对于插入/删除的记录

将 StatusFilter 设置为 [usInserted] 和/或 [usDeleted]。改变他们。你完成了。

对于修改的记录

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

编辑:你是对的。如果您不包含所有标记为必需的字段,则无法更改已修改记录的增量字段。

你的代码去:

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;
于 2011-06-30T18:25:34.963 回答