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

江田篤史様

 

初めまして。

こちらの記事のコードを利用して、関連レコード取得集計が出来ました。

ありがとうざいました。

集計方法として、「受注予定日」や「対応日時」の日付を期間指定して集計することは可能でしょうか。

例:2020/1/1~2020/6/30

運用としましては、顧客アプリ関連レコード(該当顧客の受注金額)を年度や四半期で区切り、集計表示したいと考えております。

初歩的な質問で大変恐縮ですが、ご教授頂けますと幸いです。

何卒よろしくお願い申し上げます。

ayoko様

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

filter()メソッドを用いると良いと思います.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

(function() {
  "use strict";
  kintone.events.on([
    'app.record.detail.show',
    'app.record.edit.show'
  ], function(event){
    // まず、アプリのフィールド設定を取得しておく
    RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
      // 関連する案件一覧のレコードを取得する
      (new RelatedRecordsFieldManager('案件一覧')).getRecords(event.record).then(function(records){
        // space1に合計費用の合計値を表示
        kintone.app.record.getSpaceElement("space1").innerHTML =
          records.filter(function(record){
            var date = record.受注予定日.value;
            return (date >= '2020-01-01' && date <= '2020-06-30');
          }).reduce(function(sum, record){
            return sum + Number(record.合計費用.value);
          }, 0).toLocaleString();
      });
    });
  });
})();

江田篤史様

早々にご返答いただき、ありがとうございます。

サンプルコード利用で集計表示が出来ました。

ありがとうございました。

少しずつ勉強していきたいと思います。

今後も、お伺いする事があるかと思いますがその際はご教授頂けますと幸いです。

 

 

お世話になります。

関連レコード内の数値の合計をspace1に表示させたいのですが(画像の①の部分を御覧ください)、

何も変わりません。console画面を見てもエラーは出ていないのですが、修正する箇所を教えて頂けますでしょうか。

 

(function() {
“use strict”;
kintone.events.on([
‘app.record.detail.show’,
‘app.record.edit.show’
], function(event){
// まず、アプリのフィールド設定を取得しておく
RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
// 関連する案件一覧のレコードを取得する
(new RelatedRecordsFieldManager(‘直近の申請(50件まで)’)).getRecords(event.record).then(function(records){
// space1に数量の合計値を表示
kintone.app.record.getSpaceElement(“space1”).innerHTML =
records.reduce(function(sum, record){
return sum + Number(record.数量.value);
}, 0).toLocaleString();
});
});
});
})();

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

mm

mm様

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

問題点は見当たりませんね…

まずは古いコードがキャッシュされていないか,確認するとよいかと思います.
https://helpx.adobe.com/jp/legacy/kb/222659.html

それでも動作しなければ,下記などを参考に,コードのどの箇所まで動作しているか確認するとよいかと思います.
https://ics.media/entry/190517/

江田様

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

再度Consoleを確認したところ、RelatedRecordsFieldManager.jsの以下の箇所にエラーが表示されていました。

this.property = this.fieldProperties[fieldCode].referenceTable;

コンストラクターは、何か編集をしないといけないのでしょうか。

また、編集したsample.jsにもエラーが出ていました。

修正箇所を教えて頂けますでしょうか。

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

mm

mm様

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

恐らく,フィールドコードの指定が正しくないのかと思います.

アプリの設定から,フィールド名「直近の申請(50件まで)」のフィールドコードが何になっているか,今一度ご確認いただけますか?

江田様

お世話になります。

ご丁寧にありがとうございました。ここはフィールドコードを入れなくてはならなかったのですね。

入れたところ、無事表示されました。ありがとうございます。

space1に表示された数値を図のように計算に利用したいのですが、どうすれば取り出せるでしょうか。

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

mm

mm様

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

こちらのコメントが参考になるかと思います.

https://developer.cybozu.io/hc/ja/community/posts/360017851006/comments/360002846572

江田様

お世話になります。

コメントを参考に作成しましたが、コードの14,15行目にエラーが発生して動きません。どこを修正すればよいか教えていただけますでしょうか。

jQuery.noConflict();
(function($) {
“use strict”;
kintone.events.on([
‘app.record.craete.show’,
‘app.record.edit.show’
], function(event){

// まず、アプリのフィールド設定を取得しておく
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).toLocaleString();
});
});
});
})(jQuery);

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

mm

mm様

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

今回も,フィールドコードの指定が正しくないのかと思います.
アプリの設定から,フィールド名「数量」のフィールドコードが何になっているか,今一度ご確認いただけますか?

また,こちらのコメントで書きましたが,「submit」イベントでeventオブジェクトを書き換えてreturnしてください.
ご提示頂いたコードですと,「show」イベントになっているかと思います.
https://developer.cybozu.io/hc/ja/articles/201941954
eventオブジェクトのreturnも記述されていないかと思います.

参考コメントのフィールドコード部分を書き換えるのが手っ取り早いと思います.
関連レコード一覧4 -> 関連レコード一覧
sale4 -> 数値
sale -> フィールド名「数量」のフィールドコード

江田さま

お世話になります。

sale -> フィールド名「数量」のフィールドコード これは私のアプリでは該当するものがないです。

関連レコード一覧の中の「数量」の数値を「数値」フィールドに表示させたいのですがコードをどのように修正すればよいでしょうか。

 

mm様

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

・コードをどのように修正すればよいでしょうか。
>ご自身のアプリのフォーム設定をご確認頂き,正しいフィールドコードをソースコードに記述してください.

「関連レコード一覧」で「参照するアプリ」に指定しているアプリについて,フォーム設定をご確認ください.
フィールド名が「数量」のフィールドの,フィールドコードはどのようになっていますか?

コンソール画面によると,「record.数量」がundefinedとなったということなので,フィールドコードが間違っている可能性を疑っております.
スペースフィールドへの表示はうまくいったとのことですので,間違っている可能性は低いとは思いますが,今一度ご確認いただけますか?

江田様

お世話になっております。ご丁寧にありがとうございました。

数量は参照するアプリのフィールドコードを書くのですね。

失礼いたしました。記入したところ、動くようになりました。

また、関連レコードをあと4つ表示させて、同様に数値を取得したいのですが、以下のコードは同じJSファイルに追加できますでしょうか。

その場合、どこに追加すればよいか教えていただけますでしょうか。

それとも、一つずつ別のJSファイルに分けたほうが良いですか?

(new RelatedRecordsFieldManager(‘関連レコード一覧_2’)).getRecords(event.record).then(function(records){
event.record.数値.value = records.reduce(function(sum, record){
return sum + Number(record.p2_amt.value);

(new RelatedRecordsFieldManager(‘関連レコード一覧_3’)).getRecords(event.record).then(function(records){
event.record.数値.value = records.reduce(function(sum, record){
return sum + Number(record.p3_amt.value);

(new RelatedRecordsFieldManager(‘関連レコード一覧_4’)).getRecords(event.record).then(function(records){
event.record.数値.value = records.reduce(function(sum, record){
return sum + Number(record.p4_amt.value);

(new RelatedRecordsFieldManager(‘関連レコード一覧_5’)).getRecords(event.record).then(function(records){
event.record.数値.value = records.reduce(function(sum, record){
return sum + Number(record.p5_amt.value);

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

mm

mm様

フィールドコードのミスはよくあるケースかと思います。
JSカスタマイズのチュートリアルは、すでにご覧になられていますか?
https://developer.cybozu.io/hc/ja/articles/115002336526
kintoneカスタマイズにおける注意点を理解できるので、「はじめようJavascript」と「はじめようkintone API」は一通り目を通しておくことをお勧めいたします。

・関連レコードをあと4つ表示させて、同様に数値を取得したいのですが、以下のコードは同じJSファイルに追加できますでしょうか。
> 同じJSファイルに記述するのが良いです。
下記コメントが参考になるかと思います。
https://developer.cybozu.io/hc/ja/community/posts/360017851006/comments/900000480046

江田様

お世話になります。

チュートリアルは読んでみたのですが、これまでコードを触ったことがないため、とても難しく、理解が出来ないです。

頂いたコメントを参考にコードを修正したところ、エラーが8、33、37行目に表示されているのですが、どこを修正すればよいかわからないです。

このエラーのときは、どこを確認してどのように修正すればよいのでしょうか?

kintone.events.on([
‘app.record.create.submit’,
‘app.record.edit.submit’
], function(event){
return new kintone.Promise(function(resolve){
// まず、アプリのフィールド設定を取得しておく

RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
kintone.Promise.all([
// 関連する案件一覧のレコードを取得する
(new RelatedRecordsFieldManager(‘関連レコード一覧’)).getRecords(event.record),
(new RelatedRecordsFieldManager(‘関連レコード一覧_2’)).getRecords(event.record),
(new RelatedRecordsFieldManager(‘関連レコード一覧_3’)).getRecords(event.record),
(new RelatedRecordsFieldManager(‘関連レコード一覧_4’)).getRecords(event.record),
(new RelatedRecordsFieldManager(‘関連レコード一覧_5’)).getRecords(event.record)

]).then(function(records){

// 申請書アプリから数量を取得して数値に表示  
kintone.Promise.all([  
event.record.数値.value = records.reduce(function(sum, record){  
return sum + Number(record.p1\_amt.value),  
event.record.数値\_2.value = records.reduce(function(sum, record){  
return sum + Number(record.p2\_amt.value),  
event.record.数値\_3.value = records.reduce(function(sum, record){  
return sum + Number(record.p3\_amt.value),  
event.record.数値\_4.value = records.reduce(function(sum, record){  
return sum + Number(record.p4\_amt.value),  
event.record.数値\_5.value = records.reduce(function(sum, record){  
return sum + Number(record.p5\_amt.value);  
}, 0);  
]).resolve(event);  

});
});
});
}));
}());

また、レコードを一度開いて保存しないと正しい値が表示されないので、

一覧画面に一括更新ボタンを作りました。

(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.innerText = ‘在庫を一括更新する’;

// ボタンクリック時の処理

kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();

ボタンクリック時の処理のコードを教えていただけますでしょうか。

以下を参考にしましたが、私がやりたいことは値を上書きすることではなく、ただ開いて保存なので、その場合のやり方をチュートリアルでも見つけることが出来ませんでした。

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

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

mm

江田様

お世話になります。

コメントを見させていただいたのですが、数値に合計値を表示させることが出来ず、見よう見まねで作ってみたのですが、アドバイスをいただけないでしょうか?

関連レコード一覧から数値に合計値を表示させ、その合計値をさらに計算に使いたいです。

 

(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);
});
});
});
});
}());

江田 様

いつもお世話になっております。プログラミング完全初心者です。

本ソースを使って数値ではなく「文字列」の数を集計することは可能でしょうか。

関連レコード集計の「ステータス」項目に開始・処理中・完了などあり、「完了」になっている数を集計したいです。

 

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

 

上田さん

こちらのコメントにあるように,filterを用いると良いです.

記事でいう,「関連する活動履歴」を「対応内容が商談」という条件で絞り込んで件数を取得には,下記のようになります.

// 関連する活動履歴のレコードを取得する
(new RelatedRecordsFieldManager('活動履歴')).getRecords(event.record).then(function(records){
  // space2にレコード数を表示
  kintone.app.record.getSpaceElement("space2").innerHTML = records.filter(function(record){
    return record.対応内容.value === '商談';
  }).length;
});

江田さま

はじめまして、お世話になります。

こちらの記事を参考に以下コードを作成し、関連レコードから取得したデータの集計値を①②③のフィールドへ、一括更新ボタン押下で格納させることが出来るようになりました。

追加処理として、条件に合うデータの合計値のみを集計し、④⑤に格納したいと思うのですが、

コメントを参考にさせて頂いたのですが、うまく実装できません。

どの部分に、どのように記述すれば良いかご教示いただけませんでしょうか?

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

////////////金額の一括更新ボタン////////////

(function(){
  'use strict';
  
  var getRecords = function(app, tmpRecords){
    var limit = 500;
    var tmpRecords = tmpRecords || [];
    return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
      app: app,
      query: ' limit ' + limit +' offset ' + tmpRecords.length
    }).then(function(response){
      tmpRecords = tmpRecords.concat(response.records);
      return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
    });
  };
  
  var putRecords = function(app, records){
    var limit = 100;
    return Promise.all(
      records.reduce(function(recordsBlocks, record){
        if(recordsBlocks[recordsBlocks.length - 1].length === limit){
          recordsBlocks.push([record]);
        }else{
          recordsBlocks[recordsBlocks.length - 1].push(record);
        }
        return recordsBlocks;
      }, [[]]).map(function(recordsBlock){
        return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
          app: app,
          records: recordsBlock
        });
      })
    );
  };
  
  //--------関連レコード出金管理からデータを集計取得しフィールドへ格納--------//
  kintone.events.on('app.record.index.show', function(event){
    if(document.getElementById('updateButton') !== null) return;
    var button = document.createElement('button');
    button.innerHTML ='金額更新';
    button.id = 'updateButton';
    kintone.app.getHeaderMenuSpaceElement().appendChild(button);
    button.addEventListener('click', function(){
      Promise.all([
        getRecords(kintone.app.getId()),
        RelatedRecordsFieldManager.prototype.getFieldProperties()
        ]).then(function(responses){
          return Promise.all(responses[0].map(function(selfRecord){
            return (new RelatedRecordsFieldManager('出金管理')).getRecords(selfRecord).then(function(relatedRecords){
              return {
                id: selfRecord.レコード番号.value,
                record: {
                  必要弁済総額: {
                    value: relatedRecords.reduce(function(sum, relatedRecords){
                      return sum + Number(relatedRecords.予定額.value);
                    }, 0)
                  },
                  弁済ずみ金額:{
                    value: relatedRecords.reduce(function(sum, relatedRecords){
                      return sum + Number(relatedRecords.振込額.value);
                    }, 0)
                  },
                  弁済手数料計_見込: {
                    value: relatedRecords.reduce(function(sum, relatedRecords){
                      return sum + Number(relatedRecords.代行手数料.value);
                    }, 0)
                  },
                }
              };
            });
          }));
        }).then(function(records){
          putRecords(kintone.app.getId(), records).then(function(){
            alert('更新しました');
            location.reload();
          });
        });
    });
    return event;
  });
})();