Msg de erro na tabela temporária

Delphi

18/01/2011

Boa noite Em uma grid os os registros estão em ClientDataset (Tabela temporária), para determinados campos fiz um LOOKUP, para exibir a descrição do pagamento... Quando vou alterar o registro para informar o pagto por exemplo aparece um panel azul, como exemplo da imagem abaixo                      informo pagamento em dblookupcombobox... Pressiono OK e no evento onclick do botão, coloquei um REFRESH para fazer atualização, tipo: Cds.refresh, então aparece a seguinte msg de erro: Estou usando o Delphi 10 + DBX + Firebird 2.1    
Rogerio Santos

Rogerio Santos

Curtidas 0

Respostas

Leonardo Xavier

Leonardo Xavier

18/01/2011

O refresh esta antes ou depois do post?
GOSTEI 0
Wellington

Wellington

18/01/2011

Você esta tentando dá o reflesh com o ClientDataSet ainda em status  insert/edit.
Tente usar:

procedure TForm1.cdsAfterApplyUpdates(Sender: TObject;
  var OwnerData: OleVariant);
begin
  cds.Refresh;
end;


ou caso não funcione tenta:
procedure TForm1.btnOKClick(Sender: TObject);
begin
  cds.Post;
  cds.Refresh;
end;


GOSTEI 0
Marco Salles

Marco Salles

18/01/2011

um pouco de mershandising http://marcosalles.wordpress.com/2010/04/09/must-apply-updates-before-refreshing-data-refresh-clientdataset/      
GOSTEI 0
Rogerio Santos

Rogerio Santos

18/01/2011

Olá amigo   As suas dicas não deram certo... O que eu consegui fazer para não mostrar a msg de erro foi assim: CDS.NEXT....   Coloquei no evento onclick do botão.. Ele simplesmente vai para o próximo registro e atualiza a grid mostrando os dados... Não sei se é o certo em fazer... mas pelo meno funciona certinho, sem erro. Se caso tiver outra dica favor mandar para eu testar.     Obrigado pela atenção     Rogério    
GOSTEI 0
Marco Salles

Marco Salles

18/01/2011

Rogerio tudo bem Não é dica minha . É teoria  . Para .  realizar um REFRESH no ClientDataSet, é necesário que não exista nenhuma atualização pendente em CACHE.    Vc diz:  
Coloquei no evento onclick do botão.. Ele simplesmente vai para o próximo registro e atualiza a grid mostrando os dados... Não sei se é o certo em fazer... mas pelo meno funciona certinho, sem erro. Se caso tiver outra dica favor mandar para eu testar.
    eu que lhe peço o exemplo para que possa simular o que esta acontecendo para tentar entender e chegar no Denominador Comum com Vc   Se puder disponibilizar o exemplo para que possamos trocar experiencia ficarei grato        
GOSTEI 0
Rogerio Santos

Rogerio Santos

18/01/2011

Olá   Mas como vc quer o exemplo ???? Disponibilizar o código fonte ??? Como assim...   Rogério      
GOSTEI 0
Rogerio Santos

Rogerio Santos

18/01/2011

Olá   Mas como vc quer o exemplo ???? Disponibilizar o código fonte ??? Como assim...   Rogério      
GOSTEI 0
Marco Salles

Marco Salles

18/01/2011

Podeira simular este erro com as tabelas em um aplicativo simples , ou de outra forma sei lá O que eu sei é o seguinte   Qnd vc modifica (Post) uma tabela em memoria o Arquivo Xml Gerado é modificado vai acumulando em forma de Delta   Se vc dar o Refresh vc terá este erro ( reportado por vc )   Se vc tiver utilizando um Sistema SGDB , ap dar o ApplayUpdates do Cds , imediatamente este Xml é Limpo ( pq atraves dele que se trafega os dados para serem Resolvidos pelo dataSetProvider) e apos vc pode dar um Refresh   Porém se vc esta usando o MyBase e não tem esta opção de ApplayUpdates , vc tema aopção de chamar o método MergeChangeLog que zera o Delta e logo apos vc consegue dar um Refresh   bem a teoria é esta , mas por alguma razão vc disse que não deu certo . Eu gostaria de siguir os seus passos para confirma ou não se esta errada a teoria . So isso    
GOSTEI 0
Rogerio Santos

Rogerio Santos

18/01/2011

Amigo.. Desculpe em responder, mas ainda não consegui fazer a não ser usando o comando Cds.next...     Rogério
GOSTEI 0
Marco Salles

Marco Salles

18/01/2011

Citação Errada
Porém se vc esta usando o MyBase e não tem esta opção de ApplayUpdates , vc tema aopção de chamar o método MergeChangeLog que zera o Delta e logo apos vc consegue dar um Refresh
  desculpe ...Com o MergeChangeLog vc zera o Delta mas no caso de usar o MyBase não consegue dar o refresh da o erro que ele reclama do DataSetProvider.       Visto este deslize vamos entender e concatenar as idéias   O que seria um Refresh ???   A principio uma Atualização dos dados   Vc pode tb atualizar os dados fazendo close seguido de Open   qual a diferença entre Refresh e Close seguido de Open ???   basicamente tres diferenças a)qnd vc usa refresh o cursor fica parado no mesmo registro onde vc estava antes do Refresh .. O mesmo não se pode dizer ao dar umClose seguido de open .. O Cursor é delocado para o Primeiro Registro   b)Alguns eventos , como por exemplo beforeopen, afteropen, beforeclose, beforescroll  que normalmente q  sao chamamados na abertura e fechamento , não são disparador qnd se usa o refresh.. É claro que o beforescroll  não será disparado pq não há deslocamento do ponteiro   c)No caso de parãmetros , qnd se usa o Refresh não existe ha necessidade de passa-lo , pois trabalha com parametros  ele simplesmente reabre a consulta exatamente com o mesmo Select que estva uzando antes do Refresh   Vamos chegar lá ....... Não faz muito sentido da um Refresh No MyBase ... Os dados estão na Memória do Computador, então atualizar o que ????   Agora perceba o que vc esta fazendo.. Eu não sei aonde e nen em quem vc esta dando o Next , mas basicamente é isto que esta acontecendo   O Next irá deslocar o ponteiro , o que dispara o eventos BeforePost e AfterPost entre outros. com isto se o registro estava no Modo de Edição , ele grava os Dados e sai desse modo   Espero ter te ajudado um pouco a elucidar o que esta ocorrendo . Pelo menos para vc poder explicar melhor o que esta fazendo. Sds   então a operação de refresh não esta disponivel no MyBase ...
GOSTEI 0
José

José

18/01/2011

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0
POSTAR