2つのテーブルから集計して、別テーブルに

背景・実現したいこと

はじめまして。キントーン初学者です。

注文内容、出荷内容をそれぞれ打ち込むと、その差異(未出荷分)が別テーブルに集計されるというコードを書いています。(下図参照)

↑この時、商品(型番)はルックアップで取っています。

https://developer.cybozu.io/hc/ja/articles/202422244-%E7%AC%AC6%E5%9B%9E-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%80%A4%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B-%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%9B%86%E8%A8%88-

上記参考に、注文内容・出荷内容それぞれのテーブルで商品ごとの集計は出来た様なのですが、その先の差異の出し方、テーブルに入力していくやり方が分かりません。

ご教示願います。

 

(function() {
‘use strict’;
kintone.events.on([
‘app.record.create.show’,
‘app.record.create.change.注文内容’,
‘app.record.create.change.出荷内容’,
‘app.record.detail.show’,
‘app.record.edit.show’,
‘app.record.edit.change.注文内容’,
‘app.record.edit.change.出荷内容’
],function(event) {
var subTotals = {};
var subTotals2 = {};
var tableRecords = event.record.注文内容.value;
var tableRecords2 = event.record.出荷内容.value;

// テーブル内の各レコードをカテゴリごとに集計する
for (var i = 0; i < tableRecords.length; i++) {
var category = tableRecords[i].value[‘受注_型番’].value;
if (!subTotals[category]) {
subTotals[category] = 0;
}
var number = tableRecords[i].value[‘受注_台数’].value;
subTotals[category] += number*1;
}

for (var j = 0; j < tableRecords2.length; j++) {
var category2 = tableRecords2[j].value[‘出荷_型番’].value;
if (!subTotals2[category2]) {
subTotals2[category2] = 0;
}
var number2 = tableRecords2[j].value[‘出荷_台数’].value;
subTotals2[category2] += number2*1;
}

//この先が分かりまん。

 

tanakaさん

お世話になっております。

tableRecordsとtableRecords2をもとに新しくテーブル用のデータを作成し、event.record.受注残.valueに代入すればよいかと思います。

テーブル用のデータの構造については下記を参考にすると良いかと思います。
https://developer.cybozu.io/hc/ja/articles/360027244231

数回にわたるチュートリアルになっているので、わからない単語などがある場合は第1回からご覧になることをおすすめします。
https://developer.cybozu.io/hc/ja/articles/115002336526

ご回答ありがとうございます。

色々と調べながらやってみたいと思います。

江田篤史 様

以下の様なコードを書いてみたのですが

Cannot read property ‘value’ of undefined

というエラーが出て思い通りに動作しません。

43行目あたりで何か引っかかっている様なのですが

何が悪いのかが分かりません。

ご教示頂けますと幸いです。

 

(function() {
‘use strict’;
kintone.events.on([
‘app.record.create.show’,
‘app.record.create.change.注文内容’,
‘app.record.create.change.出荷内容’,
‘app.record.detail.show’,
‘app.record.edit.show’,
‘app.record.edit.change.注文内容’,
‘app.record.edit.change.出荷内容’
],function(event) {
var subTotals = {};
var subTotals2 = {};
var tableRecords = event.record.注文内容.value;
var tableRecords2 = event.record.出荷内容.value;
var tableRecords3 = event.record.受注残.value;

// テーブル内の各レコードをカテゴリごとに集計する
for (var i = 0; i < tableRecords.length; i++) {
var category = tableRecords[i].value[‘受注_型番’].value;
if (!subTotals[category]) {
subTotals[category] = 0;
}
var number = tableRecords[i].value[‘受注_台数’].value;
subTotals[category] += number*1;
}

for (var j = 0; j < tableRecords2.length; j++) {
var category2 = tableRecords2[j].value[‘出荷_型番’].value;
if (!subTotals2[category2]) {
subTotals2[category2] = 0;
}
var number2 = tableRecords2[j].value[‘出荷_台数’].value;
subTotals2[category2] += number2*1;
}

for (var k = 0; k < tableRecords.length; k++) {
if (category === category2){
var sai = subTotals[category] - subTotals2[category2];
tableRecords3[k].value[‘受注残_型番’].value = category;
tableRecords3[k].value[‘受注残_台数’].value = sai;
}else{
tableRecords3[k].value[‘受注残_型番’].value = category;
tableRecords3[k].value[‘受注残_台数’].value = subTotals[category];
}
}

return event;
});
})();

tanakaさん

注文内容の行数が受注残の行数より大きい場合(tableRecords.length > tableRecords3.length)、tableRecords3[k]がundefinedになるのかと思います。

いくつか対策は考えられますが、value[‘受注残_型番’].valueなどのプロパティを持ったオブジェクトを直接代入するのがかんたんかと思います。
また、フィールドタイプも指定しないとエラーになるかと思うので、そちらも追加すると良いかと思います。

tableRecords3[k] = {
  value: {
    受注残_型番: {
      value: category,
      type: 'SINGLE_LINE_TEXT'
    },
    受注残_台数: {
      value: subTotals[category],
      type: 'NUMBER'
    }
  }
}

江田篤史 様

ご教示ありがとうございます!

早速試してみたいと思います。