segunda-feira, 19 de julho de 2010

Rompendo relações implícitas!

Genexus é uma ferramenta tão poderosa que as vezes precisamos desligá-la, isso pra fazer algo de forma mais 'estúpida'. Estou falando a respeito da capacidade da ferramenta em encontrar relações entre tabelas dentro do modelo da base de dados.

A regra é que quando programamos for...eachs aninhados (um dentro do outro) a ferramenta sempre tentará encontrar a relação entre duas tabelas, e para isso buscará encontrar a relação no conjunto de tabelas estendidas. Isso é o que se chama relação implícita, e se o Genexus encontrar a tal relação, o programador não precisa programar cláusulas where para conectar as duas tabelas.

Vamos estudar um modelinho.



Por exemplo, se queremos relacionar a tabela B com a tabela D, o que existe em comum entre as duas é a tabela C, e o atributo c*, desta forma se programarmos dois for...eachs aninhados, conforme abaixo, teríamos:

A relação implícita existente entre os dois for...eachs será o que existe em comum entre as duas tabelas, que corresponde ao atributo (c*).

A questão que colocamos é como desligar essa maquininha de relações implícitas do Genexus, digamos para fazer algo como relacionar manualmente B com C, B com E, ou mesmo F com A, isto em situações diferentes de c=@c.?

Existem várias práticas que poderiam ser aplicadas, e como queremos fazer algo 'estúpido', podemos substituir os for...eachs aninhados por for..eachs paralelos. Claro que ao fazer isso estamos quebrando todas as relações existentes.  E não me pergunte a respeito de desempenho, por favor.

Tente uma subrotina.



Fazer algo assim tão anti-natural em Genexus pode auxiliar em algum problema mais prático, principalmente causado por projetos complexos de projeto de bases de dados, e relações não tão implícitas assim.  Mas não se esqueça que Genexus quase sempre tem sempre razão no quesito database, e a solução dele sempre será a mais eficiente.