Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Duplicar registro en clientdataset (https://www.clubdelphi.com/foros/showthread.php?t=91895)

oscarac 28-05-2017 20:32:12

Duplicar registro en clientdataset
 
buenas tardes
asi como dice el titulo, es posible mediante alguna instrucción (en visual fox existe el scat memv copiar registro en variables de memoria y el gath memv pegar )... duplicar un registro de un clientdataset?

ecfisa 29-05-2017 21:53:48

Hola.

No sé de ningún metodo que poseea el TClientDataSet para realizar esa acción, pero podes agregársela sin mucha dificultad:
Código Delphi [-]
unit CDSExt;

interface

uses Variants, DBClient;

type
  TClientDataSet = class( DBClient.TClientDataSet )
  private
    FAuxFields: Variant;
  public
    procedure ReadRecord;
    procedure WriteRecord( const atLast: Boolean = False );
  end;

implementation

{ TClientDataSet }

procedure TClientDataSet.ReadRecord;
var
  i: Integer;
begin
  FAuxFields := VarArrayCreate( [0, FieldCount-1], varVariant );
  for i := 0 to FieldCount-1 do
    FAuxFields[i] := Fields[i].Value;
end;

procedure TClientDataSet.WriteRecord( const atLast: Boolean = False );
var
  i: Integer;
begin
  if not VarIsEmpty( FAuxFields ) then
  begin
    if atLast then
      Append
    else
      Insert;
    for i := 0 to FieldCount-1 do
      Fields[i].Value := FAuxFields[i];
  end;
end;

end.

Solo tenes que recordar agregar la unidad CDSExt (o como la llames) en último lugar al uses de la sección interface donde la vayas a usar, vg.:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, DBClient, ...,  CDSExt;

type
  TForm1 = class( TForm )
    ...
    DataSetProvider1: TDataSetProvider;
    ClientDataSet1: TClientDataSet; 
    DataSource1: TDataSource;
  ...

implementation

// Ejemplos de llamada:

procedure TForm1.Button1Click( Sender: TObject );
begin
  ClientDataSet1.ReadRecord;
end;


procedure TForm1.Button2Click( Sender: TObject );
begin
  ClientDataSet1.WriteRecord( True ); // o :  ClientDataSet1.WriteRecord;
end;
...

Saludos :)

oscarac 12-06-2017 23:29:35

Lo solucione de esta manera, lo publico porque quizá a alguien le pueda ayudar.

Código Delphi [-]
procedure TfrmIngresoComprobantesVarios.DuplicarRegistro;
Var CdsClone : TClientDataSet;
    i: Integer;
begin
  CdsDetalle.Last;
  CdsClone := TClientDataSet.Create(Application);
  try
    CdsClone.CloneCursor(Self.CdsDetalle, True);
    CdsDetalle.Append;
    for I := 0 to CdsClone.FieldCount - 1 do
      CdsDetalle.Fields[i].Value := CdsClone.Fields[i].Value;
    CdsClone.Close;
  finally
    CdsClone.Close;
  end;
  CdsClone.Destroy;
end;

oscarac 10-06-2022 21:33:32

hola Gente....
recordé este post y se me ocurre la pregunta... se puede hacer lo mismo pero ya no en un ClientDataSet si no mas bien en un query?

oscarac 10-06-2022 21:55:23

Cita:

Empezado por ecfisa (Mensaje 517325)
Hola.

No sé de ningún metodo que poseea el TClientDataSet para realizar esa acción, pero podes agregársela sin mucha dificultad:
Código Delphi [-]
unit CDSExt;

interface

uses Variants, DBClient;

type
  TClientDataSet = class( DBClient.TClientDataSet )
  private
    FAuxFields: Variant;
  public
    procedure ReadRecord;
    procedure WriteRecord( const atLast: Boolean = False );
  end;

implementation

{ TClientDataSet }

procedure TClientDataSet.ReadRecord;
var
  i: Integer;
begin
  FAuxFields := VarArrayCreate( [0, FieldCount-1], varVariant );
  for i := 0 to FieldCount-1 do
    FAuxFields[i] := Fields[i].Value;
end;

procedure TClientDataSet.WriteRecord( const atLast: Boolean = False );
var
  i: Integer;
begin
  if not VarIsEmpty( FAuxFields ) then
  begin
    if atLast then
      Append
    else
      Insert;
    for i := 0 to FieldCount-1 do
      Fields[i].Value := FAuxFields[i];
  end;
end;

end.

Solo tenes que recordar agregar la unidad CDSExt (o como la llames) en último lugar al uses de la sección interface donde la vayas a usar, vg.:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, DBClient, ...,  CDSExt;

type
  TForm1 = class( TForm )
    ...
    DataSetProvider1: TDataSetProvider;
    ClientDataSet1: TClientDataSet; 
    DataSource1: TDataSource;
  ...

implementation

// Ejemplos de llamada:

procedure TForm1.Button1Click( Sender: TObject );
begin
  ClientDataSet1.ReadRecord;
end;


procedure TForm1.Button2Click( Sender: TObject );
begin
  ClientDataSet1.WriteRecord( True ); // o :  ClientDataSet1.WriteRecord;
end;
...

Saludos :)

utilice este ejemplo..... gracias


La franja horaria es GMT +2. Ahora son las 06:02:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi