segunda-feira, 7 de abril de 2014

Tratando erros em ApplyUpdates com FIREDAC.


Quando invocamos o método ApplyUpdates em uma FDQuery devemos lembrar que exceções não serão geradas para a aplicação, porem o FireDac registra o erro em uma estrutura de registro de dados interna e continua a processar atualizações até que o número de erros seja igual ou superior a AMaxErrors.

Após chamar o método ApplyUpdates , devemos incluir rtHasErrors em FilterChanges para filtrarmos os registros que contenham erros. Em seguida, navegamos através do conjunto de dados e lemos a propriedade RowError que conterá um objeto de exceção associado ao registro atual. Como mostra o exemplo abaixo:

var
  oErr: EFDException;
begin
if FDQuery1.ApplyUpdate > 0 then begin
  FDQuery1.FilterChanges := [rtModified, rtInserted, rtDeleted, rtHasErrors];
  try
    FDQuery1.First;
    while not FDQuery1.Eof do begin
      oErr := FDQuery1.RowError;
      if oErr <> nil then begin
        raise Exception.Create(oErr.Message);
      end;
      FDQuery1.Next;
    end;
  finally
    FDQuery1.FilterChanges := [rtUnmodified, rtModified, rtInserted];
  end;
end;

6 comentários:

  1. Legal Eduardo..... mas virei e mexi e nao consegui montar uma rotina decente para gerenciar meus erros utilizando FDQuery. Tem como postar um exemplo de utilização?

    ResponderExcluir
  2. Boa tarde,
    Conforme descrito no exemplo acima, ao dar um applyUpdates no FDQuery1 o mesmo retorna um Integer informando se deu erro ou não. Após isso percorremos as linhas do FDQuery1 onde podemos verificar cada erro ocorrido em cada linha do FDQuery1.
    Não entendi qual sua dificuldade referente ao exemplo acima, você pode ser mais especifico ?
    Desde já agradeço, fico muito feliz em ajuda-lo.

    ResponderExcluir
  3. Camara! Estou passando o diabo tentando fazer uma factura com Xe7+ Firedac+FB30 c/chachedUpdates que possa se estornar/anular uma Fatura/Recibo
    Tenho 3 tabelas HeaderInv P_KEY=INVNO_ID+SINAL
    DetailINV com P_KEY=INVNO_ID+SINAL+NOLI e por fim ResumoImposto PKKEY=INVNO_ID+SINAL+NOLI se limita arrumar resumo do impostos a 10%; 16%,;23%; etc
    O diabo quando muda o Sinal de mais para menos na copia do mesmo INVNO_ID (uma Flag="E" não pertence à chave). É que dá sempre chave duplicada!?.
    Mas não tem como porque: mantenho um registo positivo e copio ele com sinal menos seted hardecode e valores=valores *-1. C/Flag"E"storno!
    Já passou por semelhante coisa

    ResponderExcluir
    Respostas
    1. Bom dia. Qual framework você utilizava para conectar ao banco anteriormente?

      Excluir
  4. Esse exemplo foi muito útil para mim. Parabéns e obrigado pelo compartilhamento.

    ResponderExcluir
  5. Fantástico exemplo...
    exatamente o que eu estava procurando...
    Muito obrigado!!

    $UC3$$@

    ResponderExcluir