はじめに
前回ApexでSOQLとSOSLを併用するものを作りました。
今回は、画面フローで前回作成したApexをベースに取引先を検索してみます。
やること
- Apexの修正
- 画面フローの作成
Apexの修正
フローアクションとして呼び出せるように修正
public with sharing class SearchAccount {
@InvocableMethod(
label='Account 取引先名称検索'
description='Accountの取引先名称検索(SOQL,SOSL)を行います。'
)
public static List<SearchAccountResult> SearchAccount(
List<SearchAccountRequest> requests
) {
List<SearchAccountResult> results = new List<SearchAccountResult>();
String searchKeyword = requests[0].searchKeyword;
Integer limitNum = requests[0].limitNum != null ? requests[0].limitNum : 10;
SearchAccountResult result = getSearchAccountResult(
searchKeyword,
limitNum
);
results.add(result);
return results;
}
private static SearchAccountResult getSearchAccountResult(
String searchKeyword,
Integer limitNum
) {
// SOQLで検索
List<Account> accountsBySoql = getAccountByNameSOQL(
searchKeyword,
limitNum
);
// SOSLで検索
List<Account> accountsBySosl = getAccountByNameSOSL(
searchKeyword,
limitNum
);
// SOSL SOSLの検索結果をマージ
Set<Account> accountSets = new Set<Account>();
accountSets.addAll(accountsBySoql);
accountSets.addAll(accountsBySosl);
List<Account> deduplicationAccounts = new List<Account>(accountSets);
SearchAccountResult result = new SearchAccountResult();
result.accounts = deduplicationAccounts;
return result;
}
private static List<Account> getAccountByNameSOQL(
String searchKeyword,
Integer limitNum
) {
searchKeyword = '%' + searchKeyword + '%';
List<Account> accounts = [
SELECT Id, Name
FROM Account
WHERE Name LIKE :searchKeyword
LIMIT :limitNum
];
return accounts;
}
private static List<SObject> getAccountByNameSOSL(
String searchKeyword,
Integer limitNum
) {
List<List<SObject>> searchSosl = [
FIND :searchKeyword
IN NAME FIELDS
RETURNING Account(Id, Name LIMIT :limitNum)
];
if (searchSosl.isEmpty()) {
return null;
}
return searchSosl[0];
}
public class SearchAccountRequest {
@InvocableVariable(label='検索キーワード' required=true)
public String searchKeyword;
@InvocableVariable(label='取得件数 デフォルト10件')
public Integer limitNum;
}
public class SearchAccountResult {
@InvocableVariable
public List<Account> accounts;
}
}
前回からの主な差分
InvocableMethod アノテーションとInvocableVariable アノテーションを追加しました。
InvocableMethod
でフローから呼び出すアクションの対象に、InvocableVariable
でアクション実行時の入力値とアクションの出力値の形式を決めます。
@InvocableMethod(
label='Account 取引先名称検索'
description='Accountの取引先名称検索(SOQL,SOSL)を行います。'
)
・
・
・
public class SearchAccountRequest {
@InvocableVariable(label='検索キーワード' required=true)
public String searchKeyword;
@InvocableVariable(label='取得件数 デフォルト10件')
public Integer limitNum;
}
public class SearchAccountResult {
@InvocableVariable
public List<Account> accounts;
}
画面フローを作成
1. 検索画面を作成
取引先名を入力するテキストコンポーネントを設置し、必須入力にしました。
2. 作成したApexを呼び出し
@InvocableMethod(
label='Account 取引先名称検索'
description='Accountの取引先名称検索(SOQL,SOSL)を行います。'
)
InvocableMethod
のlabel
でアクションが作成されています。
public class SearchAccountRequest {
@InvocableVariable(label='検索キーワード' required=true)
public String searchKeyword;
@InvocableVariable(label='取得件数 デフォルト10件')
public Integer limitNum;
}
検索キーワードに画面フローの入力テキストinput_name
を設定します。
3. 検索結果画面を作成
表示テキストコンポーネントをを設置し、リソースピッカーにアクションの出力を指定します。
実行してみる
前回の検索結果と同じ内容が取得できました。
検索結果がIDで表示されてしまいます。
- 検索結果を事前に割り当て要素で取引先名に変える
- Apexの返り値で表示したい目的の形式に変える
等の対応を行ったり
リンクにしたい場合は、LWCでNavigationMixin
を使ったコンポーネントを作ってもいいかもしれません。
最後に
今回は前回作成したApexをフローアクションで呼び出せるように修正し、画面フローで取引先検索Apexを実行してみました。
フローアクションとしてのApexを用意することでフローではできないことをできるようにしたり、フローだと処理が長くて保守しにくくなってしまったものをリファクタリングすることもできます。