GARANTIR DESCONTO

Fórum Erro com clientdataset #264794

10/01/2005

0

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


Danielle Ballester

Danielle Ballester

Responder

Posts

10/01/2005

Objetivacreator

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.


Responder

Gostei + 0

11/01/2005

Danielle Ballester

É que eu faço as operações no CLIENTDATASET e não na QUERY, e é por isso que preciso resolver este problema no APPLYUPDATES.


Responder

Gostei + 0

11/01/2005

Bruno_fantin

Posta o codigo do evento OnBeforeUpdateRecords


Responder

Gostei + 0

11/01/2005

Danielle Ballester

não tenho nada neste evento.


Responder

Gostei + 0

11/01/2005

Bruno_fantin

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


Responder

Gostei + 0

11/01/2005

Danielle Ballester

que tipo de tratamento vc fazia?
Vc tem algum exemplo!!


Responder

Gostei + 0

11/01/2005

Bruno_fantin

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


Responder

Gostei + 0

11/01/2005

Danielle Ballester

já entendi, mas mesmo assim vc tem algum exemplo de código para me ajudar?


Responder

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;



Responder

Gostei + 0

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

Aceitar