Delphi exception violation of PRIMARY or UNIQUE KEY constraint

31/01/2020

0

Estou fazendo uma rotina para que ao importar o XML de uma nota fiscal eletronica, os produtos contidos nela sejam automáticamente inseridas na tabela de cadastro de produtos, no banco de dados Firebird 2.5 criei uma unique key para o campo descricao, para que não se repitam, irei verificar outros campos também, mas gostaria de ver qual seria a melhor forma de tratar a exceção que é retornada quando faço a importação do XML e consequentemente a inserção na tabela produtos.

Está retornando essa exceção
exception message : [FireDAC][Phys][FB]violation of PRIMARY or UNIQUE KEY constraint "UNQ_DESCRICAO" on table "CAD_PRODUTOS" Problematic key value is ("DESCRICAO" = 'XXXXXXX').

procedure TFrmCompra.CadastraProduto(aProduto: TRProduto);
var
mDQuery: TFDQuery;
mDecimal: Char;
begin
mDecimal := FormatSettings.DecimalSeparator;
try

FormatSettings.DecimalSeparator := '.';

mDQuery := TFDQuery.Create(Self);
mDQuery.Connection := FrmPrincipal.DBConexao;
mDQuery.SQL.Clear;
mDQuery.SQL.Add(' insert into CAD_PRODUTOS( ');
mDQuery.SQL.Add(' EMPRESA ');
mDQuery.SQL.Add(' ,REFERENCIA ');
mDQuery.SQL.Add(' ,CODIGO_BARRA ');
mDQuery.SQL.Add(' ,CODIGO_FABRICANTE ');
mDQuery.SQL.Add(' ,DESCRICAO ');
mDQuery.SQL.Add(' ,DATA ');
mDQuery.SQL.Add(' ) ');
mDQuery.SQL.Add(' values ( ');
mDQuery.SQL.Add(':EMPRESA');
mDQuery.SQL.Add(',:REFERENCIA');
mDQuery.SQL.Add(',:CODIGO_BARRA');
mDQuery.SQL.Add(',:CODIGO_FABRICANTE');
mDQuery.SQL.Add(',:DESCRICAO');
mDQuery.SQL.Add(',:DATA');
mDQuery.SQL.Add(' ) ');
mDQuery.ParamByName('EMPRESA').AsInteger := FSistema.Empresa;
mDQuery.ParamByName('REFERENCIA').AsString :=
UpperCase(Trim(aProduto.REFERENCIA));
mDQuery.ParamByName('CODIGO_BARRA').AsString :=
UpperCase(Trim(aProduto.CODBARRA));
mDQuery.ParamByName('CODIGO_FABRICANTE').AsString :=
UpperCase(Trim(aProduto.REFERENCIA));
mDQuery.ParamByName('DESCRICAO').AsString :=
UpperCase(Trim(aProduto.DESCRICAO));
mDQuery.ParamByName('DATA').AsDateTime := Date;
mDQuery.ExecSQL;
finally
mDQuery.Close;
mDQuery.Free;
FormatSettings.DecimalSeparator := mDecimal;
end;
end;

ps: tentei colocar p </> rsrsrs
Ederson Silva

Ederson Silva

Responder

Posts

03/02/2020

Ricardo Araujo

Bom dia,

O erro quer dizer que não pode ter o nome descrição do mesmo nome, porque a chave e primary ou unique, então os nome precisa ser diferente.

Se quiser cadastra o mesmo produto ou descrição precisa verificar se isto e necessario.
Responder

03/02/2020

Ederson Silva

Bom dia,

O erro quer dizer que não pode ter o nome descrição do mesmo nome, porque a chave e primary ou unique, então os nome precisa ser diferente.

Se quiser cadastra o mesmo produto ou descrição precisa verificar se isto e necessario.


Olá Ricardo, obrigado pela resposta, exatamente isso, no XML ele vem duplicado o mesmo produto, mas o que gostaria de saber é como poderia tratar esse produto duplicado no momento de inserção no banco, porque no momento, ele retorna essa exceção e fecha o sistema.

Vlw.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar