画面フローのアクションボタンを使ってみよう PART 2

「画面フローのアクションボタンを使ってみよう」では、Salesforce内部だけの処理のご紹介でしたが、 画面フローのアクションボタンの使いようによっては、Salesforce外のデータを一時的に、Salesforceで 表示させたいというリクエストにも答えることができるのではと考え、1例ではありますが、ご紹介します。

はじめに

以前の記事「画面フローのアクションボタンを使ってみよう」では、Salesforceの機能内だけの処理のご紹介でした。
画面フローのアクションボタンの利用については、他にもSalesforce外のデータを一時的にSalesforceで表示させたいというリクエストにも答えることができるのではと考えました。
今回は、1例ではありますがご紹介します。

シナリオ

今回のシナリオとして、「Salesforce上で、ERPシステム上の在庫一覧を確認する」というケースを考えてみました。

Salesforce上で確認する在庫一覧の画面イメージは、以下を想定しています。

画面イメージ

システム構成

今回の機能に関する構成は、以下の図となります。

システム構成図

上記のシステム構成図から、機能概要は以下の2点となります。
(1)Salesforceのフロー内にある在庫検索処理より在庫検索処理基幹システムにある在庫管理システムとの連携でデータを取得。
(2)フロー内のデータテーブルに在庫検索結果を表示。

なお、上記のシステム構成図は、画面フローのアクションボタンから外部データの取得を確認するための単純な構成となっており、システム連携方式や認証について、深堀りしていません。

Salesforceに関わるシステム連携を考察する際には、以下の資料をご参照ください。

オブジェクトの準備

ここでは、以下の画面イメージの赤枠のデータテーブルにて、取得したデータを表示するためのオブジェクトと項目を設定します。

データテーブルの画面イメージ

【設定内容】
・オブジェクト:在庫一覧
・API 参照名:Inventory__c

<商材No項目>
・項目の表示ラベル:商材No
・API 参照名:Name
・データ型:テキスト
・桁数:80

<商材名項目>
・項目の表示ラベル:商材名
・API 参照名:InventoryName__c
・データ型:テキスト
・桁数:255

<総在庫量項目>
・項目の表示ラベル:総在庫量
・API 参照名:TotalInventoryQuantity__c
・データ型:数値 (18, 0)
・桁数:18

フローの実装内容

利用するフローは2種類あります。
・在庫確認フローは、中心機能のアクションボタンとデータテーブルの設定のみ表示します。
・在庫一覧取得処理フローは、在庫確認フロー内のアクションボタンの設定内容について記載します。

在庫確認フロー

最初に在庫確認フローです。この画面フローはメインの画面フローになります。
画面フローの内容は以下の通りで、在庫確認画面のみとなります。

在庫確認フローの設定イメージ

在庫確認画面の設定の中で、重要な設定は2か所です。
最初は、アクションボタンの設定です。
アクションボタンの設定内容は以下となります。

アクションボタンの設定内容

次に、データテーブルの設定内容は以下の通りとなります。

データテーブルの設定内容

在庫一覧取得処理フロー

次は在庫のデータを取得するフローです。このフローは在庫確認フローのアクションボタンの処理内容となります。
フローの内容は以下の通りで、APEX アクションを呼び出すのみとなります。

在庫一覧取得処理フローのイメージ

APEX アクションの内容は、以下の通りです。
今回は単純につないでいるだけなので、エラー処理等は実装していないので、ご注意ください。
global class InventoryAcquisition {
   public class InputInfo{
        @InvocableVariable(label='商材No')
        public String products_no;

        @InvocableVariable(label='商材名')
        public String products_name;
    }
    @InvocableMethod(label='在庫一覧取得' description='在庫一覧')
    public static List<List<Inventory__c>> collectionALL(List<InputInfo> infos){

        List<list<Inventory__c>> products_master_return = new List<list<Inventory__c>>();

        HttpRequest req1=new HttpRequest();

        req1.setEndpoint('<エンドポイントの設定>');

        req1.setMethod('GET');

        req1.setHeader('pNo',infos[0].products_no);
        
        req1.setHeader('pNo',infos[0].products_name);

        req1.setHeader('Authorization','<認証設定>');

        Http http1=new Http();

        HttpResponse res1=new HttpResponse();

        res1=http1.send(req1);
        
        if (res1.getStatusCode() == 200) {

            List<Object> requestList = new List<Object>();

            requestList = (List<Object>)JSON.deserializeUntyped(res1.getBody());
            
            list<Inventory__c> return_products_master = new list<Inventory__c>();

            for (Object resultAlone : requestList) {

                Map<String, Object> resultMAP = (Map<String, Object>)resultAlone;

                Inventory__c oInventory = new Inventory__c(); 

                oInventory.Name = (String)resultMAP.get('No');

                oInventory.InventoryName__c = (String)resultMAP.get('InventoryName');

                oInventory.TotalInventoryQuantity__c = (Decimal)resultMAP.get('TotalInventoryQuantity');
                
                return_products_master.add(oInventory);
                
            }
            
            products_master_return.add(return_products_master);
        }

        return products_master_return;

    }

}
在庫一覧取得の内容

まとめ

今回ご紹介した例は、簡単な画面でのパターンとなり、在庫確認画面の画面フロー部分のみ費やした時間は30分ほどでした。
同じ画面をLightning Web コンポーネントで作成する場合よりも、はるかに少ない工数で対応できると思います。
しかしながら、Lightning Web コンポーネントのように自由度の高い画面を画面フローで作成するのは厳しいので、システムの仕様に応じて何をご利用になるかはご検討いただくことをおすすめします。