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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.