Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Tratando Exceção no ClientDataSet


renanbg

Pergunta

No meu botão gravar, gravo dados em 3 tabelas diferentes.

em 2 delas uso clientdataset, na outra uso query.

Joguei tudo dentro de um try except e caso de erro, dou um rollback.

O problema é que se o erro der no applyupdates(0), a exceção não será gerada e terei dados inconsistentes gravados.

Já pesquisei e vi que devo apresentar a mensagem de erro no evento OnReconcileError do clientdataset pra apresentar a mensagem de erro. Mas mesmo após a mensagem, o restante do código será executado.

O resumo do meu codigo é assim:

try
  cdsagenda.post;
  cdsagenda.applyupdates(0);

  cdscontas.post;
  cdscontas.applyupdates(0);

  while not cdsitens.eof do
  ...
  ...
  qrproducao.post;
except
showmessage('deu erro, não gravei nada');
transaction.rollbackretaining;
end;

Minha duvida é como cancelar tudo em caso de erro.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

tente isso:

try
  cdsagenda.post;
  if cdsagenda.applyupdates(0)> 0 then
     begin
        showmessage('Erro de gravação');
        cdsagenda.Cancel;
     end;

  cdscontas.post;
  if cdscontas.applyupdates(0)> 0 then
     begin
        showmessage('Erro de gravação');
        cdscontas.Cancel;
     end;

  while not cdsitens.eof do
  ...
  ...
  qrproducao.post;
except
showmessage('deu erro, não gravei nada');
transaction.rollbackretaining;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

nesse caso basta voce condicionar  o salvamento dos registros nas tabelas

try
  cdsagenda.post;
  if cdsagenda.applyupdates(0)> 0 then
     begin
        showmessage('Erro de gravação');
        cdsagenda.Cancel;
     end
  else 
     begin
        cdscontas.post;
        if cdscontas.applyupdates(0)> 0 then
           begin
              showmessage('Erro de gravação');
              cdscontas.Cancel;
           end;
     end; 

  while not cdsitens.eof do
  ...
  ...
  qrproducao.post;
except
showmessage('deu erro, não gravei nada');
transaction.rollbackretaining;
end;

Voce pode ainda, se não quiser dar um Cancel na Tabela, pode dar um comando Exit e sair do restante do código, para não ser executado.

Pela minha experiência, se voce soube estruturar corretamente as suas tabelas, dificilmente vai ocorrer  esse tipo de problema.

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...