Salesforce Apex Database.Stateful

Posted by ExiaHuang on August 21, 2017

Database.Stateful を使うと、データの内容を保持した状態でバッチが走らせられた

apexでバッチを走らせる場合は、デフォルトでの200件ごとに処理を走らせる場合が多いけれれど、 その時に処理の中でカウントアップしたデータを次の処理に引き継ぎたかった。 結論から言うと、 Database.Stateful を使うと、データの内容を保持した状態でバッチが走らせられた。 具体的には以下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public with sharing class Hogehoge_Batch implements Database.Batchable<sObject>, Database.Stateful{
  
    private Integer count {get; set;}
    
  public Hogehoge_Batch(Boolean isLastBatch){
      this.count = 0;
    }
    
    public Database.QueryLocator start(Database.BatchableContext BC){
        String query = 'select id from Lead';
         return Database.getQueryLocator(query);
    }
    
    public void execute(Database.BatchableContext BC, List<Lead> scope){
        for(Lead user : scope){ 
            user.count__c = this.count;
            this.count++;
        }
        update scope;
    }
   
    public void finish(Database.BatchableContext BC){
    }
    
}

クラス定義の1行目の最後にくっついてる。 これがないとcountは毎回リセットされてしまう。