12

我有一个自定义的 TDatasetProvider,它允许为它提供的任何数据创建新字段。

因此,假设您在原始数据集上获得了以下字段:

  • 客户ID
  • 姓名
  • 年龄

您需要使用显示位图在 DBGrid 上选择它。好吧,你可以,因为我的 DSP 可以添加一个调用Selected数据集数据的布尔字段。

我现在这样做的方式:

  1. 创建 2 个 TClientDataset 对象(Origin 和 Target)
  2. 在 Origin 中,我加载了从 InternalGetRecords 方法的参数中获取的数据(我覆盖了它)
  3. 在 Target 中,我创建了从 Origin 数据集定义的 fielddef,并添加了开发人员在设计时创建的 fielddef
  4. 在目标上执行 CreateDataset
  5. 并且,逐行(和逐字段)将数据从 Origin 数据库复制到 Target 数据集
  6. 最后,将 Data 变量作为 InternalGetRecords 的返回值返回。

我真的不知道是否有更优雅(更快)的方式来做到这一点。还有另一种(更快和/或优雅)的方式来获得这个结果吗?

4

4 回答 4

13

从源数据集加载数据后,似乎可以调用IDSBase.AddField添加更多字段:

uses
  DB, DBCommon, DBClient, DSIntf;

type
  THackClientDataSet = class(TClientDataSet);

procedure EncodeFieldDesc(var FieldDesc: DSFLDDesc;
  const Name: string; DataType: TFieldType; Size, Precision: Integer;
  Calculated: Boolean; Attributes: TFieldAttributes);
begin
  // ... copied from TClientDataSet.EncodeFieldDesc
end;

//...
var
  FldDesc: DSFLDDesc;
begin
  FillChar(FldDesc, SizeOf(FldDesc), 0);
  EncodeFieldDesc(FldDesc, 'SELECTED', ftBoolean, 0, 0, False, []);
  with THackClientDataSet(DataSet) do
    Check(DSBase.AddField(@FldDesc));
  // now you can create a second client dataset and assign it DataSet.Data directly:
  // DataSet2.Data := DataSet.Data;
  // DataSet2 now contains the new field (with empty values in all existing records)
end;

我没有彻底测试它,但上面的简单示例按预期工作,我能够导航第二个客户端数据集并像往常一样编辑所有字段的值。

于 2012-05-01T14:59:55.613 回答
1

最快的方法是使用CloneCursor. 像这样的东西:

  1. 创建 2 个 TClientDataset 对象(Origin 和 Target)
  2. 在 Origin 中,加载从 InternalGetRecords 方法的参数中获取的数据
  3. 在 Target 中,创建从 Origin 数据集定义的 fielddefs,并添加开发人员在设计时创建的 fielddefs
  4. Target.CloneCursor(Origin); //there are more params than this, but this is the basic idea
  5. Target 现在将包含与 Origin 相同数据的新视图,但受 Target 上存在的任何字段、过滤器等的限制。(如果您没有定义任何字段,它将复制 Origin 的字段。如果您确实定义了字段,那么它会坚持您提供的内容。)
  6. 从 Target 复制数据,这应该正是您正在寻找的。
于 2012-04-19T22:25:51.443 回答
0

I have a sample that adds fields to a CDS dynamically, using anonymous methods for the calculations of individual fields, to achieve more flexibility. Before opening the CDS, you add the calculated fields, than open it..

Is this is what you are looking for? The question is not very clear...

于 2012-04-27T20:14:33.363 回答
-1

您可以使用 TClientDataset 的 Data 属性复制整个数据集、元数据和数据。这应该是将一个 TClientDataset 复制到另一个的最快方法。

请参阅http://docwiki.embarcadero.com/RADStudio/en/Assigning_Data_Directly

于 2012-04-19T19:26:36.250 回答