【簡単】queryを書かずに関連レコードを取得&集計

青山昌司様

お世話になっております.
恐らくですが,空のコンストラクタを再定義してしまっているのかと思います.

記事が誤解しやすい書き方だったので修正いたしました.
もう一度,記事の手順に従って設定してみて頂けますでしょうか?

Masahiro Makita様

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

①について
問題なさそうに見えますね・・・
エラーメッセージを見せて頂ければなにかわかるかもしれません.

②について
利用できます.
下記の記事などが参考になるかと思います.
下記の案件では関連レコードを1件のみ取得するためコンストラクタを一部変更していますが,全件取得する場合はもとのコードのまま利用してください.
https://developer.cybozu.io/hc/ja/community/posts/360017929003

江田様

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

再度確認し動作を確認いたしました。

ありがとうございます。

過去他の方が問合せしておりますが、新しく作成した数値フィールド(フィールドコード:金額)に値を出す場合、

下記のとおりでよろしいのでしょうか?

訂正する箇所がございましたらご教示いただければ幸いです。

よろしくお願いします。

 

(function() {

“use strict”;

kintone.events.on([

‘app.record.create.submit’,

‘app.record.edit.submit’

], function(event){

returnnewkintone.Promise(function(resolve){

RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){

(new RelatedRecordsFieldManager(‘案件一覧’)).getRecords(event.record).then(function(records){

event.record.金額.value=records.reduce(function(sum, record){

returnsum+Number(record.合計費用.value);

}, 0);

resolve(event);

});

// 関連する活動履歴のレコードを取得する

(new RelatedRecordsFieldManager(‘活動履歴’)).getRecords(event.record).then(function(records){

// space2にレコード数を表示

kintone.app.record.getSpaceElement(“space2”).innerHTML=records.length;

});

});

});

})();

青山昌司様

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

7行目など,ところどころ半角スペースが抜けていますね.
あと,}と)が1個ずつ足りていないです.

コーディングする際は,インデント(字下げ)をいれるようにした方がよいと思います.
テキストエディタも,こちらの記事などで使いやすいものが紹介されているので,使ってみるとミスを発見しやすくなると思います.
https://developer.cybozu.io/hc/ja/articles/211029283

(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){returnnewkintone.Promise(function(resolve){RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){(newRelatedRecordsFieldManager('案件一覧')).getRecords(event.record).then(function(records){event.record.金額.value=records.reduce(function(sum,record){returnsum+Number(record.合計費用.value);},0);resolve(event);});});});});}());

江田様

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

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

上記の方法で確認ができました。

やりたいことへ一歩前進しました。

ところで

レコードを一度開いて保存を成功させないと金額フィールドはデータが反映しませんが、

CSVへ一度エクスポート後、インポートしても反映しないものでしょうか?

またレコード一覧画面で強制計算させる方法はとれるのでしょうか?

 

何卒宜しくお願い致します。

青山昌司様

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

上記のコードは,「レコード追加画面で保存ボタンを押したとき」と「レコード画面で保存ボタンを押したとき」に動作するので,CSVを読み込んでも動作しません.
https://developer.cybozu.io/hc/ja/articles/201941984#step2
https://developer.cybozu.io/hc/ja/articles/202166270#step2

CSVを読み込んだときに動作させる実装は困難なので,一覧画面に一括更新ボタンを設置する等の実装が良いかと思います.
よろしければ,下記などを参考にしてください.
https://developer.cybozu.io/hc/ja/community/posts/360017977863
https://developer.cybozu.io/hc/ja/articles/202331474#step2
https://developer.cybozu.io/hc/ja/articles/201941784#step2

江田さま

いつも大変お世話になっております。

本ソースをを使って最終取引の値をフィールドに貼り付けたいと考えているのですが

そのようなことは可能でしょうか?

 

サンプルの「活動履歴」でいいますと2018年3月7日が最終日となりますので

フィールドに「2018-03-07」を日付フィールドに、文字フィールドに「注文書回収」をコピーしたいと考えています。

お手すきの際にでもご教示いただければ幸いです。

 

よろしくお願いいたします。

青山昌司様

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

下記コードで実装できます.

(function () {
  "use strict"
  kintone.events.on([
    'app.record.create.submit',
    'app.record.edit.submit'
  ], function (event) {
    return RelatedRecordsFieldManager.prototype.getFieldProperties().then(function () {
      return (new RelatedRecordsFieldManager('活動履歴')).getRecords(event.record).then(function (records) {
        var latestRecord =
          records.reduce(function (latestRecord, record) {
            if(!latestRecord.レコード番号) return record
            return latestRecord.対応日時.value > record.対応日時.value ? latestRecord : record;
          }, {})
        event.record.日付.value = latestRecord.対応日時.value
        event.record.文字.value = latestRecord.対応内容.value
        return event
      })
    })
  })
})()

江田さま

 

いつも大変お世話になっております。

ご教示ありがとうございます。

早速試してみたいと思います。

今後ともよろしくお願いいたします。

江田篤史

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

先日ご教授いただいた方法を活用させていただいているのですが、関連レコードにデータがない場合エラーになり保存ができません。

if(latestRecord.対応日時.value!==undefined){

event.record.日付.value = latestRecord.対応日時.value

event.record.文字.value = latestRecord.対応内容.value

}

としてみましたがうまく動きません。

関連レコード内に参照するレコードがない場合の処理を

ご教授いただけませんでしょうか。

よろしくお願いいたします。

青山昌司様

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

下記で対応可能かと思います。

var latestRecord =
  records.length && records.reduce(function (latestRecord, record) {
    if(!latestRecord.レコード番号) return record
    return latestRecord.対応日時.value > record.対応日時.value ? latestRecord : record;
  }, {});
if(latestRecord){
  event.record.日付.value = latestRecord.対応日時.value;
  event.record.文字.value = latestRecord.対応内容.value;
}

江田篤史様

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

ご教授いただいた方法で問題解決できました。

いつもご丁寧な回答ありがとうございます。

今後ともよろしくお願いいたします。

 

 

 

江田様

お世話になります。

私も数値フィールドに集計を行う形式で実装できました。ありがとうございます。

これ、指定条件に該当するレコードだけを集計することはできますでしょうか?

例えば、案件に案件種別というドロップダウンがあって、案件種別の値が”新規”の合計費用だけを計算したいです。

コンストラクタのqueryを書き換えるのかとおもうのですが、書き方がわからず、ご共住いただけましたら幸いです。

江田様

 

いつもお世話になっております。

 

関連レコードの号家を数値フィールドに入れてその数値を元に計算されるものを作りたいと思っております。

具体的には別アプリに売上データがあって、会社名をとってくると、軽減税率の売上と標準税率の売上に分けてそれぞれ関連レコードで引っ張ってくる。

手数料の計算をしたいので、それぞれの関連レコードで販売数と販売金額の合計を出してそれぞれ数値フィールドに転記されるようなものが作りたいです。

現在は、関連レコードの合計が関連レコードの項目名のところに出てくるTISさんの無料プラグインを使用して、出てきた合計を数値フィールドに手打ちで転記しております。

この部分を自動化できればと思っております。

アドバイスいただけると助かります。

 

宜しくお願い致します。

 

Yuichi Hanazono様

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

見逃しておりました. 申し訳ございません.

解決済みかもしれませんが…
コンストラクタは書き換えずに,取得したrecordsに対してfilterをかけるのが良いかと思います.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

(new RelatedRecordsFieldManager('案件一覧')).getRecords(event.record).then(function(records){
  event.record.金額.value = records.filter(function(record){
    return record.案件種別.value === '新規';
  }).reduce(function(sum, record){
    return sum + Number(record.合計費用.value);
  }, 0);
  resolve(event);
});

望月秀吉様

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

下記が参考になるかと思います.
https://developer.cybozu.io/hc/ja/community/posts/360017851006/comments/360004419532

複数の関連レコードの値を用いるのであれば,Promise.all()を用いると良いと思います.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

...
      RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
        kintone.Promise.all([
          (new RelatedRecordsFieldManager('軽減税率')).getRecords(event.record),
          (new RelatedRecordsFieldManager('標準税率')).getRecords(event.record)
        ]).then(function(responses){
          var reducedTaxRecords = responses[0];
          var standardTaxRecords = responses[1];
          event.record.軽減税率販売数合計.value = reducedTaxRecords.reduce(function(sum, record){
            return sum + Number(record.軽減税率販売数.value);
          }, 0);
          ...
          resolve(event);
        });
      });
...

江田様

お世話になります。初心者なのですが、こちらのコードを拝見させていただき、数値フィールドに反映することができました。

できればレコード保存後ではなく、レコード追加画面、編集画面で指定フィールド(フィールドコード(ルックアップコピー先):注文番号)の値が変更された時に、数値フィールド(フィールドコード:売上数量)に値を出したいのですが、可能なことなのでしょうか?

また、関連レコードは、別アプリからではなく、同一アプリ内のデータを関連づけています。(注文を複数回に分けて納品するので、過去の売上数量を確認するためです)お教えいただければ幸いです。よろしくお願いいたします。

(function() {
“use strict”;
kintone.events.on([
‘app.record.create.change.注文番号’,
‘app.record.edit.change.注文番号’
], 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);
});
});
});
});
}());

watanabe様

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

changeイベントでの書き換えも可能です.

ただし,changeイベントではkintone.Promiseオブジェクトをreturnすることはできません.
https://developer.cybozu.io/hc/ja/articles/201941984#step3
代わりに,kintone.app.record.set()を利用すると良いと思います.
https://developer.cybozu.io/hc/ja/articles/201942014#step4

また,RelatedRecordsFieldManager.prototype.getFieldProperties()は一度だけ呼べば良いです.
'app.record.create.show’や’app.record.edit.show’内で呼んだ方が,パフォーマンス上良いかと思います.