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

(Resolvido) Firedac key violation


DanielR

Pergunta

Pessoal parece que hoje é o meu dia de postar.

Obrigado pela paciência, no entanto não postaria se não fosse diferente.

Vamos lá, como já disse num outro post estamos mudando de: interbase para FireDac no acesso ao banco de dados Firebird.

O erro que apresento nesse momento é muito comum, e a resposta para ele também, porém no meu caso é diferente. Vejam, o erro é o famoso key violation.

Segue o código:

FcjParcelas.Insert;
FcjParcelas.fieldbyname('empresa'    ).AsInteger  := self.GetEmpresa; // faz parte da chave
FcjParcelas.FieldByName('codigo'     ).AsInteger  := Ficodigo; // faz parte da chave
FcjParcelas.FieldByName('parcela'    ).AsInteger  := i; // faz parte da chave (aqui eu incremento cfe qtd de parcelas)
FcjParcelas.FieldByName('dt_Vcto'    ).AsDateTime := FdDtvcto;
FcjParcelas.FieldByName('status'     ).AsString   := 'A';
FcjParcelas.FieldByName('valor'      ).AsFloat    := strToFloat(FcValorAuxParcela) + FdDiferenca;
FcjParcelas.FieldByName('forma_pgto' ).AsInteger  := FaFormaPgto.ID_FORMAPGTO;
FcjParcelas.FieldByName('descricao'  ).AsString   := FaFormaPgto.DESCRICAO;
FcjParcelas.Post;

Posso lhes garantir que cada linha é diferente e como prova disso é que a mesma rotina funciona no interbase e esta rodando em produção a pelo menos 8 anos.

outro detalhe, somente as grades de parcelas (que passam pelo código acima) que estão apresentando esse comportamento, as demais (até agora) estão incluindo, alterando, excluindo bem tranquilo cfe já funciona do mesmo.

Se alguém já passou por algo parecido e quiser compartilhar agradeço.

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Pessoal, como não poderia ser diferente o erro é nosso, mas ta corrigido.

O Firedac deve ser mais criterioso que o interbase, por isso onde cometemos o erro tenha passado a tanto tempo.

O erro estava na origem (no select) no inner join.

Select parcela.* from Documento inner join parcela on (documento.chaveA = parcela.chaveA)
                                          and (documento.chaveB = parcela.chaveB)

o select usado não é esse mas o erro sim, como era um select de mais de 8 anos como falei, nem desconfiei dele, quando fui olhar o select esta buscando o documento fazendo um inner com parcelas, as linhas de resultado serão as mesmas com certeza, no entanto a importação de chave e demais constraints serão da tabela documento e não da tabela parcelas, por isso o erro de key violation

O Select correto é:

Select  parcela.* from Parcela inner join Documento on (documento.chaveA = parcela.chaveA)
                                          and (documento.chaveB = parcela.chaveB)

Obrigado a todos.

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