新規投稿
フォローする

一括更新ボタンで関連テーブルの値で計算した値もすべてのレコードに反映したい

関連テーブルの値で計算した値を一括更新ボタンですべてのレコードに反映したい
と同じことをしたいと思っておりますが、関連レコードの値の集計方法が異なります。(関連レコード元の値をいくつか変更して、一覧にある更新ボタンを押すと、集計した値に反映したい)
jsの素人で恐縮ですが、現状の以下のコードに手を加えて、実現可能な方法はありますでしょうか。

1.関連テーブルの値の集計方法
【簡単】queryを書かずに関連レコードを取得&集計
2.一括更新ボタンの方法
後で追加した計算フィールドに一括で値を反映する方法

1のコード
(2つの関連レコードの集計を、それぞれの合計フィールドに入れてます)

window.RelatedRecordsFieldManager = (function(fieldCode){
var RelatedRecordsFieldManager = function(fieldCode){
this.fieldCode = fieldCode;
this.targetAppId = kintone.app.getRelatedRecordsTargetAppId(fieldCode);
this.property = this.fieldProperties[fieldCode].referenceTable;
}
RelatedRecordsFieldManager.prototype = {
selfAppId: kintone.app.getId(),
records: [],
limit: 500,
getFieldProperties: function(){
return kintone.api(kintone.api.url('/k/v1/app/form/fields', true), 'GET', {
app: RelatedRecordsFieldManager.prototype.selfAppId,
}).then(function(response){
RelatedRecordsFieldManager.prototype.fieldProperties = response.properties;
});
},
query: function(record){
return (
this.property.condition.relatedField +
'="' +
record[this.property.condition.field].value +
(this.property.filterCond ? '" and ' : '"') +
this.property.filterCond
);
},
getRecords: function(record){
var _this = this;
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
app: this.targetAppId,
query:
this.query(record) +
' order by ' + this.property.sort +
' limit ' + this.limit +
' offset ' + this.records.length
}).then(function(response){
_this.records = _this.records.concat(response.records);
return response.records.length === _this.limit ? _this.getRecords(record) : _this.records;
});
}
}
return RelatedRecordsFieldManager;
})();

/* フィールドに合計値を入れる場合 */
(function() {
"use strict";
kintone.events.on([
'app.record.create.submit',
'app.record.edit.submit'
], function(event){
return new kintone.Promise(function(resolve){
RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
(new RelatedRecordsFieldManager('申込金')).getRecords(event.record).then(function(records){
event.record.申込金合計.value = records.reduce(function(sum, record){
return sum + Number(record.申込金予定金額.value);
}, 0);
resolve(event);
});
});
});
});
}());
(function() {
"use strict";
kintone.events.on([
'app.record.create.submit',
'app.record.edit.submit'
], function(event){
return new kintone.Promise(function(resolve){
RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
(new RelatedRecordsFieldManager('契約金')).getRecords(event.record).then(function(records){
event.record.契約金合計.value = records.reduce(function(sum, record){
return sum + Number(record.契約金予定金額.value);
}, 0);
resolve(event);
});
});
});
});
}());

2のコード

(function () {
"use strict";
kintone.events.on('app.record.index.show', function (event) {
if (document.getElementById ('my_index_button') !== null) {
return;
}
var myIndexButton = document.createElement('button');
myIndexButton.id = 'my_index_button';
myIndexButton.innerHTML = '再計算';

// ボタンクリック時の処理
myIndexButton.onclick = function() {
var appId = kintone.app.getId();
kintone.api('/k/v1/records', 'GET', {app: appId}, function(resp) {
//////// 空更新オブジェクトの生成
var param = {
"app": appId,
"records": []
};
for (var i = 0; i < resp['records'].length; i++) {
param['records'][i] = {
"id": resp['records'][i]['レコード番号']['value'],
"record": {}
}
}
kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', param, function(resp) {
// success
console.log(resp);
}, function(error) {
// error
console.log(param);
console.log(error);
});
});
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();
0

1件のコメント

Avatar
江田篤史

まさよし様

お世話になっております.
トヨクモの江田と申します.

可能だと思います.

一覧画面にボタンを設置するのであれば,「レコード一覧画面の表示後イベント(app.record.index.show)」で実行した方がよいかと思います.
event.recordsでループ回して関連レコードを取得することになるかと思います.
下記の質問などが参考になるかと思います.
https://developer.cybozu.io/hc/ja/community/posts/360017929003
上記の回答では,コンストラクタのコードを書き換えていますが,今回の案件でしたらナレッジ記事のコードのままでよいと思います.

レコードの更新は,下記を参考にkintone REST APIで行うことになるかと思います.
https://developer.cybozu.io/hc/ja/articles/201941784#step2

0
ログインしてコメントを残してください。