O sistema nã atualiza

22/12/2005

Olha eu aqui de novo, rsrs. Bom é o seguinte, eu fiz um sisteminha de agenda para testar, e me deparei com o seguinte:

Eu abri o sistema duas vezes, em um eu alterei alguns dados e salvei, coloquei o comando de refres da tabela, mas só atualiza no outro sistema aberto quando eu fecho e abro ele de novo. Pq, como funciona esse negocio? O que devo fazer para ele funcionar, ou seja atuzalizar automáticamente sem que seja necessário eu fechar e abrir o sistema novamente. ;(

Eu uso Firebird 1,5 delphi7 e os componentes Ibtable da aba interbase e datasource da aba data acces.


Chip_set

Respostas

22/12/2005

Eixox

Estimado amigo,

responderei a sua pergunta, mas outras tantas iguais a essa já foram respondidas, portanto, não me leve a mal.

A resposta é: Quando o sistema está em ´rede´, veja que você está trabalhando com duas instâncias do mesmo sistema. Quando você atualizar os dados em uma instância, a outra, não atualizará os dados.

Por que? Simples. Uma consulta foi executada, o que você está vendo na outra instância nada mais é do que dados que estão em cache e não dados ligados diretamente a tabela - é quase um Shadow mas não é.

Portanto, para que seus dados em outra instância sejam atualizados, você deve executar o refresh manual. Se você quiser que isso seja feito automaticamente, o pessoal geralmente usa um timer ou coloca um botão para que o próprio usuário atualize os dados quando desejar.

Na forma de botão é o mais recomendado, já que dessa forma você reduz o tráfego na rede. Com o timer ele ficará executando o refresh dentro do período de tempo que você estimou.


Responder Citar

22/12/2005

Chip_set

Portanto, para que seus dados em outra instância sejam atualizados, você deve executar o refresh manual. Se você quiser que isso seja feito automaticamente, o pessoal geralmente usa um timer ou coloca um botão para que o próprio usuário atualize os dados quando desejar.


Eu coloquei no evento ofterpost da tabela o refresh, e ao mesmo tempo logo apos ter dado o comando post na tabela coloquei tb um refresh.

Foi logo depois de ter feito tudo isso que verifiquei o problema.


Responder Citar

22/12/2005

Martins

[quote:85f2e5ac97]Portanto, para que seus dados em outra instância sejam atualizados, você deve executar o refresh manual. Se você quiser que isso seja feito automaticamente, o pessoal geralmente usa um timer ou coloca um botão para que o próprio usuário atualize os dados quando desejar.


Eu coloquei no evento ofterpost da tabela o refresh, e ao mesmo tempo logo apos ter dado o comando post na tabela coloquei tb um refresh.

Foi logo depois de ter feito tudo isso que verifiquei o problema.[/quote:85f2e5ac97]

Acredito q esse refresh logo após o comando post é desnecessário, já q vc tem ele no evento AfterPost da tebela, reveja tb as transações.


Responder Citar

22/12/2005

Chip_set

[quote:187ef82e91=´chip_set´][quote:187ef82e91]Portanto, para que seus dados em outra instância sejam atualizados, você deve executar o refresh manual. Se você quiser que isso seja feito automaticamente, o pessoal geralmente usa um timer ou coloca um botão para que o próprio usuário atualize os dados quando desejar.


Eu coloquei no evento ofterpost da tabela o refresh, e ao mesmo tempo logo apos ter dado o comando post na tabela coloquei tb um refresh.

Foi logo depois de ter feito tudo isso que verifiquei o problema.[/quote:187ef82e91]

Acredito q esse refresh logo após o comando post é desnecessário, já q vc tem ele no evento AfterPost da tebela, reveja tb as transações.[/quote:187ef82e91]

Como é que vê esse negocio de transações.


Responder Citar

22/12/2005

Martins

Quais são os componentes q vc tá usando, IBDataBase, IbTransaction, IbTable, DataSource e o q mais?


Responder Citar

22/12/2005

Chip_set

Quais são os componentes q vc tá usando, IBDataBase, IbTransaction, IbTable, DataSource e o q mais?

Só esses ai mesmo.


Responder Citar

22/12/2005

Martins

OK!

Tenta então:
IBTable.Post;
IBTable.Transaction.CommitRetaining;



Responder Citar

22/12/2005

Martins

OK! Tenta então:
IBTable.Post;
IBTable.Transaction.CommitRetaining;


ou então assim:

IBTable1.Post; 
IBTable1.ApplyUpdates;
IBTable1.Refresh;
IBTable1.Transaction.CommitRetaining;


Dê um duplo clique em seu IBTransaction, tente usar ReadCommited.


Responder Citar

22/12/2005

Chip_set

IBTable1.Post; 
IBTable1.ApplyUpdates;
IBTable1.Refresh;
IBTable1.Transaction.CommitRetaining;
Dê um duplo clique em seu IBTransaction, tente usar ReadCommited.


Coloquei todos, depois do post aplly, refresh, commitreta..
la na minha IBtransaction marquei a opção ReadCommited blz, ai tive que activar todas as tabelas novamente. então compilei mas abrir novamente dois sistemas, em um fiz o cadastro na agenda mas no outro ainda não aparece. Apenas se eu fechar o programa e abrir de novo.[/quote]


Responder Citar

23/12/2005

Martins

[quote:67c1a28472]
IBTable1.Post; 
IBTable1.ApplyUpdates;
IBTable1.Refresh;
IBTable1.Transaction.CommitRetaining;
Dê um duplo clique em seu IBTransaction, tente usar ReadCommited.


Coloquei todos, depois do post aplly, refresh, commitreta..
la na minha IBtransaction marquei a opção ReadCommited blz, ai tive que activar todas as tabelas novamente. então compilei mas abrir novamente dois sistemas, em um fiz o cadastro na agenda mas no outro ainda não aparece. Apenas se eu fechar o programa e abrir de novo.[/quote:67c1a28472][/quote]

Isso é pq como o colega falou no inicio do tópico, seus dados estão no cache, vc teria q ter uma botão de refresh nessa outra aplicação ou então tente algo só para ver o q acontece, coloque um botão para fechar e abrir a tabela ou então dar um refres nela, nessa segunda instância, onde os dados estão sendo somente consultados.


Responder Citar

23/12/2005

Chip_set

Bom, eu fiz assim, deixei os commando na gravação e na abertudo do form, coloquei um refresh, assim funcionou..

Só mais um detalhe, nos sistema em clipper (dos) essa atualização é automatica sem que tenhamos que dar um ´refresh´ no delphi então terei que utilizar um refresh sempre que fizer uma operação?

E se eu estiver na tela de vendas, o meu dbgrid vai estar mostrando o conteudo do banco, como eu poderia manter essa dbgrid atualizado, pq a cada operação o estoque vai mudar. isso é complicado dessa maneira. Existe uma solução viavel para esse problema?


Responder Citar

26/12/2005

Eixox

Estimado amigo,

No Clipper você está trabalhando diretamente na Base de Dados, como se fosse uma única aplicação. Eu lembro que trabalhava tranquilamente com algumas aplicações sem ter que me preocupar com esse tipo de coisa. Em compensação, outros problemas bem maiores deviam ser cuidados, era por exemplo quando dava pau nos índices e tudo ia para o espaço.

Hoje, esse problema é relativamente simples de ser solucionado, até porque as características das aplicações são diferentes, você pode trabalhar com concorrência ou exclusividade. A idéia do desenvolvimento de qualquer sistema, ainda mais com relação a ´postagem´, inclusão e alteração de dados. ´Muitos´ programadores adotam a idéia de que uma consulta deve retornar o maior número de resultados, quando o ´correto´ é a consulta retornar o menor número de resultados - melhor é somente um ou nada.

Com relação a atualização de dados nas tabelas, isso não é problema. O correto é buscar os dados necessários para complementação da rotina a ser transacionada - o usuário não precisa estar vendo isso.

Imagine uma empresa como o Ponto Frio e as Casas Bahia, cada vendedor trazendo uma pilha de clientes como retorno. O servidor iria a loucura.

O que eu estou falando aqui é só uma questão de metodologia de desenvolvimento, nada tem a ver com a sua pergunta - só está relacionado ao Clipper.


Responder Citar