コンテンツにスキップ

items.BulkDelete

概要

指定したサイトのレコードを一括削除します。選択条件を指定して削除対象のレコードを絞り込むことができます。

構文

items.BulkDelete(siteId, data)

パラメータ

パラメータ 型 必須 概要
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
let data = {
    Selected: [1000,1003,1400]
};
items.BulkDelete(123, JSON.stringify(data));

使用例 3

以下の例では、サイトID 123 のテーブルにある全レコードを削除します。

JavaScript
let data = {
    All: true
};
items.BulkDelete(123, JSON.stringify(data));

サンプルコード

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にしてください。

注意事項

こちらはサーバスクリプトで使用するメソッドです。スクリプトでは使用できません。

関連情報