論理削除

最終更新日: 2021年7月8日
R8 | R9

「顧客」モデルに論理削除機能を設定した例です。

「一般ユーザ」と「業務管理者」というプリンシパルを持つ2アカウントで動作を確認します。

2つのアカウントの違いは次の通りです。

アカウントプリンシパル説明
user一般ユーザ論理削除のみ
manager業務管理者※論理削除と物理削除が行える

※「業務管理者」は下図の通り新規追加したプリンシパルです。
プリンシパルの追加手順については「認証・認可 > モデル単位の制御 > 新しいプリンシパルの追加」をお読みください。

プリンシパル「業務管理者」を追加
一般ユーザ
業務管理者

一般ユーザの場合

  1. アカウント「user」でログオンし、顧客データを1件登録します。
    顧客データの登録
  2. 登録後、「削除」ボタンを押下します。
    この時点で、削除ボタンは論理削除として動作する仕様となっています。
    ボタン押下によって、「有効期限」項目に実行時の日付時刻をセットしてデータを更新します。
    論理削除の実行
  3. 暗黙条件を設定し、「有効期限」項目の値が空白(null)のデータのみ検索するようにしています。
    そのため、論理削除したデータは表示されません。
    論理削除されたデータは不可視となる(暗黙条件の設定)

業務管理者の場合

  1. 続いてアカウント「maneger」でログオンします。
    このアカウントにおいては暗黙条件が解除される設定のため、データが表示されます。
    論理削除されたデータを見られる
  2. 詳細画面を開きます。「有効期限」項目に、論理削除を行った日付時刻がセットされていることがわかります。
    有効期限項目の確認

物理削除を行う

業務管理者には物理削除のパーミッションを付与しました。
通常の「削除」ボタンは論理削除処理となっているため、別途「物理削除」ボタンを用意しています。

物理削除ボタンが表示

ボタン押下により、データベースからの削除が行われます。

物理削除の実行

定義方法

  1. 「顧客」モデルに論理削除機能を設定します。「有効期限」項目を用意します。

    ワンポイント

    • 項目名や項目IDは任意ですが、型は必ず「文字列型」としてください。
      保存する値は日付時刻(を意味する文字列)になります。
    • 今回用意した「有効期限」項目は、モデル参照の無効判定項目としても利用できます。
      無効判定の使い方は「選択肢モデル > 選択肢を無効にする」をお読みください。

    顧客モデルに有効期限項目を用意する
  2. この項目を暗黙条件として用います。
    ※「値をデータベースに保存する」設定が有効になっている必要があるため、予めこの設定を確認してください。
    詳細 > 値をデータベースに保存する
    確認ができたら、「暗黙条件」タブより設定を行います。
    今回は「値が null(未入力) と等しい」というルールにします。
    これによって、この項目の値が未入力のデータのみが検索・一覧画面などで表示されるようになります。
    また、適用除外権限を同時に設定します。権限名は "pdelete" とします。(後述)
    暗黙条件の設定
    これにより、データ検索時には常に SQL の where 句に "where valid IS NULL" が付加されます。
  3. 値を入力できないよう、全画面で読み込み専用とします。
    読み込み専用の設定

    ワンポイント

    本番運用時には、この項目を隠し項目としてもかまいません。

  4. 「画面 > その他 > 削除 > データの削除を論理削除にする」を有効にします。
    また、論理削除判定項目には手順1で用意した項目IDを指定します。
    論理削除を有効にする
  5. さらに、詳細画面に物理削除ボタンを用意します。
    「画面 > その他 > 削除 > Javaソースコードの設定」より行います。 設定内容は次の通りです。
    これにより、物理削除の権限をもったアカウントでは物理削除も行えるようになります。
    項目 設定内容 説明
    画面名 詳細表示画面 以下の設定が詳細表示画面に適用されます。
    表示する 表示する 有効にします。
    表示条件 HASPRINCIPAL("manager") 業務管理者プリンシパル "manager" を持っている場合に、物理削除ボタンを表示するようにします。
    ボタン名 物理削除 ボタンの文言です。任意の内容を指定します。
    イベント名 Send 物理削除画面に対してSendイベントを送信する必要があります。
    アクション名 physicalDeleteCustomer 物理削除画面は physicalDelete<モデル名> となります。(*1)
    *1 キャメル記法を適用します。例えばモデルIDが my_funny_valentine の場合は physicalDeleteMyFunnyValentine になります。[詳細...]
    物理削除ボタンの設定
  6. 顧客モデルの「画面 > 機能権限」を開きます。
    ギアアイコンから「パーミッション追加」を選択し、物理削除が可能なパーミッション "pdelete" を追加します。
    pdeleteは固定名です。日本語名は任意です。ここでは "物理削除" とします。
    パーミッションの追加(1)
    パーミッションの追加(2)
  7. このパーミッションを保有するプリンシパルを用意します。
    ギアアイコンから「プリンシパル追加」を選択し、事前に追加しておいた業務管理者(manager)のパーミッションを設定します。
    プリンシパルの追加(1)
    プリンシパルの追加(2)
    • 図1,図2で用意したアカウントは、このプリンシパルを持つように設定されています。
    • 図13の暗黙条件設定では、適用外の権限(パーミッション)として、"pdelete" を設定してます。
    • 図15のボタン追加設定では、このプリンシパル "manager" を持っている場合にボタンを表示すると設定しています。

判定項目を独自に設定するWDN

標準では、論理削除の判定項目には実行時の日付時刻(を示す文字列)が格納されます。
この項目が null なら削除されていないとみなします。

このルールをカスタマイズすることができます。
例として「値が0なら正常、1なら削除」というルールを設定します。

  1. 有効期限(valid)項目の登録時の初期値を "0" とします。
    初期値の設定
  2. 暗黙条件の設定を"0に等しい" とします。
    暗黙条件の設定
  3. 論理削除時に動作するスクリプトを記述します。「画面 > スクリプト > ヘルパ」の実行タイミングで「論理削除」を指定し、次のスクリプトを入力します。
    customer.valid = "1";
    論理削除時に動作するスクリプトの設定

仕様・制約

詳細画面が必要

本設定を用いる場合、対象モデルの詳細画面を用意することが必要です。

未対応の機能

  • CSV・Excelアップロード更新には未対応です。アップロード更新での削除は「物理削除」になります。
  • REST API に対応していません。現在は物理削除のみです。

ボタンの配置

ボタンの表示順序を制御することはできません。オリジナルボタンは常にボタン表示部の右側に配置されます。

スクリプトが優先される

「画面 > スクリプト > ヘルパ」の実行タイミング "論理削除" のスクリプトを用意した場合、こちらが優先されます。(この場合、論理削除項目に日付時刻をセットするJavaコードは生成されません。)

※ スクリプトを作成した状態でビルドを行ってください。(スクリプトがない状態でビルドを行うとJavaコードが生成されます。)