Fórum Quais campos da tabela foram alterados? #333005
10/11/2006
0
Estou aqui com mais uma duvida. Estou precisando fazer um log de alterações realizadas em um cadastro de cliente. Tipo assim tudo que é campo que o usuario alterar na tabela de CLIENTE eu fazer um log com o valor anterior a atualização ...
Exemplo: Na minha tabela de cliente tem o campo:
RAZAO - VARCHAR(60)
FANTASIA 0 VARCHAR(60)
O seguinte registro no banco:
RAZAO = ´EMPRESA DE TESTE LTDA´
FANTASIA = ´EMPRESA DE TESTE´
Dai o usuario logado no sistema vai la e muda a FANTASIA DESTE CLIENTE PARA:
FANTASIA = ´SUPER EMPRESA DE TESTE´
Entao eu queria ter esta modificação grava em um log de alterações.
IDUSUARIO = 2
DATA = 10/11/2006 15:18:00
CAMPO = FANTASIA
NOVO_VALOR = ´SUPER EMPRESA DE TESTE´
Se o usuario alterar mais de um campo ... o log listar tudo mais ou menos assim:
IDUSUARIO = 2
DATA = 10/11/2006 15:18:00
CAMPO = FANTASIA
NOVO_VALOR = ´SUPER EMPRESA DE TESTE´
CAMPO = RAZAO
NOVO_VALOR = ´SUPER EMPRESA DE TESTE LTDA´
CAMPO = ENDERECO
NOVO_VALOR = ´RUA DA EMPRESA DELE 1000´
Então é isso pessoal ... Estou usando o Delphi 7 + DbExpress + ClientDataSet + Firebird 1.5
Se alguem puder me dar um help ai .. agradeço desde já.
Abraços!!
Mmoreira
Curtir tópico
+ 0Posts
14/11/2006
Saint
por exemplo..crie um array dinamico
aAntes:array of string
aih no before edit vc coloca lah
SetLength(aAntes,qryCliente.RecordCount); for i:=0 to qryCliente.recordcount-1 do aAntes[i]:=qryCliente.fields[i].asstring;
aih blza..vc tem os valores dos campos..aih no after post da query vc coloca
ActiveControl:=nil; for i:=0 to qrycliente.recordcount-1 do if aAntes[i]<>qrycliente.fields[i].asstring then //Grava o log aqui..o campo foi alterado.. GravaLog;
e pronto..vc vai ter o log do que foi alterado..
ah, o ActiveControl:=nil ali em cima é pra tirar o foco de todos os campos..pq se tratando de banco, as vezes vc pode por exemplo querer salvar enquanto um campo está sendo alterado e o objeto ainda nao atribuiu o valor visualizado ao dataset..
espero ter ajudado, abraco!
Gostei + 0
22/11/2006
Emerson Nascimento
var i: integer; begin with ClientDataSet1 do for i := 0 to FieldCount-1 do if Fields[i].NewValue <> Fields[i].OldValue then ShowMessage(´Campo ´+Fields[i].FieldName+´ alterado´); end;
(eu recomendo que isso seja feito numa trigger)
Gostei + 0
22/11/2006
Macario
Tenho uma rotina que fiz uso o BeforeUpdateRecord do DataSetProvider, pois atraves do Delta dele consigo mapear os campos onde pego nao so o valor alterado mas sim o valor anterior.
Vou procurar um local onde possa postar a rotina para que todos possam utilizar.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)