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

Y.U

Rewa Tech

技術コラム

システム開発

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

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」ボタンをクリックして登録します。

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

式の構文

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

式の値

名前 特殊文字
0〜59
0〜59
0〜23 , – * /
1〜31 , – * ? / L W
1〜12 または JAN〜DEC , – * /
曜日 1〜7 または SUN 〜SAT , – * ? / L #
省略または 1970〜2099 , – * /

特殊文字の定義

, 複数の値を指定 (例: JAN,MAR,APR)
範囲の指定 (例: JAN-MAR)
* すべての値を指定 (例: 月を*と指定すると毎月)
? 特定の値を指定しない
/ 増分を指定 (例: 日を1/5と指定すると1日から5日おき)
L 日の場合は月末日、曜日の場合は土曜日または数字と組み合わせて曜日を指定 (例: 2L と指定すると最終月曜)
W 指定日に最も近い平日(月~金) (例: 20W と指定すると20日が土曜なら19日 1Wと指定すると1日が土曜なら次の月曜の3日)
# 毎月第〇曜日を指定 (例: 2#1 と指定すると毎月第1月曜日)

具体例

0 0 13 * * ? 毎日午後1時に実行
0 5 * * * ? 毎時5分に実行
0 0 22 ? * 6L 毎月最終金曜の午後10時に実行
0 0 10 ? * MON-FRI 月曜から金曜の午前10時に実行
0 0 20 * * ? 2024 2024年の毎日午後8時に実行

まとめ

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

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

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

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

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

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

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

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

関連記事