terça-feira, 9 de agosto de 2011

Pise no Break


São Paulo resolveu punir motoristas que não pisam no freio e desrespeitam os pedestres nas faixas, e nesse sentido, Montevidéu é um exemplo, por lá todo mundo respeita os pedestres, chega a ser irritante quando sem querer você pisa na faixa, daí tem que atravessar, até por constrangimento, pois os motoristas param pra valer.

Nesses devaneios me lembrei que de vez em quando devemos pisar no Break do Genexus também, mas não no sentido de reduzir a velocidade, ao contrário, devemos remover os breaks de nossos for eachs para acelerar a velocidade de nossos programas.

A regra é simples, se você programou o Break pra valer, então com certeza é um programador hábil e seu código reflete um belo agrupamento de registros, agora se o break apareceu meio sem querer, e insiste em permanecer, até tem que criar aquela estúpida subrotina para enganar o Genexus, então meu amigo, você precisa sentar-se novamente no banquinho porque fez uma bela ‘kakinha’, com o perdão da palavra.

O que é o Break

No mapa de navegação o Genexus indica quais tabelas são recorridas (tabelas bases) e quando se programamfor eachs aninhados, as relações entre as tabelas dos for eachs são apresentadas. No exemplo abaixo, temos um break aparecendo no segundo for each.

Figura 1. Mapa de Navegação

O break é um indicativo de que está ocorrendo recursão, ou seja, o segundo for each está apontando para a mesma tabela que o primeiro for each no aninhamento, observe que é a NotaFiscal, no exemplo. E por que isso ocorre se estou tentando pegar registros de outra tabela? A resposta é simples: tabela estendida.

Tabela Estendida

Com certeza esse é um dos mecanismos mais interessantes do Genexus, e significa que ocorre Join automático a todas as tabelas que se encontram em uma relação N-1 com a tabela base apontada pelo for each.  O que isso significa? Que você não precisa fazer nenhum esforço para obter os dados complementares que se encontram na relação N-1.

Figura 2. Diagrama

Desta forma para obter o nome de um cliente ou da cidade desse cliente, por exemplo, estando na tabela de notas fiscais não é necessário recorrer a um for each adicional. Eu diria até que seria um crime caso você faça isso, ou melhor, que está perdendo seu tempo programando uma recursão para uma tabela que já está na sua mão, e nesses casos é que surgem os breaks indesejados.

Por essa razão é que o Break surgiu na nossa figura 1, que foi produzida a partir do seguinte código.

for each
      &NotaFiscalData = NotaFiscalData
      for each
            &ClienteNome = ClienteNome
      endfor
endfor
  
Veja que eu nem coloquei no for each a cláusula where para ligar o primeiro ao segundo for each, que alias muitos insistem em fazer de forma totalmente desnecessária.

Qual é a Solução?

Para os Breaks indesejados a solução é mais simples do que parece, apenas remova os for eachs que foram programados a mais, e o break some milagrosamente.
 


Para os desenvolvedores mais experientes, mil desculpas, mas apesar da simplicidade do tema, tinha que registrar esse importante avanço no transito brasileiro, enfim uma multa que vale a pena ser aplicada.