Open IT Experts for Enterprise

Zylk empresa de desarrollo de ecommerce

CDF. Extendiendo el componente tabla en los dashboards de pentaho.

Gustavo Fernández
Gustavo Fernández

Durante el desarrollo de un proyecto de BI con pentaho, similar al
proyecto que describimos el año pasado que hicimos con las empresa cianoplan,
nos ha surgido la necesidad de ampliar la funcionalidad del componente
tabla del CDF.

La idea es que queríamos calcular algunos totales en la tabla.
Buscando por internet en los foros he llegado al siguiente
post en el que se explica
como ampliar el componente

para hacer, precisamente esto. Así que lo he puesto en el CDE y ha funcionando
correctamente pero con un pequeño problema, el código
del foro sirve para calcular los totales de todos los elementos y
resulta que la tabla realiza, o puede realizar, algunos filtros en
cliente que son de utilidad (ordenaciones, paginado y filtrado).

Llegados a este punto he modificado el código del ejemplo para que
interactue con estas acciones de la tabla y así nos
permite calcular los totale correctos cuando se aplican los filtros y
la paginación.

El código fuente de las funciones javascritp es el siguiente

function TableTotal(tblObj,totalStr,calcSumFlags, rows) {
    //si existe lo elimino
    if($(‘#’+tblObj.htmlObject+’
tfoot’).length > 0){
        $(‘#’+tblObj.htmlObject+’
tfoot’).remove();
    }
    
   
if($(‘#’+tblObj.htmlObject+’ tfoot’).length===0){
        var
grandTotalRow = "<tfoot><tr><td
class="column0 string">" + totalStr + "</td>";

        for ( var c=1; c <= calcSumFlags.length; c++
){
            grandTotalRow += "<td
class="column" + c + " numeric">";
            sumVal = 0;
            if(calcSumFlags[c-1] ==
1)
            {
                for(var i = 0; i <
rows.nTBody.children.length; i++){
                    //var
value = tblObj.rawData.resultset[i][c];
                    var
value = rows.nTBody.children[i].childNodes[c].innerText;
                    value = parsetofloat(value);
                    
                    if
(isNumber(value)){
                        sumVal +=
parseFloat(value);
                    }
               
}
                grandTotalRow +=
addCommas(sumVal.toFixed(2));
            }
           
grandTotalRow += "</td>";
        }
      
 
        grandTotalRow +=
"</tr></tfoot>";
       
$(‘#’+tblObj.htmlObject).find(‘table’).append(grandTotalRow);
    }
}

function parsetofloat(aaa)
{
    return
aaa.replace(/,/,"");
}

function isNumber(n) {
    return !isNaN(parseFloat(n))
&& isFinite(n);
}

function addCommas(nStr)
{
   nStr += »;
  
x = nStr.split(‘.’);
   x1 = x[0];
   x2 = x.length > 1
? ‘.’ + x[1] : »;
   var rgx = /(d+)(d{3})/;
   while
(rgx.test(x1)) {
      x1 = x1.replace(rgx, ‘$1’ + ‘,’ +
‘$2’);
   }
   return x1 + x2;
}

Y la función que va en el evento draw del componente en el CDF

function redraw(aaa) {
  // 1 – calculate sum, 0 – empty
footer
  var calcSumFlag=[0,1];
  // Write footer, first
column value will be "Total"
 
TableTotal(this,"Total",calcSumFlag,aaa);
}

En esencia solo se ha cambiado un poco lo explicado en
el foro
pero creo que puede resultar de interés ya que me
imagino que más gente tendrá esta necesidad.

Por otro lado comentar también que no se si esta es la mejor
forma de hacer esto
…ya que creo que igual sería más
interesante ampliar el componente para que disponga de esta
funcionalidad, pero eso requiere algo más de conocimiento de los
componentes y del CDF

Unas caputras del componente para ilustrar su funcionamiento

En la primera vemos que el total es de los motrados en la
primera página

Y en este caso vemos que el total se calcula a partir de los
que cumplen el criterio de filtro indicado en el buscador

 

Si te ha parecido interesante comparte este post en RRS

Facebook
LinkedIn
Telegram
Email

Leer más sobre temas relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *