GARANTIR DESCONTO

Fórum Salvar Data e Campo alterado no DB #531727

15/09/2015

0

Olá amigos, estou querendo criar um histórico de alterações dos registros do sistema, criei campos com <data, hora e Membro(Usuário)> que inclui o registro e data, hora e de que membro que foi alterado registros.

Como poderia criar uma rotina que fizesse isso automaticamente, sem precisar que eu tenha que inserir os dados manualmente?

Grato

Allan
Allan

Allan

Responder

Post mais votado

16/09/2015

Olá Allan,

O que você precisa pode ser realizado com uma Trigger no banco de dados.

Luiz Freitas

Luiz Freitas
Responder

Gostei + 1

Mais Posts

16/09/2015

Allan

Luiz, obrigado.
poderias dá um exemplo?
to quebrando a cabeça desde ontem....
Responder

Gostei + 0

16/09/2015

Luiz Freitas

Qual banco de dados você utiliza Allan?
Responder

Gostei + 0

16/09/2015

Allan

Access
Responder

Gostei + 0

16/09/2015

Jothaz

Access


Qual versão?
Responder

Gostei + 0

16/09/2015

Allan

2007
Responder

Gostei + 0

16/09/2015

Jothaz

No Access não existem triggers.

Nas versões iguais ou superiores a 2010 você pode simular triggers utilizando Data Macros.

Dê uma pesquisada no Pai Google que você achará exemplos.
Responder

Gostei + 0

16/09/2015

Allan

Então, eu deveria tipo, trocar de banco de dados pra poder salvar um histórico (log)?
Responder

Gostei + 0

16/09/2015

Jothaz

Isto que deve deve decidir é você.

Nesta versão que você esta utilizando não tem como implementar trigger ou Data Macros, então teria de mudar para a versão 2010
ou mudar para um banco de dados tpagos: SQL Server ou Oracle ou gratis: PostgreSQL, Maria DB ou MySql.

Agora somente você terá poderá decidir se você terá capacidade de utilizar outro bacno de dados ou mesmo qual o impacto da mudança.
Responder

Gostei + 1

16/09/2015

Allan

ok amigo, Obrigado.
Responder

Gostei + 0

16/09/2015

Fabio Cardoso

Alan pelo que entendi você quer criar uma rotina que qualquer alteração feita no seu banco vc fique sabendo é isso?
Você quer essa rotina direto no banco ou seria um procedimento via delphi mesmo?

Porque via Delphi não precisa de mudança nenhuma de banco de dados. podemos desenvolver uma ideia aqui
você quer via delphi ou banco?
Responder

Gostei + 1

16/09/2015

Allan

Isso mesmo Fabio. quero tipo criar um histórico. que quando for feita alterações no banco crie um histórico...
então, queria de preferencia via banco, mas também pode ser via Delphi.
Responder

Gostei + 0

16/09/2015

Luiz Freitas

Olá Allan,

Realmente, a maneira mais simples de fazer o que você precisa é utilizando trigger, mas como o db que você está utilizando não as suporta, nada impede que o trabalho seja realizado diretamente pelo delphi.

Então, criando uma procedure (ou function, depende se você vai querer algum retorno, ou não) com o código necessário para gravar nesta tabela de log, é só chamar essa procedure nas inclusões e a cada alteração.

Compartilha a estrutura da tabela na qual você vai armazenar os logs que, como o Fábio disse, te auxiliamos na criação dessa procedure, se você precisar de ajudar.
Responder

Gostei + 0

17/09/2015

Allan

Então Luiz, eu criei uma tabela TB_CACHE com os campos COD, ALTERACAO, CLIENTE, DATA, HORA.
recebendo o campo que foi alterado de qual cliente e quando.
Responder

Gostei + 0

17/09/2015

Luiz Freitas

Então Luiz, eu criei uma tabela TB_CACHE com os campos COD, ALTERACAO, CLIENTE, DATA, HORA.
recebendo o campo que foi alterado de qual cliente e quando.


Olá Allan, boa tarde!

Blz! Vamos lá:

Se você estiver utilizando um DataModule (provavelmente sim) declare um procedimento como este (declara em Public, assim fica visível em todos os formulários que estiverem fazendo uso do seu DataModule):
public
  procedure GravaLog(pCampo, pCliente: string; pData, pHora: tDateTime);
  { Public declarations }


E implementa assim, caso você esteja utilizado os componentes ADO (a lógica é a mesma, caso você esteja utilizando outros componentes de acesso a dados):
procedure TDataModule.GravaLog(pCampo, pCliente: string; pData, pHora: tDateTime);
begin

  qryTB_CACHE.SQL.Clear;
  qryTB_CACHE.SQL.Add('insert into TB_CACHE(ALTERACAO, CLIENTE, DATA, HORA)');
  qryTB_CACHE.SQL.Add('values(' +quotedStr(pCampo) + ', '
                                +quotedStr(pCliente) + ', '
                                +'#' +formatDateTime('yyyy/MM/dd', pData) +'#' +', '
                                +quotedStr(formatDateTime('hh:mm:ss', pHora)) + ')');
  qryTB_CACHE.SQL.SaveToFile('d:\teste-sql.txt');
  qryTB_CACHE.ExecSQL;

  //obs:
  //deduzi que o campo COD seja auto incremento
end;


Utilize toda vez que realizar uma alteração:
  GravaLog('CIDADE', 'LUIZ', Date, Time);


Não sei exatamente como você está trabalhando, talvez já tenha essas informações em outro lugar, mas acredito que faltam campos para você identificar, principalmente, de qual tabela é o campo sendo alterado e a qual registro alterado na tabela aquele log pertence.

É uma ideia básica pra você tentar solucionar o problema ai... espero que te dê uma base pra conseguir o que precisa.

Qualquer coisa, sinta-se a vontade para perguntar.

t++
Responder

Gostei + 1

18/09/2015

Allan

Olá Luiz, deixa ver se entendi direito.
Eu declaro a procedure publica GravaLog no DM, e a TDataModule.GravaLog eu chamo No envento do botão, ou num evento da table?

Desculpe por minha ignorância.
Responder

Gostei + 0

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

Aceitar