Refresh ou Fechar e Abrir DataSet ?
Bom gente, até agora estava utilizando apenas refresh quando precisava por exemplo que a ação de uma trigger seja visualizada na aplicação, porém percebi um problema.
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 ?
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
Curtidas 0
Respostas
Marco Salles
01/07/2011
Bom gente, até agora estava utilizando apenas refresh quando precisava por exemplo que a ação de uma trigger seja visualizada na aplicação, porém percebi um problema.
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 ?
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
Ronaldo Lanhellas
01/07/2011
Caro amigo, vocÊ disse: o Refresh não muda o cursor , porém uso um relacionamento master-detail e toda vez que dou refresh na tabela master , tanto a master como as details posicionam o cursor no primeiro registro, coisa que não aconteçe em uma tabela comum.
GOSTEI 0
Ronaldo Lanhellas
01/07/2011
tanto que estou utilizando um locate para ir novamente para a posição que estava, ou seja, eu gravo o id em uma variável e depois de salvar dou um locate, mais não acho que este seria o método correto, já que você disse que com o refresh não deveria mudar o cursor.
GOSTEI 0
Marco Salles
01/07/2011
Caro amigo, vocÊ disse: o Refresh não muda o cursor , porém uso um relacionamento master-detail e toda vez que dou refresh na tabela master , tanto a master como as details posicionam o cursor no primeiro registro, coisa que não aconteçe em uma tabela comum.
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
Ronaldo Lanhellas
01/07/2011
"nada impede que voce desabilite o controle consciente de dados durante este processo" ...
não entendi a afirmação :D
não entendi a afirmação :D
GOSTEI 0
Marco Salles
01/07/2011
"nada impede que voce desabilite o controle consciente de dados durante este processo" ...
não entendi a afirmação :D
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
Ronaldo Lanhellas
01/07/2011
Vou lhe ser sincero, a dica do BookMark funcionou perfeitamente em outras situação, mas na minha situação em especial não funcionou, que é a seguinte :
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
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
Marco Salles
01/07/2011
Humm , mas vc esta usando NestedDataSet ?????
GOSTEI 0
Marco Salles
01/07/2011
Humm , mas vc esta usando NestedDataSet ?????
GOSTEI 0
Ronaldo Lanhellas
01/07/2011
Sim utilizo NestedDataSet ( sem provider nos detalhes, apenas no mestre)
GOSTEI 0
Marco Salles
01/07/2011
então funciona...
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
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
Ronaldo Lanhellas
01/07/2011
Então qual sua dica para resolver esse problema ?
GOSTEI 0
Marco Salles
01/07/2011
Então qual sua dica para resolver esse problema ?
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
Ronaldo Lanhellas
01/07/2011
enviei ao eu email meu dataModule para voce dar uma olhada
GOSTEI 0
Marco Salles
01/07/2011
é ficou dificil de enteder... So não entendi o porque de tanto DataSorce ligado ao DataSet do TSqlDataSet ???
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)
Vc disse que :
Tenho
uma tabela Mestre chamada Vendedor, e uma detalhe chamada Pedidos,
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
Ronaldo Lanhellas
01/07/2011
hehe .. dei apenas um exemplo do Vendedor e detalhe itens ... na verdade o meu relacionamento é de 3 camadas da seguinte forma:
Promotor (Master) -- > Dist_Promotores (detail) -- > Dist_Promotores_Produtos (Detail)
Promotor(Master, mesma tabela) -- > Vendedor -- > Distribuicao -- > Distribuicao_Produtos
Promotor (Master) -- > Dist_Promotores (detail) -- > Dist_Promotores_Produtos (Detail)
Promotor(Master, mesma tabela) -- > Vendedor -- > Distribuicao -- > Distribuicao_Produtos
GOSTEI 0
Marco Salles
01/07/2011
hehe .. dei apenas um exemplo do Vendedor e detalhe itens ... na verdade o meu relacionamento é de 3 camadas da seguinte forma:
Promotor (Master) -- > Dist_Promotores (detail) -- > Dist_Promotores_Produtos (Detail)
Promotor(Master, mesma tabela) -- > Vendedor -- > Distribuicao -- > Distribuicao_Produtos
Promotor (Master) -- > Dist_Promotores (detail) -- > Dist_Promotores_Produtos (Detail)
Promotor(Master, mesma tabela) -- > Vendedor -- > Distribuicao -- > Distribuicao_Produtos
Eu entendi e ercebi que se tratava de Mestre - Detalhe - Detalhe do Detalhe
Queria so ver como vc tina feito essas ligações
Mas do jeito que vc postou deu para entender que aparentemente esta tudo correto
GOSTEI 0
Ronaldo Lanhellas
01/07/2011
pois é ... está tudo correto sim o relacionamento ... ! Bom acho melhor encerramos este tópico e ficar como está ,, usando locate depois do ApplyUpdates(0);
heheh
heheh
GOSTEI 0
José
01/07/2011
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0