Manipulando erros de atualização em vários registros no método ReconcileError do TclientDataSet

StackOverflow https://stackoverflow.com/questions/2821399

Pergunta

Estou tentando usar o evento ReconcileError para permitir que o usuário corrija os dados após um erro de atualização que ocorreu em um registro específico, entre outros.

Exemplo:

Eu tenho um conjunto de dados com um campo e 3 registros, esse campo tem uma restrição exclusiva no banco de dados, então altero um valor para conflito quando atingir o banco de dados e ligo para o ApplUpDates no conjunto de dados.

Isso gerará um erro (violação de restrição exclusiva) no provedor e abortará o processo ApplyUpDates, retornando Raabort na ação VAR do método ReconcileError.

No método ReconcileError, tentei usar:

Action := HandleReconcileError(aDataSet, UpdateKind, E); 

** Editar **

Depois de depurar e despejar os registros do conjunto de dados que foram devolvidos do servidor, notei que existem 2 registros nesse conjunto de dados, o primeiro é o registro antigo e o segundo tem todas as alterações que fiz no primeiro registro.

Estou um pouco confuso, sempre vou receber esse conjunto de dados com 2 registros? Eu pensei que deveria ter apenas um registro com os valores antigos/novos.

Obrigado.

Foi útil?

Solução

Depois de um pouco de depuração e leitura, descobri o seguinte:

  • O OnrecoCileError é chamado para cada registro que não pôde ser aplicado e um conjunto de dados é criado para cada um.
  • Esse conjunto de dados tem 2 registros quando o UpdateKind é UKModify, um registro como UsUnmodified (o registro original) e o segundo registro como USModificado (todas as modificações estão neste segundo registro)
  • Quando a mudança é UkInssert ou UkDelete, o conjunto de dados tem apenas um registro
  • Esse conjunto de dados não deve ser alterado, pois este é apenas um conjunto de dados temporário criado para que você possa ler os dados
  • A caixa de diálogo Reconcile simplesmente não está funcionando como o esperado, pois nunca mostra os valores corretos do registro modificado (Delphi 2010 Bug?)

Outras dicas

No dBExpress, você encontrará com o componente TSQLConnection, nos parâmetros uma entrada, Mars_Connection, que está definido como Falso Por padrão, defina isso como Verdadeiro e a mensagem de erro é resolvida

O registro passou para o OnReCoCileError ou OnUpDateError é o registro que não poderia ter atualizações aplicadas. De acordo com D2007 Arquivo de ajuda (Observe que este é um link de arquivo de ajuda e não um link da web!) - Observe a seção sobre o parâmetro do conjunto de dados:

Você sempre deve codificar um manipulador de eventos OnReCoCileError ou OnUpDateError, mesmo que apenas para descartar os registros retornados que não puderam ser aplicados. Os manipuladores de eventos para esses dois eventos funcionam da mesma maneira. Eles incluem os seguintes parâmetros:

DataSet: um conjunto de dados do cliente que contém o registro atualizado que não pôde ser aplicado. Você pode usar os métodos desse conjunto de dados para obter informações sobre o registro do problema e editar o registro para corrigir quaisquer problemas. Em particular, você deseja usar as propriedades Curvalue, OldValue e NewValue dos campos no registro atual para determinar a causa do problema de atualização. No entanto, você não deve chamar nenhum método do conjunto de dados do cliente que altere o registro atual no seu manipulador de eventos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top