Fórum Quais campos da tabela foram alterados? #333005

10/11/2006

0

Salve pessoal,

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

Mmoreira

Responder

Posts

14/11/2006

Saint

opa..blza? pq vc nao usa array?

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!


Responder

Gostei + 0

22/11/2006

Emerson Nascimento

você pode ler a alteração no próprio clientdataset:
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)


Responder

Gostei + 0

22/11/2006

Macario

Olá boa tarde colega.


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.


Responder

Gostei + 0

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

Aceitar