Fórum Gravação utilizando DbGrid e ClientDataSet #285870
23/06/2005
0
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
Curtir tópico
+ 0Posts
23/06/2005
Emerson Nascimento
Gostei + 0
24/06/2005
Dani_anjos
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
24/06/2005
Emerson Nascimento
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
24/06/2005
Dani_anjos
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
24/06/2005
Dani_anjos
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
24/06/2005
Emerson Nascimento
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
24/06/2005
Dani_anjos
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
24/06/2005
Emerson Nascimento
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
24/06/2005
Dani_anjos
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
Clique aqui para fazer login e interagir na Comunidade :)