Fórum Refresh ou Fechar e Abrir DataSet ? #404119
01/07/2011
0
Tenho 2 DataModules, 1 para os dados da aplicação e outros apenas para relatório (todos com ClientDataSet), quando insiro um registro e dou refresh ele não aparece no DataModule do relatório, apenas se eu fechar a aplicação e abrir novamente, agora se eu fechar e abrir o DataSet do DataModule do Relatório, ae sim ele mostra o registro que foi inserido.
Então minha dúvida é, quando utilizar o Refresh de fato ?
Ronaldo Lanhellas
Curtir tópico
+ 0Posts
02/07/2011
Marco Salles
Tenho 2 DataModules, 1 para os dados da aplicação e outros apenas para relatório (todos com ClientDataSet), quando insiro um registro e dou refresh ele não aparece no DataModule do relatório, apenas se eu fechar a aplicação e abrir novamente, agora se eu fechar e abrir o DataSet do DataModule do Relatório, ae sim ele mostra o registro que foi inserido.
Então minha dúvida é, quando utilizar o Refresh de fato ?
hummm ... A diferença basicamente é que o Refresh não muda o cursor ( ele não vai para a primeira posição quando vc da um refresh ) diferente do open close . O fato de não atualizar pode ser vários fatores ( erro , falta de aplicar o applayUpdates , a Instrução sql que deve ser resolvida não resulta em um ResultSet , etc..)
Tirando todas as exceções o Refresh tem que atualizar , se não atualizar tem que descobrei o porque da não atulização
Pode ser o delta que não esta zerado ( neste caso se aplica o Cds.MergeChangeLog )
Enfim , no meu ponto de vista acho que vc não deveria descartar o Refresh e sim tentar soluciona-lo .
Outro ponto é tanto um open close e o Refresh consomem recurso de rede e isto tem que ser pensado
tem codigos que a cada post um aplayUpdates e um refresh . Em Desktop tudo funciona bem , mas em n-tier
isto é danoso
Gostei + 0
02/07/2011
Ronaldo Lanhellas
Gostei + 0
02/07/2011
Ronaldo Lanhellas
Gostei + 0
02/07/2011
Marco Salles
hummm...
O refresh na Tabela Mestre não muda o Cursor da tabela Mestre ... O Cursor da tabela Detalhe é alterado , mas isto não é devido ao refresh, mas sim consequencia do mesmo.
Como mudar isto ???
Se vc tiver utilizando o NesteddataSet no evento BeforeRefresh do CDS_Mestre_ vc marca a posição Boobmark do CdsMestre
var Bookmark:TBookmark; procedure TForm4.CDS_Mestre_BeforeRefresh(DataSet: TDataSet); begin Boobmark :=CDS_Detalhe_.Bookmark; end; e no evento AfterRefresh do CDS_Mestre_ vc recupera a posição do Cursor procedure TForm4.CDS_Mestre_AfterRefresh(DataSet: TDataSet); begin CDS_Detalhe_.Bookmark:=Boobmark; end;
ps_ nada impede que voce desabilite o controle consciente de dados durante este processo
Gostei + 0
02/07/2011
Ronaldo Lanhellas
não entendi a afirmação :D
Gostei + 0
02/07/2011
Marco Salles
não entendi a afirmação :D
Durant este processo pode ser que os registros role no dbgrid antes de retonar para a posição inicial ). Desabilitar o dbgrid
impede um efeito indesejável
cds_Detalhe_.disableControls e no fim Cds_Detalhe_.EnableControls
Gostei + 0
02/07/2011
Ronaldo Lanhellas
Tenho uma tabela Mestre chamada Vendedor, e uma detalhe chamada Pedidos, quando o vendedor apre um novo e pedido e clica em salvar ele faz o seguinte:
cdsVendedor.ApplyUpdates(0); cdsVendedor.Refresh;
e isso faz com que o cursor do pedido vá para o primeiro registro, tentei utilizar a dica do bookMark mais não funcionou, parece que a melhor forma até agora foi a seguinte :
salvo o ID do Pedido, e depois dou um locate nele ! :d
Gostei + 0
02/07/2011
Marco Salles
Gostei + 0
02/07/2011
Marco Salles
Gostei + 0
02/07/2011
Ronaldo Lanhellas
Gostei + 0
02/07/2011
Marco Salles
O problema é POE . Muitas das vezes as coisas não acontecem do jeito que a gente quer
Eventos atrapalham a execução do fluxo e o que a gente pensa que deveira ser executado , na verdade esta sendo desviado
Se quiser montemos um Mestre_Detalhe rapidamente utilizando o Employee do Firebird para pormos em prática o que estou achando . Possa ser que esteja errado , mas na dúvida acabei de testar
Gostei + 0
02/07/2011
Ronaldo Lanhellas
Gostei + 0
02/07/2011
Marco Salles
A dica é vc montar m Mestre detalhe utilizando NestedDataSet .. Ver que o refresh no CDS_Mestre não ALtera o Cursor do
Mestre e que a dica passada com bookmark , retorna o cursor dos dados . Se sua tabela não for grande e for no firebird pode me
enviar ela . se quiser enviar um projeto limpo com este Mestre _ Detalhe , pode enviar também
Porque se não esta funcionando é alguma coisa que esta desviando o fluxo das instruçoes ...
Gostei + 0
03/07/2011
Ronaldo Lanhellas
Gostei + 0
03/07/2011
Marco Salles
Vc disse que :
Suponha que vc so tenha esta duas tabelas .como vc esta fazendo este relacionamento utilizando o DbExpress ??? to meio perdido nas ligações que vc esta fazendo ...Para isto vc irá precisar de :
1 TSqlConnection ... conexao;
2 TSqlDataSet .. Sql_Mestre Sql_Detalhe
1 DataSetProvider .. Dsp
2 ClientDataSet .. Cds_Mestre , Cds_Detalhe
3 DataSouce ( Ds_Mestre, Ds_Detalhe , Ds_Relacionamento)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)