[Salesforce]FlowとApexの使い分け:適材適所でシステムの効率化を図る
Salesforceは強力な自動化プラットフォームを提供しており、その中でもFlowとApexは、開発者やビジネスユーザーにとって非常に重要なツールです。どちらもSalesforceでの業務プロセスの自動化やカスタマイズに利用されますが、それぞれが異なる強みを持っています。本記事では、FlowとApexの違い、そしてそれらをどのように使い分けるべきかについて、具体的なシナリオとコード例を交えて解説します。
1. FlowとApexの基本的な違い
Flowの概要
Flowはノーコードまたはローコードで、ビジネスプロセスを自動化するためのツールです。営業プロセスの自動化や承認プロセスの構築など、シンプルな業務フローを素早く構築するのに適しています。SalesforceのUIを使って、画面操作や条件分岐を設定し、自動化したい業務フローを簡単にデザインできます。
Apexの概要
Apexは、Salesforce上で動作するプログラム言語です。高度なビジネスロジックや、大量データの処理、外部システムとの連携など、複雑な処理を実装する際に必要です。Apexを使うことで、開発者は細かい制御や最適化を行うことが可能になります。
2. Flowでは対応できないApexのユースケース
Flowは多くの業務プロセスをカバーできますが、複雑な要件や大量データの処理には限界があります。ここでは、Flowでは対応できず、Apexで実装すべき具体的なシナリオを紹介します。
ユースケース1:大量データの処理(バッチ処理)
シナリオ
例えば、企業が顧客アカウントを一括で更新する必要があるとしましょう。10万件を超えるアカウントデータをまとめて更新する場合、Flowではガバナ制限やタイムアウトの問題が発生します。
Apexによる解決
Apexのバッチ処理を使えば、大量データを効率的に処理することができます。Apexではデータを小分けにして段階的に処理することができるため、ガバナ制限を超えずに安全に実行できます。
バッチ処理のコード例
global class AccountBatchUpdate implements Database.Batchable<sObject> {
global Database.QueryLocator start(Database.BatchableContext BC) {
return Database.getQueryLocator([SELECT Id FROM Account WHERE IsActive__c = true]);
}
global void execute(Database.BatchableContext BC, List<Account> scope) {
for (Account acc : scope) {
acc.Status__c = 'Updated';
}
update scope;
}
global void finish(Database.BatchableContext BC) {
System.debug('Batch job completed');
}
}
// スケジュールクラス
global class ScheduleAccountBatchUpdate implements Schedulable {
global void execute(SchedulableContext SC) {
AccountBatchUpdate batch = new AccountBatchUpdate();
Database.executeBatch(batch, 100);
}
}
バッチ処理をスケジュールし、Salesforceのガバナ制限をクリアしつつ大量のデータを定期的に処理することができます。
ユースケース2:外部システムとのAPI連携
シナリオ
Salesforceと外部の在庫管理システムやERPシステムとのリアルタイム連携が必要になることがあります。例えば、商品情報や在庫情報を外部システムから取得してSalesforce内で商談や注文データを更新したい場合です。
Apexによる解決
Apexでは、外部APIを使ってRESTやSOAPのエンドポイントと直接やり取りできます。これにより、Salesforce外部のデータをリアルタイムに取得し、内部データを更新することが可能です。
API連携のコード例
HttpRequest req = new HttpRequest();
req.setEndpoint('https://inventory.example.com/api/v1/products');
req.setMethod('GET');
req.setHeader('Authorization', 'Bearer ' + accessToken);
Http http = new Http();
HttpResponse res = http.send(req);
if (res.getStatusCode() == 200) {
// 在庫情報の処理
System.debug(res.getBody());
}
Flowでは外部システムとのシンプルな連携は可能ですが、複雑なリクエストやセキュアな認証処理を含む連携はApexの方が適しています。
ユースケース3:複雑なエラーハンドリングとトランザクション管理
シナリオ
商談や関連するカスタムオブジェクトのレコード作成が複数のステップに分かれている場合、その途中でエラーが発生すると処理全体をロールバックし、データの一貫性を保つ必要があります。
Apexによる解決
Apexでは、try-catch構文やSavepointを使ったトランザクション管理が可能です。これにより、エラーが発生した場合にすべての変更をロールバックし、安全に処理を終了できます。
トランザクション管理のコード例
Savepoint sp = Database.setSavepoint();
try {
Account acc = new Account(Name='New Account');
insert acc;
Contact con = new Contact(LastName='New Contact', AccountId=acc.Id);
insert con;
// 処理の途中でエラーが発生した場合
throw new CustomException('An error occurred!');
} catch (Exception e) {
// 失敗した場合、すべての変更をロールバック
Database.rollback(sp);
System.debug('Transaction rolled back: ' + e.getMessage());
}
Flowではここまで高度なエラーハンドリングやトランザクション管理は難しく、Apexが優れています。
3. ApexとFlowをどう使い分けるべきか
Flowが適している場合
• シンプルな業務フローの自動化: 営業やカスタマーサポートチームが使う、頻繁に変更が必要なワークフローやタスクの自動化にはFlowが最適です。
• 短期間で素早く構築が必要なプロセス: ノーコードであるため、構築や修正が簡単です。
Apexが適している場合
• 大量データの処理が必要な場合: Apexのバッチ処理やトリガーを使えば、ガバナ制限をクリアしつつ大量のレコードを処理できます。
• 外部システムとのAPI連携: 複雑な認証やリクエスト操作、エラーハンドリングを必要とする場合にはApexが必要です。
• 複雑なエラーハンドリングやトランザクション管理: データの一貫性を保ちながら複数の処理を行う場合、Apexは安全に処理を実行できます。
まとめ
SalesforceにおけるFlowとApexの使い分けは、システムの効率化において非常に重要です。Flowは、簡単なプロセス自動化や頻繁な変更が発生するビジネスロジックに適しており、素早く柔軟に対応できます。一方で、Apexは大量データの処理や外部システムとの連携、複雑なビジネスロジックの実装に最適です。
また、Apexでは詳細なトランザクション管理やエラーハンドリングも行えるため、大規模な企業システムではApexを活用することが不可欠です。それぞれの強みを理解し、適材適所で使用することで、Salesforceのパフォーマンスと効率を最大化しましょう。