Fórum Erro com clientdataset #264794
10/01/2005
0
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
Curtir tópico
+ 0Posts
10/01/2005
Objetivacreator
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
11/01/2005
Danielle Ballester
Gostei + 0
11/01/2005
Bruno_fantin
Gostei + 0
11/01/2005
Danielle Ballester
Gostei + 0
11/01/2005
Bruno_fantin
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
11/01/2005
Danielle Ballester
Vc tem algum exemplo!!
Gostei + 0
11/01/2005
Bruno_fantin
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
11/01/2005
Danielle Ballester
Gostei + 0
11/01/2005
Bruno_fantin
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
Clique aqui para fazer login e interagir na Comunidade :)