Delphi: duplicar um registro de um dataset

Publicado por Marcos Dell Antonio em 26/04/2007 | Delphi

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.

2 comentários

  1. 1
    Alexandre // December 20th, 2008 at 12:52 pm

    Olá amigo, boa tarde.
    Eu gostaria de incluir uma linha em um dataset, a partir de informaçoes do tipo exto.
    Ja tentei utilizar com componente table:
    dataSet.Tables.Add(table)
    Mas não funciona.
    Você pode me ajudar?
    Obrigado

  2. 2
    Vanderlei // February 17th, 2009 at 4:11 pm

    Amigo, peguei essa função, mexi, mexi um monteaté chego onde quero, mas para isso preciso fechar e abrir a tela novamente.

    O que eu quero fazer!

    Quero duplicar o registro master e os registros do detalhe, mas até agora não consegui deixar 100%, poderia lhe pedir uma ajuda?

    Agradeço

Deixe o seu comentário

Anúncios

Anúncio provido pelo BuscaPé