1

グループ化され、複数の列 (A、B、C、D) を含むページに jqGrid があります。各グループ内の列 D の集計 (合計行) を次のようにするにはどうすればよいですか? sum(D)/Sum(A) * 100?

summaryType のカスタム関数を定義できることはわかっています。列 A、B、および C はすべて、summaryType: 'sum' のように summaryType が設定されているため、組み込みの合計機能を使用して計算されることに注意してください。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);
 }

これを行うためのより良い方法があるかどうかはわかりませんが、これはうまくいくようです。他の提案はありますか?ありがとう。

4

3 に答える 3

2

少し遅いですが...

列 B に対する列 C の個々の割合を示す列 D があります。そのため、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");
}

これがまだ役立つことを願っています。

于 2012-09-03T19:24:56.240 に答える
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>
于 2013-11-14T16:58:54.107 に答える
0

サーバー上で行います。はるかに簡単になり、完全に制御できます。

于 2015-07-22T19:01:40.700 に答える