見出し画像

[Salesforce][Apexコード付き]大量データを自動で更新するApexクラス

Salesforceに入っている大量データを自動で更新したい。


そんな時、通常の方法ではDataloaderでデータを更新となりますが、個人的にはDataloaderで大量データを更新する際の悩み事として以下のようなことがあります。

処理が終わるまでPCをつけっぱなしにしないといけない!
途中でPCがスリープしたりインターネットの接続が無くなったら、どこまで処理したか分からない


また、プロセスビルダーを作ったけど、過去データには値が入らないので空更新したいという場合もたまにあります。

Salesforce内で更新処理を実行しよう

そんな時に便利なのがApexジョブ。
必要なデータを取得して、一定件数ずつに分割してSalesforec内で処理を実行してくれます。

今回は以下のようなシンプルなデータを更新するだけのApexクラスを作成してみました。

public with sharing class UpdateRecordsBatch implements Database.BatchableDatabase.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  testschedule() {
        // テストの開始
        String q='SELECT ID FROM Task LIMIT 1';
        Test.startTest();
        UpdateRecordsBatch batchable = new UpdateRecordsBatch(q);
        Database.executeBatch(batchable, 200);
        Test.stopTest()
    }
}

Apexジョブを実行すれば、後は終了まで待つだけなので楽です。
終了通知が欲しい場合は、finishメソッドでログ用のオブジェクトにデータを登録してメールアラートでメール送信などで通知可能です。

本記事は以上です。
お役に立ちましたら、本記事を購入お願いします。

ここから先は

0字

¥ 1,000

この記事が気に入ったらサポートをしてみませんか?