(Key Violation of Primary or unique key constraint)

Delphi

22/07/2004

Meus amigos do forum, eis a minha dúvida.
Utilizando o ibExpert tento fazer uma inclusao numa tabela qualquer
cuja chave primária já existe me retorna uma mensagem em ingles (Key Violation of Primary or unique key constraint) até aí tudo perfeito, mas quando rodo a minha aplicação digito o código sabendo que já existe na tabela para forçar o erro de chave duplicada, clico no botão gravar
e não recebo o retorno de chave primária já cadastrada.
Utilizo o delphi 7, componente dbExpress e banco de dados firebird 1.5
Utlizo os seguintes componentes:
sqlConnection, sqlDataSet, dataSetProvider, clientDataSet e o DataSource.
Tenho que alterar alguma propriedade de um destes componentes para receber esta mensagem de erro?
:?:
Plácido


Placido

Placido

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

22/07/2004

Plácido,

Vc está executando a instrução SQL diretamente no banco ou utilizando o ApplyUpdates do ClientDataSet ?
Se for ApplyUpdates, ele não gera exceção caso não consiga aplicar os updates ele apenas retorna um número de erros facilmente testado com :
if CDS.ApplyUpdates(0) = 0 then 
  // não houveram erros
else // houveram erros

Para exibir a mensagem de erro do banco trabalhe no evento OnReconcileError do CDS por exemplo :
ShowMessage(E.Message);


Espero ter ajudado...
T+


GOSTEI 0
Djjunior

Djjunior

22/07/2004

o metódo de gravação não está no meio de um try não ? Neste
coloque uma instrução tipo

try
SuaTable.Post;
except
on e: exept do
messagedlg(´Erro ao gravar dados na tabela ! O erro foi:´ + #13 +
e.message, mtwarning, [mbok], 0);
end;
end;


GOSTEI 0
Vinicius2k

Vinicius2k

22/07/2004

try 
  SuaTable.Post;
except
  on e: exept do
    messagedlg(´Erro ao gravar dados na tabela ! O erro foi:´ + #13 + 
    e.message, mtwarning, [mbok], 0);
  end;
end;


:?: isto não se aplica em ClientDataSets para verificar erros oriundos do banco... e se a instrução SQL for direta o caminho seria buscar a exceção do método seria ExecSQL da SQLQuery ou SQLDataSet...


GOSTEI 0
Placido

Placido

22/07/2004

Meus amigos obrigado pelas dicas...
Vou implementar e retorno a informação se deu certo ou não.
Obrigado :roll:
Plácido


GOSTEI 0
Placido

Placido

22/07/2004

Estou utilizando o método ApplyUpdates(-1).
Grato :roll:


GOSTEI 0
Placido

Placido

22/07/2004

No evento after uso o comando abaixo:

(DataSet as TClientDataSet).ApplyUpdates(-1);


No evento OnReconcileError do CDS da dica coloquei este comando

ShowMessage(E.Message);

Deu a mensagem de erro beleza, mas dá uma mensagem especificando o número do erro e o nome da tabela, como proceder para enviar a mensagem em portugues? ex. (Código já cadastrado)?
Obrigado pela ajuda.
Um abraço


GOSTEI 0
Placido

Placido

22/07/2004

No evento after uso o comando abaixo: (DataSet as TClientDataSet).ApplyUpdates(-1); No evento OnReconcileError do CDS da dica coloquei este comando ShowMessage(E.Message); Estou aguardando ajuda dos colegas....... Deu a mensagem de erro beleza, mas dá uma mensagem especificando o número do erro e o nome da tabela, como proceder para enviar a mensagem em portugues? ex. (Código já cadastrado)? Obrigado pela ajuda. Um abraço



GOSTEI 0
Placido

Placido

22/07/2004

Meus colegas deu certo, agora estou recebendo a mensagem de chave duplicada, agora quero transofrmar esta mensagem de erro, em portugues, ex. (Código já gravado).
Obrigado pelas dicas.
Plácido


GOSTEI 0
Vinicius2k

Vinicius2k

22/07/2004

Placido,

Não mostre diretamente E.Message, mas lembre-se de que esta mensagem pode não ser a única mensagem de erro que o banco retorna então é aconselhável tratar as conhecidas, mas deixar que seja exibida a original caso não se enquadre como conhecida... faça algo parecido com isto :
if Copy(E.Message,1,13) = ´Key Violation´ then
  ShowMessage(´Codigo já existente.´)
else ShowMessage(E.Message);


Espero ter ajudado...
T+


GOSTEI 0
Placido

Placido

22/07/2004

Vinícius Obrigado pela dica, fique com Deus.
Um abraço.
Plácido


GOSTEI 0
POSTAR