items.BulkDelete
概要¶
指定したサイトのレコードを一括削除します。選択条件を指定して削除対象のレコードを絞り込むことができます。
構文¶
パラメータ¶
| パラメータ | 型 | 必須 | 概要 |
|---|---|---|---|
| siteId | long | ○ | 対象テーブルのサイトIDを指定。 |
| data | string | ○ | 一括削除するレコードの条件等をJSON形式で指定。JSONの仕様は レコード一括削除API の「設定値」を参照。 |
戻り値¶
一括削除したレコード数を返却します。削除できなかった場合は0を返却します。
使用例 1¶
以下の例では、サイトID 123 のテーブルにある Status(状況) が 900(完了) のレコードを削除します。
JavaScript¶
let data = {
View: {
ColumnFilterHash: {
Status: "[900]"
}
}
};
items.BulkDelete(123, JSON.stringify(data));
使用例 2¶
以下の例では、サイトID 123 のテーブルにある レコードIDが 1000,1003,1400のレコードを削除します。
JavaScript¶
使用例 3¶
以下の例では、サイトID 123 のテーブルにある全レコードを削除します。
JavaScript¶
サンプルコード¶
1. 案件を削除したとき、その案件の作業明細をまとめて削除する
案件管理のテーブルで案件を削除したあと、作業明細のテーブルに残っている、その案件の明細をitems.BulkDeleteでまとめて削除します。
実務での使いどころ¶
案件と作業明細、受注と出荷明細のように、親のレコードに明細がぶら下がる構成で、親を削除したあとも明細が残り続けるのを防げます。標準の機能には、あるテーブルのレコードの削除に合わせて、別のテーブルのレコードを削除する仕組みがありません。明細を1件ずつitems.Deleteで削除するのと違い、1回の呼び出しでまとめて削除できます。
事前準備¶
1:「作業明細」テーブル(記録テーブル)で、以下の項目を有効化してください。
| 項目コード | 内容 |
|---|---|
| タイトル(Title) | 作業内容 |
| 分類A(ClassA) | 親の案件ID。案件管理テーブルへのリンクでも、自由入力でもかまいません |
あわせて「テーブルの管理 > 全般」タブの「サイト名」に「作業明細」と入力してください。サンプルコードはこのサイト名で「作業明細」テーブルを探します。
2:「案件管理」テーブルにスクリプトを登録します。
2-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
2-2:タイトル: 任意の名前(例:deleteDetailsWithParent)
2-3:スクリプト: 下記サンプルコードを貼り付け
2-4:条件: 「削除後」にチェック
JavaScript¶
// 作業明細テーブルの「サイト名」(テーブルの管理 > 全般 で設定する)
const DETAIL_SITE_NAME = '作業明細';
// 作業明細で、親の案件IDを持つ項目
const PARENT_ID_COLUMN = 'ClassA';
// 案件を削除したあと、その案件の作業明細をまとめて削除する
function deleteDetails() {
const detailSite = items.GetClosestSite(DETAIL_SITE_NAME);
if (!detailSite) {
logs.LogUserError(
`[deleteDetailsWithParent] サイト名「${DETAIL_SITE_NAME}」のサイトが見つからないため削除をスキップします`,
'main',
);
return;
}
// 「削除後」では、context.Id に削除したレコードのIDが入る
const parentId = String(context.Id);
// 分類項目の絞り込みは、配列形式+ExactMatchMultipleでないと完全一致にならない
const view = {
View: {
ColumnFilterHash: { [PARENT_ID_COLUMN]: `["${parentId}"]` },
ColumnFilterSearchTypes: { [PARENT_ID_COLUMN]: 'ExactMatchMultiple' },
},
};
const candidates = Array.from(items.Get(detailSite.SiteId, JSON.stringify(view)));
// 削除は取り消せないため、値が完全に一致するレコードだけを選び、IDで指定して削除する
const targetIds = candidates
.filter((item) => String(item[PARENT_ID_COLUMN]) === parentId)
.map((item) => item.ResultId);
logs.LogInfo(
`[deleteDetailsWithParent] 案件ID=${parentId} 候補${candidates.length}件 削除対象${targetIds.length}件`,
'main',
);
// 0件のまま呼ばない(Selected が空の指定を避ける)
if (targetIds.length === 0) {
return;
}
const count = items.BulkDelete(detailSite.SiteId, JSON.stringify({ Selected: targetIds }));
logs.LogInfo(`[deleteDetailsWithParent] 案件ID=${parentId} 作業明細を${count}件削除しました`, 'main');
}
deleteDetails();
注記¶
- 「削除後」で動かすため、案件の削除が終わってから明細を削除します。「削除前」で動かすと、明細を削除したあとに案件の削除が失敗したとき、案件が残ったまま明細が消えてしまいます。
- 「削除後」では、
context.Idに削除した案件のレコードIDが入ります。 - 一覧画面で複数の案件を選んで一括削除したときは「削除後」が動かないため、明細は残ります。
- 削除した明細は、作業明細テーブルのごみ箱に入ります。ごみ箱から元に戻せます。
- 明細の絞り込みは、配列形式の値と
ExactMatchMultipleで完全一致にしています。分類項目の設定(リンク・自由入力)やバージョンによっては、検索方法を指定しないと、部分一致になったり、1件も当たらなかったりします。関係の無い明細を消さないよう、取得した明細の値が案件IDと一致することもコードで確かめ、レコードIDをSelectedで指定して削除しています。 - 作業明細が期限付きテーブルの場合は、
item.ResultIdをitem.IssueIdにしてください。
注意事項¶
こちらはサーバスクリプトで使用するメソッドです。スクリプトでは使用できません。
