いつもご愛読いただきありがとうございます。
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の活用向上と導入の効果を最大化します。