GARANTIR DESCONTO

Fórum Como atualizar Registros em Tempo real com Access + Delphi #428282

07/11/2012

0

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!
Filipe Silva

Filipe Silva

Responder

Post mais votado

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.

Claudia Nogueira

Claudia Nogueira
Responder

Gostei + 1

Mais Posts

07/11/2012

Claudia Nogueira

Qual componente de conexão com o banco de dados?
Está usando transação?
Responder

Gostei + 0

07/11/2012

Filipe Silva

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...

Responder

Gostei + 0

07/11/2012

Claudia Nogueira

Tenta colocar na propriedade "IsolationLevel" do componente de conexão isso: ilReadCommitted e faça o teste.
Responder

Gostei + 0

07/11/2012

Filipe Silva

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!
Responder

Gostei + 0

07/11/2012

Claudia Nogueira

Há controvérsia em usar ou não transação com Access, porém creio que você terá que testar isso.

try
  ADOConnection1.BeginTrans;
  //Códigos
  ADOConnection1.CommitTrans;
except
  ADOConnection1.RollbackTrans;
end;


Se não funcionar posta novamente que vou testar aqui na rede.
Responder

Gostei + 0

08/11/2012

Filipe Silva

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:

 
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...

Responder

Gostei + 0

08/11/2012

Felipe Passos

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.
Responder

Gostei + 0

08/11/2012

Filipe Silva

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

Responder

Gostei + 0

08/11/2012

Filipe Silva

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
Responder

Gostei + 0

08/11/2012

Claudia Nogueira

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.
Responder

Gostei + 0

08/11/2012

Filipe Silva

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?
Responder

Gostei + 0

08/11/2012

Claudia Nogueira

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:
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.
Responder

Gostei + 0

09/11/2012

Filipe Silva

Claudia,

Consegui, está tudo certo agora, Agradeço muitíssimo a sua ajuda...

Deus abençoe a Sua Vida!!!
Responder

Gostei + 0

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

Aceitar