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:
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:
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
Curtir tópico
+ 1
Responder
Clique aqui para fazer login e interagir na Comunidade :)