関連レコードの集計

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

関連レコード集計についてお教えいただければと思います。

条件なしで集計をしたいのですが下記の投稿を参考にして作りましたがうまくいきません。

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

仕入小計の下に仕入の請求金額の合計を入れたいです。

レコード条件は受注番号にしています。

よろしくお願いします。

 

 

 

/*
 * total related records
 * Copyright (c) 2022 Cybozu
 *
 * Licensed under the MIT License
*/
(() => {
  ‘use strict’;

  const events = [
    ‘app.record.detail.show’,
    ‘app.record.edit.show’
  ];
  kintone.events.on(events, (event) => {
    const clientRecordId = event.recordId;
    const relatedAppId = kintone.app.getRelatedRecordsTargetAppId(‘仕入’);
    const query = `受注番号=“${clientRecordId}” ;
    const outputFields = [‘請求金額’];
    const appUrl = kintone.api.url(‘/k/v1/records’);

    const params = {
      ‘app’: relatedAppId,
      ‘query’: query,
      ‘fields’: outputFields
    };

    const elementId = ‘totalAmount’;

    kintone.api(appUrl, ‘GET’, params, (resp) => {
      let amount = 0;
      for (let i = 0; i < resp.records.length; i++) {
        amount += parseFloat(resp.records[i].請求金額.value);
      }

      const divTotalAmount = document.createElement(‘div’);
      const wString = String(amount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, ‘$1,’));
      divTotalAmount.style.fontWeight = ‘bold’;
      divTotalAmount.style.textAlign = ‘right’;
      divTotalAmount.style.fontSize = 12;
      divTotalAmount.innerHTML = ¥${wString}-;
      kintone.app.record.getSpaceElement(elementId).appendChild(divTotalAmount);
      return event;
    });
  });
})();

   const query = `受注番号="${clientRecordId}" ;

この部分のバッククォートが閉じていないようです。

  const query = `受注番号="${clientRecordId}"`;

こちらに直せば問題ないはずです。

ご回答ありがとうございます。

ただ、集計できませんでした。

参考にした投稿のアプリを使用するとうまくいったのですが、はじめからつくるからアプリを作りました。

うまくいかないのと関係ありますでしょうか。

よろしくお願いします。

 

KAN さま

サンプルのアプリでは動作したということは、新たに作成したアプリの

①関連レコード一覧のフィールドコード(サンプルだと「仕入」となっているもので、フィールド名ではありません)
②スペースのID(サンプルだと「totalAmount」となっているもので、スペース右上の歯車から設定)
③クエリ(サンプルだと「受注番号="${clientRecordId}" 」となっているもので、これは「参照先アプリの『受注番号』というフィールドコードの値と、現在のアプリの『レコード番号』が一致」していることを意味します)

いずれかに問題があるのではないかと思います。

おそらく③の部分に問題があるのだと思います。

条件としては、参照先アプリの「受注番号」と現在のアプリの「受注番号」が一致するとしたいです。

現在のアプリの「受注番号」は文字列でフィールドコードも「受注番号」と設定しています。

 

 

 

KAN さま

 constquery =`受注番号="${clientRecordId}"`;

この部分を

 constquery =`受注番号="${event.record['受注番号'].value}"`;

このように変更すれば可能かと思います。

できました!

ありがとうございます。

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

何度も申し訳ないのですが、またわからないことがあるので追加で質問があります。

関連レコードごとの合計は出せたのですが、2つの関連レコードの合計を数値フィールドの金額から引く計算をしたいです。

 

粗利益の横にスペースフィールドで要素ID totalAmount2 があります。

そちらに反映させたいのですがどこに、どのようなコードを追加すればいいでしょうか。

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

KAN さま

>2つの関連レコードの合計を数値フィールドの金額から引く計算

添付されている画像だと「100,000 - 58,500」という計算でしょうか?
2つ目の関連レコードの合計をどのようにして求めているかで回答が変わるので、現在のコードを頂いても問題ありませんか?

mls-hashimoto

ご回答の計算式で合っています。

その答えを出したいのですが、現在はスペースフィールドですが、計算フィールドでも構いません。

仕入と外注を同時に計算するコードがわからないので2つコードを使用しています。

わかりづらく申し訳ありません。

 

/*
 * total related records
 * Copyright (c) 2022 Cybozu
 *
 * Licensed under the MIT License
*/
(() => {
  ‘use strict’;

  const events = [
    ‘app.record.detail.show’,
    ‘app.record.edit.show’
  ];
  kintone.events.on(events, (event) => {
    const clientRecordId = event.recordId;
    const relatedAppId = kintone.app.getRelatedRecordsTargetAppId(‘仕入’);
    const query = 受注番号="${event.record['受注番号'].value}";
    const outputFields = [‘請求金額’];
    const appUrl = kintone.api.url(‘/k/v1/records’);

    const params = {
      ‘app’: relatedAppId,
      ‘query’: query,
      ‘fields’: outputFields
    };

    const elementId = ‘totalAmount’;

    kintone.api(appUrl, ‘GET’, params, (resp) => {
      let amount = 0;
      for (let i = 0; i < resp.records.length; i++) {
        amount += parseFloat(resp.records[i].請求金額.value);
      }

      const divTotalAmount = document.createElement(‘div’);
      const wString = String(amount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, ‘$1,’));
      divTotalAmount.style.fontWeight = ‘bold’;
      divTotalAmount.style.textAlign = ‘right’;
      divTotalAmount.style.fontSize = 12;
      divTotalAmount.innerHTML = ¥${wString}-;
      kintone.app.record.getSpaceElement(elementId).appendChild(divTotalAmount);
      return event;
    });
  });
})();

 


/*
 * total related records
 * Copyright (c) 2022 Cybozu
 *
 * Licensed under the MIT License
*/
(() => {
  ‘use strict’;

  const events = [
    ‘app.record.detail.show’,
    ‘app.record.edit.show’
  ];
  kintone.events.on(events, (event) => {
    const clientRecordId = event.recordId;
    const relatedAppId = kintone.app.getRelatedRecordsTargetAppId(‘外注’);
    const query = 受注番号_0="${event.record['受注番号'].value}";
    const outputFields = [‘請求金額’];
    const appUrl = kintone.api.url(‘/k/v1/records’);

    const params = {
      ‘app’: relatedAppId,
      ‘query’: query,
      ‘fields’: outputFields
    };

    const elementId = ‘totalAmount1’;

    kintone.api(appUrl, ‘GET’, params, (resp) => {
      let amount = 0;
      for (let i = 0; i < resp.records.length; i++) {
        amount += parseFloat(resp.records[i].請求金額.value);
      }

      const divTotalAmount = document.createElement(‘div’);
      const wString = String(amount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, ‘$1,’));
      divTotalAmount.style.fontWeight = ‘bold’;
      divTotalAmount.style.textAlign = ‘right’;
      divTotalAmount.style.fontSize = 12;
      divTotalAmount.innerHTML = ¥${wString}-;
      kintone.app.record.getSpaceElement(elementId).appendChild(divTotalAmount);
      return event;
    });
  });
})();

2つ分のスクリプトをまとめました。以下でお試し下さい。

(() => {
  'use strict';

  kintone.events.on([
  'app.record.detail.show', 'app.record.edit.show'
], async (event) => {
  let record = event.record;
  let relatedTables = [
    {
      body: {
        app: kintone.app.getRelatedRecordsTargetAppId('仕入'),
        query: `受注番号 = "${record['受注番号'].value}"`,
        fields: ['請求金額']
      },
      spaceId: 'totalAmount'
    },
    {
      body: {
        app: kintone.app.getRelatedRecordsTargetAppId('外注'),
        query: `受注番号_0 = "${record['受注番号'].value}"`,
        fields: ['請求金額']
      },
      spaceId: 'totalAmount1'
    }
  ];
  let billingAmount = Number(record['請求金額'].value);

    for (let table in relatedTables) {
    await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', relatedTables[table].body).then((resp) => {
      let amount = resp.records.reduce((prev, record) => {
        return prev += Number(record['請求金額'].value);
      }, 0);

        billingAmount -= amount;

        let divTotalAmount = document.createElement('div');
      let wString = String(amount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'));

        divTotalAmount.style.fontWeight = 'bold';
      divTotalAmount.style.textAlign = 'right';
      divTotalAmount.style.fontSize = 12;
      divTotalAmount.innerHTML = `¥${wString}-`;
      kintone.app.record.getSpaceElement(relatedTables[table].spaceId).appendChild(divTotalAmount);
    });
  };

    let divBillingAmount = document.createElement('div');
  let wString = String(billingAmount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'));

    divBillingAmount.style.fontWeight = 'bold';
  divBillingAmount.style.textAlign = 'right';
  divBillingAmount.style.fontSize = 12;
  divBillingAmount.innerHTML = `¥${wString}-`;
  kintone.app.record.getSpaceElement('totalAmount2').appendChild(divBillingAmount);

    return event;
});
})();

できました!

一つにまとめていただきありがとうございます!