【salesforce】レコード削除時に「アクセス権がありません」を回避して削除できるようにする設定
先日レコードを削除しようとした時にエラーが発生しました。
これはロールが原因でした。
レコードを削除しようとする時に「アクセス権がありません」のエラーになる理由
例え共有ルールで参照・更新権限を付与されていたとしても、ロール階層で下位のユーザーが上位のユーザーの所有するレコードを削除することはできません。
知らなかったです。
今回はこの問題を解決する方法をフローを使って組みました。今回は商談を削除する場合を例にしています。
まず、このようなフローを作ります。
手順を説明します。まずレコードの更新で所有者を削除する人に置き換えます。
変数はテキスト形式で商談IDやユーザIDを保管できるように作っておきます。どちらも種別は入力のみです。
次にレコードの削除を設定します。所有者を置き換えた商談レコードを削除します。
あとはレコードの更新を開始に設定して、更新→削除の順でつなげます。あとは保存して名前をつけてください。有効化も忘れないようにしてください。
次にvisualforceの設定をします。
visualforceは従来プログラミングですが、値の置き換えだけでどうにかできるのでそんなに難しくありません。
visualforceは開発→visualforceページにて新規作成します。
以下元となるコードを貼ります。
<apex:page standardController="Opportunity">
<flow:interview name="delete_opportunity"
finishLocation="/{!Opportunity.AccountId}">
<apex:param name="OwnerId" value="{!$User.Id}"/>
<apex:param name="OpportunityId" value="{!Opportunity.Id}"/> </flow:interview> </apex:page>
以下1つずつ説明します。基本的に色のついた部分を差し替えるだけです。
<apex:page standardController="Opportunity">
どのオブジェクトに対して動作させるか、という行です。ここでは商談なのでOpportunityを選びます。カスタムオブジェクトももちろん大丈夫です。その時には__cを付けるのを忘れずに。
<flow:interview name="delete_opportunity"
どのフローを起動させるかです。先ほど保存したフローの名前を紫色の部分に設定してください。
finishLocation="/{!Opportunity.AccountId}">
終わった時にどこにランディングさせるかです。今回は商談データの削除なのでリレーションがある取引先に飛ばすように設定しました。
ここで出てくる{!〜〜〜〜}ですが、カスタムリンクの設定時に出てくる差し込み項目と同じ形式になります。カスタムリンクの画面を同時に開いて、差し込み項目を持ってくるようにするといいと思います。
<apex:param name="OwnerId" value="{!$User.Id}"/>
<apex:param name="OpportunityId" value="{!Opportunity.Id}"/>
これはフローの変数(緑色)に対して、入れたい値の参照先(オレンジ色)を設定します。先ほどの差し込み項目で項目を持ってきます。OwnerIdには{!$User.Id}とこのフローを起動する(削除ボタンを押す)ユーザIDを持ってくるように設定します。OpportunityIdには{!Opportunity.Id}と商談IDを設定します。
Visualforceの設定は以上です。
次に削除ボタンに対して、このvisualforceを呼び出す設定を行います。
削除したいオブジェクトのボタン、リンク、およびアクションをクリックして、削除の編集をクリックします。
上書き手段で先ほど作ったVisualforceページを呼び出します。これを保存すると完成です。
なお、重要なことですが、ユーザプロファイルなどでフローの実行を有効化しておいてください。
これをやらないと、以下のようなエラーが出ます。私はここでつまづきました。
手順としてはそこまで複雑ではないかと思います。visualforceのことはよくわかりませんが、フローの呼び出しとして活用する方法を覚えていけば、設定の幅が広がりそうです。