レコードの削除を制御したい

レコードの削除を制御したい
58
レコードの削除を制御したい
kazunii
2024/02/14 17:10:56

はじめに


まだまだ、寒い日が続きますね、早く春が来ないかなぁ。。。
今年は、桜の開花が「例年並かそれより早くなりそう」と、最近ニュースで見たのですが、いつもより早くお花見ができそうだなぁと思って、なんだか嬉しくなりました🌸😄🍺
体調を崩しやすい季節ですので、皆さまも暖かくしておすごしください。

さて本題に入りますが、「レコードの削除を制御したい」と、お客様から要望をいただくことが、たまに(いや必ず)あります。
「普段はレコードの作成や削除は自由に行えるが、消してほしくない条件になったレコードは消せない様にしたい」と、言う要望です。

最近は、フローの「カスタムエラー」で制御できるようになっているようですが、以前はその機能が無かったので「基本的に標準機能ではレコードの削除を制御できないんです、要件によっては開発が必要なんです。。。」と、お客様に説明していました。
ただ、標準機能だけでも苦肉の策で、削除を制御できる方法を考えて提案したこともありましたので、今回はその方法をお伝えしようと思います。
この方法を知っている事で、お客様への提案の幅が広がるのかなとも思っておりますし、何かの気付きになればなと思いまして書いてみました。

参考:カスタムエラーで主従関係の子レコードがあるときは親レコードを削除させない

レコード削除の恐ろしさ


salesforceは「主従関係」の場合、親レコードを削除すると、その子レコードは、何もアラートを出さずに、サクッとすべて削除されてしまいます。
 例えば、取引先を削除すると、紐づくすべての商談が削除されてしまいます。

ちなみに、標準オブジェクトでは、少しだけレコードの削除が制御されていて、成立した商談などががあると、その取引先は削除できないように制御はかかっているようなので、少しは安心ですね♪

レコードを削除した本人も気づかないうちに、関連するレコードまでサクッと消されてしまうのは、怖いですね。。。
集計に利用している、大事なレコードが削除されてしまうと、影響が出てしまいます。。。
また、一部のユーザに「レコードの削除の権限を与えない」と、言う方法もありますが、それだと不要になったレコードが増えてしまい、それをどうやって消していくのかと言う問題も出てきます。。。

ここからは、ユーザには削除権限は与えて、ある条件になるとレコードを削除できない様にする方法をお伝えします。

(ユースケース)
 前提:商談には「予算化」のチェックボックスがあり、これにチェックが入っている商談は、会社の予算として集計されている
    1. 予算化された商談を削除させたくない(商談の削除を制御)
    2. 予算化された商談を持つ取引先は削除させたくない(取引先の削除を制御)

予算化された商談を削除させたくない


ここでは、予算化されている「商談」レコード自体の、削除を制御する方法を説明します。
取引先と商談の主従関係を利用して、取引先に「積み上げ集計」項目と「入力規則」を作成して課題解決を図ります。

設定内容
(取引先に作成する項目)
  1. すべての商談件数
    • 積み上げ集計 商談の件数
  2. 予算化された商談件数
    • 積み上げ集計 商談の件数
    • 条件:予算化にチェックがある
(取引先に作成する入力規則)
  1. 予算化された商談削除のチェック
  ※下のどちらの条件も一致したときにエラーとする
   1.商談の削除を検知する
     変更前のすべての商談件数 > 変更後のすべての商談件数
   2.予算化された商談の減少を検知する
     変更前の予算化された商談件数 > 変更後の予算化された商談件数

動作イメージ
予算化された商談のレコードを削除しようとすると、紐づく取引先の入力規則が動作して、エラーメッセージも表示されます。


予算化された商談を持つ取引先は削除させたくない


ここでは、商談の親である「取引先」レコードの削除を制御する方法を説明します。
取引先に「入力規則」の作成と、フローを利用して課題解決を図ります。
また、カスタムエラーを利用した場合の説明も、後ろの方で触れております。

設定内容
(取引先に作成する項目)
  1. DeleteNG チェックボックス
(取引先に作成する入力規則)
  1. 取引先の削除チェック
    • DeleteNGにチェックが入っている場合エラーとする
(作成するフロー)
  1. 取引先の削除チェック
    • 開始条件:レコードフロートリガー 取引先、取引先レコードが削除される前
    • 処理の流れ:紐づく商談の「予算化」にチェックが入っているものが存在した場合に、取引先の「DeleteNG」にチェックを入れる
動作イメージ
取引先を削除しようとすると、フローのレコードの更新で、取引先のDeleteNGにチェックが入いるので、入力規則が動作してレコードの更新できないと言うエラーが出ます。
そのため、レコードの削除は行わまれません。
ただし、システムエラーがそのまま表示されてしまい、操作している人は戸惑ってしまいます。
更に、フローでエラーが出ているため、管理者にエラーが出たことのメールが送信されてしまいます。
今は、フローに「カスタムエラー」があるので、それを利用して分かりやすいメッセージを出すのがスマートだと思います。上のフロー図で、レコードの更新を行っていた場所にカスタムエラーを配置するイメージです。

カスタムエラーを利用した場合
(作成するフロー)
  1. 取引先の削除チェック(カスタムエラー利用)
    • 開始条件:レコードフロートリガー 取引先、取引先が削除される前
    • 処理の流れ:紐づく商談に「予算化」にチェックが入っているものが存在した場合に、エラーを表示させる
  ※取引先に項目や、入力規則の作成を行う必要が無くなります。
動作イメージ
カスタムエラーの方が、分かりやすいメッセージが表示されるので、操作している人が戸惑うこともありません。また、フローの処理は、カスタムエラーが出ることで、取引先の削除処理はキャンセルされます。
更に、フローでは本当のエラーが出ているわけではないため、管理者にエラーが出たことのメールは送信されません。


おわりに


今回は、フローのカスタムエラーを利用しない、標準機能で「レコードの削除を制御する方法」を説明しました。
  1. 予算化された商談を削除させたくない(商談の削除を制御)
  2. 予算化された商談を持つ取引先は削除させたくない(取引先の削除を制御)
今考えると、かなり力技な感じもしますが、「カスタムエラー」が無かったあの頃に、標準機能だけで作れたこの機能は、お客様にとても重宝されました。

salesforceのバージョンアップにより、どんどんできることが広がっていく事は、嬉しいです。
その反面、今まで開発者が行っていた事も、私達アドミニストレータが担当することになるので、なんだか大変な気もします。
ただ、今まで制限があって諦めていたことが、プログラムを書かなくても設定できる様になるのは、技術者のハシクレとしては、やっぱり嬉しいんですよねぇ♪

ご活用ください。
gilde tech(for Salesforce)」に入会しませんか?
登録すると、「gilde tech」に掲載されているSalesforceのノウハウを全部閲覧できるだけでなく、自分が知っている知識を発信し、他の会員と交流することもできます。
またSalesforceの知識習得に役立つイベント情報も得ることができます。
是非ここで得た知識を業務に活かしてください!
58
コメント