お世話になっております。
以下のサイトを参考に関連テーブルの値を計算し、フィールドに格納する検討をしております。
このときに以下の通り実装をしたいと考えております。
1.一括更新ボタンを押下した際に一覧のすべてのレコードについて、関連テーブルを再度取得し、計算し、数値フィールドに登録する。
2.一括更新ボタンを実装し一覧のレコードに対し一括で実装する。
1に関しては、実装できたので2を別に実装した際に、集計値が更新されると思いましたがされませんでした。
別途一括更新の際に再計算する必要があるのでしょうか。
1のソース************************************************************************
(function() {
“use strict”;
//レコードの追加、編集、詳細画面で適用する
var events = [
‘app.record.detail.show’,
‘app.record.edit.show’
]
kintone.events.on(events, function(event) {
// var client_rid = event.recordId;
// 関連テーブルのAppIdを取得
var related = kintone.app.getRelatedRecordsTargetAppId(‘仕入れ情報’);
// レコード取得関数(100行制限)
function fetchRecords(appId, opt_offset, opt_limit, opt_records) {
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
// 詳細画面のレコードの情報取得
var record = event.record;
var bukkenNo = record[“物件No”].value;
var s_query = ‘物件No="’ + bukkenNo + '" limit ';
var params = {app: related, query: s_query + limit + ’ offset ’ + offset};
return kintone.api(‘/k/v1/records’, ‘GET’, params).then(function(resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(related, offset + limit, limit, allRecords);
}
return allRecords;
});
}
// 小数点n位までを残す関数(切上げ)
// number=対象の数値
// n=残したい小数点以下の桁数
function floatFormat( number, n ) {
var _pow = Math.pow( 10 , n ) ;
return Math.ceil
( number * _pow ) / _pow ;
}
fetchRecords(kintone.app.getId()).then(function(records) {
var amount = 0;
var data_count = 0;
for (var i = 0; i < records.length; i++) {
amount = amount + parseFloat(records[i].税抜き金額.value);
data_count++;
}
//集計値設定()
var appid = kintone.app.getId();
var recid = kintone.app.record.getId();
//売上高取得
var record_2 = event.record;
var sales = record_2[“売上高”].value;
// 利益率=(売上高-仕入れ情報「税抜き金額」小計)/売上高 × 100
// 0除算の場合エラーになるため|0で0設定
var interestRate = (sales - amount)/sales*100|0;
interestRate = floatFormat(interestRate,2);
//仕入情報が更新されている場合、再度修正して仕入れ計と利益率更新
//初期登録時、仕入れ計と利益率に初期値登録
if ( ((record_2.仕入れ計.value != amount) || (record_2.利益率.value != interestRate)) ||
((record_2.仕入れ計.value == “”) || (record_2.利益率.value == “”))){
var Param = {
“app”:appid,
“id”:recid,
“record”:{
“仕入れ計”:{
“value”: amount
},
“利益率”:{
“value”: interestRate
},
},
};
kintone.api(“/k/v1/record”,
“PUT”,Param,
function(resp){
location.reload(true);
// alert(“登録成功”);
},
function(resp){
// alert(“登録エラー”);
}
);
};
});
return 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][‘物件No’][‘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);
});
})();