Criando uma função que retorna os campos alterados em uma tabela

Nesta dica mostrarei como criar um função que receberá como parâmetros um ClientDataSet e um String com os nomes dos campos que serão verificados e retornará um String com o nome do campo alterado, o valor antigo do campo e o valor atual. Eu uso esta função para gravar as alterações na tabela LOG.

Eis o código da função:
 
function CampoAlterado(ACDS: TClientDataSet; ACampos: String): String;
var
   CampoAlt : array of String;
   X, Y     : Integer;
   A, B     : String;
begin
Result := '';
Y := 0;
for X := 1 to length(ACampos) do
    begin
    A := Copy(ACampos, X, 1);
    if A = ';' then
       begin
       Y               := Y + 1;
       SetLength(CampoAlt, Y);
       CampoAlt[Y - 1] := B;
       B               := '';
       end
    else
       begin
       B := B + A;
       end;
    end;
for X := 0 to Y -1 do
    begin
    A := ACDS.FieldByName(CampoAlt[X]).OldValue;
    B := ACDS.FieldByName(CampoAlt[X]).NewValue;
    if A <> B then
       Result := Result + 'Alterado o campo ' + ACDS.FieldByName(CampoAlt[X]).DisplayLabel + ' de ' + A + ' para ' + B + #13;
    end;
end;
 
 
usando a função:
 
var
   Texto : String;
begin
Texto := CampoAlterado(cdsCliente, 'NOME;DATA_NASCIMENTO;');
if Texto <> '' then
   begin
   Query.SQL.Add('INSERT INTO LOG (DATA, TEXTO) VALUES (CURRENT_DATE, :TEXTO)');
   Query.ParamByName('TEXTO').AsString := Texto;
   Query.ExecSQL;
   end;
end;
 

Artigos relacionados