こんにちは、DX攻略部のヘナトンです。
「商談レコード詳細ページに画面フローを配置して、その商談の情報を使ってフロー処理をしたい!」
「取引先のカスタムボタンをクリックしてフローを起動する際に、その取引先の情報を使ってフロー処理をしたい!」
これらのような経験はありませんか?
今回はそんな時に便利な入力変数input_recordについて事例を用いて解説します。
そもそも画面フローとは?という方はこちらの記事をご活用ください。
こんにちは、DX攻略部のヘナトンです。 Salesforceは、顧客関係管理(CRM)ソフトウェアのリーディング企業であり、世界中の多くの企業がそのサービスを利用しています。 Salesforceは、ビジネスプロセスを改善し、ビ[…]
また同様にレコードのIdだけを入力変数として取得できるrecordIdについてはこちらで解説しております。
こんにちは、DX攻略部のヘナトンです。 商談レコード詳細ページに画面フローを配置して、その商談の情報を使ってフロー処理をしたい! 取引先のカスタムボタンをクリックしてフローを起動する際に、その取引先の情報を使ってフロー処理をした[…]
【事例】画面フローを使って取引先にある商談項目を一括更新する方法
今回の事例では取引先レコード詳細ページに配置された画面フローを使ってその取引先の子レコードである商談の説明項目を取引先の説明項目と同じ値に更新する処理を行います。
※標準オブジェクトの取引先と商談はリレーション構造上、「取引先:商談 = 1:多」になっているので少し複雑なループ処理を行います。
まずは目標である完成形を確認しましょう。
目標確認
AAA株式会社の商談「AAA–2023年6月度」の説明項目を確認します。(空白)
AAA株式会社の詳細ページに配置された画面フローの「次へ」をクリックして起動します。
画面フローが起動され、取引先の説明とその商談の説明が同じになりました。
設定方法
設定>クイック検索「フロー」>フロー>新規フロー
まず新規フローを立ち上げます。
フロー種別を選択するモーダルウィンドウが表示されたら「画面フロー」を選択し、「作成」ボタンをクリックします。
今回はレイアウトを自由形式で作成するので「自動レイアウト」から「自由形式」に切り替えます。
※レイアウトの違いは設定する際のヴィジュアルだけですのでお好きな方を設定ください。
画面
取引先レコード詳細ページに配置した際に始めに表示される画面を設定します。
ツールボックス>要素>相互関係>画面をキャンパスにドラッグ&ドロップで開きます。
新規画面が開けたら、画面のプロパティを設定します。
画面要素の表示ラベルとAPI参照名を入力します。
「ヘッダーを設定」でヘッダーの表示/非表示(デフォルトは表示)を設定し、ヘルプテキストを設定できます。
「フッターを設定」でフッターのボタンの詳細設定が可能です。
コンポーネント>表示>表示テキストをキャンパスにドラッグ&ドロップで配置します。
表示テキストのAPI参照名を入力します。
表示テキストの内容を入力します。(今回は「商談の説明項目を一括更新しますか?」と入力します)
モーダル画面の「完了」をクリックします。
入力変数input_recordの作成
入力変数recordIdではレコードを取得要素を使用しなければレコードが取得できませんでしたが、入力変数input_recordでは必要ありません。
画面フローが起動されたレコードページのレコードを丸ごと変数として取得できるのです。
ツールボックス>マネージャ>新規リソースをクリックします。
- リソース種別:変数を選択します。
- API参照名:「input_record」と入力します。一字違わず「input_record」と入力してください。「input_record」と入力しないと機能しません。「input_Record」でも「Input_Record」でもなく「input_record」です。
- データ型:レコードを選択します。
- オブジェクト:取引先を選択します。
- フロー外部での可用性:「入力で使用可能」にチェックを入れてください。
- 完了をクリックします。
この入力変数を作成するだけで、Salesforce Idだけでなくレコード丸ごと取得できました。便利ですね。
レコードを取得
更新する子オブジェクトの商談を取得します。
ツールボックス>要素>データ>レコードを取得をキャンパスにドラッグ&ドロップで開きます。
新規レコードの取得が開けたら、要素のプロパティを設定します。
レコードを取得要素の表示ラベルとAPI参照名を入力します。
このオブジェクトのレコードを取得>オブジェクトで商談を選択します。
取引先レコードを絞り込み>項目で「AccountId」を選択します。
演算子で「次の文字列と一致する」を選択します。
値のボックス内をクリックし、先ほど作成した入力変数「input_record」>取引先IDを設定します。
「保存するレコード数」は「すべてのレコード」を選択することでこのgetOppsは複数の商談レコードを保持するコレクション変数(Apexで表現するとList<Opportunity>)になります
「商談レコードを並び替え」と「レコードデータの保存方法」はデフォルトのまま「完了」をクリックします。
ループ
商談レコードのコレクション変数の項目を一つ一つ更新するにはループ要素を使用します。
今回はさきほど作成したgetOppsという商談レコードのコレクション変数の数だけループします。
ここで注意してほしいのはSalesforceフローのループではコレクション変数を用いた拡張for文的なループしか行うことができません。
Salesforceフローでコレクション変数に関わらず指定した条件でループしたい場合の対応策については別の記事で紹介したいと思います。
ループ要素の表示ラベルとAPI参照名を入力します。
コレクション変数を選択>コレクション変数でgetOppsを選択します。
処理するための方向とはコレクション変数の一つ一つをループする順番のことですが今回は考慮不要です。
完了をクリックします。
割り当て
入力変数input_recordで取得した取引先レコードの項目値をループ内の一つ一つの商談項目に割り当てます。
ツールボックス>要素>ロジック>割り当てをキャンパスにドラッグ&ドロップで開きます。
要素のプロパティを設定します。
割り当て要素の表示ラベルとAPI参照名を入力します。
新しく商談レコード変数oppを作成し、その商談ID項目を左側に設定します。
ループしている商談のID項目を右側に設定します。
oppの説明項目を左側に設定します。
入力変数input_record(取引先)の説明項目値を右に設定します。
新しく商談レコードコレクション変数opps_forUpdateを作成し、左側に設定します。
演算子を「追加」に変更します。
1行目と2行目で項目を設定したoppを右側に設定します。
「完了」をクリックします。
レコードを更新
割り当てた内容を更新する設定をします。
ツールボックス>要素>データ>レコードを更新をキャンパスにドラッグ&ドロップで開きます。
要素のプロパティを設定します。
レコードを更新要素の表示ラベルとAPI参照名を入力します。
更新するレコードを選択>レコードまたはレコードコレクションに、商談レコードコレクション変数opps_forUpdateを設定します。
「完了」をクリックします。
要素を連結する
作成した要素同士をつなぎます。
矢印でつなぐことで実行順序を設定できます。
ループ要素で設定したコレクション変数の数だけループは実行されます。
例えば、画面フローを起動した取引先に紐づいた商談のレコード数が3つだった場合の今回の画面フローの実行順序は、
screen1→商談取得→Loop1→項目割り当て→Loop1→項目割り当て→Loop1→項目割り当て→Loop1→商談更新
となります。
つまり、ループ要素Loop1から商談のレコード数である3回は「項目ごと」という矢印が実行され、その3回が終了した後は「最後の項目の後」という矢印が実行されます。
最後に保存および有効化し、取引先Lightningレコードページに配置すれば完了です。
Apexで書くとこうなる(プログラマー向け)
最後にプログラマーの方がフローをイメージしやすいようにレコードを取得からレコードを更新までの要素の処理内容をApexコードで表現します。
List<Opportunity> getOpps = [SELECT 全ての項目 FROM Opportunity WHERE AccountId =: input_record.id];
List<Opportunity> opps_forUpdate = new List<Opportunity>();
for(Opportunity loop1 : getOpps){
Opportunity opp = new Opportunity();
opp.Id = loop1.Id;
opp.Description = input_record.description;
opps_forUpdate.add(opp);
}
update opps_forUpdate;
参考までにどうぞ。
Apexで書いたほうが圧倒的に楽ではないかと思いたくなるところですが、Apexで書いた場合はレコード詳細ページに配置するためにVisualforceを書かなくてはなりませんし、本番環境にアップロードするためにTestコードも書かなくてはいけないことも考慮してどちらで開発するか決めましょう。
事例まとめ
このinput_record活用事例では取引先に配置された画面フローを起動し、その子オブジェクトの商談の項目を更新しました。
過程の処理としてループ要素の使い方も簡単に紹介いたしましたが、今回のポイントとしてはrecordIdではなくinput_recordを使うことで、レコードを丸ごと取得し、レコードを取得要素を一つ省略できることです。
まとめ
画面フローの入力変数input_recordについての解説は以上です。
画面フローでは入力変数input_recordを用いることでrecordIdを使用する際と比べてレコードを取得要素を一つ省略できました!
(SOQL的なサーバーとのやりとりが一つ減ることにテンションが上がるのは私だけではないはず!)
もちろん処理内容によっては入力変数としてrecordIdを使用すべきシーンは多々あります。
処理内容によってrecordIdとinput_recordの二つの特別な入力変数を使い分けることで最適なフロー開発を目指しましょう。
事例を用いて解説いたしましたが、フロー開発に慣れている方にとっては無駄な部分が多く感じると思いますが、ご了承ください。
最後までお読みいただきありがとうございました。