Refresh Firedac

07/08/2019

0

Boa tarde.
Estamos migrando nossas aplicações de dbexpress para Firedac com Firebird 3.0.

Estou com um problema relacionado a atualização dos dados(refresh ou update).

Tenho uma tela de lote(FrmLote) onde posso incluir varias solicitações em um lote.
Nessa tela de lote possuo um Cds com os dados dos lotes e outro ligado a ele com as solicitações.
Quando abro a tela de lote(FrmLote) faço uma busca, os dados são carregados corretamente.
Nessa mesma tela possuo um botão "importar" que chama uma outra tela(FrmSolicitacoesImporta) com as solicitações disponíveis.
A tela FrmSolicitacoesImporta possui um cds com as solicitações, eu marco as solicitações que desejo importar e preencho no cds o codigo do lote
faço o post, applyUpdates e fecho a tela FrmSolicitacoesImporta.
Nesse momento verifico a informação no banco e o código do lote foi corretamente gravado nas solicitações.
Ao voltar a tela FrmLote sem fechar a mesma desde o inicio da operação, eu faço um refresh no Cds de lotes e as solicitações não são atualizadas.
Se eu fechar a tela FrmLote e abrir novamente os dados passam a sem exibidos.

Já inseri um TFDTransaction no meu TFDConnection.
UpdateOptions esta marcado AutoCommitUpdates
RefreshMode rmAll
Na tela TFDQuery(SqlCadastro), TDataSetProvider(DspCadastro), ClientDataSet(Cdscadastro) e DataSource(DsCadastro) do lote,
DataSource(DsMaster) ligado ao Sqlcadastro
TFDQuery(SqlSolicitacoes), TDataSetProvider(DspSolicitacoes), ClientDataSet(CdsSolicitacoes) e DataSource(DsSolicitacoes) de solicitações.
Reitero que a busca aparentemente funciona, o problema ocorre somente quando em outra tela faço alguma atualização e chamo o refresh que não atualiza p CdsSolicitacoes.
Smart Sistemas

Smart Sistemas

Responder

Posts

09/08/2019

Fabricio Kawata

Já passei por diversas situações parecidas. A questão é que o método Refresh do componente TClientDataSet possui algumas particularidades que distorcem a sua função básica de dar um refresh dos dados em tela. Isso é apontado na própria documentação do componente:

"The Refresh method does not work for all TDataSet descendants. In particular, TQuery....".

Nestes casos, onde é usado o trio de componentes Query + Provider + ClientDataSet, o recomendado segundo a própria documentação é abrir e fechar o DataSet. Aí é testar e ver se adapta ao seu caso.

Espero ter ajudado de alguma forma.

Forte abraço!
Responder

12/08/2019

Smart Sistemas

Já passei por diversas situações parecidas. A questão é que o método Refresh do componente TClientDataSet possui algumas particularidades que distorcem a sua função básica de dar um refresh dos dados em tela. Isso é apontado na própria documentação do componente:

"The Refresh method does not work for all TDataSet descendants. In particular, TQuery....".

Nestes casos, onde é usado o trio de componentes Query + Provider + ClientDataSet, o recomendado segundo a própria documentação é abrir e fechar o DataSet. Aí é testar e ver se adapta ao seu caso.

Espero ter ajudado de alguma forma.

Forte abraço!


Obrigado Fabricio.
Achei o problema e sua colocação esta correta.
Antes eu usava DataSet, Provider e ClientDataSet e ao converter fiquei com TFDQuery e ClientDataSet.
A solução é fazer o refresh no "Sqlfilho", ou seja, para minha situação foi
SqlSolicitacao.Refresh;
CdsCadastro.Refresh;
Responder

05/09/2019

Mauro Klowaski

Estou com mesma situação. Essa solução resolve em partes o problema. Por exemplo, usar um form com 3 grids nele, com 3 querys ligadas entre si com o MASTERSOURCE. Conforme o clique no primeiro, ele filtra os dados do segundo, e conforme o clique do segundo, filtra os dados do terceiro. Quando acessa a tela, tudo normal. Se nesse form você abre um segundo form para fazer um CRUD e retorna para ela, essa atualização so aparece se fechar e abrir a query de novo..... MAS... se outra pessoa estiver em outro PC na mesma tela, visualizando esse primeiro form, ela pode clicar a vontade e fazer os filtros que quiser, que esses dados novos não aparecem. Somente se ela fechar o form e abrir de novo.

É como se carregasse pra memoria da primeira vez e trabalhasse com esses dados em memoria mesmo com CachedUpdates = False



Responder

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

Aceitar