Erro com clientdataset
Pessoal,
Estou usando clientdataset. Se eu dou um INSERT no clientdataset, no evento AFTERPOST coloquei um applyupdates(-1), no AFTERDELETE também. Até ai tudo bem, mas o problema é o seguinte, se eu inserir um registro ele atualiza normal, mas se logo em seguida eu excluo este mesmo registro ele dá o seguinte erro abaixo
---------------------------
Debugger Exception Notification
---------------------------
Project granel.exe raised exception class EDatabaseError with message ´Update failed´. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
e é bem na linha do APPLYUPDATES(-1) do afterdelete.
O que será que está acontecendo??!!
Estou usando clientdataset. Se eu dou um INSERT no clientdataset, no evento AFTERPOST coloquei um applyupdates(-1), no AFTERDELETE também. Até ai tudo bem, mas o problema é o seguinte, se eu inserir um registro ele atualiza normal, mas se logo em seguida eu excluo este mesmo registro ele dá o seguinte erro abaixo
---------------------------
Debugger Exception Notification
---------------------------
Project granel.exe raised exception class EDatabaseError with message ´Update failed´. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
e é bem na linha do APPLYUPDATES(-1) do afterdelete.
O que será que está acontecendo??!!
Danielle Ballester
Curtidas 0
Respostas
Objetivacreator
10/01/2005
Cara amiga
Eu particularmente utilizo o comando Delete e depois o ExecSQl, não dou o comando ApplyUpdate(-1), não.
Exemplo de uma aplicação minha.
Dm.SqlDataSet1.Close
Dm.SqlDataSet1.CommandText := ´Delete From Cliente where CodCliente=:CodCli´;
Dm.SqlDataSet1.ExecSql();
Espero ter ajudado.
Valnei.
Eu particularmente utilizo o comando Delete e depois o ExecSQl, não dou o comando ApplyUpdate(-1), não.
Exemplo de uma aplicação minha.
Dm.SqlDataSet1.Close
Dm.SqlDataSet1.CommandText := ´Delete From Cliente where CodCliente=:CodCli´;
Dm.SqlDataSet1.ExecSql();
Espero ter ajudado.
Valnei.
GOSTEI 0
Danielle Ballester
10/01/2005
É que eu faço as operações no CLIENTDATASET e não na QUERY, e é por isso que preciso resolver este problema no APPLYUPDATES.
GOSTEI 0
Bruno_fantin
10/01/2005
Posta o codigo do evento OnBeforeUpdateRecords
GOSTEI 0
Danielle Ballester
10/01/2005
não tenho nada neste evento.
GOSTEI 0
Bruno_fantin
10/01/2005
Eu já fiz um sistema enorme (5 modulos... Quase 3 anos para terminar) usando DataSetProvider + ClientDataSet...
E todas as vezes... Todas... Que eu me esquecia de colocar algo nesse evento aparecia cada erro que nem Deus conseguia explicar o motivo...
E todas as vezes... Todas... Que eu me esquecia de colocar algo nesse evento aparecia cada erro que nem Deus conseguia explicar o motivo...
GOSTEI 0
Danielle Ballester
10/01/2005
que tipo de tratamento vc fazia?
Vc tem algum exemplo!!
Vc tem algum exemplo!!
GOSTEI 0
Bruno_fantin
10/01/2005
Obrigatoriamente eu sempre setava as chaves... E a maoria dos erro erra por causa disso... A DataSetProvider não sabia quais eram as chaves da tabela e dava pau...
Ai para casos especificos eu fazia alguns tratamente no insert e raramente no delete.... E quase nunca no update...
No insert geralmente eu definia chaves sequencias e definia os relacionamentos das tabelas detalhes... Também campos como ´DataCadastro´ eu definia o seu valor nesse momento...
No delete só quando tinha que fazer alguma alteração em outra tabela quando um registro fosse excluido... Era casos raros porque geralmente eu faço isso usando triggers no banco...
Ai para casos especificos eu fazia alguns tratamente no insert e raramente no delete.... E quase nunca no update...
No insert geralmente eu definia chaves sequencias e definia os relacionamentos das tabelas detalhes... Também campos como ´DataCadastro´ eu definia o seu valor nesse momento...
No delete só quando tinha que fazer alguma alteração em outra tabela quando um registro fosse excluido... Era casos raros porque geralmente eu faço isso usando triggers no banco...
GOSTEI 0
Danielle Ballester
10/01/2005
já entendi, mas mesmo assim vc tem algum exemplo de código para me ajudar?
GOSTEI 0
Bruno_fantin
10/01/2005
procedure TForm1.DataSetProviderBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin // Setando as chaves... // Primeiro eu vou descobrir qual tabela está sendo trabalhada pelo DSP... // E depois eu seto as chaves para aquela tabela... // O parametro SourceDS me indica qual tabela que é... E o DeltaDS é aonde irei setar as chaves... if SourceDS = ADODataSet_Master then begin DeltaDS.FieldByName(´Codigo´).ProviderFlags := [pfInUpdate, pfInWhere, pfInKey]; end; if SourceDS = ADODataSet_Detalhe then begin DeltaDS.FieldByName(´Codigo´).ProviderFlags := [pfInUpdate, pfInWhere, pfInKey]; DeltaDS.FieldByName(´Sequencia´).ProviderFlags := [pfInUpdate, pfInWhere, pfInKey]; end; // Tratamento opcional... // Nesse caso eu vou criar o autoincremento da tabela e definir a relação master-detalhe... // Primeiro vou verificar se é insert através do parametro UpdateKind... // Depois verifico a tabela e faço o tratamento dela... if UpdateKind = ukInsert then begin if SourceDS = ADODataSet_Master then begin // Esse codigo pega o proximo codigo atráves da ADOQuery_Proximo e joga ele // No campo Codigo da tabela Master... ADOQuery_Proximo.Close; ADOQuery_Proximo.Open; DeltaDS.FieldByName(´Codigo´).NewValue := ADOQuery_ProximoCodigo.AsInteger; // Obs - Para mudar qualquer valor do DeltaDS você deve usar o metodo NewValue end; if SourceDS = ADODataSet_Detalhe then begin // Aqui é feita a ligação master-detalhe... // Pego o codigo da tabela master e jogo na tabela detalhe... // A propriedade DataSetField.Delta é a tabela acima da tabela trabalhada... DeltaDS.FieldByName(´Codigo´).NewValue := DeltaDS.DataSetField.Delta.FieldByName(´Codigo´).AsString; end; end; end;
GOSTEI 0