0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Salesforce】バッチ処理入門:Accountテストレコード作成

Posted at

はじめに

今回は、Salesforceのバッチ処理(Apex一括処理)について学び、Accountオブジェクトのテストレコードを作成する方法を実装します。

Salesforceのバッチ処理

Salesforceでは、Apexクラスを使用してレコードをバッチ単位で非同期に一括処理できます。これにはDatabase.Batchableインターフェースを実装し、以下の3つのメソッドを含める必要があります。

  1. startメソッド
    処理するレコードまたはオブジェクトを収集するために使用します。
    開始時に1回コールされ、Database.QueryLocatorオブジェクトか、ジョブに渡すレコードやオブジェクトが含まれるIterableオブジェクトを返します。

  2. executeメソッド
    メソッドに渡されたデータの処理単位(バッチ)ごとに実際の処理を実行します。
    このメソッドでは、以下を取得します。
    Database.BatchableContextオブジェクトへの参照
    List<sObject>などのsObjectのリストまたはパラメーター化された型のリスト
    Database.QueryLocatorを使用している場合は、返されたリスト

  3. finishメソッド
    すべてのバッチ処理が完了した後に1回呼び出され、後処理(例: メール通知など)を実行します。

Apex一括処理クラスの呼び出し

クラスを呼び出すにはインスタンス化し、そのインスタンスを使用してDatabase.executeBatchをコールします。

MyBatchClass myBatchObject = new MyBatchClass();
Id batchId = Database.executeBatch(myBatchObject);

レコードを追加するApexクラスの作成

public class AccountCreateBatch implements Database.Batchable<sObject>, Database.Stateful {
  private Id recordTypeId;
  
  public Database.QueryLocator start(Database.BatchableContext BC) {
      getRecordTypeId();
      return Database.getQueryLocator('SELECT Id FROM Account LIMIT 1');
  }

  public void execute(Database.BatchableContext BC, List<SObject> scope) {
      List<Account> acc = new List<Account>();
      for (Integer i = 0; i < 100; i++) {
          acc.add(new Account(
              Name = 'Test Account 0' + i,
              Phone = '123-456-7890',
              Email__c = 'test0' + i + '@example.com',
              RecordTypeId = recordTypeId
          ));
      }
      insert(acc);
  }

  public void finish(Database.BatchableContext BC) {
      System.debug('Batch job completed.');
  }

  private void getRecordTypeId() {
      recordTypeId = [SELECT Id FROM RecordType WHERE SObjectType = 'Account' AND DeveloperName = 'JobSeeker' LIMIT 1].Id;
  }
}

startメソッドでは、追加するレコードのレコードタイプを取得します。
レコードタイプIdの取得をstartメソッドにそのまま記述すると、期待通りの動作をしなかったので、getRecordTypeIdメソッドを作成して呼び出す形で実装しています。

public Database.QueryLocator start(Database.BatchableContext BC) {
    getRecordTypeId();

下記の記述は、バッチ処理の対象データを指定するために必要な部分です。この記述がないと、バッチ処理がどのデータを処理するのかをSalesforceに伝えることができず、正常に動作しません。

return Database.getQueryLocator('SELECT Id FROM Account LIMIT 1');

excuteメソッドでは、Accountオブジェクトのリストを作成し、テストデータを追加します。
SalesforceのUI上での操作と同様、必須項目に値を入れなかったり、入力規則でエラーが出る状態で作成することはできません。

finishメソッドでは、今回はデバッグログを出力するだけですが、必要に応じて後処理を追加できます。

作成したApexクラスをデプロイします。
デプロイしたいファイルを右クリックでもデプロイできますが、組織から削除と並んでいるので、コマンドパレットから実行する方がおすすめです。

>SFDX: Deploy This Source to Org

スクリーンショット 2025-04-05 21.33.46.png

バッチ処理の実行

作成したバッチクラスを実行するには、以下のコードを使用します。

AccountCreateBatch batch = new AccountCreateBatch();
Database.executeBatch(batch, 200);

このコードをscriptsフォルダ内に新規ファイルとして保存します。

コードの上部にあるExcuteから実行できます。
runBatch_apex_—_sf-dev-edition.png

テストレコードの削除

作成したテストレコードを削除したいときには、以下のコードを実行します。

List<Account> accountsToDelete = [SELECT Id FROM Account WHERE Name LIKE 'Test Account 0%'];
if (!accountsToDelete.isEmpty()) {
    delete accountsToDelete;
    System.debug(accountsToDelete.size() + ' records deleted.');
} else {
    System.debug('No records found to delete.');
}

先ほどと同様にscriptsフォルダ内に新規ファイルとして保存し、Excuteから実行できます。

まとめ

バッチ処理でデータローダーを使わずにテストレコードを作成することが可能になりました。

しかし、必須項目や入力規則の数が多いと上手く作成できないことが多いので、バッチ処理やApexクラスの知見を深めて、簡易的にテストレコードを作成する方法を見つけていきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?