データベースの使い方。 Salesforce のバッチ Apex でのステートフル

公開: 2023-11-21

まず、Batch Apex を使用する場合は、Salesforce が提供するインターフェース Database を実装する Apex クラスを作成する必要があることを理解する必要があります。 バッチ可能にしてからプログラムでクラスを呼び出します。 バッチ Apex ジョブの実行を監視または停止するには、[設定] から、[クイック検索] ボックスに 「Apex ジョブ」 と入力し、[Apex ジョブ] を選択します。

この記事では、データベースの強力な機能について詳しく説明します。 Batch Apex のステートフル。 データベースについて理解する。 ステートフルはバッチ ジョブの実行全体で状態を維持するために不可欠であり、開発者がインスタンス変数を保持し、より洗練された状態認識型バッチ プロセスを作成できるようになります。

バッチの構文:

 グローバル クラス BatchName は Database.Batchable を実装します{}

バッチクラスのメソッド:

 global (Database.QueryLocator | Iterable) start (Database.BatchableContext bc) {
 //ここでクエリを追加し、メソッドを実行するために結果を返します
}

グローバル void 実行 (Database.BatchableContext BC, list<P>){
 //ロジックがここにある必要があります
}

グローバル void 終了 (Database.BatchableContext BC){
 //すべてのバッチの処理後、このメソッドが呼び出されます。 その中に任意のコードを書くことができます。 実行メソッドで作成または更新されたすべてのレコードに電子メールを送信したい場合と同様です。
}

こちらもお読みください: Salesforce でカスタム レポート タイプを作成する方法?

Database.Batchable インターフェイスの実装

例:

 グローバル クラス BatchAccountUpdate は Database.Batchable{ を実装します
    文字列クエリ = 'アカウント WHERE 名から名前を選択してください! = null AND (名前 = \'Virendra Company\' OR 名前 = \'Virendra Sharma\') ';
    global Database.QueryLocator start (Database.BatchableContext bc) {
        // 実行に渡されるレコードまたはオブジェクトのバッチを収集します
        戻りデータベース.getQueryLocator(クエリ);
    }
    
    グローバル void 実行 (Database.BatchableContext bc、レコードのリスト) {
        // レコードの各バッチを処理します
        for (アカウント acc : レコード){
            acc.Name = acc.Name + ' 更新されました';
        }
        記録を更新する。
    }
    
    グローバル void 終了 (Database.BatchableContext bc){
        // バッチ クラスを呼び出して後処理操作を実行します。
        BatchUpdateAccount関連連絡先 b = 新しいBatchUpdateAccount関連連絡先();
        Database.executeBatch(b, 200);
    }    
}
データベースステートフル

データベース.ステートフル

次のサンプル クラスは、QueryLocator を使用して start() メソッドによって渡されたすべてのアカウント レコードを検索し、関連付けられた連絡先をアカウントのメール アドレスで更新します。 最後に、一括ジョブの結果と、Database.Stateful を使用して状態を追跡しているため、更新されたレコードの数を記載した電子メールが送信されます。

データベースのステートフル コード
データベースのステートフル コード

例:

Salesforce開発者を雇う

Database.AllowsCallout

Database.AllowsCallout in Batch は、Salesforce と外部サーバーの統合に役立ちます。 バッチ Apex でコールアウトを使用するには、バッチクラスのクラス定義で Database.AllowsCallouts インターフェイスを使用する必要があります。

構文:

 グローバル クラス SearchAndReplace は Database.Batchable、Database.AllowsCallouts を実装します{}

例:
ここでは、Opportunity オブジェクトを Razorsync.com と統合しています。
/*
razorsync からサービス リクエストを取得し、Salesforce に更新します
*/

 グローバル クラス Batch_SR_RazorSyncAPI は、Database.Batchable、Database.AllowsCallouts{ を実装します。
    global Database.QueryLocator start (Database.BatchableContext BC){
        文字列クエリ = 'SELECT Id, Razorsync_Service_Request_Id__c FROM Opportunity WHERE Razorsync_Service_Request_Id__c != null AND Razorsync_Job_Status__c != \'ジョブ完了\' AND RazorSync_Status__c = \'成功\'';
        戻りデータベース.getQueryLocator(クエリ);
    }
   
    グローバル void 実行 (Database.BatchableContext BC、リスト スコープ){
        文字列ステータス。
        for (機会 : スコープ){
            //ServiceRequestを取得する
            System.debug(s.Id);
            Http http1 = 新しい Http();
            HttpRequest request1 = 新しい HttpRequest();
            request1.setEndpoint('https://DomainName.0.razorsync.com/ApiService.svc/ServiceRequest/'+ s.Razorsync_Service_Request_Id__c);
            request1.setMethod('GET');
            request1.setHeader('Content-Type', 'application/json');
            request1.setHeader('ホスト', 'ドメイン名.0.razorsync.com');
            request1.setHeader('コンテンツの長さ', '0');
            request1.setHeader('接続', 'キープアライブ');
            request1.setHeader('サーバー名', 'ドメインサーバー名');
            request1.setHeader('トークン', 'XXXXXXXXXXXXXXXXXXXXXXX');
            
            HttpResponse 応答 1 = http1.send(request1);
            
            if(response1.getStatusCode() == 200) {
                状態;
                JSONParser パーサー = JSON.createParser(response1.getBody());
                while(parser.nextToken() != null) {
                    if( (parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'StatusId') || Test.isRunningTest()) {
                        parser.nextToken();
                        StatusId = parser.getText();
                    }
                }
                System.debug(StatusId);
                if(StatusId == String.valueOf(1) || Test.isRunningTest()){
                    s.Razorsync_Job_Status__c = 'ジョブ完了';
                    s.StageName = 'クローズド勝利';
                }それ以外{
                    s.Razorsync_Job_Status__c = '作業中';
                }
            }
        }
        スコープを更新します。
    }
    グローバル void 終了 (Database.BatchableContext BC){
    }
}

こちらもお読みください: Salesforce Commerce Cloud の利点と Salesforce の Apex からフローを呼び出す方法

結論

Salesforce 内のバッチ Apex でDatabase.Stateful を使用すると、バッチジョブのさまざまな実行方法にわたって状態を保持できます。 これは、複雑なデータ処理が必要であり、バッチ チャンク間で状態を保持する必要があるシナリオでは非常に重要です。

Database.Statefulを実装することで、開発者はデータの一貫性を確保し、大規模なデータ セットを効果的に管理できます。 ただし、過度のメモリ消費や潜在的なパフォーマンスの問題を避けるために、この機能を慎重に使用することが重要です。

ベスト プラクティスには、状態変数を最小限に抑え、重要なデータに焦点を当てることが含まれており、 Database.Stateful は、Salesforce での複雑で状態に依存するバッチ処理のための強力なツールになります。

Salesforce プロジェクトに関するさらなる支援が必要な場合は、Salesforce コンサルタントとして当社を雇用してメリットを享受してください。