Msg de erro na tabela temporária
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
Curtidas 0
Respostas
Leonardo Xavier
18/01/2011
O refresh esta antes ou depois do post?
GOSTEI 0
Wellington
18/01/2011
Você esta tentando dá o reflesh com o ClientDataSet ainda em status insert/edit.
Tente usar:
ou caso não funcione tenta:
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
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
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
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
18/01/2011
Olá
Mas como vc quer o exemplo ???? Disponibilizar o código fonte ??? Como assim...
Rogério
GOSTEI 0
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
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
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
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é
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