【フロー】画面フローで親オブジェクトの項目に連動する選択リストを表示する

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   |

このような設定を行うと、選択可能値は下記の条件を満たす選択肢となることがわかります。

```
取引先.レベルの数値 <= 商談.レベルの数値
```

## 実装方法
画面フローを構築する際に、選択リスト値を取得するロジックを使用しますので、下記の記事を参考にして作成しておきます。

https://qiita.com/HNakazawa/items/3267eea782b70d3e2acb

#### フローの種類を選択する
フローの種類は __「画面フロー」__ を選択します。

![Flow_ScreenFilteringPicklist_フロー種別の選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/41fdad6a-3517-5868-1260-5b53541dcd69.png)

#### 入力変数を定義する
入力変数として下記を準備します。

- __recordId__ ： 商談レコードを入力する商談オブジェクトのレコード型の入力で使用可能な変数

![Flow_ScreenFilteringPicklist_入力変数_recordId.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/993f7eea-977d-afca-bb9a-564128d4f625.png)

#### 内部変数を定義する
内部変数として下記を準備します。

- __LevelPicklistValueInfo__ ： 商談オブジェクトのレベル項目の中で選択可能値を含む変数

![Flow_ScreenFilteringPicklist_内部変数_LevelPicklistValueInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/17b6826c-dee7-fe85-dcdf-ce81e68177d6.png)

#### 取引先を取得する
レコードの取得要素を使用して、入力変数から取引先（Account）を取得します。
ここでは下記のような設定とします。

- API参照名 ： Get_Account
- オブジェクト ： 取引先
- 絞り込み条件 ： すべての条件に一致（AND）
  - Id 次の文字列と一致する {!recordId.AccountId}
- 保存するレコード数 ： 最初のレコードのみ

![Flow_ScreenFilteringPicklist_レコード取得_Get_Account.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/9f4cf5b5-a174-a318-a83c-7a370a220555.png)

#### 商談オブジェクトのレベル項目の選択リスト値を取得する
サブフローを使用して商談オブジェクトのレベル項目の選択リスト値を取得します。
ここでは下記のような設定とします。

- API参照名 ： Get_LevelPicklistValueInfo
- 入力値 ：
  - FieldApiName ： Level__c
  - SObjectApiName ： Opportunity

![Flow_ScreenFilteringPicklist_サブフロー_Get_LevelPicklistValueInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/4c2a50bf-d296-9697-d879-86cc68695972.png)

#### 選択リスト値をループする
取得したオブジェクト権限（ObjectPermissions）をループします。
ここでは下記のような設定とします。

- API参照名 ： Loop_LevelPicklistValueInfo
- コレクション変数 ： {!Get_LevelPicklistValueInfo.PicklistValueInfoList}

![Flow_ScreenFilteringPicklist_ループ_Loop_LevelPicklistValueInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/95faf621-331e-ec52-e433-b00e480841b5.png)

#### 数式リソースを作成する
レベル項目を数値化するために、下記の数式リソースを作成します。

- __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
)
```

![Flow_ScreenFilteringPicklist_数式リソース_Formula_AccountLevel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/8d274aa4-5a5b-e12f-25bb-0ce85f743494.png)
![Flow_ScreenFilteringPicklist_数式リソース_Formula_OpportunityLevel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/46ea8cbb-bc43-fee2-bfbe-0378a86c0a3d.png)

#### ループの中で選択リスト値の数値による判定を行う
ループの中で取引先のレベル項目の数値と商談のレベル項目の数値を比較します。
ここでは下記のような設定とします。

- API参照名 ： Decide_ValueOfPicklist
- 結果 - 1 ： 選択可能
  - API参照名 ： Decide_ValueOfPicklist_Available
  - 条件 ： すべての条件に一致（AND）
    - {!Formula_AccountLevel} 以下 {!Formula_OpportunityLevel}
- デフォルトの結果 ： 選択不可

![Flow_ScreenFilteringPicklist_決定_Decide_ValueOfPicklist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/93063134-67b9-4ec7-54d1-62119380e512.png)

#### 選択リストを追加する
選択可能な場合にループの中の選択リスト値情報を変数に追加します。
ここでは下記のような設定とします。

- API参照名 ： Assign_AddPicklistValueInfo
- 変数値を設定　：
  - {!LevelPicklistValueInfo} 追加 {!Loop_LevelPicklistValueInfo}

![Flow_ScreenFilteringPicklist_割り当て_Assign_AddPicklistValueInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/7fc48d4d-2eee-9934-20f3-085e060649a1.png)

#### コレクション選択肢セットを作成する
選択可能な選択リスト値が抽出されたコレクション変数からコレクション選択肢セットを作成します。
ここでは下記のような設定とします。

- API参照名 ： LevelPicklistValueSet
- コレクション ： {!LevelPicklistValueInfo}
- 選択肢表示ラベル ： Label
- データ型 ： テキスト
- 選択肢の値 ： Value

![Flow_ScreenFilteringPicklist_コレクション選択肢セット_LevelPicklistValueSet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/11bf680e-954a-1ad9-a969-39e1ff1c4a24.png)

#### 画面を配置する
選択リストを配置する画面を設定します。
ここでは下記のような設定とします。

- API参照名 ： Screen_SelectLevel

![Flow_ScreenFilteringPicklist_画面_Screen_SelectLevel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/4a96533c-df69-3164-a10f-98749d89c665.png)

#### 画面に選択リストを配置する
配置した画面に選択リストコンポーネントを配置します。
ここでは下記のような設定とします。

- API参照名 ： Level
- データ型 ： テキスト
- コンポーネントの種類 ： 選択リスト
- 選択肢 ： {!LevelPicklistValueSet}

![Flow_ScreenFilteringPicklist_画面要素_Level.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/28cdcbe5-405f-6a94-58fe-2c7cf7f06b9a.png)

#### 選択された値で商談のレベル項目を更新する
画面で選択された値で商談の項目を更新します。
ここでは下記のような設定とします。

- API参照名 ： Update_Opportunity
- オブジェクト ： 商談
- 絞り込み条件 ： すべての条件に一致（AND）
  - Id 次の文字列と一致する {!recordId.Id}
- 更新項目 ：
  - Level__c ： {!Level}

![Flow_ScreenFilteringPicklist_レコード更新_Update_Opportunity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/c64f872d-9225-0ccd-e3df-da669a9b7206.png)

#### フローの完成
完成したフローの形は下記のような形になります。

![Flow_ScreenFilteringPicklist_フロー全体像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/f5fe2f35-8551-e820-b233-5f74652b6d52.png)

#### フローの保存
フローを保存します。

![Flow_ScreenFilteringPicklist_フロー保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/228ba6c7-c8cc-c664-da26-20e21a92cc4b.png)

## 実行してみる
適当な取引先のレベル項目を変更して、フローを実行します。
ここでは取引先のレベル項目を"C"に変更した場合のイメージを載せておきます。

![Flow_ScreenFilteringPicklist_フロー実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/ff48dceb-8b3c-ec9f-ae49-00bbc0acf640.png)

:::note warn
本記事では言及していませんが、画面に表示される選択リスト値の順序は保証されませんので、順序を整列したい場合はコレクションの並び替えを利用するなどの工夫が必要になります。
:::

## まとめ
本記事は下記の機能を実際に使うことを想定して作成しました。

https://qiita.com/HNakazawa/items/3267eea782b70d3e2acb

他のポイントとしては、連動関係を単純なIF関数による条件分岐ではなく、数値に置き換えた形で実装する方法にあるかと思っています。
本記事では条件を数値の範囲条件に置き換えて考えましたが、数値へ置き換えて条件分岐を簡素な作りにする数値遊びは他にも多くあるため、追々紹介できたらと思います。