Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Firedac key violation


DanielR
 Share

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...