Analitcs

Pesquisar no conteúdo do blog.atlabs.com.br

terça-feira, 28 de abril de 2015

DELPHI - Clonar TDataSet para ClientDataSet - Clone TDataSet to ClientDataSet

Reações: 
// Testado clonando um IBQuery para um ClientDataSet - Campos Excedidos no TSQLDataSet
//Se utilizar via abertura direta com um provider, o sistema herda algumas propriedades de somente leitura dos componentes TIB* e não aceita edição dos registros. Solução: Clonar o dataset para um TClientDataSet e alterar manualmente.

Uses
  DBXpress, FMTBcd, DB, SqlExpr, Provider,
  DBClient, IBCustomDataSet, IBQuery, IBDatabase;

procedure CloneDataSet(ACDSDestino : TClientDataSet; ADataSet_Origem : TDataSet);

procedure CloneDataSet(ACDSDestino: TClientDataSet;
  ADataSet_Origem: TDataSet);
Var
  aField : TField;
  I : Integer;
begin

  if not ADataSet_Origem.Active then Exit;
  if ADataSet_Origem.IsEmpty then Exit;

  ACDSDestino.Cancel;
  ACDSDestino.Close;
  ACDSDestino.MasterSource   := nil;
  ACDSDestino.MasterFields   := '';
  ACDSDestino.IndexFieldNames:= '';
  ACDSDestino.PacketRecords  := -1;


  for I := 0 to ADataSet_Origem.Fields.Count - 1 do
  begin
    if (ADataSet_Origem.Fields.Fields[i] is TStringField) then
      aField := TStringField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TIntegerField) then
      aField := TIntegerField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TFloatField) then
      aField := TFloatField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TLargeintField) then
      aField := TLargeintField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TFMTBCDField) then
      aField := TFMTBCDField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TNumericField) then
      aField := TNumericField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TBooleanField) then
      aField := TBooleanField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TDateField) then
      aField := TDateField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TTimeField) then
      aField := TTimeField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TDateTimeField) then
      aField := TDateTimeField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TSQLTimeStampField) then
      aField := TSQLTimeStampField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TBinaryField) then
      aField := TBinaryField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TBlobField) then
      aField := TBlobField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TObjectField) then
      aField := TObjectField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TVariantField) then
      aField := TVariantField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TInterfaceField) then
      aField := TInterfaceField.Create(ACDSDestino)
    else
    if (ADataSet_Origem.Fields.Fields[i] is TAggregateField) then
      aField := TAggregateField.Create(ACDSDestino);


    aField.Name      := ACDSDestino.Name + ADataSet_Origem.Fields.Fields[i].FieldName;
    aField.FieldName := ADataSet_Origem.Fields.Fields[i].FieldName;
    aField.FieldKind := fkData;
    aField.ReadOnly  := False;
    aField.Required  := False;
    aField.DataSet   := ACDSDestino;
    try
      aField.Size := ADataSet_Origem.Fields.Fields[i].Size;
    except
    end;
  end;
  ACDSDestino.CreateDataSet;
  ACDSDestino.Open;

  ADataSet_Origem.First;
  ACDSDestino.DisableControls;
  ADataSet_Origem.DisableControls;
  try
    while not ADataSet_Origem.Eof do
    begin
      ACDSDestino.Insert;
      for I := 0 to ACDSDestino.Fields.Count - 1 do
        ACDSDestino.Fields.Fields[I].Value := ADataSet_Origem.FieldByName(ACDSDestino.Fields.Fields[I].FieldName).Value;
      ADataSet_Origem.Next;
    end;
  finally
    ACDSDestino.EnableControls;
    ADataSet_Origem.EnableControls;
  end;

end;

Max Gehringer