ブログ

レコードを大量に処理するApexバッチの書き方

#Salesforce #Apexバッチ #書き方

システム管理者であるあなたは、Salesforceでレコードを大量に処理したい場面に遭遇したことはありませんか?
その際、Salesforceでは画面からの入力やデータローダーなどを活用したCSVファイルの取り込みではなく、Apexバッチを活用することをお勧めします。特に、処理するレコード数が数千~数百万件が存在する場合はSalesforceのデータローダー等の取り込みでは制約に該当し、うまく更新できない事態が発生するかもしれません。また、Salesforceは必要なデータ量に応じストレージを購入する必要があるため、使用しないデータについては定期的に一括で削除したい場面も容易に想像することが可能です。本記事では、上記のような場面で活用可能なSalesforceのApexバッチについて、特段事前に準備することが不要な開発者コンソールで実際のコードを用いて詳細に解説します。

開発者コンソールとは

Salesforceが提供する統合開発環境(IDE)のことを指します。自分の所属する組織内で、アプリケーションの開発から、作成したアプリケーションのデバッグ確認や、テスト実行が可能です。 また、ブラウザベースで動作するため、自らのPCへの専用アプリケーションのインストールや、ツールのダウンロードなど、事前に環境を準備することなく使用することができるのが強みです。

開発者コンソールのアクセスおよび事前準備

以下、3手順で簡単にコーディング可能なエディタ画面まで遷移することができます。

  1. ギアアイコンから開発者コンソールをクリック(Sandbox環境またはDeveloper Edition環境)
  2. 表示されたエディタ画面の左上部からFile>New>Apex Classの順で選択
  3. 新規に作成するApex Class名を入力し、OKボタンをクリック

該当の項目を一括で更新可能なApexバッチ実装における学習事項

今回、Apexバッチで一括更新を実装するためには、Salesforceが提供するインターフェースの一つであるDatabase.Batchableがもつ3つのメソッドを活用する必要があります。

  • startメソッド
  • executeメソッド
  • finishメソッド

startメソッド

start メソッドは、Apexバッチで最初に呼び出されるメソッドを指します。

バッチ処理するレコードを取得し、executeメソッドに渡します。
executeメソッドに渡すオブジェクトは、Database.QueryLocator、またはIterableになります。通常はDatabase.QueryLocatorを使用しますが、外部連携や複雑なオブジェクト構造を扱いたいときにはIterableオブジェクトを使用します。

QueryLocatorを使用する場合、SOQLで最大5000万件のレコードの取得ができます。
一方、Iterableを使用する場合は、SOQLで取得できるレコード総数のガバナ制限(最大 5万件)は引き続き適用されます。

executeメソッド

executeメソッドは、バッチ(データの処理単位)ごとに処理を実行するメソッドを指します。

処理するレコードは、startメソッドからバッチサイズに分割されて渡されます。
バッチサイズは省略可能で、デフォルトサイズは200です。

例えば、バッチサイズが200、startメソッドで2,000件のレコードを取得した場合、10個のトランザクションに分割され、executeメソッドが実行されます。ガバナ制限は、各トランザクション単位で適用されます。

finishメソッド

finishメソッドは、Apexバッチで最後に呼び出されるメソッドを指します。

すべてのバッチが処理された後、1回呼び出されます。
バッチ処理が終了したことを通知する確認メール送信など、後処理を行います。

上記の内容を理解したうえで、実際のサンプルコードを確認し、より理解を深めていきましょう。

Apexバッチのサンプルコード

以下のコードを実行すると、取引先(Account)オブジェクトを取得、説明(Description)項目を「Apexバッチによる更新」といった文字列で一括更新します。

public class UpdateAccountBatch implements Database.Batchable {

public Database.QueryLocator start(Database.BatchableContext bc){
System.debug(‘*** start ***’);
String query = ‘Select Id, Name, Description From Account’;
return Database.getQueryLocator(query);
}

public void execute(Database.BatchableContext bc, List scope){
System.debug(‘*** execute ***’);
List updList = new List();
for(Account acc : scope){
Account newAcc = new Account();
newAcc.Id = acc.Id;
newAcc.Description = ‘Apexバッチによる更新’;
updList.add(newAcc);
}
if(updList.size() > 0){
update updList;
}
}
public void finish(Database.BatchableContext bc){
System.debug(‘*** execute ***’);
}
}

詳細説明

クラスの定義:

public class UpdateAccountBatch implements Database.Batchable {
説明:Apexクラス名はUpdateAccountBatchで、Database.Batchableというインターフェースを実装しています。これは、Salesforceのデータベースでバッチ処理を実行するための標準的な方法です。

start メソッド:

public Database.QueryLocator start(Database.BatchableContext bc){
System.debug(‘*** start ***’);
String query = ‘Select Id, Name, Description From Account’;
return Database.getQueryLocator(query);
}
説明:バッチの処理を開始するstartメソッドでは、Account(取引先)オブジェクトからId、Name、Descriptionの情報を取得するクエリを実行し、その結果をQueryLocatorという形式で返しています。

execute メソッド:

public void execute(Database.BatchableContext bc, List scope){
System.debug(‘*** execute ***’);
List updList = new List();
for(Account acc : scope){
Account newAcc = new Account();
newAcc.Id = acc.Id;
newAcc.Description = ‘Apexバッチによる更新’;
updList.add(newAcc);
}
if(updList.size() > 0){
update updList;
}
}
説明:バッチ処理における実際の作業を行います。このコードでは、startメソッドで実行された結果をバッチサイズに基づき、scopeリスト(acc)としてforループで回し、newAcc変数にaccのIdやDescriptionを設定します。設定したnewAccを更新用のupdListリストに追加して、最後に更新を行います。

finish メソッド:

public void finish(Database.BatchableContext bc){
System.debug(‘*** execute ***’);
}

説明: executeメソッドの後に呼び出され、バッチ処理の後処理を実行します。今回の例では、単純なデバッグメッセージを表示しています。

作成したApexバッチの保存方法

コードを記述したApex Classはエディタ画面のFile>Save Allで簡単に保存できます。

Apexバッチの実行方法

保存したサンプルコードを実行するためには、スケジュールクラスを作成し、実行タイミングを指定する必要がありますが、今回は「Anonymous Window(匿名ウィンドウ)」を使用してApexバッチを実行とすることとします。
※本番環境にリリースする場合、テストコードの作成が必要になります。

  1. 開発者コンソールの上部にあるDebug>Open Execute Anonymous Windowを選択
  2. (Ctrl + Eでも開けます。)

  3. バッチを実行するコードを入力
  4. 以下、バッチを実行するサンプルコードです。
    UpdateAccountBatch uab = new UpdateAccountBatch();
    Database.executeBatch(uab, 200);

  5. Executeをクリック
  6. エディタ画面下部のLogから成功とのみ出力されていれば、Apexバッチ処理が問題なく実行されました!

    次からは、よくあるApexバッチによる一括更新の活用事例をいくつか見ていきましょう。

    Apexバッチの活用事例

    1. 大量のデータの更新や削除

    上記のサンプルは、取引先データの一括更新でしたが、作成時期の古いレコードの削除等大量のデータを一括で処理する場合にApexバッチは有効活用できます。
    これにより、システムのパフォーマンスを向上や使用しているストレージの圧縮も実現できます。

    2. 複雑なビジネスロジックの実行

    複数のオブジェクト間で更新を必要とする場合や、特定の条件を満たすレコードのみ更新する場合に、Apexバッチを使用した複雑なビジネスロジックを実行できます。

    3. 外部システムとの統合

    外部システムとのデータ同期やデータ変換など、Salesforceと他のシステム間で大量のデータを同期する場合にApexバッチを利用することができます。

    ご参考:Apexバッチの作成に慣れてきたシステム管理者向けポイント

    1. バッチサイズの調整

    Apexバッチは、1回のバッチ実行で処理されるレコード数を指定することができます。適切なバッチサイズを選択することで、システムの負荷軽減に寄与することができます。

    2. エラーハンドリング

    Apexバッチでは、エラーハンドリングが重要です。try-catchブロックを使用し、
    例外ケースを表示、例外発生時も適切に業務ができる状態にすることが日々の運用で重要です。

    3. テストコードの作成

    Apexバッチは、テストコードも含めた開発が推奨されています。テストコードを用いて、バッチ処理の正確性やパフォーマンスを事前に確認することができます。

    まとめ

    SalesforceのApexバッチは、大量のレコードを効率的に処理するための強力なツールです。本記事では、Apexバッチのコードを初めて記載する管理者向けに、コンソール画面への遷移方法、バッチを実行するメソッド、そして実際のサンプルコードについて詳細にご紹介しました。
    本記事のサンプルコードを皮切りに、Apexバッチの基本的な構造と実装手順を理解できると、組織に存在している大量のデータを効率的に操作することができるようになります。そして、大量のデータを効率的に操作できることは、システムのパフォーマンス向上やデータ管理の最適化にもつながっていきます。
    ぜひ、本記事をきっかけに学習を継続し、あなたの組織でもApexバッチを有効に活用してみてください。

    <Salesforce>
    弊社ではSalesforceをはじめとするさまざまな無料オンラインセミナーを実施しています!
    >>セミナー一覧はこちら

    また、弊社ではSalesforceの導入支援のサポートも行っています。ぜひお気軽にお問い合わせください。
    >>Salesforceについての詳細はこちら
    >>Salesforceの導入支援実績はこちらからご覧いただけます!

    医療業界に特化した営業支援、顧客管理(SFA/CRM)のコンサルティングも提供しております。こちらもぜひお気軽にお問い合わせください。
    >>顧客管理(SFA/CRM)のコンサルティングの詳細はこちら

CONTACT
お問い合わせ

ご相談やご依頼、病院マスタなどについてのお問い合わせはこちらのお問い合わせフォームから。

サービスなどについてのお問い合わせ 病院マスタについてのお問い合わせ

メールお問い合わせ