Gravação utilizando DbGrid e ClientDataSet
Boa tarde!
Estou tentando alterar dados de uma tabela a partir de um DbGrid que está ligado a um DataSource e este está ligado á um ClientDataSet.
Quando altero uma linha do DbGrid e mando salvar, não está enviando as alterações pro DataSetProvider. Na realidade, qdo verifico o State do ClientDataSet está igual a dsBrowser. Como posso colocá-lo em estado de edição?
No evento AfterPost do ClientDataSet estou dando um ApplyUpdates(0).
Alguém poderia me ajudar?
Obrigada!
Estou tentando alterar dados de uma tabela a partir de um DbGrid que está ligado a um DataSource e este está ligado á um ClientDataSet.
Quando altero uma linha do DbGrid e mando salvar, não está enviando as alterações pro DataSetProvider. Na realidade, qdo verifico o State do ClientDataSet está igual a dsBrowser. Como posso colocá-lo em estado de edição?
No evento AfterPost do ClientDataSet estou dando um ApplyUpdates(0).
Alguém poderia me ajudar?
Obrigada!
Dani_anjos
Curtidas 0
Respostas
Emerson Nascimento
23/06/2005
qual a instrução do seu Dataset? os providerflags dos campos foram definidos de acordo com o UpdateMode do datasetprovider? a instrução é alterada no clientdataset?
GOSTEI 0
Dani_anjos
23/06/2005
Oi!
Os providerflags estão como pfInUpdate, pfInWhere. No meu DataSetProvider o options está como poPropogateChanges e poAllowCommandTex. O UpdateMode está como UpWhereKeyOnly.Eu não altero as instruções do ClientDataSet, eu apenas passo dois parâmetros pra ele.
Obrigada pela atenção e desculpe pela demora na resposta, tive uns probleminhas com a internet aqui..rs
Valeu!
Os providerflags estão como pfInUpdate, pfInWhere. No meu DataSetProvider o options está como poPropogateChanges e poAllowCommandTex. O UpdateMode está como UpWhereKeyOnly.Eu não altero as instruções do ClientDataSet, eu apenas passo dois parâmetros pra ele.
Obrigada pela atenção e desculpe pela demora na resposta, tive uns probleminhas com a internet aqui..rs
Valeu!
GOSTEI 0
Emerson Nascimento
23/06/2005
a primeira pergunta foi: qual a instrução do seu dataset?
essa pergunta foi para saber se há uso de join. visto que você não a respondeu, imagino que não haja uso de joins.
os providerflags devem ser utilizados em conjunto com o updatemode.
como seu updatemode está como UpWhereKeyOnly, você precisa o(s) campo(s)-chave.
[b:9e4f14f16f]por padrão, faça assim:[/b:9e4f14f16f]
[i:9e4f14f16f]o(s) campo(s)-chave deve(m) estar com:
providerflags := [pfInUpdate, pfInWhere,pfInKey]
obviamente, pfInKey indica que esse é um campo chave. também é informado que esse campo é atualizável e que deve constar na clásula where. faça isso para todos os campos-chave de sua tabela.
os demais campos, desde que pertençam à mesma tabela, devem ser:
providerflags := [pfInUpdate]
porque eles não precisam estar na cláusula where e nem são chaves. na cláusula where basta que se ponham os campos-chave para correta localização do registro.
os campos não pertencentes à tabela (aqueles campos vindo de joins) devem ser:
providerflags := [pfHidden]
para que não sejam referenciados na instrução que será montada pelo provider para manipulação do registro.[/i:9e4f14f16f]
Note que essas configurações somente são necessárias porque você definiu o updatemode como UpWhereKeyOnly. essa forma é mais trabalhosa, mas propricia uma melhor performance na execução do programa.
como você não havia definido as chaves, o provider não conseguiu montar a instrução de alteração do registro.
acho que é isso.
bom trabalho.
essa pergunta foi para saber se há uso de join. visto que você não a respondeu, imagino que não haja uso de joins.
os providerflags devem ser utilizados em conjunto com o updatemode.
como seu updatemode está como UpWhereKeyOnly, você precisa o(s) campo(s)-chave.
[b:9e4f14f16f]por padrão, faça assim:[/b:9e4f14f16f]
[i:9e4f14f16f]o(s) campo(s)-chave deve(m) estar com:
providerflags := [pfInUpdate, pfInWhere,pfInKey]
obviamente, pfInKey indica que esse é um campo chave. também é informado que esse campo é atualizável e que deve constar na clásula where. faça isso para todos os campos-chave de sua tabela.
os demais campos, desde que pertençam à mesma tabela, devem ser:
providerflags := [pfInUpdate]
porque eles não precisam estar na cláusula where e nem são chaves. na cláusula where basta que se ponham os campos-chave para correta localização do registro.
os campos não pertencentes à tabela (aqueles campos vindo de joins) devem ser:
providerflags := [pfHidden]
para que não sejam referenciados na instrução que será montada pelo provider para manipulação do registro.[/i:9e4f14f16f]
Note que essas configurações somente são necessárias porque você definiu o updatemode como UpWhereKeyOnly. essa forma é mais trabalhosa, mas propricia uma melhor performance na execução do programa.
como você não havia definido as chaves, o provider não conseguiu montar a instrução de alteração do registro.
acho que é isso.
bom trabalho.
GOSTEI 0
Dani_anjos
23/06/2005
Desculpe, me esqueci de colocar a instrução...
Bom a instrução é:
SELECT * FROM TABELA WHERE CD_USUARIO_SIST = :UsuarioLogado
AND CD_SISTEMA = 1
Com relação aos providerflags, eu mantive o default. Ficou assim:
(AdoQuery)providerflags: pfInUpdate, pfInWhere
(DataSetProvider) Options: poUseQuoteChar
UpdateMode: UpWhereAll
Estou utilizando do Delphi 2005.
Dessa maneira q eu descrevi acima, tb não está funcionando!
Vou tentar fazer as alterações q vc me passou!
Muito obrigada!!
Bom a instrução é:
SELECT * FROM TABELA WHERE CD_USUARIO_SIST = :UsuarioLogado
AND CD_SISTEMA = 1
Com relação aos providerflags, eu mantive o default. Ficou assim:
(AdoQuery)providerflags: pfInUpdate, pfInWhere
(DataSetProvider) Options: poUseQuoteChar
UpdateMode: UpWhereAll
Estou utilizando do Delphi 2005.
Dessa maneira q eu descrevi acima, tb não está funcionando!
Vou tentar fazer as alterações q vc me passou!
Muito obrigada!!
GOSTEI 0
Dani_anjos
23/06/2005
Oi, novamente!
Eu fiz o q vc me passou, mas ainda não está funcionando!
No AfterPost do ClientDataSet eu coloquei apenas ´ClientDataSet.ApplyUpdate(0)´. Eu tentei colocar ClientDataSet.Post antes do applyupdate, mas recebo a mensagem de q o ClientDataSet não está no modo de edição.
Como estou fazendo essa alteração diretamente no Dbgrid, vc saberia me dizer se preciso colocar ClientDataSet.edit em algum momento? OU apenas o applyupdate(0) é o suficiente pra essa alteração ser salva no banco de dados?
Mais uma vez, muito obrigada!
Eu fiz o q vc me passou, mas ainda não está funcionando!
No AfterPost do ClientDataSet eu coloquei apenas ´ClientDataSet.ApplyUpdate(0)´. Eu tentei colocar ClientDataSet.Post antes do applyupdate, mas recebo a mensagem de q o ClientDataSet não está no modo de edição.
Como estou fazendo essa alteração diretamente no Dbgrid, vc saberia me dizer se preciso colocar ClientDataSet.edit em algum momento? OU apenas o applyupdate(0) é o suficiente pra essa alteração ser salva no banco de dados?
Mais uma vez, muito obrigada!
GOSTEI 0
Emerson Nascimento
23/06/2005
a própria grid põe o dataset em modo de edição no momento em que você começa a digitar algo e, assim que você move o ponteiro de registros, ele grava (post). se você colocou o ApplyUpdates no afterpost, nada mais é necessário.
mas não sei te responder o porque de não estar gravando.
se possível, explique exatamente o que você está tentando fazer, qual o banco de dados utilizado e quais os componentes de acesso aos dados.
mas não sei te responder o porque de não estar gravando.
se possível, explique exatamente o que você está tentando fazer, qual o banco de dados utilizado e quais os componentes de acesso aos dados.
GOSTEI 0
Dani_anjos
23/06/2005
Oi Emerson!
Estou desenvolvendo uma aplicação em 3 camadas. Na Aplicação Servidora, estou utilizando 3 Transactional Data Modules, em um deles tenho o TAdoConnection e os demais estão ligados a ele. Utilizo TAdoquery e TDataSetProvider ligado a query.
Na Aplicação Cliente possuo 3 Data Modules, e utilizo o DComConnection e SharedConnection, ClientDataSet e DataSource ligado ao Clientdataset.
O banco é SQL Server 2000.
O q estou tentando fazer é alterar os dados de uma tabela utilizando o DbGrid.
Te perguntei com relação ao modo de edição, porque no evento afterpost do ClientdataSet coloquei a seguinte verificação:
if ClientdataSet.State = (dsEdit) then
begin
ClientdataSet.ApplyUpdates(0);
end;
E o State está como dsBrowser. É assim mesmo?
Desculpe pela insistência mas é q estou migrando uma aplicação Client/Server pra 3 camadas, e estou com muitas dúvidas!
Muito Obrigada!
Estou desenvolvendo uma aplicação em 3 camadas. Na Aplicação Servidora, estou utilizando 3 Transactional Data Modules, em um deles tenho o TAdoConnection e os demais estão ligados a ele. Utilizo TAdoquery e TDataSetProvider ligado a query.
Na Aplicação Cliente possuo 3 Data Modules, e utilizo o DComConnection e SharedConnection, ClientDataSet e DataSource ligado ao Clientdataset.
O banco é SQL Server 2000.
O q estou tentando fazer é alterar os dados de uma tabela utilizando o DbGrid.
Te perguntei com relação ao modo de edição, porque no evento afterpost do ClientdataSet coloquei a seguinte verificação:
if ClientdataSet.State = (dsEdit) then
begin
ClientdataSet.ApplyUpdates(0);
end;
E o State está como dsBrowser. É assim mesmo?
Desculpe pela insistência mas é q estou migrando uma aplicação Client/Server pra 3 camadas, e estou com muitas dúvidas!
Muito Obrigada!
GOSTEI 0
Emerson Nascimento
23/06/2005
na verdade você não precisa verificar o estado, senão nunca será feito o ApplyUpdates. ocorre que ao mudar de registro ou dar um post manualmente, o estado se altera e, obviamente depois do post (afterpost) o estado não será mais edição nem inserção.
o correto seria deixar apenas a linha do ApplyUpdates.
procedure TForm1.ClientDataSetAfterPost(DataSet: TDataSet);
begin
TClientDataset(Dataset).ApplyUpdates;
end;
agora uma outra pergunta: que tipo de edição você está fazendo a para usar uma grid? porque se for uma grid detalhe (como itens de pedidos ou coisa assim) você não deveria dar o ApplyUpdates a cada resgistro detalhe, mas sim ao final da edição do registro mestre.
o correto seria deixar apenas a linha do ApplyUpdates.
procedure TForm1.ClientDataSetAfterPost(DataSet: TDataSet);
begin
TClientDataset(Dataset).ApplyUpdates;
end;
agora uma outra pergunta: que tipo de edição você está fazendo a para usar uma grid? porque se for uma grid detalhe (como itens de pedidos ou coisa assim) você não deveria dar o ApplyUpdates a cada resgistro detalhe, mas sim ao final da edição do registro mestre.
GOSTEI 0
Dani_anjos
23/06/2005
No DbGrid estou carregando uma tabela de valores, mas essa tabela só tem duas linhas e seis colunas. O usuário pode alterar o valor que quiser, e não precisa alterar todas as colunas. Por isso coloquei o apllyupdate no afterpost.
Ainda não obtive sucesso! :cry:
Vou refazer a query e ver se obtenho algum resultado!
Bom, se vc tiver mais alguma sugestão...
Muito obrigada!
Ainda não obtive sucesso! :cry:
Vou refazer a query e ver se obtenho algum resultado!
Bom, se vc tiver mais alguma sugestão...
Muito obrigada!
GOSTEI 0