関連レコード内データに該当データがある場合のみ、別フィールドへ印をつける

初心者です。

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

■Aアプリ:顧客対応履歴 → 1回対応するごとに1レコード登録

■Bアプリ:企業情報管理 → 1企業毎に1レコード登録

 

Aアプリ ⇒ Bアプリ:関連レコードで、これまでの対応履歴を紐づけ(企業ID)

 

という仕様になっているのですが、Bアプリ内の関連レコードの中で、ある特定のものが選択されている場合に、別のフィールドに"○"をつけるという方法を知りたいのですが、可能でしょう。

例えば

この関連レコードで、対応内容の部分に見積提示が含まれる場合は、別のフィールド(文字列)に"○"を入力するというのが希望です。

 

尚、この見積提示が含まれる対応履歴レコードが、一番直近のレコードじゃなかったとしても○が付く仕様にしたいと考えております。

 

こちらを参考にしましたが、

https://developer.cybozu.io/hc/ja/articles/203030394-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E9%A0%85%E7%9B%AE%E3%82%92%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A7%E9%9B%86%E8%A8%88

行き詰ってしまいました。。

「別のフィールドに"○"をつける」というのは、Aアプリ、Bアプリのどちらでしょうか?

 

harada

いつもありがとうございます。

○をつけるのはBアプリの文字列フィールドで考えています。

1)どの画面から更新をかける予定でしょうか?

アプリBの個別ページからであれば、

レコードの取得(GET) – cybozu developer network
https://developer.cybozu.io/hc/ja/articles/202331474-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97-GET-#step1

を参考にAアプリ:顧客対応履歴のアプリ番号を指定して、紐付いた顧客を対象に対応内容が見積提示で抽出します。複数ある場合は、OrderやLimitをつけます。

一括でする場合は、一覧ページなどにボタンを設置して

https://developer.cybozu.io/hc/ja/community/posts/900001057226-kintone%E3%81%AE%E4%B8%80%E8%A6%A7%E3%81%AB-%E8%A8%88%E7%AE%97%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E4%B8%80%E6%8B%AC%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E8%A8%AD%E7%BD%AE%E3%81%97%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99-?page=1#community_comment_900000369606

を参考にデータを抽出して、条件にあえば、丸を書き込むことになります。

案件の読みをしたいのであれば、アプリA側でクロス集計をして、顧客、対応内容、日付の最大で失注レコードを除くとかするほうがkintoneの標準機能だけでよいようにも思われます。ご検討ください。

harada

1)更新していくのはAアプリです。

 

例)株式会社 山田商事[企業ID:100]というクライアントが存在するとして

◆Aアプリに下記レコード追加

株式会社 山田商事[対応レコードID:88] 3/1 電話

株式会社 山田商事[対応レコードID:89] 3/5 見積提示

株式会社 山田商事[対応レコードID:90] 3/7 商談

 

◆Bアプリに 株式会社 山田商事[企業ID:100] というレコードが存在

この中に対応レコードID88~90が紐づいた関連レコードがあって、「見積提示」という履歴が1つ以上存在しているため、Bアプリ内の文字列フィールドに"○"がつく。

 

という仕様にしたいのです。

肝心なポイントは、見積提示は対応レコードIDが89ですが、さらに対応レコードID90が増えたことにより、この○が消えないようにしたいというのが希望です。。

 

つまり、株式会社 山田商事に対し、過去一度でも見積を出したことがあるかどうかを、Bアプリの一覧画面ですぐに確認できるようにカスタマイズしたいのですが、できればボタン等ではなく自動でBアプリの文字列フィールドが更新されるようにしたいです。

 

https://developer.cybozu.io/hc/ja/articles/900001057206

こういったクエリ?も勉強途中ではあるものの、お恥ずかしながら取得した後どうしたら良いのか全く分からずという状況です。

話が具体的なカスタマイズの話にならないため、自分の勉強のために上に示したサンプルコードを改良しました。

1)前提

・対応内容の電話、見積提示、商談はドロップダウンにしました。
・対応履歴アプリ側の企業IDはルックアップ形式でルックアップフィールドコードです。フォームの設定で必須にする必要があります。企業アプリは、企業IDというフィールドコードで必須、重複禁止で設定します。
・見積提出済というフィールドコードの文字列フィールドにしました。

(function () {
'use strict';
const companyAppId = 292;
const historyAppId = 291;

  const getRecords = function (app, tempRecord) {
  const limit = 500;
  let tmpRecords = tempRecord || [];
  return kintone
    .api(kintone.api.url('/k/v1/records', true), 'GET', {
      app: app,
      query: '対応内容 in ("見積提示") limit ' + limit + ' offset ' + tmpRecords.length,
    })
    .then(function (response) {
      tmpRecords = tmpRecords.concat(response.records);
      return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
    });
};
const putRecords = function (app, records) {
  const limit = 100;
  return kintone.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;
  const button = document.createElement('button');
  button.innerHTML = 'update';
  button.id = 'updateButton';
  kintone.app.getHeaderMenuSpaceElement().appendChild(button);
  const targetCompany_id = [];
  button.addEventListener('click', function () {
    getRecords(historyAppId).then(function (records) {
      records.map((record) => {
        targetCompany_id.push(record.ルックアップ.value);
      });
      const NodupetargetCompany_id = new Set(targetCompany_id);
      const uniqueNums = Array.from(NodupetargetCompany_id);
      putRecords(
        companyAppId,
        uniqueNums.map(function (record) {
          return {
            updateKey: {
              field: '企業ID',
              value: record,
            },
              record: {
              見積提出済: { value: '○' },
            },
          };
        })
      ).then(function () {
        alert('updated');
        location.reload();
      });
    });
  });
  return event;
});
})();

今のところ更新操作は、ボタン操作は必須です。
ボタン操作なしすることはできますが、ボタンを押さないだけで内部的には同じ操作が必要です。
そのため、クロス集計にされた方が知識も、更新処理も不要で便利だとおもいます。
ボタンを押すとすべての関連レコードを対象に調べてしまいます。適宜直近1週間とかに絞るなどするとよいと思います。

 

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