見出し画像

Kintone関連レコードの値を集計する

Kintoneアプリで関連レコードの値を集計するカスタマイズを試しました。
関連レコードとは、レコード詳細画面に「条件に一致したレコード」を一覧表示できる機能です。
ヘルプページ:関連レコードとは

よく似た機能にテーブル(表)という機能が有り、こちらではテーブル内の数値データをテーブル外で計算フィールドを作成して集計ができます。
しかし関連レコードは、標準機能では「集計」する方法が有りません。

◆やりたいこと

工場で製品マスターと日報アプリを作成して、製品マスターに日報アプリのデータ(日付、生産数量、作業時間等)を関連レコードで最大50件参照している処理が有ります。
この関連レコードの生産量と作業時間を集計表示したいという要望です。

 ちなみに日報アプリ側で、製品番号をキーにして数量と作業時間の集計表を作成することで製品別の作業時間を集計するという目的は達成することが出来るのですが、製品マスターを参照した際に、関連レコードで最近の生産量や作業時間がパッと見れた方が良いとの要望でした。

◆デモ画面

試しに、Kintoneの社員マスタと休暇申請アプリを使って、社員マスタの詳細画面に休暇申請アプリの休暇申請日数を関連レコードで表示して、休暇日数の合計を計算できないか試してみました。
以下の画面に「計算」フィールドを追加し、計算式にSUM(休暇日数合計)を設定しても「フィールドが存在しません」というエラーになります。
関連レコードのフィールド名は、計算フィールドで扱えない仕様です。
(2023年10月18日現在)

関連レコード

この問題で悩んでいる人は多い様で、関連レコードの集計を実現する有料のプラグインがネット上で沢山リリースされています。
関連レコード集計プラグイン   価格 250,000円(税抜)
関連レコード集計 プラグイン for kintone 価格 180,000円(税抜)
プラグインを使った集計は高機能ですが、高いですねw

今回も対応方法として、JavaScriptカスタマイズで関連レコードを集計して、レコード詳細画面で集計結果を表示する機能を実現してみました。
今回のカスタマイズは、結果表示が地味なので、関連レコードの集計値を赤字の太字で表示しています。

関連レコードの集計

◆関連レコードの値を集計するJavascriptコード

/*関連レコードの値を集計し、レコード詳細画面で表示する*/
(() => {
    'use strict';

    // 初期設定
    const APP_KEY_FIELD = '製品番号';    // 関連レコードとリレーションするフィールドコード名
    const APP_SPACE_ID  = 'ResultSpace'; // 集計結果を表示したいスペースフィールドのIDを設定

   // 関連レコードのフィールド名で関連レコードのアプリIDをセットする
    const RELATED_APP_ID = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧'); 

   // 関連レコード側の検索・集計条件の設定
    const QUERY_KEY_FIELD = '製品No';   // 関連レコードを検索するフィールドコード名
    const QUERY_TOT_FIELD = '作業時間'; // 関連レコードで集計するフィールドコード名

 //関連でコードの検索クエリと集計を実行する関数
    const displaySumInSpaceField = (event) => {
        // 集計したい関連レコードの検索条件を設定
        const QUERY_CONDITION = `${QUERY_KEY_FIELD}="${event.record[APP_KEY_FIELD].value}"`; 

        const params = {
            'app': RELATED_APP_ID,
            'query': QUERY_CONDITION
        };

        kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, function(resp) {
            let total = 0;
            for (const record of resp.records) {
                total += parseFloat(record[QUERY_TOT_FIELD].value);
            }

            const spaceElement = kintone.app.record.getSpaceElement(APP_SPACE_ID);
            spaceElement.textContent = `合計: ${total.toLocaleString('en-US', { maximumFractionDigits: 2 })}`;

            // 計算結果を太字の赤色で表示するスタイルを適用
            spaceElement.style.fontSize = '16px';
            spaceElement.style.fontWeight = 'bold';
            spaceElement.style.color = 'red';
            spaceElement.style.marginLeft = '20px';

        }, function(error) {
            console.error('APIリクエストエラー: ', error);
        });

        return event;
    };

    kintone.events.on('app.record.detail.show', displaySumInSpaceField);
})();

2つのアプリを操作するので、設定方法が少しややこしいですが、初期設定の2つは、関連レコードを表示している製品マスター側のフィールドコードを設定します。
const APP_KEY_FIELD = '製品番号';
const APP_SPACE_ID = 'ResultSpace';

次に、製品マスター内の関連レコードのフィールドコード名を以下のKintoneAPI関数のカッコ内で指定します。
Kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧');
※これで関連レコードの元データを持っているアプリIDを調べています。

次に関連レコードの元データ側の検索・集計条件の設定をします。
ここは、関連レコードの元データが有る日報アプリ側のフィールドコードを設定します。
const QUERY_KEY_FIELD = '製品No';
const QUERY_TOT_FIELD = '作業時間';

◆検索機能の制限について

Kintoneのレコード詳細画面に表示されている関連レコードの情報は、Javadcriptでは直接操作できない仕様です。
よって関連レコードを集計するには、JavascriptでKintoneAPIの検索クエリを作成して実行しする必要が有ります
また、KintoneAPIのQuery実行では、デフォルトで100件、最大で500件までしかレコードを取得できないという制限が有ります。

(参考)
検索Queryにパラメータを追加することで取得上限を指定できます。
QUERY = '製品No=' + event.record[APP_KEY_FIELD].value + ' limit 500';


よろしければサポートお願いします! いただいたサポートは、note記事制作の活動費に使わせていただきます!