首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从数据集结构移动到另一个数据集结构的更快方法(在TDatasetProvider中)

将数据从数据集结构移动到另一个数据集结构的更快方法(在TDatasetProvider中)
EN

Stack Overflow用户
提问于 2012-04-19 18:19:47
回答 4查看 11.7K关注 0票数 12

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

因此,假设您在原始数据集中获得了折叠字段:

  • CustomerId
  • Name
  • Age

您需要使用显示位图的方式在DBGrid上选择它。您可以这样做,因为我的DSP可以向数据集数据中添加一个名为Selected的布尔字段。

我现在的做法是:

developer

  • Execute

  • 创建了两个TClientDataset对象(原产地和目标)

  • ,在中加载了从InternalGetRecords方法(重写它)
  1. 的参数中获得的数据,创建了从原产地数据集定义的字段防御,并添加了由目标
  2. 和逐行(和字段- by -字段)在设计时创建的字段防御,然后将数据从原产地数据库复制到目标数据集

H 120,最后将数据变体作为来自InternalGetRecords.的返回值返回。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-01 14:59:55

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

代码语言:javascript
复制
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;

我没有对其进行彻底的测试,但上面的简单示例如出一辙,我能够像往常一样导航第二个客户端数据集并编辑所有字段的值。

票数 13
EN

Stack Overflow用户

发布于 2012-04-19 22:25:51

最快的方法是使用CloneCursor。就像这样:

developer

  • Target.CloneCursor(Origin); //there are more params than this, but this is the basic idea

  • Target在
  1. 中创建2种TClientDataset对象(原产地和目标)
  2. ,加载从目标中的InternalGetRecords方法
  3. 参数获取的数据,创建从原产地数据集中定义的字段防御,并添加在设计中创建的字段防御--由same创建的时间将包含与原产地相同的数据的新视图,但受目标上存在的字段、筛选器等的限制。(如果您没有定义任何字段,它将复制Origin的字段。如果您确实定义了字段,那么它将坚持您给它的内容。)
  4. 从Target复制数据,而这正是您要寻找的.
票数 1
EN

Stack Overflow用户

发布于 2012-04-27 20:14:33

我有一个示例,它动态地将字段添加到CDS中,使用匿名方法计算单个字段,以获得更大的灵活性。在打开CDS之前,要添加计算出的字段,而不是打开它。

这就是你要找的吗?问题不是很清楚..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10234325

复制
相关文章

相似问题

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