Salesforceの画面フローにおいて、親オブジェクトの項目に連動する選択リストを設定する方法を考えてみます。
考える具体例
取引先オブジェクトのレベルという選択リスト項目の値によって、商談オブジェクトのレベルという選択リスト項目の選択可能な値を制御します。
ここで、それぞれの項目は下記のように定義します。
オブジェクト | 表示ラベル | API参照名 | 選択リスト値 |
---|---|---|---|
取引先 | レベル | Level__c | A,B,C,D,E |
商談 | レベル | Level__c | A,B,C,D,E |
また、連動の関係は下記のように設定します。
取引先.レベル | 商談.レベルの選択可能値 |
---|---|
A | A,B,C,D,E |
B | B,C,D,E |
C | C,D,E |
D | D,E |
E | E |
選択リスト値を連動させる考え方
上記のような連動を行う場合は、それぞれの選択肢に対して数値を割り振り、選択可能値を数値の範囲を満たす条件によって設定する方法が使えます。
例えば、下記のように数値を割り当てることを考えます。
レベル | 数値 |
---|---|
A | 1 |
B | 2 |
C | 3 |
D | 4 |
E | 5 |
このような設定を行うと、選択可能値は下記の条件を満たす選択肢となることがわかります。
取引先.レベルの数値 <= 商談.レベルの数値
実装方法
画面フローを構築する際に、選択リスト値を取得するロジックを使用しますので、下記の記事を参考にして作成しておきます。
フローの種類を選択する
フローの種類は 「画面フロー」 を選択します。
入力変数を定義する
入力変数として下記を準備します。
- recordId : 商談レコードを入力する商談オブジェクトのレコード型の入力で使用可能な変数
内部変数を定義する
内部変数として下記を準備します。
- LevelPicklistValueInfo : 商談オブジェクトのレベル項目の中で選択可能値を含む変数
取引先を取得する
レコードの取得要素を使用して、入力変数から取引先(Account)を取得します。
ここでは下記のような設定とします。
- API参照名 : Get_Account
- オブジェクト : 取引先
- 絞り込み条件 : すべての条件に一致(AND)
- Id 次の文字列と一致する {!recordId.AccountId}
- 保存するレコード数 : 最初のレコードのみ
商談オブジェクトのレベル項目の選択リスト値を取得する
サブフローを使用して商談オブジェクトのレベル項目の選択リスト値を取得します。
ここでは下記のような設定とします。
- API参照名 : Get_LevelPicklistValueInfo
- 入力値 :
- FieldApiName : Level__c
- SObjectApiName : Opportunity
選択リスト値をループする
取得したオブジェクト権限(ObjectPermissions)をループします。
ここでは下記のような設定とします。
- API参照名 : Loop_LevelPicklistValueInfo
- コレクション変数 : {!Get_LevelPicklistValueInfo.PicklistValueInfoList}
数式リソースを作成する
レベル項目を数値化するために、下記の数式リソースを作成します。
- Formula_AccountLevel : 取引先のレベル項目を数値に変換するための数式リソース
CASE( TEXT( {!Get_Account.Level__c} ) ,
"A" , 1 ,
"B" , 2 ,
"C" , 3 ,
"D" , 4 ,
"E" , 5 ,
0
)
- Formula_OpportunityLevel : 商談のレベル項目を数値に変換するための数式リソース
CASE( {!Loop_LevelPicklistValueInfo.Value} ,
"A" , 1 ,
"B" , 2 ,
"C" , 3 ,
"D" , 4 ,
"E" , 5 ,
0
)
ループの中で選択リスト値の数値による判定を行う
ループの中で取引先のレベル項目の数値と商談のレベル項目の数値を比較します。
ここでは下記のような設定とします。
- API参照名 : Decide_ValueOfPicklist
- 結果 - 1 : 選択可能
- API参照名 : Decide_ValueOfPicklist_Available
- 条件 : すべての条件に一致(AND)
- {!Formula_AccountLevel} 以下 {!Formula_OpportunityLevel}
- デフォルトの結果 : 選択不可
選択リストを追加する
選択可能な場合にループの中の選択リスト値情報を変数に追加します。
ここでは下記のような設定とします。
- API参照名 : Assign_AddPicklistValueInfo
- 変数値を設定 :
- {!LevelPicklistValueInfo} 追加 {!Loop_LevelPicklistValueInfo}
コレクション選択肢セットを作成する
選択可能な選択リスト値が抽出されたコレクション変数からコレクション選択肢セットを作成します。
ここでは下記のような設定とします。
- API参照名 : LevelPicklistValueSet
- コレクション : {!LevelPicklistValueInfo}
- 選択肢表示ラベル : Label
- データ型 : テキスト
- 選択肢の値 : Value
画面を配置する
選択リストを配置する画面を設定します。
ここでは下記のような設定とします。
- API参照名 : Screen_SelectLevel
画面に選択リストを配置する
配置した画面に選択リストコンポーネントを配置します。
ここでは下記のような設定とします。
- API参照名 : Level
- データ型 : テキスト
- コンポーネントの種類 : 選択リスト
- 選択肢 : {!LevelPicklistValueSet}
選択された値で商談のレベル項目を更新する
画面で選択された値で商談の項目を更新します。
ここでは下記のような設定とします。
- API参照名 : Update_Opportunity
- オブジェクト : 商談
- 絞り込み条件 : すべての条件に一致(AND)
- Id 次の文字列と一致する {!recordId.Id}
- 更新項目 :
- Level__c : {!Level}
フローの完成
完成したフローの形は下記のような形になります。
フローの保存
フローを保存します。
実行してみる
適当な取引先のレベル項目を変更して、フローを実行します。
ここでは取引先のレベル項目を"C"に変更した場合のイメージを載せておきます。
本記事では言及していませんが、画面に表示される選択リスト値の順序は保証されませんので、順序を整列したい場合はコレクションの並び替えを利用するなどの工夫が必要になります。
まとめ
本記事は下記の機能を実際に使うことを想定して作成しました。
他のポイントとしては、連動関係を単純なIF関数による条件分岐ではなく、数値に置き換えた形で実装する方法にあるかと思っています。
本記事では条件を数値の範囲条件に置き換えて考えましたが、数値へ置き換えて条件分岐を簡素な作りにする数値遊びは他にも多くあるため、追々紹介できたらと思います。