いつ使う: 「削除」ボタンを押しても物理的には消さず、削除フラグを立てるだけ。後から復活できる、または監査要件で履歴が必要な場合。
- 一般ユーザー画面: 「削除」ボタンを押すとレコードが見えなくなる (一覧から消える) - 管理画面: 削除済みレコードも表示。フラグを戻して復活できるsoft_delete_items
├── id PK
├── name TEXT
└── LogicalDelete BOOLEAN ← CLB 予約名 (この綴りでないと動かない)
| モジュール | テーブル | 役割 |
|---|---|---|
SoftDeleteItem |
soft_delete_items |
一般ユーザー用。LogicalDelete 予約名で論理削除自動動作 |
SoftDeleteItemAdmin |
soft_delete_items (同じテーブル) |
管理用。Boolean 名を予約名以外 (例: DeletedFlag) にして自動フィルタを回避 |
DeletedAtItem / DeletedAtItemAdmin |
deleted_at_items |
削除時刻 (DeletedAt) を自動記録するバリエーション (標準パターン集)。下記参照 |
AuditDeleteItem / AuditDeleteItemAdmin |
audit_delete_items |
削除者 + 削除時刻 (Deleter + DeletedAt) を自動記録する監査バリエーション (「認証・権限」グループ)。下記参照 |
BooleanFieldDesignを作ってNameを必ず"LogicalDelete"にする (CLB の予約名)- これだけで CLB の削除ボタンが
UPDATE SET LogicalDelete = trueに変わる - 一覧表示時も
LogicalDelete = falseで自動フィルタされる - UI には出さず Fields にだけ定義 (一覧で空セルになるので)
LogicalDelete (Boolean) の代わりに、削除の 時刻 と 実行者 を記録する予約名フィールドを置くと、CLB が論理削除時に自動でセットする。Boolean フラグは無くてもよい (DeletedAt か Deleter のいずれかがあれば論理削除扱いになり、DeletedAt/Deleter が値を持つ行=削除済みとして一覧から自動除外される)。
| フィールド名 (予約名) | 型 | 論理削除時の自動動作 |
|---|---|---|
DeletedAt |
DateTime | 削除時刻を自動セット |
Deleter |
Link → ユーザー (AppUser) | 削除実行者 (ログインユーザー) を自動セット |
DeletedAtは認証不要。時刻だけなのでログインの有無に関係なく動くDeleterは認証が前提。ログインユーザーをAppUserへのリンクとして記録する (認証を外したアプリでは実行者を特定できず空になる)。標準パターン集ではサイドバー「認証・権限」グループに収録- 管理画面は
LogicalDelete版と同じく 別モジュール (同じテーブル) + フィールド名を予約名以外 (DeletedAtView/DeleterView) にして自動フィルタを回避し、削除済みの「いつ・誰が」を表示する。DeletedAtViewを空にして更新すると復活する
- サイドバー
データ操作/論理削除/フラグ→SoftDeleteItem(一般画面) - サイドバー
データ操作/論理削除/フラグ管理→SoftDeleteItemAdmin(削除済も見える管理画面) - サイドバー
データ操作/論理削除/時刻→DeletedAtItem(一般画面、DeletedAtで削除時刻を自動記録) - サイドバー
データ操作/論理削除/時刻管理→DeletedAtItemAdmin(削除済の削除時刻を表示する管理画面)
- サイドバー
認証・権限/削除監査 (削除者記録)→AuditDeleteItem(一般画面、Deleter+DeletedAtで削除者・時刻を自動記録) - 管理画面 (
AdminFrame) サイドバー削除監査 (管理)→AuditDeleteItemAdmin(削除済の「いつ・誰が」を表示)
「消したデータは残したいが、元テーブルは肥大化させたくない」場合は、行を残す論理削除ではなく、削除時に別テーブル(退避テーブル)へコピーしてから元テーブルから物理削除する方式が使える。DeleteArchiveField を Module に 1 つ置くだけで削除操作がこの動作に切り替わる。
- 元テーブルは常に「生きているデータだけ」になり、削除済みは退避テーブルに集まる
- 退避テーブルは元テーブルと同じ列 + 任意の削除日時・削除者列で作る
- 復活は退避テーブルからの手動リストアになる(論理削除のフラグ戻しほど手軽ではない)
- 論理削除(
LogicalDelete/DeletedAt/Deleter)とは併用できない(デザインチェックでエラー)。どちらか一方を選ぶ
詳細は DeleteArchiveField を参照。
- フィールド名は必ず
LogicalDeleteの綴り。IsDeleted等の任意名だと CLB の自動動作が効かない - 管理画面用は 別モジュール (同じテーブルを参照) + Boolean 名を予約名以外にして自動フィルタを回避
DeletedAtは DateTime、Deleterは Link (→ AppUser) で作る。型が違うと削除マーカーとして認識されないDeleter/DeletedAtは論理削除時に CLB が自動でセットするので、スクリプトで代入する必要はない (Creator/CreatedAtと同じ)
- アプリ作成パターン一覧 ─ 全パターンのインデックス
- モジュール定義の全体構造
- Field リファレンス ─ LinkField / ListField / DetailListField / ModuleField 等の詳細
