我遇到了一些应该处理TClientDataSet的代码的问题
Delta,我将其归结为以下测试案例。

我有两个ClientDataSets,cdsData和cdsDelta,都带有一个数据源DBGrid
和DBNavigator,以及一个用于显示Delta的OldValue和NewValues的TTreeView。

在cdsDatas AfterPost中,我调用下面的DisplayDelta过程。

当我运行该应用程序时,我更改了一个字段的值并将其保存在csdData中,
说“PrevValue”到“UpdatedValue”。我的问题是
树 View 中的OldValue和NewValue节点显示“UpdatedValue”,并且
没有“PrevValue”的迹象。那么,如何正确获取OldValue?

procedure TDeltaTestForm.DisplayDelta;
var
  Delta : OleVariant;
begin
  Delta := cdsData.Delta;
  if not VarIsClear(Delta) then begin
    cdsDelta.Data := Delta;
  end;
  if cdsData.Modified then
    Caption := 'modified'
  else
    Caption := '';
  Caption := Caption + '/' + IntToStr(cdsData.ChangeCount);
  BuildDeltaTree;
end;

procedure TDeltaTestForm.BuildDeltaTree;
var
  NewNode,
  ChildNode : TTreeNode;
  i,
  ID : Integer;
  Field : TField;
  Value : String;

  function ChildValue(ALabel : String; FieldValue : Variant) : String;
  begin
    Result := ALabel;
    if VarIsClear(FieldValue) then
      Result := Result + '(empty)'
    else
      if VarIsNull(FieldValue) then
        Result := Result + '(null)'
      else
        Result := Result + VarToStr(FieldValue);
  end;
begin
  { Find the current row in the delta dataset }

  ID := cdsData.FieldByName('ID').AsInteger;
  if not cdsDelta.Locate('ID', ID, []) then
    raise Exception.CreateFmt('ID: %d not found in Delta', [ID]);

  TreeView1.Items.BeginUpdate;
  try
    Treeview1.Items.Clear;
    for i:= 0 to cdsDelta.FieldCount - 1 do begin
      Field := cdsDelta.Fields[i];
      NewNode := TreeView1.Items.AddChild(Nil, Field.FieldName);
      ChildNode := TreeView1.Items.AddChild(NewNode, ChildValue('Old: ', Field.OldValue));
      ChildNode := TreeView1.Items.AddChild(NewNode, ChildValue('New: ', Field.NewValue));
      ChildNode := TreeView1.Items.AddChild(NewNode, ChildValue('Cur: ', Field.CurValue));
    end;
    TreeView1.FullExpand;
  finally
    TreeView1.Items.EndUpdate;
  end;
end;

最佳答案

我可以重现您的问题。试试这个:

改变

for i:= 0 to cdsDelta.FieldCount - 1 do begin
  Field := cdsDelta.Fields[i];


for i:= 0 to cdsData.FieldCount - 1 do begin
  Field := cdsData.Fields[i];

现在,您应该找到所需的OldValueNewValue的值。无论如何,我在这里。

我承认对此感到有些困惑-我一直认为您可以将一个CDS的Delta分配给另一个CDS,而第二个CDS将包含与Delta相同的字段值(旧值和新值),但显然不是。但是,此结果与Cary Jensen出色的“ClientDataSets”(第6章中的“StatusFilter Versus Delta”)的一段很相似,他说:

“...当您使用CDS的增量加载第二个CDS时,第二个CDS没有更改缓存。”

也许他的意思是,您在第二篇文章中得到的只是Delta的快照,而不是其历史。我猜这就是为什么您的cdsDelta在Field.OldValue和Field.NewValue中返回相同值的原因。

关于delphi - 处理ClientDataset的增量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39168696/

10-13 02:40