見出し画像

関連レコードと合計を表示するテーブルの実装(5/5)

やりたいこと

アプリにテーブル形式で関連レコードの明細表示と金額フィールドの合計を表示します。テーブル形式の表示パーツにkintone UI Component v1の部品ReadOnlyTable利用して、Kintoneライクな外見で表示します。

※本記事では「KUC版読取り専用テーブル」と呼びます。
※サンプルとしてKintoneアプリストアの「営業支援パック」を使用します。

今回のカスタマイズは、全体で120行を超える大きなコードになりますので、手順を分割して全部で5回のシリーズで公開しています。
今回は第5回目です(過去記事は以下のリンクから参照可能です)。

第1回:KUC版読取り専用テーブルの仕組み
第2回:他アプリのデータをKUC版読取り専用テーブルに読み込む
第3回:金額の3桁カンマ編集とユーザー選択フィールドの編集
第4回:案件名に案件レコードのリンクを貼り付ける
第5回:金額フィールドの合計を計算して表示する(今回)


第5回:金額フィールドの合計を計算して表示する

第5回(最終回)では、標準の関連テーブルには無い機能、テーブルデータを合計して表示する機能を実装します。
具体的には、テーブルの費用合計の列を集計して合計を表示します。

第5回:テーブルの合計金額を表示

1.アプリの準備

「営業支援パック」の顧客管理アプリのフォーム設定画面を開いて、
案件一覧(標準の関連レコードフィールド)の上にスペースを追加して、
スペース要素IDに「total_space」を追加して下さい。
※テーブルの表示が乱れない様にスペースは十分な幅を取ってください。
<KUC版読取り専用テーブルの動作試験用アプリ>
・スペース  :要素ID:Related_space(第2回で追加済み)
・スペース  :要素ID:total_space (今回追加)

第5回:フォーム設計画面

合計金額表示用のスペース(total_space)を別途用意する理由は、kintone UI Component v1のコンポーネントの表示領域に他のHTML要素が混在すると、予期しない不具合が起きる可能性があるためです。

実際に既存のKUC版読取り専用テーブル表示用スペース(Related_space)に合計金額のHTML要素を追加したら、KUC版読取り専用テーブルプロパティの一部(paginationの表示/非表示)が正常に作用しない現象が発生しました。

2.Javascriptコードの変更

(1)初期設定の変更

関連付けするアプリIDとフィールドの初期設定、関連レコードの出力しペースに「合計金額」の出力スペース名も追加します。
以下に初期設定部分の修正後のコードを掲載します。

//関連付けするアプリのID番号
const relAppid = 123; 

// 関連付けフィールドの初期設定
const relatedKeycode = '顧客管理レコード番号_関連レコード紐付け用';
const relatedItem01  = '案件名';
const relatedItem02  = '確度';
const relatedItem03  = '受注予定日';
const relatedItem04  = '合計費用';
const relatedItem05  = '商談担当者';

//関連レコードの出力スペース
const resultSpaceId = 'Related_space'; // KUC版テーブル表示スペース
const totalSpaceId  = 'total_space';   // 合計金額表示スペース
// <---  初期設定ここまで --->

(2)レコード取得と表示関数の変更点

  1. 関数の引数に合計金額表示スペース(totalElement)を追加

  2. レコード数繰り返し処理前に合計金額集計用の変数の初期化

  3. レコード数繰り返し処理中に合計の集計ロジックを追加

  4. 合計の表示ロジックを追加

上記の変更・追加箇所を赤字で表示します。
(noteでは文字色を付けられないので、画像で投稿しています)

レコード取得と表示関数の変更点

修正後のコードは以下の通りです。

// レコードの取得と表示
async function fetchAndDisplayRecords(relatedKey, tableElement, totalElement) {
    const appID = relAppid;
    const query = `${relatedKeycode} in ("${relatedKey}") order by ${relatedItem04} desc`;

    try {
        const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
            app: appID,
            query: query
        });

        if (resp.records.length > 0) {
            let total = 0;    // 合計金額の初期化
            let tblData = []; // テーブル行プロパティの初期化
            // レコード数の繰り返し処理
            resp.records.forEach((record, index) => {                        
                tblData.push({
                    index: index,
                    field01: recordLinkset(record[relatedItem01].value,appID,record.$id.value),
                    field02: record[relatedItem02].value,
                    field03: record[relatedItem03].value,
                    field04: tripleDigitSeparator(record[relatedItem04].value),
                    field05: getUserValues(record[relatedItem05].value),
                });
                total += Number(record[relatedItem04].value); // 合計の集計
            });
            // KUC版読取り専用テーブル表示
            tableElement.innerHTML = ''; // 結果表示スペースの初期化
            createKUCReadOnlyTable(tblColumns, tblData, tableElement);
            // 合計の表示
            totalElement.innerHTML = ''; // 合計表示スペースの初期化
            const sumString = tripleDigitSeparator(total); // 3桁カンマ編集
            totalElement.innerHTML = '<b style="color: blue;"> 合計金額:' + sumString + '</b>';
        } else {
            tableElement.innerHTML = '<b style="color: blue;">関連データがありません</b>';
        }
    } catch (error) {
        console.error(error);
        tableElement.textContent = `データの取得中にエラーが発生しました: ${error.message}`;
    }
}

(3)動作イベント処理の変更

  1. 合計金額表示スペース取得の処理追加

  2. スペース要素チェックロジックの追加

  3. レコード取得と表示関数の引数に合計表示スペースを追加

上記の1番と3番の変更・追加箇所を「赤色」で表示します。
2番は文字数が多いので「青色」で表示しています。
(noteでは文字色を付けられないので、画像で投稿しています)

動作イベント処理の修正箇所

修正後のコードは以下の通りです。

// 動作イベントの設定
kintone.events.on(['app.record.edit.show', 'app.record.detail.show'], function (event) {
    const tableElement = kintone.app.record.getSpaceElement(resultSpaceId); // テーブル表示スペースの取得
    const totalElement = kintone.app.record.getSpaceElement(totalSpaceId);  // 合計金額表示スペースの取得
    // スペース要素のチェック
    switch (true) {
        case !tableElement && !totalElement:
            console.error('指定スペース要素が見つかりません: ' + resultSpaceId + ' & ' + totalSpaceId);
            break;
        case !tableElement:
            console.error('指定スペース要素が見つかりません: ' + resultSpaceId);
            break;
        case !totalElement:
            console.error('指定スペース要素が見つかりません: ' + totalSpaceId);
            break;
        default:
            // エラー無しの処理
            break;
    }
    // 関連付Key(レコード番号)で検索とテーブル明細・合計表示
    const relatedKey = kintone.app.record.getId();
    fetchAndDisplayRecords(relatedKey, tableElement, totalElement);
    return event;
});

(4)実装後のデモ画面

第5回(最終回)の修正コードを実装したデモ画面です。
表示するレコードの切り替えで合計金額が集計・表示されています。

第5回:実行デモ画面

プロパティ変更のデモ画面

KUC版読取り専用テーブル」のプロパティ変更のデモ画面です。
デモ画面では、チェックボックスがチェックされた列だけを表示する様に、チェックボックスのchangイベントで、列要素のvisibleプロパティを変更しています。Column[列番号].visible=true/false で操作可能です。

列の表示/非表示のデモ画面

カスタマイズした感想

今回(第5回)で、kintone UI Component v1のコンポーネントReadOnlyTable(記事内では「KUC版読取り専用テーブル」と呼んでます)を利用した関連レコード表示のカスタマイズの説明は終了です。

kintone UI Component v1のコンポーネントを使わずにHTML<TABLE>タグを用いても似たような機能は実装可能ですが、KintoneライクなUIデザインが簡単に使えること、コンポーネントのプロパティ変更で、テーブルのタイトル、行数、列の表示/非表示を変更できる利便性があります。
テーブル列の合計以外に、平均、最大値、最小値を計算して表示することもやろうと思えば実現可能です。

本シリーズの連載を最後まで読んで頂いてありがとうございました。

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