Mirror

How to copy a record from one table to another (Views: 100)


Problem/Question/Abstract:

Assuming I have Table1 and Table2, that have identical structures (same fields), how can I transfer all of the fields in the current record to a new record in the second table? For example, I want record no. 3 in Table1 to be appended to Table2.

Answer:

Solve 1:

for I := 0 to Table1.FieldCount do
  Table2.Fields[I].AsVariant := Table1.Fields[I].AsVariant;


Solve 2:

Copies a record from a DataSet to a Table by field names. This is much safer than using the Fields property since the order of fields in the Fields array depends on the order of instantiation of the TField objects, not the order of fields in the table. This procedure assumes that the corresponding fields in the source and destination datasets have the same names.

Parameters:
Source = The source dataset
Destination = The destination table

procedure dgCopyRecordByName(Source: TDataSet; Destination: TTable);
var
  LastField, L: Integer;
begin
  Destination.Edit;
  LastField := Source.FieldCount - 1;
  for L := 0 to LastField do
  begin
    {Skip fields that do not exist in the destination table}
    if Destination.FieldDefs.IndexOf(Source.FieldDefs[L].Name) < 0 then
      Continue;
    {Skip fields that are read only in the destination dataset}
    if Destination.FieldByName(Source.FieldDefs[L].Name).ReadOnly then
      Continue;
    {Copy the field}
    Destination.FieldByName(Source.FieldDefs[L].Name).Assign
      (Source.FieldByName(Source.FieldDefs[L].Name));
  end;
end;


Solve 3:

var
  iCount: LongInt;
  sName: string;
begin
  Table2.Insert;
  for iCount := 0 to Table2.FieldCount - 1 do
  begin
    sName := Table2.Fields[iCount].FieldName;
    if (Table1.FindField(sName) <> nil) and (sName <> 'ID') then
      Table2.FieldByName(sName).Assign(Table1.FieldByName(sName));
  end;
  Table2.Post;
end;

If you work with FieldByName, there are 2 advantages: You can copy only the fields you want. In the upper example, the field "ID" would not be copied. The construction of the two tables must not the same. Only fields with the same name would be copied. If you are sure, the construction is the same

for iCount := 0 to Table2.FieldCount - 1 do
  Table2.Fields[iCount].Assign(Table1.Fields[iCount]);

also works.


Solve 4:

procedure CopyRecord(Tabelle: TTable);
var
  feldwert: Variant;
  i: Word;
begin
  with DataModule1 do
  begin
    feldwert := VarArrayCreate([0, Tabelle.FieldCount - 1], varVariant);
    for i := 0 to Tabelle.FieldCount - 1 do
      feldwert[i] := Tabelle.Fields[i].Value;
    Tabelle.Append;
    for i := 0 to Tabelle.FieldCount - 1 do
      Tabelle.Fields[i].Value := feldwert[i];
  end;
end;


Solve 5:

procedure AppendCurrent(Dataset: TDataset);
var
  aField: Variant;
  i: Integer;
begin
  {Create a variant Array}
  aField := VarArrayCreate([0, DataSet.Fieldcount - 1], VarVariant);
  {Read values into the array}
  for i := 0 to (DataSet.Fieldcount - 1) do
  begin
    aField[i] := DataSet.fields[i].Value;
  end;
  DataSet.Append;
  {Put array values into new the record}
  for i := 0 to (DataSet.Fieldcount - 1) do
  begin
    DataSet.fields[i].Value := aField[i];
  end;
end;


Solve 6:

The following is a chunk of code that I use to copy TTable rows. This function assumes that you are handling the insert and post calls yourself.

function CopyRow(Source, Dest: TTable): Boolean;
var
  n: Integer;
begin
  Result := False;
  for n := 0 to Source.FieldCount - 1 do
  begin
    try
      Dest.Fields[n].Assign(Source.Fields[n]);
    except
      Exit;
    end;
  end;
  Result := True;
end;

<< Back to main page