関連レコード集計結果を数値フィールドに表示したい

何を実現したいのかを書きましょう

【関連レコード集計結果を数値フィールドに保存したいです】
お世話になっております。

関連レコードを集計し、スペースフィールドに表示するまでは、何とかできたのですが、その後、集計した結果をまた別で集計したいと言われてしまいました。このため、集計結果を数値フィールドにも出そうと四苦八苦しているのですが、出ません。

下記のコードでスペースフィールドに集計結果を出しているのですが、この後どのようにすれば、数値フィールドにも同じ集計結果を出力することができるでしょうか?

初心者のため、コードもお伺いの仕方もおかしいかもしれません。
何卒よろしくお願い申し上げます。

/*関連レコードの値を集計し、レコード詳細画面で表示する*/
(() => {
    'use strict';
     // 初期設定
    const APP_KEY_FIELD = '社員番号';    // 関連レコードとリレーションするフィールドコード名
    const APP_SPACE_ID  = 'ResultSpace'; // 集計結果を表示したいスペースフィールドのIDを設定
    const APP_DATE_FIELD = '給与月'; // 絞り込み条件に使用
    const APP_CHECK_FIELD = 'チェックボックス';//絞り込み条件に使用
    
   // 関連レコードのフィールド名で関連レコードのアプリIDをセットする
    const RELATED_APP_ID = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧'); 

   // 関連レコード側の検索・集計条件の設定
    const QUERY_KEY_FIELD = '社員番号';   // 関連レコードを検索するフィールドコード名
    const QUERY_TOT_FIELD = '計算'; // 関連レコードで集計するフィールドコード名(h)の方
    const QUERY_DATE_FIELD = '締月';//絞り込み条件に使用
    const QUERY_CHECK_FIELD = 'チェックボックス'; //絞り込み条件に使用

 //関連レコードの検索クエリと集計を実行する関数
    const displaySumInSpaceField = (event) => {
        // 集計したい関連レコードの検索条件を設定
        const QUERY_CONDITION = `${QUERY_KEY_FIELD}="${event.record[APP_KEY_FIELD].value}" and ${QUERY_DATE_FIELD}="${event.record[APP_DATE_FIELD].value}" and チェックボックス in ("同日作業なし")`;
        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 = '20px';
            spaceElement.style.fontWeight = 'bold';
            spaceElement.style.color = 'black';
            spaceElement.style.marginLeft = '20px';
        }, function(error) {
            console.error('APIリクエストエラー: ', error);

        });


        return event;
    };

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

フィールドに保存したい、ということであれば、レコード詳細画面表示イベントで実行するべきではないかとおもいます(全く不可能ではないが…)

レコード保存時のイベントあたりで、フィールドの値を書き換えることができるのでそれが一番素直だとおもいます。
試してみてください。

2 Likes

mura様
お世話になっております。
ご回答いただきありがとうございます。
ご教示いただきましたとおり、レコード保存時のイベントでフィールドの値を書き換えるように変更し、何とか成功しました。が、この方法だと、レコードを編集画面で開いて保存しなおさないと集計値が更新されず困っております。
スペースに表示させるときと同じように’app.record.detail.show’'app.record.edit.show’等試してみたのですが、数値は変わらず、一括空更新等も試してみたのですが、うまくいきません。。。
何とかせめて、一覧画面からの処理程度で、再集計させたいのですが、お助けいただけないでしょうか。。。

レコード保存時のイベントは、画面から保存ボタンを押したときにしか動作しません。

任意のタイミングで再計算させ、その値をレコードのデータをして保存させるには、REST APIを利用する必要がありますね。
レコード更新のAPIを使うと更新できます。( kintone REST API リクエストを送信する APIを使ったリクエスト を参照)

下記がベーシックですかね。

  1. 1レコードを更新する機能をつくる場合
    1. 詳細画面の上部等にボタンを配置(このあたり参考
    2. そのボタンを押したときに再計算し、上記のようにREST APIを用いて保存
  2. 複数レコードを一括で更新する機能をつくる場合
    1. 一覧画面の上部等にボタンを配置(このあたり参考
    2. そのボタンを押したときに再計算し、上記のようにREST APIを用いて保存。ただし1件のときとは違い、複数のレコードをループしながら処理を実行する

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