関連レコードの件数取得や集計を保存時(.submit)ではなく表示時(.show)で行いたい

https://developer.cybozu.io/hc/ja/community/posts/360017851006–%E7%B0%A1%E5%8D%98-query%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%9A%E3%81%AB%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8F%96%E5%BE%97-%E9%9B%86%E8%A8%88

こちらの記事を参考にして、一応狙い通りに動きますが、現在は

‘app.record.create.submit’,'app.record.edit.submit’でないと動きません。

実務上は、‘app.record.detail.show’, ‘app.record.edit.show’,'app.record.index.showで表示したいです。

どのようにすればよいでしょうか?

現在のJSは以下の通りです。これに加えて、リンクで紹介されているRelatedRecordsFieldManager.jsを設定しています。

・申込拠点 という関連レコードからセット数という項目をSUM集計し『申込セット数』フィールド(数値)に表示

・申込拠点 という関連レコードからレコード件数を集計し『申込件数』フィールド(数値)に表示

数値フィールドに表示したい理由は、その後の計算や一覧表示時に確認したいからです。

宜しくお願い申し上げます。

 

(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);
});
(new RelatedRecordsFieldManager(‘申込拠点’)).getRecords(event.record).then(function(records){
event.record.申込件数.value = records.length;
resolve(event);
});
});
});
});
})();

 

prestantiousさん、こんにちは。

showイベントでは、eventオブジェクトをreturnしてもフィールドは書き換えられません。

この場合は、REST APIによるレコード更新+画面リロード という形で対応できると思います。

詳細画面表示時の項目更新について

で詳しく説明されていますので、参考にしてみてください。

Masudaさん、こんにちわ

迅速なご返信有難うございます。

教えて頂いたリンクを確認いたしましたが、具体的な記述でつまづいております

kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, params, function(resp) {}を使用すべきというのはなんとなく分かりますが、

入れるべき場所などがいまだ不明です。

お手数ですが、具体的な記述についてアドバイスを頂ければ助かります。

宜しくお願い申し上げます。

prestantious様

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

解決済みかもしれませんが、params.recordを変えればよいと思います。

(function(){"use strict";kintone.events.on(['app.record.detail.show','app.record.edit.show'],function(event){RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){(newRelatedRecordsFieldManager('申込拠点')).getRecords(event.record).then(function(records){varapplicationSet=records.reduce(function(sum,record){returnsum+Number(record.セット数.value);},0);varapplicationNumber=records.length;if(Number(event.record.申込セット数.value)===applicationSet&&Number(event.record.申込件数.value)===applicationNumber)return;kintone.api(kintone.api.url('/k/v1/record',true),'PUT',{app:kintone.app.getId(),id:kintone.app.record.getId(),record:{申込セット数:{value:applicationSet},申込件数:{value:applicationNumber}}}).then(function(){location.reload();});});});});})();

一覧画面での更新はこちらの記事が参考になるかと思います。 https://developer.cybozu.io/hc/ja/community/posts/360017977863#community_comment_360004431671

江田様、アドバイス有り難うございます。

こちらを試しましたが、残念ながら更新がかかりません。

気になる点として、JSEdit for kintoneを利用した場合に

app: kintone.app.getId(),

以降が白いままです。

何かしらのエラーがあるかと自分でも調べたのですが分からず、お手数ですがご確認頂けますでしょうか?

宜しくお願い致します。

prestantious遠藤

prestantious遠藤様

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

実際に,詳細画面を開いたときにエラーなどは表示されますでしょうか?
エラーの確認方法はこちらなどで紹介されています.
https://developer.cybozu.io/hc/ja/articles/207613916

 

もし,エラーが表示されていない場合は,9行目と10行目の間に

console.log('申込セット数-before: ' + event.record.申込セット数.value);
console.log('申込セット数-after: ' + applicationSet);
console.log('申込件数-before: ' + event.record.申込件数.value);
console.log('申込件数-after: ' + applicationNumber);

と追加して,コンソール画面を確認してみてください.

江田様

迅速なご返信ありがとうございます。

再度確認したところ、問題なく更新できておりました。

該当レコードのない関連レコードでチェックしており、空欄のままだったので動いていないのかと勘違いしておりました。

御協力誠に有り難うございます!

prestantious遠藤

prestantious遠藤様

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

10行目を

if(Number(event.record.申込セット数.value) === applicationSet &&Number(event.record.申込件数.value) === applicationNumber && event.record.申込セット数.value !== '' && event.record.申込件数.value !== '') return;

とすれば,空欄を0に更新するかと思います.

江田様

お世話になっております。こちらも上手くできました、有り難うございます!

引続き一覧画面についても教えて頂いたリンクを基にトライしてみます。

宜しくお願い申し上げます。

prestantious遠藤

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。