Atualizar ClientDataSet de Todas as Máquinas Clientes
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
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
Curtidas 0
Respostas
Comodelphi
12/05/2004
Olá Undeclared Identifier, qual banco vc está usando? os dados são alterados somente pelo seu aplicativo?
GOSTEI 0
Ruben
12/05/2004
Você pode usar callbacks
GOSTEI 0
Rômulo Barros
12/05/2004
Utilizo Oracle 8i com DBExpress e Delphi 6.0 e todas as máquinas da rede estão rodando o mesmo aplicativo. :oops:
GOSTEI 0
Ffsombra
12/05/2004
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???
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
Universodosoftware
12/05/2004
Você pode usar callbacks
amigo vc poderia explicar como funciona este termo tanto na teoria como na prática.
GOSTEI 0
Rômulo Barros
12/05/2004
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
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
Aroldo Zanela
12/05/2004
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.
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
Ruben
12/05/2004
você está usando DataSnap ?
GOSTEI 0
Rômulo Barros
12/05/2004
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
Sobe --> Sobe
GOSTEI 0
Cabelo
12/05/2004
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
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
Rômulo Barros
12/05/2004
Não estou utilizando DataSnap naum.
Obrigado tb pela sugestão, Cabelo_uni :P
Obrigado tb pela sugestão, Cabelo_uni :P
GOSTEI 0
Ffsombra
12/05/2004
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???
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
Rômulo Barros
12/05/2004
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
GOSTEI 0
Aroldo Zanela
12/05/2004
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.
GOSTEI 0
Thematrix:reloaded
12/05/2004
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+
- 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
Rômulo Barros
12/05/2004
Obrigado à todos que me ajudaram....
Vou começar a implementar as ídeias e postarei novamente(Neste mesmo tóico) uma resposta a respeito do resultado e testes, deixando-os conscientes do resultado desta implementação... Com certeza estarei postando, como resposta, [color=red:70a47d7c11][color=red]que a implementação foi um sucesso !!!![/color:70a47d7c11][/color]
Vou começar a implementar as ídeias e postarei novamente(Neste mesmo tóico) uma resposta a respeito do resultado e testes, deixando-os conscientes do resultado desta implementação... Com certeza estarei postando, como resposta, [color=red:70a47d7c11][color=red]que a implementação foi um sucesso !!!![/color:70a47d7c11][/color]
GOSTEI 0
Rômulo Barros
12/05/2004
[quote:44e22fcccf=´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.[/quote:44e22fcccf]
Primeiramente,gostaria de agradecer aos companheiros [size=18:44e22fcccf][color=red:44e22fcccf]Aroldo_Zanela,ffsombra,comodelphi,ruben,cabelo_uni,TheMatrix:Reloaded[/color:44e22fcccf][/size:44e22fcccf] (Será que esqueci mais alguém? rs rs) É Cada nick que vejo ... .. .. hum... Brincadeirinha, galera !!!
Finalmente, consegui com a ajuda de todos vcs.. muito obrigado pelo tempo e atenção de todos... Qualquer coisa, estamos aí !!!!!!!!
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.[/quote:44e22fcccf]
Primeiramente,gostaria de agradecer aos companheiros [size=18:44e22fcccf][color=red:44e22fcccf]Aroldo_Zanela,ffsombra,comodelphi,ruben,cabelo_uni,TheMatrix:Reloaded[/color:44e22fcccf][/size:44e22fcccf] (Será que esqueci mais alguém? rs rs) É Cada nick que vejo ... .. .. hum... Brincadeirinha, galera !!!
Finalmente, consegui com a ajuda de todos vcs.. muito obrigado pelo tempo e atenção de todos... Qualquer coisa, estamos aí !!!!!!!!
GOSTEI 0
Ffsombra
12/05/2004
Qual solução vc utilizou, a dos sockets ou a da tabela de estados???
GOSTEI 0
Rômulo Barros
12/05/2004
Qual solução vc utilizou, a dos sockets ou a da tabela de estados???
Utilizei a tabela de estados !!!! :roll: Valeu :roll:
GOSTEI 0