non-programmers salesforce 小ネタブログ

Apexやvisualforceなどプログラミングの力を使わずにどこまでやれるか小ネタを投稿します。

【salesforce】レコード削除時に「アクセス権がありません」を回避して削除できるようにする設定

先日レコードを削除しようとした時にエラーが発生しました。

f:id:non-prog-sf:20160818181956p:plain

これはロールが原因でした。

レコードを削除しようとする時に「アクセス権がありません」のエラーになる理由

例え共有ルールで参照・更新権限を付与されていたとしても、ロール階層で下位のユーザーが上位のユーザーの所有するレコードを削除することはできません。 

知らなかったです。

 

今回はこの問題を解決する方法をフローを使って組みました。今回は商談を削除する場合を例にしています。

まず、このようなフローを作ります。

f:id:non-prog-sf:20160818182149p:plain

手順を説明します。まずレコードの更新で所有者を削除する人に置き換えます。

f:id:non-prog-sf:20160818182213p:plain

 

変数はテキスト形式で商談IDやユーザIDを保管できるように作っておきます。どちらも種別は入力のみです。

f:id:non-prog-sf:20160818182415p:plain

f:id:non-prog-sf:20160818182420p:plain

次にレコードの削除を設定します。所有者を置き換えた商談レコードを削除します。

f:id:non-prog-sf:20160818182501p:plain

 

あとはレコードの更新を開始に設定して、更新→削除の順でつなげます。あとは保存して名前をつけてください。有効化も忘れないようにしてください。

f:id:non-prog-sf:20160818182149p:plain

次にvisualforceの設定をします。

visualforceは従来プログラミングですが、値の置き換えだけでどうにかできるのでそんなに難しくありません。

visualforceは開発→visualforceページにて新規作成します。

f:id:non-prog-sf:20160818183620p:plain

 

以下元となるコードを貼ります。

<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>

f:id:non-prog-sf:20160818183728p:plain

 

以下1つずつ説明します。基本的に色のついた部分を差し替えるだけです。

 

<apex:page standardController="Opportunity">

どのオブジェクトに対して動作させるか、という行です。ここでは商談なのでOpportunityを選びます。カスタムオブジェクトももちろん大丈夫です。その時には__cを付けるのを忘れずに。

<flow:interview name="delete_opportunity"

どのフローを起動させるかです。先ほど保存したフローの名前を紫色の部分に設定してください。

finishLocation="/{!Opportunity.AccountId}">

終わった時にどこにランディングさせるかです。今回は商談データの削除なのでリレーションがある取引先に飛ばすように設定しました。

ここで出てくる{!〜〜〜〜}ですが、カスタムリンクの設定時に出てくる差し込み項目と同じ形式になります。カスタムリンクの画面を同時に開いて、差し込み項目を持ってくるようにするといいと思います。

f:id:non-prog-sf:20160818184941p:plain

<apex:param name="OwnerId" value="{!$User.Id}"/> 
<apex:param name="OpportunityId" value="{!Opportunity.Id}"/>

これはフローの変数(緑色)に対して、入れたい値の参照先(オレンジ色)を設定します。先ほどの差し込み項目で項目を持ってきます。OwnerIdには{!$User.Id}とこのフローを起動する(削除ボタンを押す)ユーザIDを持ってくるように設定します。OpportunityIdには{!Opportunity.Id}と商談IDを設定します。

 

Visualforceの設定は以上です。

次に削除ボタンに対して、このvisualforceを呼び出す設定を行います。

削除したいオブジェクトのボタン、リンク、およびアクションをクリックして、削除の編集をクリックします。

f:id:non-prog-sf:20160826123432p:plain

f:id:non-prog-sf:20160826123441p:plain

上書き手段で先ほど作ったVisualforceページを呼び出します。これを保存すると完成です。

f:id:non-prog-sf:20160826123454p:plain

なお、重要なことですが、ユーザプロファイルなどでフローの実行を有効化しておいてください。

f:id:non-prog-sf:20160826123839p:plain

これをやらないと、以下のようなエラーが出ます。私はここでつまづきました。

f:id:non-prog-sf:20160826123727p:plain

 

手順としてはそこまで複雑ではないかと思います。visualforceのことはよくわかりませんが、フローの呼び出しとして活用する方法を覚えていけば、設定の幅が広がりそうです。