non-programmers salesforce 小ネタブログ

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

リストビューで一括更新するボタンをほぼノンプログラミングで作る【Salesforce】

リストビューにカスタムボタンを追加して、チェックボックスを付けたレコードの一括更新をしたいという要望に対応しました。

 

これまでこのような課題に対応するにはjavascriptでのコーディングが必要と考えられてきました。

dackdive.hateblo.jp

リストビュー内カスタムボタンによるレコードの一括更新

https://developer.salesforce.com/forums/?id=906F0000000D7JPIA0

 

これをVisualWork Flowでどうにか実現したい!ということで色々頭をひねった結果が次のとおりです。

 

今回はケースにある3項目をボタン一つでまとめて更新します。

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

 

まずループを設定します。いつものことですが、ループ対象はSオブジェクトコレクション変数、ループ変数はSオブジェクト変数です。

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

ループ対象にはSオブジェクトコレクション変数を設定します。入力/出力種別は入力のみに設定します。

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

 

Sオブジェクト変数も合わせて設定します。こちらは非公開で大丈夫です。

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

 

ループの次は割り当てです。変数の設定がポイントです。

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

変数は先ほど作成したSオブジェクト変数から変更させたい項目を選ぶのです。今回の場合このあと高速更新を行うのですが、このときにはSオブジェクト変数で該当の項目に値を割り当てます。

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

また、先ほどの割り当てですが、変数を指定して、外部の値を取り込むことも可能です(上記の画像であれば{!User})。

 

割り当ての次にもう一つ割り当てを設定します。割り当て2と仮に呼びます。ここで変数には新しくSオブジェクトコレクション変数を作ります。値には既に作成したSオブジェクト変数を設定します。

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

 

作成するSオブジェクトコレクション変数は非公開のもので大丈夫です。

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

 

次に高速更新を設定します。変数には割り当て2で新規作成したSオブジェクトコレクション変数を設定します。

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

 

以上、作ったものをつないでいきます。ループをスタートとしてループ→割り当て1→割り当て2→ループとして、ループの終了を高速更新につなげます。これでフローは完成です。

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

 

次にVisualforceの設定をします。

こんなコードです。

-----------------------------------

<apex:page standardController="Case" recordSetVar="Cases">
<flow:interview name="ListUpdateCase"
finishLocation="{!URLFOR('/500?')}">
<apex:param name="SOCCase1" value="{!Selected}"/>
<apex:param name="User" value="{!$User.Id}"/>
</flow:interview>
</apex:page>

-----------------------------------

 

順に説明します。

standardController="Case"

ここの赤字は対象のオブジェクトを設定します。

 recordSetVar="Cases"

というrecordSetVarというところがあるのですが、

ここは何か任意の文字列を入れていればいいようです。

 

<flow:interview name="ListUpdateCase"
finishLocation="{!URLFOR('/500?')}">

紫色のところにフロー名を、水色のところに完了後にランディングさせたいページリンクを入れます。通常、元のリストビューに戻って欲しいので、リストビューのURLを入れると思います。

 

<apex:param name="SOCCase1" value="{!Selected}"/>
<apex:param name="User" value="{!$User.Id}"/>

緑色にフローの変数を、茶色のvalueに値を入れます。フロー作成時にSオブジェクトコレクション変数を入力のみに設定しましたが、これには{!Selected}を割り当てます。これはリストビューでチェックされたレコードのIDを持ってきてくれるようです。

また、操作ユーザのIDは{!$User.Id}で持ってきます。

 

これでVisualforceは完了です。

 

次にカスタムボタンの設定です。

該当オブジェクトのボタン、リンク、及びアクションで新規ボタンまたはリンクをクリックします。表示の種類をリストボタンにして、チェックボックスの表示にもチェックを入れます。動作は「現在のウィンドウにサイドバー及びヘッダーなしで表示」を選び、内容のソースはVisualforceページにして、先ほど作ったVisualforceページを選択します。

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

 

次で最後です。検索レイアウトからボタンをリストビューに表示させます。検索レイアウトを開いて、リストビューで編集を押します。

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

カスタムボタン欄に先ほど作ったものがあるので、それを選択します。以上で完了です。

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

動作確認です。リストビューでレコードを選び、ボタンを押してみます。

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

無事更新されました。

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

 

削除版も作りました。

non-prog-sf.hatenablog.com