2

設定:

A-<B>-C。AではBにRFSがあり、次に更新後トリガーがあり、実行時にBのフィールドにデータが入力されます。次にBのフィールドの1つがCのフィールドにロールアップされます。

質問:

トリガーは機能しますが、すべてを最新の状態にするために、DB内の既存のレコードでトリガーを実行する必要があります。それ、どうやったら出来るの?私はすでにAとCのRFSで力の質量の再計算を実行しようとしました。

4

3 に答える 3

7

再計算するすべてのレコードに触れるために、かなり単純な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内に保持されています

于 2012-07-11T08:19:45.500 に答える
2

回避策を見つけました。

データローダーを使用する-IDと更新のエクスポートを実行します。これにより、最終更新日が変更され、更新後トリガーが起動します。

于 2012-06-12T13:54:54.087 に答える
0

より良い方法は、オブジェクトにダミー フィールドを作成し、そのフィールドを一括更新することです。これにはさらに問題が発生する可能性があるため、DML を実行する場合に SOQL ガバナー制限が発生しないように、バッチ サイズを小さくする必要があります。

于 2012-08-13T21:09:07.067 に答える