Fórum Atualizar ClientDataSet de Todas as Máquinas Clientes #231785

12/05/2004

0

Olá galera delphiana.. (he he he)

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

Rômulo Barros

Responder

Posts

12/05/2004

Comodelphi

Olá Undeclared Identifier, qual banco vc está usando? os dados são alterados somente pelo seu aplicativo?


Responder

Gostei + 0

12/05/2004

Ruben

Você pode usar callbacks


Responder

Gostei + 0

12/05/2004

Rômulo Barros

Utilizo Oracle 8i com DBExpress e Delphi 6.0 e todas as máquinas da rede estão rodando o mesmo aplicativo. :oops:


Responder

Gostei + 0

13/05/2004

Ffsombra

Undeclared Identifier, sua questão é importantíssima, tb venho procurando uma resposta para este problema, já pesquisei por vários tópicos e ainda não encontrei a solução ideal.

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


Responder

Gostei + 0

13/05/2004

Universodosoftware

Você pode usar callbacks


amigo vc poderia explicar como funciona este termo tanto na teoria como na prática.


Responder

Gostei + 0

13/05/2004

Rômulo Barros

Ola´... O Aroldo Zanela, Moderador do Fórum, informou-me que posso utilizar o componente ShellChanteNotifier (Paleta Samples).
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


Responder

Gostei + 0

13/05/2004

Aroldo Zanela

Colega,

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.


Responder

Gostei + 0

13/05/2004

Ruben

você está usando DataSnap ?


Responder

Gostei + 0

13/05/2004

Rômulo Barros

Outra grande idéia sua, Aroldo Zanela. Entretanto, é possível atualizar uma tabela através de uma Trigger? E, se for possível, os dados do DbGrid serão atualizados automaticamente(sem precisar dá um Refresh no TClientDataSet?
Sobe --> Sobe


Responder

Gostei + 0

13/05/2004

Cabelo

Caro colega..

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


Responder

Gostei + 0

13/05/2004

Rômulo Barros

Não estou utilizando DataSnap naum.

Obrigado tb pela sugestão, Cabelo_uni :P


Responder

Gostei + 0

13/05/2004

Ffsombra

Pelo que eu entendi da solução do Aroldo, não é a trigger que vai disparar as atualizações nos datasets...

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


Responder

Gostei + 0

13/05/2004

Rômulo Barros

Pelo que eu entendi da solução do Aroldo, não é a trigger que vai disparar as atualizações nos datasets... 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???


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


Responder

Gostei + 0

13/05/2004

Aroldo Zanela

Pelo que eu entendi da solução do Aroldo, não é a trigger que vai disparar as atualizações nos datasets... 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???


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.


Responder

Gostei + 0

13/05/2004

Thematrix:reloaded

Apenas pra tentar ajudar:

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


Responder

Gostei + 0

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

Aceitar