Fórum Erro de chave o que fazer? #590058

22/12/2017

0

Ola!
Tenho um banco de dados firebird com uma tabela com um campo chave primaria saida_ID e varios outros campos que nao sao chaves. Quando eu insiro os registros ele salva o priimeiro quando vou salvar o segundo ele da key violation. Porque isto esta acontecendo ? Segue o codigo do botao salvar :

if (edtValorSaida.asCurrency > 0.00) and (ItemEscolhido <> '') then
Begin
With DM.cdsSaidas do
Begin
Append;
FieldByName('DATA').AsDateTime := cmbData.Date;
FieldByName('OBS').AsString := edtObs.Text;
FieldByName('SECAO_SAIDA').AsString := cmbSecao.Text;
FieldByName('SUBSECAO_SAIDA').AsString := cmbSubSecao.Text;
FieldByName('TIPO_SAIDA').AsString := ItemEscolhido;
FieldByName('VALOR').AsCurrency := edtValorSaida.asCurrency;
Post;
ApplyUpdates(0);
Close;
Open;
End;

PodeFechar := True;
cmbSecao.Enabled := False;
cmbSubSecao.Enabled := False;
edtProcura.Enabled := False;
lsbItems.Enabled := False;
edtObs.Enabled := False;
cmbData.Enabled := False;
edtValorSaida.Enabled := False;
cmbSecao.ItemIndex := 0;
cmbSubSecao.ItemIndex := 0;
lsbItems.ItemIndex := 0;

btNovaSaida.Enabled := True;
btSalvarSaida.Enabled := False;
btCAncelarSaida.Enabled := False;
btFechar.Enabled := True;
End
Else
Begin
MessageDlg('Você precisa entrar com todas as informações antes de salvar.',mtWarning,[mbOk],0);
edtProcura.SetFocus;
End;


obrigado
Eduardo Jr

Eduardo Jr

Responder

Post mais votado

04/01/2018

Olá Eduardo,

O erro ocorre porque provavelmente no seu banco de dados o campo saida_ID não deve estar incrementando o código no momento de salvar. Com isso ele até salva o primeiro registro, porém na segunda tentativa ele retorna o erro por estar tentando inserir a mesma informação do Id duas vezes.

Não sei o banco de dados que está utilizando, mas o conceito serve para todos os bancos relacionais onde o valor da chave primária não pode se repetir.

Então tenta validar na coluna saida_ID da tabela que você criou, nas propriedades o atributo relacionado a Identity, que deve ser True para os campos de chave primária, isso tomando como base que você está usando SQL Server.

Outra coisa é verificar se você não setou para alguma coluna dessa tabela o atributo UNIQUE, que também não deixa gravar valores repetidos nas colunas onde encontra-se habilitado.

Mas pela descrição do erro creio que seja algo relacionado a primeira sugestão.

Abs,

William Finco

William Finco
Responder

Gostei + 1

Mais Posts

05/01/2018

Eduardo Jr

Obrigado Joao!
Estou usando o Firebird 3.0.
Engracado que minha tabela tem os seguinte campos :

SAIDA_ID PRIMARARY key
DATA
OBS
SECAO_SAIDA
SUBSECAO_SAIDA
TIPO_SAIDA
VALOR

Se eu insiro um registro com um texto tipo TESTE no campo OBS que nao e chave primaria e depois insiro outro registro com mesmo texto TESTE no campo OBS ele da erro de chave se eu mudo de TESTE pra TESTE1 dai grava normal. Curioso que o campo OBS nao é chave primaria.

O que pode estar errado?
Responder

Gostei + 0

05/01/2018

William Finco

Olá Eduardo,

Pelo seu exemplo provavelmente o campo OBS está como UNIQUE, que é quando não se pode repetir os valores inseridos entre registros diferentes para esse campo.

Será necessário dar um alter table na tabela removendo a unique constraint.

Se você usar o IBExpert, você consegue ver as propriedades da tabela e ver se o campo em questão realmente está como UNIQUE.

Achei um tópico legal que pode te ajudar: https://stackoverflow.com/questions/3858880/how-to-drop-a-unique-constraint-in-firebird

Abs,



Responder

Gostei + 0

05/01/2018

Eduardo Jr

Joao, no IbExpert nao mostra que o campo OBS seja unique nao..onde mais posso ver isso?

obrigado
Responder

Gostei + 0

08/01/2018

William Finco

Olá Eduardo,

Não sei se ainda resolveu o seu problema, mas no IBExpert eu faço assim:

- Digito o nome da tabela na sql editor e clico duas vezes nela;
- Vai abrir uma janela com as definições da tabela;
- Vejo, dentro da aba Fields uma coluna chamada UNQ, o campo que está com essa definição fica marcado com o ícone de uma chave com a letra U;
- Na aba Constraints posso visualizar na subaba Uniques a constraint responsável para a definição Unique, efetivamente.

O que me intriga é que, pelo seu exemplo, tudo tem a ver com isso, porque o campo se torna uma chave com esse atributo, porém uma chave que não é primária, mas de unicidade, que certifica a exclusividade do valor para o campo, que não pode se repetir para os outros registros.

Por último Eduardo, sugiro que você se certifique que este campo OBS não está como Primary Key mesmo, pelo IB são os mesmos passos para verificar, só o nome do atributo que muda, que é PK.

Abs,
Responder

Gostei + 0

08/01/2018

Eduardo Jr

Joao mais uma vez mto obrigado.Engracado que na coluna UNQ nao tem nenhum marcado e na aba constrains tambam nao fala nada do campo obs e o campo obs nao esta como PK
Responder

Gostei + 0

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

Aceitar