Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

Salesforce CPQ での契約更新の自動化

公開日: Sep 27, 2025
説明
Salesforce CPQ では、契約の更新売上予測項目または更新見積済み項目を手動で確認することで、契約と納入商品を更新できます。契約更新プロセスを自動化する場合は、次のベストプラクティスに沿ってスケジュール済み Apex 一括処理ジョブを使い、契約を更新します。
 
解決策
契約更新プロセスを自動化するには、スケジュール済み Apex クラスを使用して、契約オブジェクトで一括処理サイズを「1」にして Apex の一括処理クラスを実行することで、このタスクを実行することをお勧めします。Apex の一括処理クラスでは、更新が必要なすべてのレコードに対してクエリを実行し、SBQQ__RenewalForecast__c または SBQQ__RenewalQuoted__c 項目を設定できます。以下の例では、SBQQ__RenewalForecast__c も SBQQ__RenewalQuoted__c もチェックされていない、組織内のすべての契約に対してクエリを実行します。次に、それらの契約の SBQQ__RenewalForecast__c を「true」に設定して更新商談を生成します。また、一括処理を作成したユーザーにバッチ処理のステータスを通知するメールを送信します。
 
///***Apex の一括処理クラス***

global class RenewContractsBatch implements Database.Batchable<SObject>, Database.Stateful {
	global Integer recordsProcessed = 0;

	global Database.QueryLocator start(Database.BatchableContext bc){
		return Database.getQueryLocator(
			//更新を設定するレコードの条件をここに入力します。 
			'SELECT SBQQ__RenewalForecast__c, SBQQ__RenewalQuoted__c, Id FROM Contract WHERE SBQQ__RenewalForecast__c = FALSE AND SBQQ__RenewalQuoted__c = FALSE'
		);
	}
	global void execute(Database.BatchableContext bc, List<Contract> scope){
		for(Contract contract:scope){
			contract.SBQQ__RenewalForecast__c = TRUE;
			recordsProcessed = recordsProcessed + 1;
		}
		update scope;
	}
	global void finish(Database.BatchableContext bc){
       // この一括処理ジョブを表す AsyncApexJob の ID を
       // Database.BatchableContext から取得します。
       // AsyncApexJob オブジェクトを照会して現在のジョブの情報を取得します。
       AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,
          TotalJobItems, CreatedBy.Email
          FROM AsyncApexJob WHERE Id =
          :BC.getJobId()];
       // 任意:Apex ジョブの送信者にジョブの完了を通知するメールを送信します。
       Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
       String[] toAddresses = new String[] {a.CreatedBy.Email};
       mail.setToAddresses(toAddresses);
       mail.setSubject('Contract Renewal Batch ' + a.Status);
       mail.setPlainTextBody
       ('The batch Apex job processed ' + a.TotalJobItems +
       ' batches with '+ a.NumberOfErrors + ' failures.');
       Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
	}
}

Apex の一括処理クラスを作成したら、Apex の一括処理クラスを自動的に呼び出す Schedulable Apex クラスを作成する必要があります。Apex の一括処理クラスを呼び出すときは、個々の Apex プロセスの組織制限に達しないように一括処理サイズに「1」を使用することが重要です。
 
//***Schedulable Apex クラス***

global class RenewSchedule implements Schedulable {
    global void execute(SchedulableContext ctx) {
        RenewContractsBatch batchObject = new RenewContractsBatch();
		Id batchId = Database.executeBatch(batchObject, 1);
    }
}

一括処理クラスとそれを呼び出すスケジュールクラスを作成したら、[設定] の [Apex クラス] リストで [Apex をスケジュール] ボタンをクリックします。ここで、標準の Salesforce Schedule Apex インターフェースを使用した更新一括処理の日次実行を選択できます。ただし、より頻繁に一括処理を実行する必要がある場合は、次のコードの形式を実行します。次の例では、上の RenewSchedule クラスを 10 分ごとに実行するよう設定しています。一括処理は毎時 0 分、10 分、20 分、30 分、40 分、50 分に実行されるよう設定されています。

System.schedule メソッドについての詳細は、こちらの開発者ドキュメントの記事を参照してください。
 
//***Scheduled Apex の実行を設定するための匿名 Apex***

RenewSchedule c = new RenewSchedule();
String sch0 = '0 0 * * * ?';
System.schedule('Renew Contracts 0', sch0, c);

String sch1 = '0 10 * * * ?';
System.schedule('Renew Contracts 10', sch1, c);

String sch2 = '0 20 * * * ?';
System.schedule('Renew Contracts 20', sch2, c);

String sch3 = '0 30 * * * ?';
System.schedule('Renew Contracts 30', sch3, c);

String sch4 = '0 40 * * * ?';
System.schedule('Renew Contracts 40', sch4, c);

String sch5 = '0 50 * * * ?';
System.schedule('Renew Contracts 50', sch5, c);

注意:処理する契約数が少ないお客様は、時間ベースのワークフロールールを使用して自動更新を行うことができます。ただし、同じワークフローオートメーションで複数の契約を更新しようとすると、Apex 制限に達する危険があります。サイズを「1」にして一括処理ジョブを実行すると、このような Apex 制限を回避できます。 時間ベースのワークフロールールを使用する場合は、デフォルトのワークフローユーザーがシステム管理者か、CPQ オブジェクトとレコードに対する適切なアクセス権をすべて持っているユーザーであることを確認してください。Salesforce Org のデフォルトのワークフローユーザーを特定するには、こちらのリンクをクリックしてください。
スケジュール済みフローを使用して更新を自動化することはお勧めできません。スケジュール済みフローを更新の自動化に使用すると、エラーが返されます。スケジュール済みフローは、「内部」ユーザーを使用してプロセスを実行します。そのユーザーは自動化プロセスと呼ばれます。このユーザーはアクセスも構成もできず、CPQ への適切なアクセス権を持ちません。自動化プロセスユーザーに関するこちらのアイデアに対して、ご自由にプラス投票してください。
ナレッジ記事番号

000383568

 
読み込み中
Salesforce Help | Article