設定:
A-<B>-C。AではBにRFSがあり、次に更新後トリガーがあり、実行時にBのフィールドにデータが入力されます。次にBのフィールドの1つがCのフィールドにロールアップされます。
質問:
トリガーは機能しますが、すべてを最新の状態にするために、DB内の既存のレコードでトリガーを実行する必要があります。それ、どうやったら出来るの?私はすでにAとCのRFSで力の質量の再計算を実行しようとしました。
設定:
A-<B>-C。AではBにRFSがあり、次に更新後トリガーがあり、実行時にBのフィールドにデータが入力されます。次にBのフィールドの1つがCのフィールドにロールアップされます。
質問:
トリガーは機能しますが、すべてを最新の状態にするために、DB内の既存のレコードでトリガーを実行する必要があります。それ、どうやったら出来るの?私はすでにAとCのRFSで力の質量の再計算を実行しようとしました。
再計算するすべてのレコードに触れるために、かなり単純なBatch Apex(ドキュメントを参照)ジョブクラスを作成できます。
global class TouchRecords implements Database.Batchable<sObject>{
private String query;
global TouchRecords(String query) {
this.query = query;
}
global Database.QueryLocator start(Database.BatchableContext BC){
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext BC, List<sObject> scope){
update scope;
}
global void finish(Database.BatchableContext BC){
}
}
次に、次のコマンドを実行してジョブを実行できます(たとえば、匿名で実行)。
Id batchInstanceId = Database.executeBatch(new TouchRecords('select id from A__c'));
また
Id batchInstanceId = Database.executeBatch(new TouchRecords('select id from Contact'));
すべての連絡先に触れる
これにより、タッチされているすべてのレコードでトリガーが実行されます(最大5,000万レコードをサポートします)。提案されたデータローダーソリューションと同じアイデアですが、再利用しやすいようにSFDC内に保持されています
回避策を見つけました。
データローダーを使用する-IDと更新のエクスポートを実行します。これにより、最終更新日が変更され、更新後トリガーが起動します。
より良い方法は、オブジェクトにダミー フィールドを作成し、そのフィールドを一括更新することです。これにはさらに問題が発生する可能性があるため、DML を実行する場合に SOQL ガバナー制限が発生しないように、バッチ サイズを小さくする必要があります。