お世話になっております。
現在、関連レコードのある列の数値の合計値を編集画面・新規作成画面時に数値フィールドに自動入力する処理を作っておりますが、なぜか数値フィールドに数字の入力が反映されません。
return eventの直前にeventをconsole表示したところ、event内には表示すべき数値が計算された状態でしっかり格納されておりました。
独力で粘ってみましたが、煮詰まってしまったのでお力を借りられればと思った次第です。どうぞよろしくお願いいたします。
<コード>
kintone.events.on(events, function(event){
var record = event.record;
var accountingRecordId = event.recordId;
var year_month = record.年月.value;
var relatedAppId = kintone.app.getRelatedRecordsTargetAppId(‘今月開催’);
var query = ‘年月=’ + year_month;
var appUrl = kintone.api.url(‘/k/v1/records’, true);
var params = {
‘app’: relatedAppId,
‘query’: query
};
kintone.api(appUrl, ‘GET’, params).then(function(resp) {
var salesSum = 0;
var expenseSum = 0;
for (var i = 0; i < resp.records.length; i++ ) {
salesSum += parseFloat(resp.records[i].売上.value);
expenseSum += parseFloat(resp.records[i].経費合計.value);
}
record[‘売上合計’][‘value’] = salesSum;
record[‘経費合計’][‘value’] = expenseSum;
return event;
}, function(resp) {
window.alert(“エラー”);
return resp;
});
<原因かもと思って調べてみたこと>
・promise処理の問題(よく理解できていない)
・kintone.api内からreturn eventができない
田中さん
原因は、promise処理ですね。
とりあえず、kintoneにおけるPromiseの書き方の基本を読んでみましょう。
サンプルコードが参考になると思います。
kintone.events.on(events, function(event) {
var record = event.record;
var accountingRecordId = event.recordId;
var year_month = record.年月.value;
var relatedAppId = kintone.app.getRelatedRecordsTargetAppId('今月開催');
var query = '年月=' + year_month;
var appUrl = kintone.api.url('/k/v1/records', true);
var params = {
'app': relatedAppId,
'query': query
};
return kintone.api(appUrl, 'GET', params).then(function(resp) {
var salesSum = 0;
var expenseSum = 0;
for (var i = 0; i < resp.records.length; i++) {
salesSum += parseFloat(resp.records[i].売上.value);
expenseSum += parseFloat(resp.records[i].経費合計.value);
}
record['売上合計']['value'] = salesSum;
record['経費合計']['value'] = expenseSum;
return event;
}).catch(function(error) {
window.alert("エラー");
return event;
});
rex0220 さん
早速コメントいただき本当にありがとうございます。無事、思った通りにできました。
ここからは個人的な反省なのですが、
今一度しっかり記事を読んでpromiseについて学び直したところ、勘違いしていた点がいくつかあることに気づきました。
-
promiseオブジェクトは、submitやproceed系のハンドラでしか使えないこと(その他のハンドラis not allowed to return “Thenable” objectエラーが出る)
-
エラー処理は、.catch(function(resp) {});で記述すること
-
promiseオブジェクトは、thenメソッド以下の関数にfullfilled(成功)/rejected(失敗)の状態に関する情報と処理結果を戻り値として渡す
-
thenメソッドの第一引数は成功時に処理される関数、第二引数は失敗時に処理される関数(今回は、成功時に処理される関数しか定義していない)
-
resolve()はpromiseオブジェクトの処理成功宣言?(この場合、kintone.apiのなかに記述されている?)
-
thenメソッドは、promiseオブジェクトが所有するメソッドで、Promiseオブジェクトを生成して返す
-
thenメソッドから次に戻り値を渡す場合は、 return ~~~~ で可能。(promiseオブジェクトが生成される)
-
return kintone.apiのreturnは、kintone.api(promiseオブジェクト)をそれ以降のthenメソッドに渡すためにつけられている?
参考:https://tech.quartetcom.co.jp/2016/03/22/javascript-promise-05/