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

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



 

00

More Blog Entries

0 Comments