Como implementar multi-level Muenchian grouping nos mapas de BizTalk
Inspirado por uma pergunta nos fóruns de BizTalk Server: XSLT Mapping Question (Summing Values)… como é que nós podemos efectuar multi- level Muenchian grouping (agrupar com base em múltiplos elementos) nos mapas de BizTalk e realizar operações matemáticas sobre este grupo?
Você poderá ler mais informações sobre o problema na thread do fórum mas basicamente o problema é: Somar todos os registos para cada grupo como mesmo tipo de conta e da mesma cidade e criar um único registo!
Solução
Adicione duas scripting functoids ao mapa:
- Configurar a primeira functoid como "Inline XSLT Call Template" e colocar o seguinte script:
<xsl:key name="groups" match="Record" use="concat(City, '|', AccountType)"/>
- Configurar a segunda functoid também como "Inline XSLT Call Template" e colocar o seguinte script:
<xsl:for-each select="Record[generate-id(.)=generate-id(key('groups',concat(City, '|', AccountType)))]">
<Record>
<xsl:variable name="city" select="City/text()" />
<xsl:variable name="type" select="AccountType/text()" />
<AccountType>
<xsl:value-of select="$type" />
</AccountType>
<City>
<xsl:value-of select="$city" />
</City>
<xsl:variable name="negativeTotal" select="sum(//Record[(City = $city) and (AccountType = $type) and (Sign = '-')]/Price)" />
<xsl:variable name="positiveTotal" select="sum(//Record[(City = $city) and (AccountType = $type) and (Sign = '+')]/Price)" />
<xsl:choose>
<xsl:when test="$positiveTotal > $negativeTotal">
<Sign>+</Sign>
<Price>
<xsl:value-of select="$positiveTotal - $negativeTotal" />
</Price>
</xsl:when>
<xsl:otherwise>
<Sign>-</Sign>
<Price>
<xsl:value-of select="$negativeTotal - $positiveTotal" />
</Price>
</xsl:otherwise>
</xsl:choose>
</Record>
</xsl:for-each>
- Arraste um link a partir da segunda scripting functoid para o registo "Record" no esquema de destino;
Poderá efetuar download do código fonte aqui:
How to implement multi-level Muenchian grouping in BizTalk Maps (34.9 KB)
Microsoft | MSDN Code Gallery
Seja o primeiro a comentar ;)
Postar um comentário