AUDITORIA - VERIFICANDO SOMENTE OS CAMPOS ALTERADOS

06/01/2021

0

Fala pessoal, uma dica legal aqui que eu estava quebrando a cabeça aqui e gostaria de postar a solução para ajudar a comunidade.
Precisava de varrer todos os campos que sofreram modificações no DataSet, pegar o valor antigo e o valor novo dos campos modificados e gerar uma log para a tabela de auditoria. Eu estava errando porque eu estava sempre usando o metodo "NewValue" para pegar o novo valor e não funcionava nunca, os dois valores eram sempre iguais. Então descobri que o metodo correto a utilizar nesse caso era o "value". Vejam o que fiz:

procedure Tdm.Auditar(Qry : TZQuery; Tabela: String; idRegistro : Integer);
var i : Integer;
aLog : string;
begin
i:= 0; //inicializando a variável
aLog := '';
//Auditar Pessoas
with Qry do
//Percorre todos os campos do DataSet e verifica qual foi modificado
while i <= FieldCount - 1 do
begin
//Se o valor antigo for diferente do valor atual (não usar NewValue)
if (Fields[i].OldValue <> Fields[i].Value) then
begin
with ZQAuditoria do
begin
Close;
Open;
Insert;
FieldByName('aud_Tabela').AsString := Tabela; //Tabela do form em movimento
FieldByName('aud_idUser').AsInteger:= ALogin_id; //id do usuario logaro
FieldByName('aud_idRegistro').AsInteger:= idRegistro; //id da pessoa em movimento
FieldByName('aud_Establ').AsInteger:= AEstabl; //id do Establecimiento

aLog := 'Usuario: "' +ALogin_str+'"; '+ #13 +
'Fecha y Hora: ' +DateTimeToStr(now)+'; '+ #13;

if Qry.UpdateStatus = usInserted then
aLog := aLog+'Insertó Registro ';

if Qry.UpdateStatus = usModified then
begin
//campos modificados
aLog := aLog+'Modificó '
+Qry.Fields[i].DisplayLabel+': "'
+Qry.Fields[i].OldValue+'" para "'
+Qry.Fields[i].Value +'"' + #13;
end;

if Qry.UpdateStatus = usDeleted then
aLog := aLog+'Eliminó Registro: ' +IntToStr(idRegistro);

FieldByName('aud_DadosLog').AsString := aLog;
Post;
end;
end;

Inc(i);
end;


Essa procedure foi criada dentro do meu DataModule porque será invocada pelo evento AfterPost de cada Query que será informada no parametro, e isso está acontecendo dentro do meu DataMódule, mas pode ser feito de outra forma também, a intenção aqui é só passar a ideia:

procedure Tdm.ZQPessoasAfterPost(DataSet: TDataSet);
begin
  {Processa o registro das alterações na tabela Auditoria do Banco de Dados
   utilizando três parametros: A Qry que sofreu o CRUD, o Nome da tabela, e
   o registro que foi modificado}
  Auditar(dm.ZQPessoas, 'pessoas', ZQPesConsultaPES_ID.AsInteger);
end;
Wilton Santos

Wilton Santos

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar