関連レコードに1件もレコードを持っていないレコードを、一覧画面の絞り込み検索で検索できるようにしたい

お世話になります。

特定の条件で検索できるようにしたく、ご相談させていただきます。

 

【実現したいこと】

関連レコードに1件もレコードを持っていないレコードを、一覧画面の絞り込み検索で検索できるようにしたい

 

商品の在庫管理としてkintoneを使用しております。

商品が購入されている場合は関連レコードに1件のレコードが入っており、未購入の場合は参照するレコードが無いということで関連レコードは0件になっています。

まだ購入されていない商品がどれくらいあるか検索できるようにしたく、関連レコードが0件のレコードを一覧画面の絞り込み検索で検索できればと考えております。

 

【試したこと】

詳細画面に集計フィールド(数値フィールド)を設定し、レコード数が集計に反映されるよう以下のコードを実装

 

関連レコードのフィールドコード:販売情報

関連レコードにレコードが表示される条件:アプリA(関連レコードが設置されているアプリ)の製番フィールドとアプリB(顧客管理をしているアプリ)の顧客製番フィールドが一致した場合

(function() {
'use strict';
const events = [
'app.record.detail.show'
];

kintone.events.on(events, function(event) {
const appId = kintone.app.getRelatedRecordsTargetAppId('販売情報');
const query = '顧客製番="' + event.record['製番'].value + '"';
const paramGET = {
'app' : appId,
'query' : query,
'totalCount' : true
};

kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'PUT', paramGET, function(resp) {
kintone.app.record.getFieldElement('集計').innerText = resp.totalCount; //表示する値の書き換え
});
});
})();

上記ですと、一覧画面の状態では詳細画面内の集計フィールドには値が入っていないためか、絞り込み検索で集計を0で絞ってもヒットしませんでした。(詳細画面を表示したときのアクションのため当たり前ではありますが…)

 

const events = [
'app.record.detail.show'
];

こちらにapp.record.index.showを追加する方法も試しましたが、一覧画面では値の取り方が違うためかエラーになってしまいました。(Uncaught TypeError: Cannot read property ‘製番’ of undefined)

 

一覧画面での書き方の場合、レコード情報を一度全部取得してくる必要があるのかと考えましたが、書き方がいまいちわからず反映させることができませんでした。

↓以下参照サイト↓

【関連レコードの情報の有無を取得したい】

https://developer.cybozu.io/hc/ja/community/posts/360017929003-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%AE%E6%9C%89%E7%84%A1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%81%84

 

今後CSVデータで新たにレコードを追加させる予定もあるため、常に最新のレコードの集計値を検索できるようにしたいと考えております。

プログラミング初心者のためコードの理解もしっかりできておらず申し訳ないのですが、どのようにすると良いかご教示いただけると幸いです。

また、上記以外で他に良いやり方がありましたら、お知恵をいただけると幸いです。

 

長文失礼いたしました。

どうぞよろしくお願い申し上げます。

坂野 裕樹さん

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

【関連レコードの情報の有無を取得したい】の方法で実装できるかと思います。
よろしければ、書いたコードを見せていただけますか?
下記を参考にコンソールに表示されたエラーも見せていただけると、回答しやすいです。
https://developer.cybozu.io/hc/ja/articles/207613916

また、レコードの保存の仕方を工夫して解決する方法もあるようです。
今回の案件ですと適用しにくいかもしれませんが、一応共有いたします。
https://developer.cybozu.io/hc/ja/community/posts/900002574963

江田篤史様

お世話になります。

コメント・参考URLの共有ありがとうございます。

 

【関連レコードの情報の有無を取得したい】の方法を参考に書いたコードが以下になります。

<想定していた動き>

①一覧画面にてレコード情報を一括取得

②詳細画面内の関連レコード(販売情報フィールド)のレコード数を取得後、集計フィールドにレコード数を反映

③一覧画面に表示させている集計という欄に②の数を反映

(function() {
  "use strict";
  kintone.events.on([
    'app.record.index.show'
  ], function(event){

    const appId = kintone.app.getRelatedRecordsTargetAppId('販売情報');
    const query = '顧客製番="' + event.record['製番'].value + '"';
    const paramGET = {
      'app' :appId,
      'query' :query,
      'totalCount' :true
    };

    kintone.api(kintone.api.url('/k/v1/records/cursor', true), 'POST', paramGET, function(resp) {
    kintone.app.record.getFieldElement('集計').innerText = resp.totalCount;
    });

    RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
      var aggregateRecordsField = newRelatedRecordsFieldManager('集計');
      event.records.forEach(function(record, index){
        aggregateRecordsField.getRecords(record).then(function(records){
          if(records.value) {
            kintone.app.getFieldElements('集計')[index].innerText = records.value;
          }
      });
    });
  });
});

  var RelatedRecordsFieldManager = (function(fieldCode){
    functionRelatedRecordsFieldManager(fieldCode) {
      this.fieldCode = fieldCode;
      this.targetAppId = kintone.app.getRelatedRecordsTargetAppId(fieldCode);
      this.property = this.fieldProperties[fieldCode].referenceTable;
    }

  RelatedRecordsFieldManager.prototype = {
    selfAppId:kintone.app.getId(),
    records: [],
    limit:1,
    offset:0,
    getFieldProperties:function(){
      returnkintone.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;
    returnkintone.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.offset
    }).then(function(response){
      returnresponse.records;
    });
  }
}

    returnRelatedRecordsFieldManager;

  })();
})();

 

 

<コンソールに表示されたエラー>

index.js:138 Uncaught TypeError: Cannot read property '製番' of undefined
at download.do?app=104&contentId=1561&jsType=DESKTOP&hash=341f638e320f455d7171ac741df26592144127f8:12
at index.js:259
at new Bl (index.js:141)
at Fx (index.js:259)
at index.js:259
at e.o (index.js:143)
at Sl (index.js:145)
at Nl (index.js:145)
at Bl.da (index.js:1016)
at ul (index.js:141)

↓ エラー箇所(太字**[‘製番’]**部分)

const appId = kintone.app.getRelatedRecordsTargetAppId('販売情報');
const query = '顧客製番="' + event.record**['製番']**.value + '"';
const paramGET = {
'app' : appId,
'query' : query,
'totalCount' : true
};

 

おかしいところが多々あるのは承知なのですが、不要な箇所やおかしい箇所・どのようにコードを修正すべきかご教示いただけると幸いです。

 

お忙しいところ恐れ入りますが、どうぞよろしくお願いいたします。