Fórum Gravação utilizando DbGrid e ClientDataSet #285870

23/06/2005

0

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!


Dani_anjos

Dani_anjos

Responder

Posts

23/06/2005

Emerson Nascimento

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?


Responder

Gostei + 0

24/06/2005

Dani_anjos

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!


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

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.


Responder

Gostei + 0

24/06/2005

Dani_anjos

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!!


Responder

Gostei + 0

24/06/2005

Dani_anjos

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!


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

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.


Responder

Gostei + 0

24/06/2005

Dani_anjos

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!


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

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.


Responder

Gostei + 0

24/06/2005

Dani_anjos

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!


Responder

Gostei + 0

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

Aceitar