質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • JavaScript

    19872questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jqGrid

    11questions

    jqGridとは、jQqueryのプラグインであり、web上に表データの表示・操作を行う事が可能になります

jqGridのGroupingの値算出時に、他の列の合計数値を利用して算出したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,320

kzmu

score 9

前提・実現したいこと

jqGridを使用しております。やりたいことは、オプションによりgroupingを行った行の特定列で他の列の合計値を参照して計算結果を出したいのですが、そのやり方がわかりません。

イメージ)

aカテゴリ b商品名 c売上 d販売数 e商品単価(←計算 c÷d) f客数 g顧客単価(←計算 c÷f)
Xgroup A 10000 100 100 10 1000
Xgroup B 3000 10 300 5 600
=>grouping 13000 110 90.9←算出したい 15 866.7←算出したい
Ygroup C 10000 100 100 10 1000
Ygroup D 3000 10 300 5 600
=>grouping 13000 110 90.9←算出したい 15 866.7←算出したい

該当のソースコード

以下が該当のソースコードです。
こちらの計算をすると、各行の計算結果の最終行(Xgroupでは商品名Bの算出結果:300)が表示されてしまいます。)

//=>jqGridのオプションでmyColModelをcolModelにセット
//colModel: myColModel
var myColModel = [
  {name : 'カテゴリ'},
  {name : '商品名'},
  {name : '売上'},
  {name : '販売数'},
  {name : '商品単価'},
  {name : '客数'},
  {name : '顧客単価'},
]
var myData={
 [カテゴリ: Xgroup, 商品名: A, 売上: 10000,販売数:100,商品単価:100,客数:10,顧客単価:1000],
///省略
}

var calc_cals = ['商品単価','客単価'];
var child_parent = {'商品単価':{parent:'販売数',child:'売上'},'顧客単価':{parent:'客数',child:'売上'}};

for (var i in myColModel){
  if (myColModel[i][name] == '商品単価' || myColModel[i][name] == '客単価'){
    var get_name=myColModel[i][name];

    child[get_name] = child_parent[get_name]['child'];
    parent[get_name] = child_parent[get_name]['parent'];

    myColModel['summaryType']
      = function(cellvalue , name, rowobject){
        var rslt = parseFloat(rowobject[child[name]]) / parseFloat(rowobject[parent[name]]);

        return rslt;}
  }
}

こちら、どのようにしたら、合計数値を使って計算ができるかご教示いただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

+1

解決しました。
方法としては、rowobjectのデータを常に計算し、display:noneで分子と分母の合算データを加算し続け、表示された場合には、見えないようにする方法で解決しました。

イメージ)
SummaryTypeに、[算出結果=分子/分母]<span style="display:none;">分子の値|分母の値</span>

ソースも記載しておきます。(実際のものとは少し違いますので動作確認していませんが)

for (var i in myColModel){
  if (myColModel[i][name] == '商品単価' || myColModel[i][name] == '客単価'){
    var get_name=myColModel[i][name];

    child[get_name] = child_parent[get_name]['child'];
    parent[get_name] = child_parent[get_name]['parent'];

    myColModel['summaryType']
      = function(cellvalue , name, rowobject){
        var childsData = parseFloat(rowobject[child[name]]);
        var parentsData = parseFloat(rowobject[parent[name]]);
        var rtn_val = calc_group_val(cellvalue,childsData,parentsData);
        return rtn_val;
        }
  }
}

function calc_group_val(cellvalue,childsData,parentsData){    
    if (cellvalue.indexOf('|') === -1){
        var wk = [0,0];
    }else{
        var reg = />(.*?)<\//gi;
        var val = cellvalue.match(reg);
        var strVal = (""+val[0]).replace('>','').replace('</','');
        var wk = strVal.split('|');
    }

    var wk_child = parseInt(wk[0]) + parseInt(childsData);
    var wk_parent = parseInt(wk[1]) + parseInt(parentsData);
    if (wk_parent>0){
        var wk_div = floatFormat(wk_child/wk_parent *100,2)+'%' ;
    }else{
        var wk_div = 0;
    }

    return wk_div+'<span style="display:none">'+wk_child + '|' + wk_parent+'</span>';
}

function floatFormat( number, n ) {
  var _pow = Math.pow( 10 , n ) ;
  return Math.round( number * _pow ) / _pow ;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • JavaScript

    19872questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jqGrid

    11questions

    jqGridとは、jQqueryのプラグインであり、web上に表データの表示・操作を行う事が可能になります