alemoraes Postado Abril 25, 2018 Denunciar Share Postado Abril 25, 2018 Coloquei um componente Application Events para tratar um erro de violação de chave estrangeira, mas apesar da mensagem aparecer e dar um OK o código é executado mesmo assim: segue o código no Application Events: procedure TfrmPatrimonio.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if pos('violation of FOREIGN KEY constraint "FK_LOCALIZACAO_ITENS_PATRIMONIO" on table "LOCALIZACAO_ITENS"',e.Message) > 0 then begin Showmessage('ERRO: Este Patrimônio encontra-se em USO!. Exclua-o no Cadastro de Localização primeiro!'); Exit; end; end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 25, 2018 Denunciar Share Postado Abril 25, 2018 mas apesar da mensagem aparecer e dar um OK o código é executado mesmo assim: isso ocorre porque, quando o evento é acionado e a mensagem é mostrada, existe um comando de saida ( Exit ) do evento. ao sair desse evento, o cursor retorna para quem fez a chamada e continua a partir dali uma das opções é voce criar uma variavel ( publica ) de controle nesse evento e testar essa variavel no retorno dela, e a partir disso cancelar o restante do processamento. abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 alemoraes Postado Abril 26, 2018 Autor Denunciar Share Postado Abril 26, 2018 Jhonas boa tarde peço sua ajuda não consegui resolver. Criei uma variável global tipo boolean o registro continua sendo executado. Veja como eu fiz procedure TfrmPatrimonio.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if vRetorno = true then begin if pos('violation of FOREIGN KEY constraint',e.Message) <> 0 then begin Showmessage('ERRO: Este Patrimônio encontra-se em USO!. Exclua-o no Cadastro de Localização primeiro!'); end; Abort; end; end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 26, 2018 Denunciar Share Postado Abril 26, 2018 exemplo: voce poderia usar um bloco try..except em cada procedimento do sistema, mas usando o componente ApplicationEvents voce pode criar um único procedimento que fará o tratamento de todas as exceções que possam ser gerados pelo sistema. procedure TFrmPrincipal.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if pos('foreign key', E.Message) <> 0 then begin ShowMessage('Erro de Chave Estrangeira'); Halt(0);//finaliza o programa /// ou ... aqui voce pode colocar uma rotina para /// Cancelar a edição do registro da tabela end else if pos('Access violation', E.Message) <> 0 then ShowMessage('Erro ao acessar um Objeto') else begin ShowMessage('Erro não tratado ' +#13+E.Message ); {caso seja uma exceção desconhecida, a linha de código abaixo ira recriar exceção sem fazer tratamento algum} raise Exception.Create(E.Message); end; end; abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 alemoraes Postado Abril 28, 2018 Autor Denunciar Share Postado Abril 28, 2018 Jhonas, obrigado pela ajuda. Apesar dos testes, ainda sim continua a execução do código mesmo tratando com a exception. Os seus exemplos estão perfeitos. Pode ter dado algum Bug no Delphi, não sei dizer. O que eu fiz foi alterar no banco de dados Firebird, ou seja, primeiro deletei todos os registros envolvendo as duas tabelas master / detail , depois fui na tabela Filha e alterei na FK_LOCALIZACAO_ITENS_PATRIMONIO para On Delete Cascade. Está funcionando nesta questão do foreign key. Resolvido. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
alemoraes
Coloquei um componente Application Events para tratar um erro de violação de chave estrangeira,
mas apesar da mensagem aparecer e dar um OK o código é executado mesmo assim:
segue o código no Application Events:
procedure TfrmPatrimonio.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
if pos('violation of FOREIGN KEY constraint "FK_LOCALIZACAO_ITENS_PATRIMONIO" on table "LOCALIZACAO_ITENS"',e.Message) > 0 then
begin
Showmessage('ERRO: Este Patrimônio encontra-se em USO!. Exclua-o no Cadastro de Localização primeiro!');
Exit;
end;
end;
Link para o comentário
Compartilhar em outros sites
4 respostass a esta questão
Posts Recomendados
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.