Criando uma nova condição XML avançada

Depois de criar o arquivo *.greex, é possível definir uma condição XML avançada ou regra Greex.

É possível criar dois tipos de condições XML avançadas:
  • Condição XML avançada normal
  • Tabela de Decisão baseada na condição XML avançada.

Condição XML avançada normal

Depois de criar o arquivo *.greex, é possível definir uma condição XML avançada normal ou regra Greex.

Nota: certifique-se de não incluir comentários na condição XML avançada ou regra Greex de qualquer tipo.

A condição XML avançada normal é útil em cenários onde é necessário definir diversos critérios de condição para uma condição XML avançada, necessária para definir diversos critérios de condição, e cada critério de condição é associado a diferentes atributos. Esses diversos critérios de condição são definidos usando construções IF e ELSE aninhadas. Por exemplo, pode ser que você deseje criar uma condição XML avançada normal para os critérios de condição, como:

If Ordertype="WEB" and OrderQty="100", then TaxExemptFlag="N". 
Else
   If OriginalTotalAmount="1000" and OrderLine>"5", then
      discount="10" TaxExemptFlag="Y".
   Else TaxExemptFlag="N".

Neste caso, temos diversos critérios de condição e cada critério de condição possui diferentes atributos associados a ele. O primeiro critério de condição possui Ordertype, OrderQty e Discount associados a ele. Enquanto que o segundo critério de condição possui OriginalTotalAmount, OrderLine e TaxExemptFlag associados a ele.

Esses critérios de condição são definidos no arquivo *.greex usando construções IF E ELSE aninhadas. A seguir um arquivo *.greex de amostra para a condição XML avançada:

<GreexRule desc="Determine Discount and Tax Exemption based on 
                 various attributes" 
         id="getDiscountTaxExempt" 
         name="Get Discount and Tax Exempt" 
         returnType="Xml" 
         type=""> 
<If> 
   <Condition name="isDiscount20?"> 
     <Group op="and"> 
       <Expression>fn:equals(@orderType, &quot;WEB&quot;)</Expression>       
       <Expression>fn:equals(@orderQty, &quot;100&quot;)</Expression> 
     </Group> 
   </Condition> 
   <Return> 
     <Value output="&lt;Order TaxExemptFlag=&quot;N&quot;/>"/> 
   </Return> 
</If> 
<Else> 
  <If> 
    <Condition name="TaxExempted?"> 
     <Group op="and"> 
       <Expression>fn:equals(@OriginalTotalAmount, &quot;1000&quot;)</Expression> 
       <Expression>fn:intGreater(@orderLine,&quot;5&quot;)</Expression> 
     </Group> 
    </Condition> 
    <Return> 
       <Value output="&lt;Order discount=&quot;10&quot;            
                      TaxExemptFlag=&quot;Y&quot;/>"/> 
    </Return> 
   </If> 
<Else> 
   <Return> 
     <Value output="&lt;Order discount=&quot;20&quot;  
                    TaxExemptFlag=&quot;N&quot;/>"/> 
   </Return> 
</Else> 
</Else> 
</GreexRule>

Tabela de decisão baseada na condição XML avançada

Depois de criar o arquivo *.greex, é possível definir uma condição XML avançada normal ou regra Greex.

Nota: certifique-se de não incluir comentários na condição XML avançada ou regra Greex de qualquer tipo.

A tabela de Decisão baseada em condições XML avançadas são úteis em cenários onde existem diversos critérios de condição aninhados a serem definidos para uma condição XML avançada, mas cada critério de condição possui os mesmos atributos associados a ele. Nesses casos, é possível gravar apenas uma condição e ter uma tabela de parâmetros que funciona como uma instrução de comutação. Na tabela de decisão baseada em condição XML avançada é possível definir diversos critérios de condição aninhados em uma construção IF. Assim, não há construção ELSE no caso da tabela de decisão baseado em condições XML avançadas. A construção IF contém uma matriz de valores constantes, ao invés de um valor constante como costumava ser em caso de condições XML avançadas normais. A construção IF possui uma tabela de parâmetros que funciona como uma instrução de comutação.

Por exemplo, pode ser que você deseje criar uma tabela de decisão baseada em condição XML avançada para critérios de condição como:
If Ordertype="WEB" and OrderLineQty="200", then Discount="5". 
Else 
   If Ordertype="STORE" and OrderLineQty="500", then  Discount="7" 
Else  
  If Ordertype="CALL" and OrderLineQty="250", then Discount="3". 
  Else 
   default="0"

A seguinte tabela de decisão descreve o cenário anterior:

Tipo de Ordem

Quantidade de Linha de Pedido

Desconto

WEB

200

5

Loja

500

7

CALLCENTER

250

3

padrão 0

Neste caso, temos diversos critérios de condição, mas cada critério de condição possui os mesmos atributos associados a ele. Todos os casos de condição possuem os atributos Ordertype, OrderLineQty e Discount associados a ele. Portanto, esta condição XML avançada possui somente uma construção IF e ela contém uma matriz de valores constantes.

Nota: para uma regra Greex baseada na tabela de decisão, é obrigatório fornecer um valor de retorno padrão. Este valor será retornado se nenhuma condição IF for atendida.

Esses critérios de condição são definidos no arquivo *.greex usando construções IF. A seguir um arquivo *.greex de amostra para a condição XML avançada baseada na tabela de decisão:

<GreexRule desc="Determine Discount based on some attributes"
           id="getDiscount"
           name="Get Discount"
           returnType="String"
           type="DecisionTable">>
 <If>
   <Condition name="isDiscount5?">
     <Group op="and">
       <Expression>fn:equals(@orderType, 
                  &quot;WEB|STORE|CALLCENTER&quot;)</Expression>
       <Expression>fn:equals(@orderLineQty, &quot;200|500|250&quot;)</Expression>
     </Group>
   </Condition>
   <Return>
      <Value default="0" output="5|7|3"/>
    </Return>
 </If> 
</GreexRule>