Salesforceに入っている大量データを自動で更新したい。
そんな時、通常の方法ではDataloaderでデータを更新となりますが、個人的にはDataloaderで大量データを更新する際の悩み事として以下のようなことがあります。
- 処理が終わるまでPCをつけっぱなしにしないといけない
- 途中でPCがスリープしたりインターネットの接続が無くなったら、どこまで処理したか分からない
- Dataloaderの設定によって更新処理をミスしたりする
また、プロセスビルダーを作ったけど、過去データには値が入らないので空更新したいという場合もたまにあります。
そんな時に便利なのがApexジョブ。
必要なデータを取得して、一定件数ずつに分割してSalesforec内で処理を実行してくれます。
今回は以下のようなシンプルなデータを更新するだけのApexクラスを作成してみました。
public with sharing class UpdateRecordsBatch implements Database.Batchable, Database.Stateful {
String query;
//コンストラクタでSOQLを受け取る
public UpdateRecordsBatch(String q) {
query = q;
}
public Database.QueryLocator start(Database.BatchableContext BC) {
return Database.getQueryLocator(query);
}
//executeメソッドではupdateするのみ。処理する場合は、こちらに記述。
public void execute(Database.BatchableContext BC, List targetIdList) {
update targetIdList;
}
//終了処理。ここで次のApexジョブを呼び出したりもできる。
public void finish(Database.BatchableContext BC) {}
}
開発者コンソールのExecute Anonymous Windowで以下のコードを実行することでジョブ実行できます。
String q=’SELECT ID FROM Task’; //処理したいレコードを取得するSOQLを記述
Test.startTest();
UpdateRecordsBatch batchable = new UpdateRecordsBatch(q);
Database.executeBatch(batchable, 200);
テストクラス。SeeAllData=trueで手抜きしてますが、皆さんはテストクラス内でデータ登録してください。
@isTest(SeeAllData=true)
public with sharing class UpdateRecordsBatchTest {
@isTest
public static void testschedule() {
// テストの開始
String q=’SELECT ID FROM Task LIMIT 1′;
Test.startTest();
UpdateRecordsBatch batchable = new UpdateRecordsBatch(q);
Database.executeBatch(batchable, 200);
Test.stopTest();
}
}
Apexジョブを実行すれば、後は終了まで待つだけなので楽です。
終了通知が欲しい場合は、finishメソッドでログ用のオブジェクトにデータを登録してメールアラートでメール送信などで通知可能です。
コメントを残す