GARANTIR DESCONTO

Fórum Refresh ou Fechar e Abrir DataSet ? #404119

01/07/2011

0

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 ?
Ronaldo Lanhellas

Ronaldo Lanhellas

Responder

Posts

02/07/2011

Marco Salles

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 ?


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


Responder

Gostei + 0

02/07/2011

Ronaldo Lanhellas

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.
Responder

Gostei + 0

02/07/2011

Ronaldo Lanhellas

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.
Responder

Gostei + 0

02/07/2011

Marco Salles

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

Responder

Gostei + 0

02/07/2011

Ronaldo Lanhellas

"nada impede que voce desabilite o controle consciente de dados durante este processo" ... 
 não entendi a afirmação :D
Responder

Gostei + 0

02/07/2011

Marco Salles

"nada impede que voce desabilite o controle consciente de dados durante este processo" ... 
 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
Responder

Gostei + 0

02/07/2011

Ronaldo Lanhellas

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
Responder

Gostei + 0

02/07/2011

Marco Salles

Humm , mas vc esta usando NestedDataSet ?????
Responder

Gostei + 0

02/07/2011

Marco Salles

Humm , mas vc esta usando NestedDataSet ?????
Responder

Gostei + 0

02/07/2011

Ronaldo Lanhellas

Sim utilizo NestedDataSet ( sem provider nos detalhes, apenas no mestre)
Responder

Gostei + 0

02/07/2011

Marco Salles

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
Responder

Gostei + 0

02/07/2011

Ronaldo Lanhellas

Então qual sua dica para resolver esse problema ?
Responder

Gostei + 0

02/07/2011

Marco Salles

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 ...
Responder

Gostei + 0

03/07/2011

Ronaldo Lanhellas

enviei ao eu email meu dataModule para voce dar uma olhada
Responder

Gostei + 0

03/07/2011

Marco Salles

é ficou dificil de enteder... So não entendi o porque de tanto DataSorce ligado ao DataSet do TSqlDataSet ???

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)






Responder

Gostei + 0

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

Aceitar