Expression é um novo tipo de dado presente na GeneXus X que avalia fórmulas e expressões em tempo de execução, e que podem ser construídas pelo próprio usuário ou analista do negócio.
Passos a seguir em nosso código para utilizar este tipo de dado:
• Primeiro, define-se uma variável de tipo Expression (&exp01), indicando a fórmula ou expressão que se deseja avaliar, neste caso a*b+c, atribuindo na variável de tipo caractere &exp01Expression a mencionada atribuição.
Para definir uma Expression é possível utilizar uma combinação de operadores aritméticos, relacionais e operandos, bem como é permitido o uso de procedimentos GeneXus (desde que observem determinadas estruturas de entrada/saída)
1)
&exp01Expression = "a*b+c" &exp01.Expression = &exp01Expression
|
• Como segundo passo, devemos atribuir valores aos operandos da mencionada fórmula, neste caso notar que deverá se atribuir o valor correspondente aos operandos a, b e c . Suponhamos que os valores que se precisam avaliar se encontram nas variáveis &int1, &int2, &int3:
2)
&int1 = 1.11 &int2 = 2.22 &int3 = 3.33 &exp01.Variables.Set( "a", &int1.ToString() ) &exp01.Variables.Set( "b", &int2.ToString() ) &exp01.Variables.Set( "c", &int3.ToString() )
|
• Temos tudo o que precisamos para poder realizar efetivamente a avaliação, para isso utiliza-se o método Evaluate da seguinte forma:
3)
&Result = &exp01.Evaluate() |
O resultado fica na variável &Result.
Dado que a expressão é atribuída e avaliada em tempo de execução, é importante checar possíveis erros utilizando as propriedades ErrCode e ErrDescription. Por exemplo:
4)
If &exp01.ErrCode = 0 // Execution OK! else // an error occured EndIf
|
Seguindo com o exemplo a partir dos operandos a,b,c carregados à variável Expression seria possível atribuir qualquer tipo de expressão e avaliá-la de novo dinamicamente, sem tocar sequer uma linha de código da aplicação! Eis alguns exemplos que seria possível avaliar:
5)
&exp01Expression = "-a*(-b+c)" &exp01Expression = "a*(b+c)/100" &exp01Expression = "1+2*3+a*(b+c)/4" &exp01Expression = "log( a * b + c)" &exp01Expression = "abs( a * b + c)" &exp01Expression = "iif( a < b , a , c)"
|
Também poderá definir expressões que utilizem diferentes operandos, leve em conta que deverá carregar os valores associados antes de utilizar o método Evaluate como foi detalhado no passo 2.
Em termos gerais, caso precise avaliar uma expressão em tempo de execução, leve em conta a existência do tipo de dado Expression; só precisa definir a expressão que deseja avaliar, carregar seus respectivos operandos e avaliá-la.