Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

maquinavirtual

Try Exception nao Funciona!

Recommended Posts

Estou usando banco de dados firebird 2.0 delphi 7 ibexpert e componentes paleta interbase.

A exception nao esta funcionando, esta aparecendo o erro gerado pelo delphi.

 

 

Project raised exception class EibInterbasError with message 'Attenpt to store duplicate value (visible to active transactions) in unique "ID_NOMECOMPLETO" Process Stoped.'


else
...
...

if Button = NbPost then //botao salvar
   begin
     //menus
     MainMenuSair.Enabled:=true; //MainMenuSair desabilitado
     MainMenuPesquisa.Enabled:=true; //MainMenuConsulta desabilitado
     //PopupMenuSair.Enabled:=false; //PopupMenuSair desabilitado
     //PopupMenuConsulta.Enabled:=false; //PopupMenuConsulta desabilitado
     //verifica campo em branco
     //e notifica usuario
      if dbeditUF.Text = '' then
       begin
        messagebeep(16);
        messagebox(FormCadastro.Handle,'Realize a pesquisa pelo "Cep",'#13'campo esta em branco!','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
        abort;
      end
     else
      if dbeditCIDADE.Text = '' then
       begin
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Realize a pesquisa pelo "Cep",'#13'campo esta em branco!','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
       end
     else
      if dbeditBAIRRO.Text = '' then
       begin
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Realize a pesquisa pelo "Cep",'#13'campo esta em branco!','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
       end
     else
      if DBCBselecCLASSE.Text = '' then
       begin
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Selecione a "Classe" do registro,'#13'campo esta em branco!','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
       end
     else
      if DBEditNOMECOMPLETO.Text = '' then
       begin
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Preencha o campo "Nome Completo",'#13'campo esta em branco!','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
       end
     else
      if (Length (dbEditcep.Text) < 8) or (Length (dbEditcep.Text) > 8) then
       begin //se digito contiver - de 8 digitos ou + de 8 digitos
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Preencha o campo "Cep" corretamente!'#13'Formato: 00.000-000. Digite'#13'somente números.','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
         dbeditCep.SetFocus;
       end
     else
      if Length (dbEditTelRes.Text) < 14 then
       begin //se digito contiver - de 14 digitos
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Preencha o campo "Telefone Residencial" corretamente!'#13'Formato: (00)0000-0000.'#13'Digite somente números.','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
         dbeditTelRes.Clear;
         dbeditTelRes.SetFocus;
       end
     else
      if Length (dbEditTelCel.Text) < 14 then
       begin //se digito contiver - de 14 digitos
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Preencha o campo "Telefone Celular" corretamente!'#13'Formato: (00)0000-0000.'#13'Digite somente números.','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
         dbeditTelCel.Clear;
         dbeditTelCel.SetFocus;
       end
     else
      if Length (dbEditTelCom.Text) < 14 then
       begin //se digito contiver - de 14 digitos
         messagebeep(16);
         messagebox(FormCadastro.Handle,'Preencha o campo "Telefone Comercial" corretamente!'#13'Formato: (00)0000-0000.'#13'Digite somente números.','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
         abort;
         dbeditTelCom.Clear;
         dbeditTelCom.SetFocus;
       end
     else
      if messagebox(FormCadastro.Handle,'Deseja Salvar'#13'o registro?','AgenTel - Salvar',mb_yesno+MB_ICONQUESTION)= idno then
       begin
         try
          DTM.IBTABcadastro.Cancel;
          messagebeep(16);
          messagebox(FormCadastro.Handle,'O registro foi'#13'cancelado com sucesso!!','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
          Abort;
         except //acrescentar clausula Ib no uses
          on E: EIbInterbaseError do
           begin
             messagebeep(16);
             messagebox(FormCadastro.Handle,'O registro que esta sendo inserido ja esta cadastrado no Banco de Dados!'#13'Altere o conteudo do campo "NomeCompleto" ou Cancele esta insercao.','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
             Abort;
           end;
         end;
       end
      else
       begin
         messagebeep(16);
         messagebox(FormCadastro.Handle,'O registro foi'#13'salvo com sucesso!!','AgenTel - Salvar',mb_Ok+MB_ICONQUESTION);
       end;
   end

else
...
...

 

 

 

Aguardo ajuda, muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vamos enumerar as soluções:

 

1º você esqueceu de colcoar um DTM.IBTABcadastro.post no else do messagebox escrito deseja salvar e as 3 1ºs mensagens de erro estão iguais sendo que as 2 ultimas não é o campo cep que estaria em branco, não sei se você errou quando copiou mas achei que deveria comentar.

2º não há necessidade dos else quando não houver erros o que você pode fazer é trocar os abort por exit.

3º este erro está acontecendo porque a função não está passando pelo bloco do try do if na mesma message box acima. A mensagem de erro significa que o valor em ID_NOMECOMPLETO já existe e não pode ser gravado um valor igual pelo fato desgte campo na base de dados estar marcado com o atributo unique.

4º na minha opnião não há motivos de você colocar um cancel dentro de um try numa rotina já que cancelar em uma base de dados não geraria erro algum(na minha opinião). O que você poderia fazer é colocar o try na hora de salvar para você ter como tratar o que deu errado quando o usuario tentou salvar este registro, neste caso em especifico colocar uma msg do tipo: "Nome já existente no sistema." ou coisa pareceida.

5º outra coisa que percebi aconselho a você fazer uma unit com as suas funções mais usadas pois isso facilitaria em futuras programações neste caso uma dessas funções poderia ser a messsagem de erro pois fora a string da mensagem o codigo é o mesmo.

sendo assim sua função poderia ser da seguinte maneira:

procedure aviso(m:string);
begin
  messagebeep(16);
  messagebox(0,m,mb_Ok+MB_ICONQUESTION);
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.