[firebase-br] Tratar mensagem de Constraint no Delphi 7

Fausto Alves fausto.s.a em uol.com.br
Qua Set 9 21:28:41 -03 2009


Em 08/09/2009 16:23, Rogerio Monteiro escreveu:
> Olá colegas.
>
> Estou com o seguinte problema:
>
> Tenho uma Constraint unique UNQ_CLIENTE_1 que trata o campo CODCLI.
>
> CODCLI pode estar em branco.
> Quando CODCLI está em branco seu ReadOnly do Field do Dataset deixo como
> False (permitindo a edição). Se não for em branco, ReadOnly vai para True
> (não permitindo que se altere um código já cadastrado).
>
> PROBLEMA: Quando tenho um CODCLI em branco e digito um código que já existe
> na tabela, a Constraint UNQ_CLIENTE_1 levanta a exceção.
>
> DÚVIDA: como capturar no delphi essa exceção do Firebird?
>
Rogério caso esteja utilizando ClientDataSet escreva um código no evento 
OnReconcilieError eu uso esse aqui:
A chamada ficaria assim:
Aponte o Evento para o OnReconciliError do ClientDataSet e no evento 
Before post eu faço assim
if MeuCds.ApplyUpdates(0) > 0 then
begin
   MeuCds.Edit;
   Abort;
end;
Lembrando que a chamada a MsgErro é para uma function criada por mim.
procedure TDataAdm.ReconcileError(DataSet: TCustomClientDataSet;
   E: EReconcileError; UpdateKind: TUpdateKind;
   var Action: TReconcileAction);
var
   Mensagem: string;
begin

   if Pos('VIOLATION OF FOREIGN KEY', UpperCase(E.Message)) > 0 then
   begin
     if UpdateKind in [ukInsert, ukModify] then
       Mensagem := 'Dado inexistente.'
     else if UpdateKind = ukDelete then
       Mensagem := 'Registro não pode ser excluído.';
   end
   else if Pos('CHECK CONSTRAINT', UpperCase(E.Message)) > 0 then
   begin
     Mensagem := 'Verifique os dados informados!';
   end
   else if Pos('VALIDATION ERROR FOR COLUMN', UpperCase(E.Message)) > 0 then
   begin
     Mensagem := 'Valor inválido!';
   end
   else if Pos('EXCEPTION 4', UpperCase(E.Message)) > 0 then
   begin
     Mensagem := '';
   end
   else if Pos('STORE DUPLICATE VALUE', UpperCase(E.Message)) > 0 then
   begin
     Mensagem := 'Você está tentando gravar um valor que não pode ser 
repetido.';
   end
   else if Pos('VIOLATION OF PRIMARY OR UNIQUE KEY', 
UpperCase(E.Message)) > 0 then
   begin
     Mensagem := 'Registro já cadastrado.';
   end
   else if Pos('RECORD NOT FOUND OR CHANGED BY ANOTHER USER.', 
UpperCase(E.Message)) > 0 then
   begin
     Mensagem := 'Registro não encontrado ou modificado por outro usuário.';
   end
   else
     Mensagem := E.Message;
   MsgErro(Mensagem);
end;


-- 
Fausto Alves
Skype:faustoalves
msn:faustoalves em com4.com.br
Franca-SP
Enviado pelo Mozilla Thunderbird
http://br.mozdev.org/thunderbird





Mais detalhes sobre a lista de discussão lista