jqGrid - 分组+自定义summarytype函数

时间:2011-11-11 18:43:39

标签: jqgrid jqgrid-formatter

我的页面上有一个jqGrid,它有分组并包含多个列(A,B,C,D)。如何使每组中D列的摘要(即总行)如下:sum(D)/ Sum(A)* 100?

我知道我可以为summaryType定义一个自定义函数,例如:summaryType:mysum但是我不太确定,我怎么能用它来做上面的公式?注意,列A,B和C都具有summaryType设置如下:summaryType:'sum',因此它们使用内置求和功能进行计算。我也想知道我是否可以在jqGrid的loadComplete事件上以某种方式解决这个问题?

我设法通过以下方式实现了这一目标:

我为列A和列C的当前值定义全局变量,并按

定义当前组
var tColA = 0.0;

var tColD = 0.0;

var tCurrentGroupBy;

然后在我的函数中,我执行以下操作:

function mysum(a, b, c) {
    if (tCurrentGroupBy!= c.GroupByCol) {
        tColA= 0.0;
        tColD = 0.0;
        tCurrentGroupBy= c.GroupByCol;
        tColA= tColA + parseFloat(c.ColA);
        tColD = tColD + parseFloat(c.ColD);
    }
    else {
         tColA= tColA + parseFloat(c.ColA);
        tColD = tColD + parseFloat(c.ColD);
    }

    return ((tColD / tColA) * 100);
 }

不确定是否有更好的方法来做到这一点,但这似乎有效。还有其他建议吗?感谢。

3 个答案:

答案 0 :(得分:2)

有点晚了,但是......

我有一个D列,它显示了C列相对于B列的个别百分比。所以我实现了一个格式化程序,它将'%'符号添加到D列。 A列是标识符。

但格式化程序功能也应用于摘要行。因此格式化程序检测它是否是摘要行,如果是,则执行计算并返回值。

function percentage_format(cellValue, options, rowObject) {
  var a=$(rowObject).attr('A');

  if(!a || a='')
    cellValue=Math.round($(rowObject).attr('C')*10000/$(rowObject).attr('B'))/100;

  return "<span originalValue='"+cellValue+"'>"+cellValue+" %"+"</span>";
}
function unformatCampo(cellValue, options, cellObject) {
return $(cellObject.html()).attr("originalValue");
}

我希望这仍有帮助。

答案 1 :(得分:1)

将此格式化程序功能放在百分比计算中涉及的每个单元格上。 在此示例中,单元格a,单元格b和单元格c需要格式化程序功能。 该函数在a和b中绘制值,在c上使用保存的值来计算百分比。

重要的是要注意格式化程序事件的3件事:

1.单元格值可以修改。即使它是格式化事件,也可能会更改值。 2.事件在订单或列模型中触发 3.虽然rwdat是行数据,但它只是格式化程序的列模型,而不是整行。这就是为什么函数需要在每个单元格上获取所有值。

<script>
var cnt = 0;
var a = 0.0;
var b= 0.0;

function linePercent(cellval, opts, rwdat, act)
{
//   rowed==”” means it’s a summary line(total)
if (opts.rowId =="")
{
//  save the 2 values used in the calculation
  if (rwdat.nm == "a"){totexec=cellval;}
  if (rwdat.nm == "b"){planamt=cellval;}
//  when the calculated cell is formatted, perform the calculation and set cellval
 if (rwdat.nm == "c"){cellval=(a/b)*100;}
}
//  call formatter to format cellval
return $.fn.fmatter('number', cellval,opts, rwdat, act); 
};
</script>

答案 2 :(得分:0)

在服务器上执行此操作。它会更简单,你可以完全控制。