martes, 14 de abril de 2009

Calculo de Totales sin usar la función SUM usando XSLT en Sharepoint

Objetivo:
Calcular una columna de totales, con su formateo.


Ingredientes:
Una función XSLT
La llamada a la función call-template
Un DataSet cargado y la selección correcta del conjunto por XPATH

Receta:
Hay que poner la función fuera de los tags xsl-template y así la podemos usar en el webpart
Calculo de totales en sharepoint con una función XLST

LA FUNCIÓN DE TOTALIZACIÓN
<xsl:template name="total">
<xsl:param name="seq"/>
<xsl:param name="total-so-far" select="0"/>
<xsl:choose>
<xsl:when test="$seq">
<xsl:call-template name="total">
<xsl:with-param name="seq"
select="$seq[position()!=1]"/>
<xsl:with-param name="total-so-far"
select="$total-so-far + translate($seq[1],',','.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($total-so-far, '#.##0;-#.##0')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>


LA LLAMADA A LA FUNCIÓN
<xsl:call-template name="total">
<xsl:with-param name="seq" select="
dsQueryResponse/Rows/Row/@Total_x0020__x0028_con_x0020_IVA" />
</xsl:call-template>




FUNCIÓN DE TOTALIZACIÓN CON FORMATEO EUROPEO (ver post de formateo numérico)
<xsl:template name="total">
<xsl:param name="seq"/>
<xsl:param name="total-so-far" select="0"/>
<xsl:choose><xsl:when test="$seq">
<xsl:call-template name="total">
<xsl:with-param name="seq"select="$seq[position()!=1]"/>
<xsl:with-param name="total-so-far"select="$total-so-far + translate($seq[1],',','.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($total-so-far, '##0,##;-##0,##','european')"/>
</xsl:otherwise></xsl:choose>
</xsl:template>

FUNCIÓN DE TOTALIZACIÓN DE PORCENTAJES
<xsl:template name="totalPercent">
<xsl:param name="seq"/>
<xsl:param name="total-so-far" select="0"/>
<xsl:choose>
<xsl:when test="$seq">
<xsl:call-template name="totalPercent">
<xsl:with-param name="seq" select="$seq[position()!=1]"/>
<xsl:with-param name="total-so-far" select="$total-so-far + translate($seq[1],',','.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($total-so-far div 100, '##0,## %;-##0,## %','european')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

NOTA: 'EUROPEAN' es un formateo numerico que he definido yo mismo en el webpart y hay que declararlo, puedes ver este post anterior http://sharepointworks.blogspot.com/2009/04/formateo-europeo-de-datos-numericos-en.html

Saludos a toda la comunidad de sharepoint
http://www.robertomarcos.com/

8 comentarios:

  1. podrias ayudarem con esto soy nuevo en esto del sharepoint designer y necesito tener la suma de una columna y nose como agregar la funcionq ue tu colocaste a mi diseño,

    ResponderEliminar
  2. La función de totalización hay que colocarla dentro del código del data View Web Part dentro de la sección xsl:stylesheet justo en el espacio en blanco entre cualquier etiqueta xsl:template, recuerda que esto es un XSL solo estará disponible dentro de ese webpart.
    Luego la puedes usar de la forma que explico en el apartado de llamada a función en vez de xsl:value-of por ejemplo dentro del TD que quieras que salgan las totalizaciones.

    ResponderEliminar
  3. Hola!
    Pude utilizar el metodo para agregar totales.
    Muchas gracias por el aporte.

    Saludos!

    ResponderEliminar
  4. Robertos me podria pasar tu e-mail para contactarte neecsito que me ayudes con el las sumatorias que no logro hacerlo

    ResponderEliminar
  5. te paso mi correo contactame fernando_lopez@cargill.com

    ResponderEliminar
  6. hola kisiera saber si la formula funciona igualmente para sharepoint 2010 y si me explicacias como sumar agrupado por titulo.

    gracias

    ResponderEliminar
  7. Roberto, aun no logro colocar la función. SharepoinT Designer me marca un error que dice "Falta un espacio en blanco necesario" si lo coloco entre cualquier espacio en blanco entre las etiquetas xsl:template. Te agradecere mucho tu ayuda. Saludos hasta españa!!

    ResponderEliminar
  8. Como mostrar solo el año en un campo

    ResponderEliminar