items.MaxDate
概要¶
itemsオブジェクトの「MaxDateメソッド」です。指定したテーブルにある対象の日付項目の最大値を取得します。選択条件を指定して集計対象のレコードを絞り込むことができます。
制限事項¶
- 日付項目以外では使用できません。
構文¶
パラメータ¶
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
| siteId | object | ○ | 対象テーブルのサイトIDを指定 |
| columnName | string | ○ | 計算対象の日付項目を指定 |
| view | string | - | 選択するレコードの条件を指定 |
戻り値¶
対象テーブルの指定した日付項目の最大値を返却します。
指定した日付項目が見つからなかった場合はutilities.EmptyTimeを返却します。
使用例①¶
以下の例では、サイトIDが 2 のテーブルに登録されているレコードでA(日付A)の最大値を取得します。
JavaScript¶
使用例②¶
以下の例では、サイト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を書き換える必要はありません。
画面の新規作成フォームに「設備名」欄を表示するには、「エディタ」タブで対象項目を「現在の設定」へ追加してください。
