Apexバッチで大量のレコードを処理する方法

技術コラム

Y.U

Apexバッチで大量のレコードを処理する方法

Y.U

いつもご愛読いただきありがとうございます。

Salesforceで大量のレコードを処理する際に、エラーやパフォーマンスの問題に悩まされていませんか?

これを解決するための効果的な方法が「Apexのバッチ処理」です。

本記事では、大量のレコードをApexバッチで処理する方法について、ご紹介させていただきます。

Apexバッチとは

ApexバッチはSalesforceのApexコードを使って大量のレコードを非同期で処理するための機能です。

この機能を利用することで、レコードを小さな塊に分けて、順次処理することができます。

これにより、システムの負荷を分散させることができるのです。

Apexバッチの構造

Batchable インターフェース

Apexクラスで Database.Batchable インターフェースを実装します。

start メソッド

最初に呼び出され、SOQLで、処理対象のレコードを取得します。

execute メソッド

取得したレコードの更新処理等を行います。

取得したレコードは、バッチサイズ(一度に処理するレコード数)に分割され、処理されます。

finish メソッド

完了後に呼び出され、後処理を行ないます。

Apexバッチの実装例

以下は、Apexバッチで取引先オブジェクトのカスタム項目を更新する例です。

/**
* 取引先有効化バッチ 
*/ 
public class AccountActiveBatch implements Database.Batchable<Sobject> { 
     /** 開始 */ 
     public Database.QueryLocator start(Database.BatchableContext bc) { 
         // 対象となる取引先レコードを取得
         return Database.getQueryLocator([SELECT Id FROM Account WHERE IsActive__c = false]);
     } 

     /** 処理 */ 
     public void execute(Database.BatchableContext bc, List<Account> accList) { 
         // 取引先を更新 
         List<Account> updAccList = new List<Account>(); 
         for (Account acc : accList) { 
             updAccList.add(new Account(Id=acc.Id, IsActive__c=true)); 
         } 
         update updAccList; 
     } 

     /** 完了 */
     public void finish(Database.BatchableContext bc) {
         // バッチ完了後の処理(メール送信やログ記録など)
     } 
} 

Apexバッチの手動実行

Apexバッチは開発者コンソールから手動で実行することができます。

右上の歯車アイコンから「開発者コンソール」を選択します。

開発者コンソールが開いたら、Debugメニューから「Open Execute Anonymous Window」を選択します。

入力する画面が開いたら、以下のようなApexコードを入力します。

Apexバッチを実行するには Database.executeBatch メソッドを使用します。

この例では、バッチサイズ(一度に処理するレコード数)に200を設定しています。

「Execute」ボタンをクリックしてApexバッチを実行します。

Apexバッチの実行結果は、設定の「Apex ジョブ」で、確認することができます。

また、「Apex ジョブ」では、実行中のApexバッチを中止する事もできます。

Apexバッチのスケジュール実行

ApexバッチはApexスケジューラーで指定した時間に実行することもできます。

Apexクラスで Schedulable インターフェースを実装し、execute メソッドでApexバッチを呼び出します。

以下はApexスケジューラーの例です。

public class AccountActiveBatchScheduler implements Schedulable {
    public void execute(SchedulableContext sc) {
        Database.executeBatch(new AccountActiveBatch());
    }
}

Apexスケジューラーは設定の「スケジュール済みジョブ」や開発者コンソールで登録することができます。

開発者コンソールで登録する場合は、System.schedule メソッドを使用します。

このメソッドは、ジョブ名、実行予定日時を表す式、Apexスケジューラーという 3 つの引数を取ります。

以下は「取引先有効化バッチ」というジョブ名で毎日午前6時にApexスケジューラーを実行させる例です。

System.schedule('取引先有効化バッチ', '0 0 6 * * ?', new AccountActiveBatchScheduler());

手動実行の時と同様に開発者コンソールのDebugメニューから「Open Execute Anonymous Window」を選択し、入力画面にコードを入力、「Execute」ボタンをクリックして登録します。

実行予定日時を表す式の意味は次のとおりです。

式の構文

秒 分 時 日 月 曜日 年(省略可)

式の値

特殊文字の定義

具体例

まとめ

Apexバッチを活用することで、大量のレコードを効率的に処理できます。

またトランザクションの制限やガバナ制限によるエラーにも悩まされず、システムのパフォーマンスを維持できます。

サンブリッジはSalesforceの日本法人設立パートナーであり、国内でも早くからSalesforceの導入・開発支援を行ってきました。

また、自社製品の開発やSalesforceを基盤とした他サービスの導入、Salesforceとの連携なども積極的に行っています。

「既存の環境を改修したいが対応できる人がいない」「もっとSalesforceを活用したいがどの機能から手を付けてよいかわからない」などお困りの際は、ぜひ、サンブリッジにご相談ください!

最後までお読みいただきありがとうございました。

Salesforce導入・活用支援のご案内

サンブリッジが提供するSalesforce導入・活用支援サービスは、お客様の現状の業務用件や目指すゴールをヒアリングし、システム設計から実装までを行います。
導入後のトレーニングまでを含むきめ細やかなサービスを一貫して実施することにより、Salesforceの活用向上と導入の効果を最大化します。

関連記事