コンテンツにスキップ

items.MaxDate

概要

itemsオブジェクトの「MaxDateメソッド」です。指定したテーブルにある対象の日付項目の最大値を取得します。選択条件を指定して集計対象のレコードを絞り込むことができます。

制限事項

  1. 日付項目以外では使用できません。

構文

items.MaxDate(siteId, columnName, view)

パラメータ

パラメータ 型 必須 説明
siteId object ○ 対象テーブルのサイトIDを指定
columnName string ○ 計算対象の日付項目を指定
view string - 選択するレコードの条件を指定

戻り値

対象テーブルの指定した日付項目の最大値を返却します。

指定した日付項目が見つからなかった場合はutilities.EmptyTimeを返却します。

使用例①

以下の例では、サイトIDが 2 のテーブルに登録されているレコードでA(日付A)の最大値を取得します。

JavaScript
let maxDate = items.MaxDate(2, 'DateA');

使用例②

以下の例では、サイトIDが 2 のテーブルでStatus(状況)が200(実施中)のレコードでDateA(日付A)の最大値を取得します。

JavaScript
let view = {
    "View": {
        "ColumnFilterHash": {
            "Status": "[\"200\"]"
        }
    }
};
let maxDate = items.MaxDate(2, 'DateA', JSON.stringify(view));
context.Log(maxDate);

サンプルコード

1. 親子関係のない別サイトの最新日付を条件チェックに使い、しきい値超過時に警告する

「設備管理」テーブルのレコード画面を開いたとき(新規作成後の遷移を含む)、親子関係のない別テーブル「メンテナンス記録」から対象設備の最新のメンテナンス実施日を取得し、一定期間(既定90日)以上メンテナンスが行われていない、または記録自体が無い場合に、画面上部の「ガイド」エリアへ警告メッセージを表示します。

実務での使いどころ

設備管理・車両管理・機器点検など、「点検記録」と「対象物の管理台帳」が別テーブルに分かれている業務は珍しくありません。台帳側のレコードを開いた時点で、関連する点検記録の最新状態をその場でチェックできれば、点検切れの設備を放置してしまう事故を防げます。レコードを開くたびに再評価されるため、新規登録時に加えて、後日そのレコードを見直したときにも同様に警告されます。

対象テーブル・日付項目名・しきい値を定数化しているため、車両の点検記録、機器の校正記録など、「別テーブルの最新日付を条件チェックに使いたい」他のシナリオにもそのまま転用できます。

事前準備

1:「メンテナンス記録」テーブルに以下の項目を有効化してください。

項目コード 内容
分類A(ClassA) 対象設備名(「設備管理」側の設備名と一致する値を入力)
日付A(DateA) メンテナンス実施日

あわせて「テーブルの管理 > 全般」タブの「サイト名」に「メンテナンス記録」と入力してください。サンプルコードはこのサイト名で「メンテナンス記録」テーブルを探します。

2:「設備管理」テーブルに以下の項目を有効化してください。

項目コード 内容
分類A(ClassA) 設備名(「メンテナンス記録」側のClassAと一致する値を入力)

3:スクリプトを登録します。

3-1:「設備管理」テーブルの「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 3-2:タイトル: 任意の名前(例:maxDateMaintenanceWarning)
 3-3:スクリプト: 下記サンプルコードを貼り付け
 3-4:条件: 「画面表示の前」にチェック

JavaScript
// メンテナンス記録サイトの「サイト名」(テーブルの管理 > 全般 で設定する)
const MAINTENANCE_SITE_NAME = 'メンテナンス記録';
// 最終メンテナンスからの経過日数がこの値を超えたら警告する
const WARNING_THRESHOLD_DAYS = 90;

// 「ガイド」タブの表示エリア(#Guide)へ警告を表示する。
// 「作成前」条件は保存後にレコード自身の画面へリダイレクトされてしまい、
// そのタイミングで追加したメッセージはリダイレクト前の一瞬しか表示されず消える。
// 「画面表示の前」条件(リダイレクトを伴わない画面描画のタイミング)で表示することで、
// 画面を開いている間は消えずに残る。
// 標準の`message`クラスは画面下部に固定表示される専用スタイルのため使わない
// (保存成功トーストと重なって見苦しくなる)。
function showWarning(text) {
    context.AddResponse('ReplaceAll', '#Guide', `<div id="Guide">⚠ ${text}</div>`);
}

const equipmentName = model.ClassA;
const maintenanceSite = items.GetClosestSite(MAINTENANCE_SITE_NAME);

if (!maintenanceSite) {
    logs.LogUserError(
        `[itemsMaxDateMaintenanceWarning] サイト名「${MAINTENANCE_SITE_NAME}」のサイトが見つからないため判定をスキップします`,
        'main',
    );
} else if (!equipmentName) {
    logs.LogUserError(
        '[itemsMaxDateMaintenanceWarning] 設備名(ClassA)が未入力のため判定をスキップします',
        'main',
    );
} else {
    // 分類項目の絞り込みは配列形式+ExactMatchMultipleでないと完全一致にならない
    const view = {
        View: {
            ColumnFilterHash: { ClassA: `["${equipmentName}"]` },
            ColumnFilterSearchTypes: { ClassA: 'ExactMatchMultiple' },
        },
    };
    const lastMaintenanceDate = items.MaxDate(
        maintenanceSite.SiteId,
        'DateA',
        JSON.stringify(view),
    );
    // 該当するメンテナンス記録が無い場合、年が1のDateが返る(utilities.EmptyTimeとは直接比較できない)
    const hasRecord = lastMaintenanceDate && lastMaintenanceDate.getFullYear() > 1;

    if (!hasRecord) {
        showWarning(
            `設備「${equipmentName}」のメンテナンス記録が見つかりません。メンテナンス状況を確認してください。`,
        );
    } else {
        const elapsedDays = Math.floor(
            (new Date() - lastMaintenanceDate) / (1000 * 60 * 60 * 24),
        );
        if (elapsedDays > WARNING_THRESHOLD_DAYS) {
            showWarning(
                `設備「${equipmentName}」の最終メンテナンスから${elapsedDays}日経過しています(しきい値:${WARNING_THRESHOLD_DAYS}日)。メンテナンス状況を確認してください。`,
            );
        }
    }
}

MAINTENANCE_SITE_NAMEには、「メンテナンス記録」テーブルに設定したサイト名を指定します。サイト名で探すため、サイトIDを書き換える必要はありません。

画面の新規作成フォームに「設備名」欄を表示するには、「エディタ」タブで対象項目を「現在の設定」へ追加してください。

関連情報