(function() {
“use strict”;
// 在庫アプリ操作
var syohinDao = {};
syohinDao.APP_ID = 373;
// 新規レコードの保存イベント
kintone.events.on(‘app.record.create.submit’, function(event) {
var tabRec = event.record.入出庫.value;
for (var i = 0; i < tabRec.length; i++) {
console.log(tabRec.length);
var record = event.record;
var params = {
“app”: syohinDao.APP_ID,
“query”: ‘部品コード ="’ + tabRec[i].value[‘部品コード’][‘value’] + ‘"’,
“fields”: [‘$id’, ‘$revision’, ‘在庫数’]
};
console.log(params);
return kintone.api(‘/k/v1/records’, ‘GET’, params).then(function(resp) {
var syohinRecord = resp[‘records’][0];
if (syohinRecord.length !== 0) {
var updQuantity = 0;
// 入庫、等の場合
if (tabRec[i].value[‘入庫数’][‘value’]) {
updQuantity = Number(syohinRecord[‘在庫数’][‘value’]) + Number(tabRec[i].value[‘入庫数’][‘value’]);
}
// 出庫、等の場合
if (tabRec[i].value[‘出庫数’][‘value’]) {
updQuantity = Number(syohinRecord[‘在庫数’][‘value’]) - Number(tabRec[i].value[‘出庫数’][‘value’]);
}
if (updQuantity < 0) {
// 更新後の在庫数がマイナスになる場合はエラーにして中断
alert(“在庫が足りません。”);
tabRec[i].value[‘出庫数’][‘error’] = “在庫が足りません。”;
event[‘error’] = “在庫が足りません。”;
return event;
}
// 更新パラメータ
var params2 = {
// 商品アプリ番号
“app”: syohinDao.APP_ID,
// レコード番号
“id”: syohinRecord[‘$id’][‘value’],
// レビジョン
“revision”: syohinRecord[‘$revision’][‘value’],
// 登録データ
“record”: {
“在庫数”: {
“value”: updQuantity
}
}
};
/*
// 商品レコードを更新
return kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, params2).then(function(resp2) {
alert(“商品レコードを更新しました。”);
}, function(resp2) {
alert(“商品レコードを取得できません。”);
});
*/
}
},function(resp) {
alert(“商品レコードを取得できません。”);
event[‘error’] = “商品レコードを取得できません。”;
return event;
});
}
});
});
↑上記のコードで、for文を使用しているのですが、データが複数あっても、一度しかfor文が動作しません。
正しい記述方法をご教示願います
kintone_TS44様
お世話になっております.
for文内でreturnが処理されるとそれ以降のループは処理されません.
全ての処理を終えた後でreturnするような記述が良いかと思います.
非同期処理が絡んでいるので,Promise.all()で全てのPromiseが解決するのを待つと良いと思います.
(function () {
"use strict";
// 在庫アプリ操作
var syohinDao = {};
syohinDao.APP_ID = 373;
// 新規レコードの保存イベント
kintone.events.on('app.record.create.submit', function (event) {
var tabRec = event.record.入出庫.value;
return kintone.Promise.all(tabRec.map(function(row){
console.log(tabRec.length);
var record = event.record;
var params = {
"app": syohinDao.APP_ID,
"query": '部品コード ="' + row.value['部品コード']['value'] + '"',
"fields": ['$id', '$revision', '在庫数']
};
console.log(params);
return kintone.api('/k/v1/records', 'GET', params).then(function (resp) {
var syohinRecord = resp['records'][0];
if (syohinRecord.length !== 0) {
var updQuantity = 0;
// 入庫、等の場合
if (row.value['入庫数']['value']) {
updQuantity = Number(syohinRecord['在庫数']['value']) + Number(row.value['入庫数']['value']);
}
// 出庫、等の場合
if (row.value['出庫数']['value']) {
updQuantity = Number(syohinRecord['在庫数']['value']) - Number(row.value['出庫数']['value']);
}
if (updQuantity < 0) {
// 更新後の在庫数がマイナスになる場合はエラーにして中断
alert("在庫が足りません。");
row.value['出庫数']['error'] = "在庫が足りません。";
event['error'] = "在庫が足りません。";
return event;
}
// 更新パラメータ
var params2 = {
// 商品アプリ番号
"app": syohinDao.APP_ID,
// レコード番号
"id": syohinRecord['$id']['value'],
// レビジョン
"revision": syohinRecord['$revision']['value'],
// 登録データ
"record": {
"在庫数": {
"value": updQuantity
}
}
};
/*
// 商品レコードを更新
return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params2).then(function(resp2) {
alert("商品レコードを更新しました。");
}, function(resp2) {
alert("商品レコードを取得できません。");
});
*/
}
}).catch(function (resp) {
alert("商品レコードを取得できません。");
event['error'] = "商品レコードを取得できません。";
return event;
});
}));
});
});
江田篤史様
お世話になっております。
ご回答頂いた、コードでアプリを実行したのですが、
思った通りに動作しませんでした。
コードのどこの箇所を気をつければよいか、ご教示願います。
※``console.log(tabRec.length);でテーブルの数が取得できませんでした。
kintone_TS44様
お世話になっております.
ご確認ありがとうございます.
即時関数の括弧が不足していました.
最終行を修正してお試しいただけますでしょうか.
});
↓
})();
江田篤史様
お世話になっております。
コンソールは表示されるようになりました。
誠に、ありがとうございます。
ですが、保存をすると
カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。
- event.record が不正です。
とメッセージが表示されます。
何度も申し訳ございませんが、ご教示願います。
kintone_TS44様
お世話になっております.
こちらこそ確認不足で申し訳ございません.
eventオブジェクトをreturnしないといけませんね.
kintone.Promise.all()にメソッドチェーンして,eventオブジェクトをreturnしてください.
...
return kintone.Promise.all(tabRec.map(function(row){
...
})); //75行目
});
})();
↓
...
return kintone.Promise.all(tabRec.map(function(row){
...
})).then(function(){ //75行目
return event;
});
});
})();
江田篤史様
お世話になっております。
無事、動作いたしました。
ご教示頂き、ありがとうございました。
江田篤史様
お世話になっております。
先ほどご教示頂いたコードに、詳細情報を追加したいと考えたおりますが、
下記の方法ですと、テーブルが上書きされてしまいます。
// 登録データ
“record”: {
“在庫数”: {
“value”: updQuantity
},
//テーブルデータの追加
“詳細情報”: {
“value”: [{
“value”: {
“日付”: {“value”: row.value[‘入出庫日’][‘value’]},
“入庫”: {“value”: Number(row.value[‘入庫数’][‘value’])},
“出庫”: {“value”: Number(row.value[‘出庫数’][‘value’])},
“会社名”: {“value”: record[‘会社名’][‘value’]}
}
}]
}
}
度々、申し訳ございませんがご教示願います。