フローで複数のレコードを一括で変更する
プロセスビルダーを利用されている方は多いと思いますが、プロセスビルダーでは実現が難しいことの1つに関連するレコードを一括で変更すると言うことがあります。
こういう場合には、フローという機能を使います。
このフロー、やや玄人仕様なので、ちょっと難しいです(プログラミングの経験がないとすーっと入ってきません)
ゴール
オブジェクトAというカスタムオブジェクトには、取引先と状態(State__c)があります。
レコードが作成または更新されたタイミング(上図では左側の緑)で、同じ取引先で状態が空のものを、同じ状態として更新するというフローを作っていきます。
実現方法
フローで複数のレコードを一括で変更する場合は、フローのトリガーが使えません(フローのレコードトリガーでは更新されたレコードのみが更新対象になります)
複数のレコードを一括で変更する場合は、プロセスビルダーからフローを起動するという方法にします。
プロセスビルダーでレコードが作成、更新されたことをキャッチしたら、フローの入力変数にそのレコードIDを渡して、フローを起動するという方法をとります。
フローを作っていきます
開始条件の設定
フローを新規作成したら、開始アイコンをダブルクリックします。
フローを起動するものとして、ユーザまたはアプリケーション-フロートリガーなしを選択します。
これで、プロセスビルダーから起動され、実行されるということなります。
入力変数を作成
プロセスビルダーから作成または更新されたレコードIDをもらうための、入力変数を作成します。
マネージャーで新規リソースでリソース種別が変数の変数をリソースを作成します。
IDをもらいたいので型はテキスト、プロセスビルダーから渡して欲しいのでフロー外部での可用性の入力での使用可能にチェックを入れてください。
これが、入力変数です。
入力変数が空でないときに実行
作成した入力変数が空のときに実行されないようにします。
要素から決定をドラッグ&ドロップして、入力変数(TargetId)がNULLでない({!$GlobalConstant.False})ことをチェックします。
作成または更新されたオブジェクトAのデータを取得
入力変数で指定されたオブジェクトAのレコードを取得します。
要素からレコードを取得をドラッグ&ドロップして、入力変数(TargetId)を条件としてオブジェクトAのレコードを取得します。
作成または更新されたレコードの取引先IDと状態を保存する変数を作成
マネージャーから新規リソースで変数を2つ作成します。
1つは取引先IDを保存するテキストの変数です。
もう1つは状態を保存するテキスト変数です。
作成した取引先IDと状態に保存
取得した作成または更新されたレコードから、作成した取引先IDと状態の変数に値を保存します。
要素から、割り当てをドラッグ&ドロップし、取引先ID(AccountId)には「{!GetTargetObjectA.Accounts__r.Id}」、状態(State)には「{!GetTargetObjectA.State__c}」を設定します。
同じ取引先で状態が空のレコードを取得
要素からレコードの取得をドラッグ&ドロップして、オブジェクトAから以下の条件でレコードを取得します。
・取引先(Account__c)が、取引先ID変数(AccountId)と同じ
・状態(State__c)が、NULL($GlobalConstant.True)
保存するレコードをすべてのレコード、レコードデータの保存方法をすべての項目を自動的に保存を選択します。
取得したレコードの状態を変更
取得したレコードの状態を1件ずつ設定していきます。
要素からループをドラッグ&ドロップします。
コレクション変数には、上で取得したレコード({!GetObjectABySameAccountAndStateIsNull})を設定します。
ループ変数で、新規リソースを選択し、取得したレコードの1件を保存する変数を作成し、設定します。
これで、同じ取引先で状態が空のレコードを1件ずつ取り出して設定する準備ができました。
状態を設定
要素から割り当てをドラッグ&ドロップして、1件ずつ取り出した変数(TargetRecord)の状態(State__c)に、事前に取得しておいた状態(State)を設定します。
更新用のコレクション変数を作成
状態を設定したレコードを保存するために使用するコレクション変数を作成します。
マネージャーから新規リソースで変数を作成します。
データ型はレコード、複数の値を許可をチェック、オブジェクトにオブジェクトAを選択します。
状態を設定したレコードを更新用コレクション変数に追加
要素の割り当てをドラッグ&ドロップして、状態を設定したレコード(TargetRecord)を更新用コレクション変数(TargetrecordsToUpdate)に追加します。
これでオブジェクトAから更新対象のレコードを取得し、状態を設定したレコードが更新用コレクション変数に転送されます。
つまり、更新用コレクション変数を保存すればいいことになります。
更新対象のレコードを更新
同じ取引先で状態が空のレコードすべてに状態が設定できました。
次は、設定したレコードを保存します。
要素からレコードを更新をドラッグ&ドロップして以下のように設定します。
更新するレコードを検索してその値を設定する方法
レコードまたはレコードコレクションからのIDおよびすべての項目値を使用
レコードまたはレコードコレクション
{!TargetRecordsToUpdate}
作成した要素を線で繋ぐ
ここまでで作成した要素を以下のように接続します。
縦でも横でも構いません。
作成したフローを保存
保存します。
デバッグします
オブジェクトAに以下の2つのレコードを作成します。
・取引先に取引先A、状態に開始
・取引先に取引先A、状態は未設定
上のレコードのレコードIDをメモします。
フローでデバッグをクリックし、入力変数のTargetIdにメモしたレコードIDを設定し実行します。
デバッグの詳細を上から順に意図した通りに動作していることを確認します。
最後に高速更新があり、オブジェクトAのレコードIDと状態がどのように更新されるかが表示されますので、意図した通りになっているか確認してください。
デバッグなので、実際のデータは更新されません(これ重要)
フローを有効化
作成したフローを有効化します。
プロセスビルダーで作成したフローを呼び出す
プロセスビルダーでレコードが更新されたときに起動するプロセスを作成します。
対象オブジェクトをオブジェクトA(ObejctA__c)にし、レコードを作成または更新したときにします。
条件として取引先(Account__c)と状態(State__c)が設定されているを設定します。
アクションでフローを選択し、作成したフローを選択します。
フロー変数を設定で、TargetIdにオブジェクトAのレコードID(ObjectA__c.Id)を設定します。
作成したプロセスを有効にします。
実際に試してみます
ここまでで、以下のように実行されるように準備が整いました。
・取引先と状態が設定されたオブジェクトAが作成または更新された
・オブジェクトAの中で同じ取引先で状態が空のレコードの状態に上記と同じ状態を設定する
実行するために、オブジェクトAのレコードを準備します。
この中の「状態が開始GoGoGo」を更新し、「状態が開始」に変更します。
確認します。
すべての状態が「開始」に変更されました。
Mission Completed!!