TDataset.CopyFields

Description

Often when manipulating datasets with similar structures, you need to copy the records from one dataset to another.  E.g. you may have fetched some records in a query or clientdaset and have located the matching records in another dataset.  You might then want to ensure the record values match without refetching the target dataset.
This looks like it would be easy to implement - i have rewritten it to take care of nested datasets as well as ordinary dataset fields.

Steps to Reproduce:

This is a requested new public method in the base TDataset class.

function TDataSet.CopyFields(Source: TDataSet): Integer;
// copies matching fields in current records- returns number of fields copied
var
  FieldCtr: Integer;
  DestField, SourceField: TField;
begin
  Result := 0;
  for FieldCtr := 0 to Source.FieldCount - 1 do begin
    SourceField := Source.Fields[FieldCtr];
    Field := FindField(SourceField.FieldName);
    if not Assigned(Field) then Continue;
    if Field.ClassType = TDataSetField then begin  // nested datasets
      while TDataSetField(Field).NestedDataSet.RecordCount > 0 do
        TDataSetField(Field).NestedDataSet.Delete;
      TDataSetField(SourceField).NestedDataSet.First;
      while not TDataSetField(SourceField).NestedDataSet.Eof do begin
        TDataSetField(Field).NestedDataSet.Append;
        CopyFields(TDataSetField(Field).NestedDataSet, TDataSetField(SourceField).NestedDataSet);
        TDataSetField(Field).NestedDataSet.Post;
        TDataSetField(SourceField).NestedDataSet.Next;
      end;
    end else
      Field.Value := SourceField.Value;
    Inc(Result);
  end;
end;

This would typically be used as follows:

SourceDS.First;
while not SourceDS.EOF do begin
  if DestDS.Locate({info required to find matching record}) then begin
    DestDS.Edit;
    DestDS.CopyFields(SourceDS);
    DestDS.Post;
  end;
  SourceDS.Next;
end; 
时间: 2024-09-19 12:21:45

TDataset.CopyFields的相关文章

中间件序列TDATASET为BUFFER演示代码

procedure SendStream(const AStream: TStream);var Buffer: array[0..4095] of Byte; // 每包最大4K StartPos, AmountInBuf, AmountSent: Integer;begin if AStream = nil then Exit; AStream.position := 0; while True do begin StartPos := AStream.Position; AmountInB

ClientDataSet中动态添加计算字段并用计算字段显示记录的UpdateStatus

ClientDataSet中每条记录都有UpdateStatus=(usUnmodified, usModified, usInserted, usDeleted)记录该条数据是修改的,删除的,还是新增的等.有时候我们只想看修改的或新增的或删除的就可能用到这一属性.下图用计算字段显示UpdateStatus状态. ********************************************************************************************

通用的更新方法

function THlsImplBase.UpdateTableData(ATableName, AKeyField: AnsiString; var AData: Variant): Boolean; var LSql: string; I: Integer; {$IFDEF MSSQL} LProvider: TProvider; LDataSet: TDataSet; {$ENDIF} {$IFDEF ORACLE} LOraQuery: TOraQuery; LDataProvider

Solr 配置文件之schema.xml

schema.xml这个配置文件的根本目的是为了通过配置告诉Solr如何建立索引. solr的数据结构如下: document:一个文档.一条记录 field:域.属性 solr通过搜索某个或某些field,返回若干个符合条件的document,或者按搜索的score排序返回. 如果跟数据库对比,document相当于数据库的表,field相当于表中的字段.而schema.xml就是为了定义一个表的结构(定义各个field的名字.类型.约束.等等). schema.xml的基本结构如下: <sc

delphi显示Sqlite的Text字段

1 procedure Mainform.SetField(Sender: TField; var Text: string; 2 DisplayText: Boolean); 3 begin 4 Text := Sender.AsString ; 5 end; 6 7 procedure TClientform.UniQuery1AfterOpen(DataSet: TDataSet); 8 var 9 i :Integer ; 10 begin 11 with DataSet do 12 b

Report Machine(RM)报表控件简单用法-delphi

RM(Report Machine)是一个功能强大的Delphi报表控件包.使用它可以制作出非常复杂的报表.下面讲述最简单的用法: 在Form上放上两个数据库控件:ADOConnection和ADOQuery设置好ADOConnection的ConnectionString.LoginPrompt=False.ADOQuery的Connection指向ADOConnection.ADOQuery的SQL设置好数据查询语句. 在Form上放上两个RM报表控件:RMDBDataSet和RMRepor

TClientDataSet使用要点

TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件.该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要. 一.TClientDataSet的基本属性和方法介绍 1).FieldDefs: 字段定义列表属性 开发者可通过单击属性编辑器中该属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单

FIREDAC的DATASNAP示例

服务端使用FDQUERY查询数据并返回TDATASET: function TServerMethods1.GetData(var sql: string): tdataset;begin qry.Close; qry.Open(sql); Result := TFDMemTable.Create(nil); TFDMemTable(Result).Data := qry.Data;end; 客户端用FDCONNECTION连接中间件,FDStoredProc访问远程方法: procedure

Delphi中根据分类数据生成树形结构的最优方法

一. 引言:    TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能,因而受到广大程序员的青睐.    树形结构在Windows环境中被普遍应用,但在数据库开发中面对层次多.结构复杂的数据,如何快速构造树形目录并实现导航呢?    二. 实现关键技术:    在Delphi提供的控件中包含了TreeView控件,但树的具体形成还需要用户编写代码.即它的列表项要在程序