Firebird Refresh
Prezados Colegas
Estou com a seguinte duvida abaixo descrita e gostaria da ajuda dos colegas.
Duvida
1) Tenho um sistema rodando em Delphi 7, Firebird 2.0 e conexão com DBExpress:
SQLConnection;
ClientDataSet;
SQLDataSet;
DataSetProvider;
DataSource.
No caso concreto, existem 10 máquinas acessando o banco de dados ao mesmo tempo. Todas conseguem visualizar, Incluir, Alterar e Excluir dados, porém, as Inclusões, Alterações e Exclusões que qualquer máquina faça só vai ser vista pela outra quando o usuário fechar o sistema e abri-lo novamente. Não está correto! Como eu faço para que as Inclusões, alterações e Exclusões que qualquer terminal faça seja refletido automaticamente para os demais? Sou inicante neste componente, antes usava BDE com Paradox. Como devo fazer agora para atualizar as informações em ambiente Cliente-Servidor.
Desde já agradeço a ajuda e atenção.
Estou com a seguinte duvida abaixo descrita e gostaria da ajuda dos colegas.
Duvida
1) Tenho um sistema rodando em Delphi 7, Firebird 2.0 e conexão com DBExpress:
SQLConnection;
ClientDataSet;
SQLDataSet;
DataSetProvider;
DataSource.
No caso concreto, existem 10 máquinas acessando o banco de dados ao mesmo tempo. Todas conseguem visualizar, Incluir, Alterar e Excluir dados, porém, as Inclusões, Alterações e Exclusões que qualquer máquina faça só vai ser vista pela outra quando o usuário fechar o sistema e abri-lo novamente. Não está correto! Como eu faço para que as Inclusões, alterações e Exclusões que qualquer terminal faça seja refletido automaticamente para os demais? Sou inicante neste componente, antes usava BDE com Paradox. Como devo fazer agora para atualizar as informações em ambiente Cliente-Servidor.
Desde já agradeço a ajuda e atenção.
M
Curtidas 0
Respostas
Edsoncabral
15/02/2008
Pela lógica, para poder ver os registros que foram adicionados e tal, bastaria vc atualizar o seu select, dando um close e um open no seu clientdataset.
Observe que o seu ClientDataSet, que é quem exibe seus registros, faz um cache dos registros resultantes do seu select, e não são atualizados automaticamente.
É realmente recomendado que passe a utilizar selects parametrizáveis (com o uso do where nos seus selects) para evitar ´fetch all´ pelos seus clientdatasets, o que tornaria o trabalho num sistema com milhares de registros inviável.
Na dúvida, poste.
Observe que o seu ClientDataSet, que é quem exibe seus registros, faz um cache dos registros resultantes do seu select, e não são atualizados automaticamente.
É realmente recomendado que passe a utilizar selects parametrizáveis (com o uso do where nos seus selects) para evitar ´fetch all´ pelos seus clientdatasets, o que tornaria o trabalho num sistema com milhares de registros inviável.
Na dúvida, poste.
GOSTEI 0
M
15/02/2008
Caro colega Edson Cabral
Valeu pela dica, foi de grande valia.
Ainda me resta uma duvida:
[b:d3e5647b3d]1) Em que momento devo abrir e fechar o ClientDataSet?[/b:d3e5647b3d]
Obs: Onde devo colocar a rotina que deve abrir e fechar o ClientDataSet?
alternativas:
a) Após a rotina de Inclusão, Alteração e Exclusão;
b) No onShow do formulario de cadstro onde tem a rotina de Inclusão, Alteração e Exclusão;
c) Ao sair do Form de cadastro onde tem a rotina de Inclusão, Alteração e Exclusão;
d) Em todas as alternativas acima.
Desde já grato pela atenção.
Valeu pela dica, foi de grande valia.
Ainda me resta uma duvida:
[b:d3e5647b3d]1) Em que momento devo abrir e fechar o ClientDataSet?[/b:d3e5647b3d]
Obs: Onde devo colocar a rotina que deve abrir e fechar o ClientDataSet?
alternativas:
a) Após a rotina de Inclusão, Alteração e Exclusão;
b) No onShow do formulario de cadstro onde tem a rotina de Inclusão, Alteração e Exclusão;
c) Ao sair do Form de cadastro onde tem a rotina de Inclusão, Alteração e Exclusão;
d) Em todas as alternativas acima.
Desde já grato pela atenção.
GOSTEI 0
Catunda
15/02/2008
Na verdade vc não precisa fechar e abrir novamente o ClientDataSet.
Inclua a linha abaixo nos eventos AfterPost e AfterDelete do ClientDataSet:
ClientDataSet1.ApplyUpdates(0);
Isso faz com que os dados em momória sejam descarregados e gravados fisicamente no banco de dados; em outras palavras, comitado.
Dessa forma se algum outro usuário acessar o registro que vc acabou de alterar, já verá suas alterações.
Vale a pena lembrar que, se esse registro já estiver sendo visualizado por outro usuário no momento em que vc alterou, ele não verá de imediato, ele terá de dar um refresh no ClientDataSet ou abrir e fechar novamente o ClientDataSet, pq o ClientDataSet mostra os dados da forma em que estavam qdo foi aberto, ele não está diretamente ligado ao banco de dados.
Inclua a linha abaixo nos eventos AfterPost e AfterDelete do ClientDataSet:
ClientDataSet1.ApplyUpdates(0);
Isso faz com que os dados em momória sejam descarregados e gravados fisicamente no banco de dados; em outras palavras, comitado.
Dessa forma se algum outro usuário acessar o registro que vc acabou de alterar, já verá suas alterações.
Vale a pena lembrar que, se esse registro já estiver sendo visualizado por outro usuário no momento em que vc alterou, ele não verá de imediato, ele terá de dar um refresh no ClientDataSet ou abrir e fechar novamente o ClientDataSet, pq o ClientDataSet mostra os dados da forma em que estavam qdo foi aberto, ele não está diretamente ligado ao banco de dados.
GOSTEI 0