Fórum Como atualizar Registros em Tempo real com Access + Delphi #428282
07/11/2012
0
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
Curtir tópico
+ 0Post mais votado
08/11/2012
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.
Claudia Nogueira
Gostei + 1
Mais Posts
07/11/2012
Claudia Nogueira
Está usando transação?
Gostei + 0
07/11/2012
Filipe Silva
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
07/11/2012
Claudia Nogueira
Gostei + 0
07/11/2012
Filipe Silva
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
07/11/2012
Claudia Nogueira
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
08/11/2012
Filipe Silva
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
08/11/2012
Felipe Passos
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
08/11/2012
Filipe Silva
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
08/11/2012
Filipe Silva
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
08/11/2012
Claudia Nogueira
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
08/11/2012
Filipe Silva
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
08/11/2012
Claudia Nogueira
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
09/11/2012
Filipe Silva
Consegui, está tudo certo agora, Agradeço muitíssimo a sua ajuda...
Deus abençoe a Sua Vida!!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)