PDA

Ver la Versión Completa : Duplicar registro en clientdataset


oscarac
28-05-2017, 20:32:12
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:

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 := 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.:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, DBClient, ..., [I]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.

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
Hola.

No sé de ningún metodo que poseea el TClientDataSet para realizar esa acción, pero podes agregársela sin mucha dificultad:

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 := 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.:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, DBClient, ..., [I]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