Apr 26 2007
Delphi: duplicar um registro de um dataset
Aqui na empresa temos algumas situações onde precisamos disponibilizar para os usuários opções para duplicar determinados registros.
Como usamos DataSets para armazenar os dados enquanto o usuário está manipulando eles, temos duas opções para realizar esta operação:
1 - Copiar manualmente
Esta é a forma mais simples e lógica: você copia os registros do DataSet para umas variáveis, faz um Append ou Insert nele e define os novos valores conforme os copiados. Claro que se o seu DataSet tiver uma quantidade considerável de campos isso é inaplicável, portanto use a segunda opção.
2 - Utilizar um método genérico
Um pouco mais complexo que a forma acima, neste caso a idéia é usar um método genérico que copia as informações do registro atual para um novo. Este método é implementado da seguinte forma:
class procedure TFuncoesClass.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;
Logicamente que você pode definir este método como um procedimento. Basta remover a declaração class procedure TFuncoesClass e adicionar a palavra procedure.
Este método recebe três parâmetros, conforme descrito abaixo:
- dataSet: é o DataSet que você deseja duplicar o registro;
- recNo: identifica qual é o registro a ser duplicado. Você pode remover este parâmetro da implementação retirando ele da declaração do método e apagando a linha dataSet.RecNo := recNo. Caso fizer isso, o registro duplicado sempre será o atual. Já se você deseja manter o parâmetro e quer duplicar o registro atual, basta passar para ele o valor dataSet.RecNo;
- camposIgnorar: se você quiser ignorar alguns campos ao duplicar o registro, basta passá-los da seguinte forma: ['Campo1', 'Campo2', 'CampoN']. Se não quiser usar este parâmetro, use o valor [].
Repare também que o método faz um tratamento caso o campo seja ReadOnly. Quando isso acontecer, ele armazenará o estado atual, definirá como false, fará a cópia e voltará ao estado antigo. Isto foi feito para evitar uma Exception ao copiar campos ReadOnly.
Exemplo de uso deste método:
procedure TfrmCliente.acDuplicarExecute(Sender: TObject); begin inherited; // Duplica as informações do registro atual TFuncoesClass.DuplicaRegistroDataSet(cdsClientes, cdsClientes.RecNo, ['CODIGO']); end;
É isso ae. Até+.
Ps: este código é uma adaptação do original disponível na Active Delphi.







