quinta-feira, 1 de novembro de 2012

Ordem de Execução das Regras - Parte I

Bom dia pessoal que tanto gosta de "fuçar" nesse tal de Genexus... Hoje vamos entender um pouco sobre como ou de qual maneira o Genexus realiza a execução de nossas regras, fórmulas e eventos programados, principalmente em nossas transações.

Esse papo é um pouco chato, mas se faz necessário entendermos de vez. Muitas vezes, quando possuímos aquela transação gigantesca, com diversas e diversas regras de controle, nós conseguimos a execução desejada dessas regras, com base na "sorte" ou na própria força de vontade. Mas por traz disso tudo existe aquela "mágica" da Artech.. bom vamos lá!!

Irei dividir este assunto em 2 partes, para não ficar tão corrido e confuso. Na figura abaixo podemos visualizar o momento de execução de cada regra e fórmula definida em uma transação. No post de hoje, irei exemplificar as duas primeiras: Regras Stand-Alone e a Execução de Regras e Fórmulas que NÃO possuem evento de disparo definido.

Genexus Regras


1º Regras Stand-Alone

As regras stand-alone são aquelas que podem se executar sem depender dos dados contidos na transação. Elas também podem se executar através dos parâmetros recebidos. Veja abaixo alguns exemplos:

Executadas a partir de parâmetros:
&Variavel = Parametro;
Msg("........") if Parametro = 2;
Execução de regras independentes:
msg("Bem vindo a transação X!");
&VariavelA = true;
2º Execução de Regras e Fórmulas sem evento de disparo definido

Os eventos de disparo são controles de execução de regras inseridas, tais como: AfterValidate, AfterInsert e AfterComplete.

Vamos considerar que geramos uma transação de Fatura, a esta transação incluímos 7 fórmulas, 3 horizontais (simples operações aritméticas), 4 aggregate (SUM, MAX, COUNT, etc..) e um controle de Erro:

1. Add(FaturaTotal, ConsumidorComprasTotais);
2. FaturaTotal = FaturaSubTotal - FaturaDesconto + FaturaEnvioValor;
3. FaturaDesconto = FaturaSubTotal * CategoriaDesconto;
4. FaturaEnvioValor = MAX(EnvioData,EnvioData<=FaturaData,,EnvioValor);
5. FaturaSubTotal = SUM(FaturaProdutoValor);
6. FaturaProdutoValor = ProdutoQuantidade*ProdutoPreco;
7. Subtract(ProdutoQuantidade, ProdutoEstoque)
8. Error("Estoque insuficiente") if ProdutoEstoque < 0;

Importante: a ordem de programação de fórmulas e regras não define a ordem de execução destas, quando não estão condicionadas a algum evento, por exemplo AfterValidate. Caso duas regras estejam condicionados ao mesmo evento a ordem de programação irá definir a sua execução.

No momento de gerar o programa, o Genexus irá verificar as dependências de cada uma destas fórmulas e atributos, e assim, definir a ordem correta de execução. Caso o valor de um atributo seja alterado, todas as regras que dependam deste atributo (assim como regras dependentes de regras de dependam deste atributo...) irão ser executadas.

Dessa forma, a primeira regra adiciona o valor total da fatura (FaturaTotal) ao histórico de compras do cliente (ConsumidorComprasTotais). Logo esta regra é dependente do valor contido em FaturaTotal. Já o valor de FaturaTotal é dependente de 3 outros valores, e assim em diante. Uma forma bem fácil de visualizarmos isso, é escrever um atributo destes em uma folha e, abaixo deste, escrever os atributos dependentes, e acima, os valores que dependam deste atributo.

O nosso exemplo ficaria da seguinte maneira:

Genexus Rule




Nenhum comentário:

Postar um comentário