Como atualizar Registros em Tempo real com Access + Delphi
Olá Pessoal,
Estou desenvolvendo um sistema em Delphi com o Banco de dados Access, e estou com um problema para trabalhar em Rede com o Access.
O banco de dados fica em um servidor, e a aplicação é instalada localmente na máquina de cada colaborador. Mas tem um problema.
Quando dois ou mais um usuário estão utilizando o sistema simultaneamente e um deles faz uma alteração em um registro, essa alteração não é mostrada em tempo real para os outros usuários que estão com a aplicação aberta. Ela só atualiza quando o sistema é fechado e aberto novamente.
Queria que atualizasse tudo em tempo real, Já busquei por tudo essa solução, mas não encontro.
Por Favor Alguém me Ajuda!!!
Obrigado!
Estou desenvolvendo um sistema em Delphi com o Banco de dados Access, e estou com um problema para trabalhar em Rede com o Access.
O banco de dados fica em um servidor, e a aplicação é instalada localmente na máquina de cada colaborador. Mas tem um problema.
Quando dois ou mais um usuário estão utilizando o sistema simultaneamente e um deles faz uma alteração em um registro, essa alteração não é mostrada em tempo real para os outros usuários que estão com a aplicação aberta. Ela só atualiza quando o sistema é fechado e aberto novamente.
Queria que atualizasse tudo em tempo real, Já busquei por tudo essa solução, mas não encontro.
Por Favor Alguém me Ajuda!!!
Obrigado!
Filipe Silva
Curtidas 0
Melhor post
Claudia Nogueira
08/11/2012
Ah então não tem nenhum problema mesmo.
Eu tinha entendido que as informações não apareciam enquanto não fechasse e abrisse o sistema.
Se ao dar close open as informaçóes são mostradas então está certo.
Não vai mostrar automaticamente a menos que você implemente algo pra fechar e abrir a quey ou table com um timer por exemplo.
Eu tinha entendido que as informações não apareciam enquanto não fechasse e abrisse o sistema.
Se ao dar close open as informaçóes são mostradas então está certo.
Não vai mostrar automaticamente a menos que você implemente algo pra fechar e abrir a quey ou table com um timer por exemplo.
GOSTEI 1
Mais Respostas
Claudia Nogueira
07/11/2012
Qual componente de conexão com o banco de dados?
Está usando transação?
Está usando transação?
GOSTEI 0
Filipe Silva
07/11/2012
Oi Claudia
O componente de Conexão com o banco é o ADOConnection e as Tabelas do banco são ligadas com ADOTables.
Não estou usando Transação...
O componente de Conexão com o banco é o ADOConnection e as Tabelas do banco são ligadas com ADOTables.
Não estou usando Transação...
GOSTEI 0
Claudia Nogueira
07/11/2012
Tenta colocar na propriedade "IsolationLevel" do componente de conexão isso: ilReadCommitted e faça o teste.
GOSTEI 0
Filipe Silva
07/11/2012
Oi Claudia,
Tentei esse procedimento mas o meu problema persiste.
o Registro não atualiza em tempo real para todos os usuários com a aplicação aberta.
se achar outra solução...
Obrigado!
Tentei esse procedimento mas o meu problema persiste.
o Registro não atualiza em tempo real para todos os usuários com a aplicação aberta.
se achar outra solução...
Obrigado!
GOSTEI 0
Claudia Nogueira
07/11/2012
Há controvérsia em usar ou não transação com Access, porém creio que você terá que testar isso.
Se não funcionar posta novamente que vou testar aqui na rede.
try ADOConnection1.BeginTrans; //Códigos ADOConnection1.CommitTrans; except ADOConnection1.RollbackTrans; end;
Se não funcionar posta novamente que vou testar aqui na rede.
GOSTEI 0
Filipe Silva
07/11/2012
Testei esse código no evento afterpost da minha tabela. mas não funcionou, então eu coloquei um close e open após a transação:
Fechar e abrir a tabela funciona, se o usuario das outras estações apertar o botão de salvar, se não, não atualiza automaticamente.
Uma sugestão que já vi em outros fóruns é criar um ttimer que a cada xtempo é fechada e aberta a tabela, mas muitos dizem que o sistema fica lento. então não sei o que fazer...
try conexao.BeginTrans; //Códigos conexao.CommitTrans; except conexao.RollbackTrans; end; ado_funcionario.Close; ado_funcionario.Open;
Fechar e abrir a tabela funciona, se o usuario das outras estações apertar o botão de salvar, se não, não atualiza automaticamente.
Uma sugestão que já vi em outros fóruns é criar um ttimer que a cada xtempo é fechada e aberta a tabela, mas muitos dizem que o sistema fica lento. então não sei o que fazer...
GOSTEI 0
Felipe Passos
07/11/2012
Bom dia,
uma alternativa é vc colocar um campo no banco e atribuir um valor sempre que o mesmo for alterado.
E com os outros componentes de conexão, ou seja, os outros terminais vc faz a verificação desse valor, se coincidir ai vc abre e fecha a tabela.
Espero que ajude.
Abraços.
uma alternativa é vc colocar um campo no banco e atribuir um valor sempre que o mesmo for alterado.
E com os outros componentes de conexão, ou seja, os outros terminais vc faz a verificação desse valor, se coincidir ai vc abre e fecha a tabela.
Espero que ajude.
Abraços.
GOSTEI 0
Filipe Silva
07/11/2012
Olá Felipe,
Agradeço sua sugestão, mas não entendi muito bem...
Só para esclarecer melhor
O meu banco de dados possui uma tabela funcionário que possui um campo valor, e outra tabela chamada lançamento que também possui um campo valor. Mas posso fazer vários lançamentos em cima de um funcionário. O que acontece é o seguinte, quando eu faço um lançamento o programa pega o valor do lançamento e soma com o valor que possui na tabela dos funcionários ou seja (lançamento.valor = valores dos lançamento individuais) (funcionário.valor = Soma dos valores de cada lançamento).
Só preciso o seguinte: quando for feito um lançamento em uma maquina X, se a maquina Y estiver no formulário dos funcionários, os dados lançados no ponto X sejam atualizados em tempo real no ponto Y.
Não sei se da para entender.
sou iniciante no Delphi
Felipe poderia dar um exemplo mais específico ?
Obrigado
Agradeço sua sugestão, mas não entendi muito bem...
Só para esclarecer melhor
O meu banco de dados possui uma tabela funcionário que possui um campo valor, e outra tabela chamada lançamento que também possui um campo valor. Mas posso fazer vários lançamentos em cima de um funcionário. O que acontece é o seguinte, quando eu faço um lançamento o programa pega o valor do lançamento e soma com o valor que possui na tabela dos funcionários ou seja (lançamento.valor = valores dos lançamento individuais) (funcionário.valor = Soma dos valores de cada lançamento).
Só preciso o seguinte: quando for feito um lançamento em uma maquina X, se a maquina Y estiver no formulário dos funcionários, os dados lançados no ponto X sejam atualizados em tempo real no ponto Y.
Não sei se da para entender.
sou iniciante no Delphi
Felipe poderia dar um exemplo mais específico ?
Obrigado
GOSTEI 0
Filipe Silva
07/11/2012
Exatamente Claudia.
O comando close e open funcionam perfeitamente, mas agora o problema está em onde posso colocar esse código.
Criar um time acho que não seria muito viável porque, se um usuário salvar em cima de um registro que já foi alterado por outro usuário, sendo que este ainda não foi atualizado, vai dar um erro. E como o sistema vai ser usado por várias estações simultaneamente a probabilidade de isso acontecer antes do timer atualizar, é grande. Acho que se programar um timer para fechar e abrir a tabela a cada 1 seg, também vai dar muito problema.
Posso estar enganado quanto ao timer, mas se houver uma solução agradeceria muitooo
O comando close e open funcionam perfeitamente, mas agora o problema está em onde posso colocar esse código.
Criar um time acho que não seria muito viável porque, se um usuário salvar em cima de um registro que já foi alterado por outro usuário, sendo que este ainda não foi atualizado, vai dar um erro. E como o sistema vai ser usado por várias estações simultaneamente a probabilidade de isso acontecer antes do timer atualizar, é grande. Acho que se programar um timer para fechar e abrir a tabela a cada 1 seg, também vai dar muito problema.
Posso estar enganado quanto ao timer, mas se houver uma solução agradeceria muitooo
GOSTEI 0
Claudia Nogueira
07/11/2012
Felipe o pessoal não costuma fazer esse tipo de controle não, o máximo que alguns fazem é bloquear o registro aberto pra nenhuma outra máquina poder editar.
Explico isso por que logicamente falando, quando você está vendo os dados no seu programa, você não está usando os dados que estão fisicamente no banco de dados, você está usando os dados de uma consulta que foi feita previamente usando um Table ou Query. Então antes de abrir você consultou e mostrou, pra esse PC são esses dados que foram consultados que serão mostrados. Não tem como adivinhar uma possível alteração ocorrida em outra máquina, sem que atualize a consulta.
O que muitos fazem também, é ter um campo em todas as tabelas guardando data e hora da última atualização, então quando você carrega os dados de uma tabela, você guarda em uma variável essa informação, antes de gravar faz uma verificação se esse campo está diferente do campo carregado e dá uma mensagem, pedindo pra reabrir a tela.
Tem várias situações envolvendo isso.
Eu por exemplo em nenhum software meu faço esse tipo de controle.
Tenho um software que tem pelo menos 5 mil usuários e nunca precisei fazer isso.
Explico isso por que logicamente falando, quando você está vendo os dados no seu programa, você não está usando os dados que estão fisicamente no banco de dados, você está usando os dados de uma consulta que foi feita previamente usando um Table ou Query. Então antes de abrir você consultou e mostrou, pra esse PC são esses dados que foram consultados que serão mostrados. Não tem como adivinhar uma possível alteração ocorrida em outra máquina, sem que atualize a consulta.
O que muitos fazem também, é ter um campo em todas as tabelas guardando data e hora da última atualização, então quando você carrega os dados de uma tabela, você guarda em uma variável essa informação, antes de gravar faz uma verificação se esse campo está diferente do campo carregado e dá uma mensagem, pedindo pra reabrir a tela.
Tem várias situações envolvendo isso.
Eu por exemplo em nenhum software meu faço esse tipo de controle.
Tenho um software que tem pelo menos 5 mil usuários e nunca precisei fazer isso.
GOSTEI 0
Filipe Silva
07/11/2012
Pois é
Consegui resolver o problema da atualização com um timer, mas surgiu um outro problema... =/
Bloquear um registro quando um outro usuário estiver editando o mesmo. ja realizei algumas configurações no access mas ainda não obtive resultado na aplicação, consigo editar duas ao mesmo tempo, mas na hora que salva da erro
'a linha não pode ser localizada para atualização. alguns valores podem ter sido alterados desde que ela foi lida pela ultima vez '
Preciso evitar esse erro bloqueando o registro quando clico no botão edit.
Podem me Ajudar?
Consegui resolver o problema da atualização com um timer, mas surgiu um outro problema... =/
Bloquear um registro quando um outro usuário estiver editando o mesmo. ja realizei algumas configurações no access mas ainda não obtive resultado na aplicação, consigo editar duas ao mesmo tempo, mas na hora que salva da erro
'a linha não pode ser localizada para atualização. alguns valores podem ter sido alterados desde que ela foi lida pela ultima vez '
Preciso evitar esse erro bloqueando o registro quando clico no botão edit.
Podem me Ajudar?
GOSTEI 0
Claudia Nogueira
07/11/2012
Filipe não sei como verificar se o registro está bloqueado com o Ado, mas uma forma seria você tratar a mensagem no momento da gravação. Exemplo:
Obs.: Reparde que no AnsiPos eu apenas digitei a mensagem que você postou que está dando, não sei a mensagem exata, tem que olhar e digitar uma parte da mensagem ali.
try
//Código...
Tabela.Post;
execpt
on E:Exception do
begin
if AnsiPos('alguns valores podem ter sido alterados',E.message) > 0 then
ShowMessage('O registro foi editado por outro usuário')
else
ShowMessage(E.Message);
end;
end;
Obs.: Reparde que no AnsiPos eu apenas digitei a mensagem que você postou que está dando, não sei a mensagem exata, tem que olhar e digitar uma parte da mensagem ali.
GOSTEI 0
Filipe Silva
07/11/2012
Claudia,
Consegui, está tudo certo agora, Agradeço muitíssimo a sua ajuda...
Deus abençoe a Sua Vida!!!
Consegui, está tudo certo agora, Agradeço muitíssimo a sua ajuda...
Deus abençoe a Sua Vida!!!
GOSTEI 0