Fórum Atualizar ClientDataSet de Todas as Máquinas Clientes #231785
12/05/2004
0
Estou com um problemão(rs rs) pra resolver e gostaria da ajuda de vcs.
Tenho um sistema CS rodando em rede(15 máquinas) e sempre que um campo de uma tabela for alterado, preciso atualizar um determinado DBGrid de todas as máquinas clientes.
EX: Tenho um DBGrid que mostra a situação atual do veículo:
M -> Em manutenção
O -> Em operação
...
...
Então, sempre que qualquer estação da rede atualizar este campo, preciso que todas as outras estações realizem um refresh no ClientDataSet, fazendo com que elas enxerquem as alterações realizadas por qualquer máquina cliente.
Pensei em utilizar sockets e, sempre que este campo for alterado, enviar uma mensagem para cada máquina cliente e atualizar o ClientDataSet. Para isso, terei que ter uma tabela que armazenará todos os nomes(ou IP) das máquinas da rede. Não sei se essa idéia é boa, mas, se for boa, não sei como fazer, pois nunca trabalhei com sockets.
Pensei ainda em colocar um Timer e a cada 10 segundos, realizar refresh no clientDAtaset.. mas essa idéia é péssima (Concordam?).
Precisso urgente disto e ficarei muito agradecido.
Rômulo Manoel
Rômulo Barros
Curtir tópico
+ 0Posts
12/05/2004
Comodelphi
Gostei + 0
12/05/2004
Ruben
Gostei + 0
12/05/2004
Rômulo Barros
Gostei + 0
13/05/2004
Ffsombra
Ainda não consegui identificar se alguma particularidade de um bd faça isso e resolva esse problema, atualmente venho fazendo o que vc classificou como péssimo (abrindo e fechando o dataset).
Nosso colega Ruben citou callback, poderia nos explicar melhor???
Gostei + 0
13/05/2004
Universodosoftware
amigo vc poderia explicar como funciona este termo tanto na teoria como na prática.
Gostei + 0
13/05/2004
Rômulo Barros
Vejam aqui algo a respeito:
[url]http://delphiforum.icft.com.br/forum/viewtopic.php?t=17814&highlight=shellchangenotifier [/url]
Já rodei tudo na web e não encontrei nada a respeito deste componente (ShellChanteNotifier ). Será que alguem sabe como funciona?
Sobe -> Sobe -> Sobe
Gostei + 0
13/05/2004
Aroldo Zanela
Estava pensando agora numa outra alternativa mais simples. Criar uma tabela para servir de ´máquina de estado´ e na tabela que sofre as atualizações inserir uma trigger para atualizar a tabela e funcionar como um semáforo para as aplicações clientes.
Gostei + 0
13/05/2004
Ruben
Gostei + 0
13/05/2004
Rômulo Barros
Sobe --> Sobe
Gostei + 0
13/05/2004
Cabelo
uma solução seria vc criar uma rotina que seria disparada a qualquer alteração no banco de dados, colocar uma trigger no banco de dados, disparando esta rotina.. Nesta rotina vc coloca a atualização doa datasets..
É só uma idéia..
Espero poder ajudar..
Cabelo
Gostei + 0
13/05/2004
Rômulo Barros
Obrigado tb pela sugestão, Cabelo_uni :P
Gostei + 0
13/05/2004
Ffsombra
A trigger é para alimentar a tabela que ele chamou de ´máquina de estado´, ou seja, a tabela teria campos informando se determinada tabela sofreu alterações ou não.
Daí, no Form com os grids ligados aos seus respectivos datasources, teria um timer que executaria um SQL que retornaria se para aquela grid foi feita alguma atualização (setada na ´máquina de estado´). Se o retorno desta instrução SQL for positiva, ele atualiza a grid, fechando e abrindo o dataset ou dando refresh. Se for negativa a resposta, nada é feita, descompremetendo a máquina com atualizações desnecessárias.
Será que é isto, Zanela???
Gostei + 0
13/05/2004
Rômulo Barros
Obrigado pela explicação. :oops: Entretanto, não quero utilizar Timer, pois, se fosse pra utilizar eu utilizaria para atualizar os ClientDataSet de Todos os sistemas, e resolveria o problema;;;
Mesmo assim : Valeu www :roll: SOBE
Gostei + 0
13/05/2004
Aroldo Zanela
Na verdade foi isto mesmo que imaginei. Neste caso, o timer não iria consumir tantos recursos do sistema e estaria consultando apenas uma tabela de um único registro.
Suponha que a trigger tenha alterado o ´estado´ desta tabela, então, numa consulta positiva seria disparado o ´refresh´. Não é melhor solução que o uso de sockets, mas com certeza, bem mais simples.
Gostei + 0
13/05/2004
Thematrix:reloaded
- O ClientDataSet ou DataSet ou Query retornam para a estação um cursor (conjunto de registros), resultado de um comando SQL, ok? Tá tudo na memória RAM da estação.
Dessa forma vc não tem um ligação viva com a informação que está sendo ATUALIZADA constantemente na base de dados, certo?
A idéia do Aroldo é muito boa pq evitaria o refresh contínuo desses cursores, daria mais rapidez e agilidade a sua estação cliente.
Fora isso, o único modo que eu imagino (mas, infelizmente não sei se é possível), seria fazer com que o servidor disparasse para as estações algum comando que realizasse o comando de refresh (o seu já pensado sockets)
outros consultas que pode lhe ajudar:
www.msgconnect.com (componente para comunicação servidor-cliente) com fontes
e no site www.activedelphi.com.br na seção DOWNLOAD
tem dois exemplos de Chat com Delphi
espero ter lhe auxiliado, t+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)