Melhorando código

<< Click to Display Table of Contents >>

Navigation:  Novatos > Mais Dicas Programação Delphi >

Melhorando código

Previous pageReturn to chapter overviewNext page

Imagine que um programador tirou férias, e você ficou responsável por um módulo dele.

Daí o cliente liga dizendo que está dando esse erro:

 

 

Você olha o fonte, tem 500 selects no clique do botão, sua reação:

 

Um dos motivos do desespero é que o erro não identifica nem a tabela e nem o campo que estourou.

Isto acontece, porque geralmente nossos tratamentos de erros de SQL são mais ou menos assim:

 

Usando insert via conexão direto:

 

  try

    AguardeShow;

    StartTransaction;

 

    DM.Conexao.ExecuteDirect('update schema.tabela set campo = xxxxxxxxx where campo = y');

 

    Commit;

 

    mDlg.Informa('Atualização OK');

  except

    on e:exception do

    begin

      AguardeHide;

      Rollback;

      mDlg.Erro('Não foi possivel atualizar a base de dados motivo: ' + #13 + e.Message);

    end;

  end;

 

Ou, usando Query normal:

 

    AguardeShow;

 

    if not Dm.QyGeral.ExecuteSQL('update tabela set campo = x where campo = y', true) then

    begin

      AguardeHide;

      mDlg.Erro('Ocorreu um erro ao atualizar os dados' + Dm.QyGeral.MensagemErro);

      Exit;

    end;

 

   AguardeHide;

 

Solução mega-power-medieval:

 

Porém, a fim de facilitar futuras manutenções quando ocorre erros deste tipo no cliente, a sugestão é começar a exibir o código SQL nas mensagens de erro, visto que nossas mDlg agora aceitam o botão "detalhes":

 

 

Para o usuário a mensagem continua praticamente a mesma. Porém para nós programadores, vai facilitar muito a vida, pois ao clicar no botão detalhes:

 

 

Agora ficou BEM mais fácil descobrir onde está o erro!

É só observar o SQL e ver que tentaram incluir um bairro com nome maior de 50 caracteres na tb_bairro.

 

Para fazer isso na prática, basta uma pequena alteração no código:

 

Usando insert via conexão direto:

 

var

  SQL: string;

...

  try

    AguardeShow;

    StartTransaction;

 

    SQL := 'update schema.tabela set campo = xxxxxxxxx where campo = y';

    DM.Conexao.ExecuteDirect(SQL);

 

    Commit;

 

    mDlg.Informa('Atualização OK');

  except

    on e:exception do

    begin

      AguardeHide;

      Rollback;

      // note que a mensagem tem 3 parâmetros, o SQL você coloca como TERCEIRO = detalhes

      mDlg.Erro('Erro ao atualizar tabela', 'Não foi possivel atualizar a base de dados motivo: ' + #13 + e.Message, SQL);

    end;

  end;

 

Ou, usando Query normal:

 

var

  SQL: string;

 

    AguardeShow;

 

    SQL := 'update tabela set campo = x where campo = y';

 

    if not Dm.QyGeral.ExecuteSQL(SQL, true) then

    begin

      AguardeHide;

      // note que a mensagem tem 3 parâmetros, o SQL você coloca como TERCEIRO = detalhes

      mDlg.Erro('Erro ao atualizar tabela', 'Não foi possivel atualizar a base de dados motivo: ' + #13 + Dm.QyGeral.MensagemErro, SQL);

      Exit;

    end;

 

   AguardeHide;

 

Use a variável "SQL" para cada insert / update dentro de um bloco.

 

Se todos nós fizermos isso nos novos códigos e sempre que possível modificar os códigos já existentes, nossa vida vai ser melhor e mais feliz, principalmente se tivermos que mexer no fonte de outro marketeiro.

 

Resultado: