Fórum Duplicar registro #380296
29/06/2010
0
Existe uma forma de duplicar um registro, exemplo tenho um poupmenu, com a opção duplicar pedido, quando clico eu gerar um novo registro com os dados do cabeçalho, itens e financeiro?
Desde já agradeço!!
Rodrigo Pereira
Curtir tópico
+ 0Posts
16/07/2010
Carlos Júnior
Use esse procedimento:
procedure DuplicaRegistroDataSet(
dataSet: TCustomClientDataSet;
recNo: integer;
camposIgnorar: array of string);
function IgnorarCampo(campo: string): boolean;
var
i: integer;
begin
Result := false;
for i := 0 to Length(camposIgnorar) - 1 do
begin
if (camposIgnorar[i] = campo) then
begin
Result := true;
Break;
end;
end;
end;
var
valores: Variant;
i: integer;
readOnly: boolean;
begin
// Duplica o registro "recNo" de um dataset
dataSet.RecNo := recNo;
valores := VarArrayCreate([0, dataSet.FieldCount - 1],
VarVariant);
for i := 0 to (dataSet.FieldCount - 1) do
valores[i] := dataSet.Fields[i].Value;
dataSet.Append;
for i := 0 to (dataSet.FieldCount - 1) do
begin
if (not(IgnorarCampo(dataSet.Fields[i].FieldName)))
then
begin
readOnly := dataSet.Fields[i].ReadOnly;
dataSet.Fields[i].ReadOnly := false;
dataSet.Fields[i].Value := valores[i];
dataSet.Fields[i].ReadOnly := readOnly;
end;
end;
end;
procedure TfrmCliente.acDuplicarExecute(Sender: TObject);
begin
inherited;
// Duplica as informações do registro atual
TFuncoesClass.DuplicaRegistroDataSet(cdsClientes,
cdsClientes.RecNo,
['CODIGO']);
end;
Gostei + 0
16/07/2010
Douglas Fernandes
Ou você pode fazer apenas chamar este procedimento duas vezes, fica ate mais facil de você mexer.
Gostei + 0
19/07/2010
Marco Salles
Existe uma forma de duplicar um registro, exemplo tenho um poupmenu, com a opção duplicar pedido, quando clico eu gerar um novo registro com os dados do cabeçalho, itens e financeiro?
Desde já agradeço!!
//evento onclick do PopupMenu procedure TSeuFormulario.DuplicarPedidoClick(Sender: TObject); Type TMyFields = Array of string; TMyValue = Array of String; var MyFields:TMyFields; MyValue:TMyValue; I: Integer; begin try SetLength(MyFields,SeuDataSet.Fields.Count); SetLength(MyValue,SeuDataSet.Fields.Count); for I := 0 to SeuDataSet.Fields.Count - 1 do begin MyFields[i]:=SeuDataSet.Fields[i].DisplayName; MyValue[i]:=SeuDataSet.Fields[i].AsString; end; if SeuDataSet.State in [dsEdit,dsInsert] then exit else SeuDataSet.Insert; for I := 0 to SeuDataSet.fields.Count - 1 do SeuDataSet.FieldByName(MyFields[i]).AsString:=MyValue[i]; SeuDataSet.Post; except // end; end;
Gostei + 0
19/07/2010
Rodrigo Pereira
Vlw resolveu problema, obrigado a todos!!!!
Gostei + 0
19/07/2010
Marco Salles
Gostei + 0
20/07/2010
Rodrigo Pereira
Gostei + 0
20/07/2010
Marco Salles
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)