2

设置:

A--< B >-- C 。在 A 上,B 上有一个 RFS,然后有一个更新后触发器,当运行时填充 B 上的字段。然后 B 的一个字段被汇总到 C 上的一个字段中。

问题:

触发器有效,但我需要在数据库中的现有记录上运行它以使所有内容保持最新。我怎么做?我已经尝试在 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'));

触摸所有联系人

这应该在所有被触摸的记录上运行触发器(最多支持 5000 万条记录)。与提议的数据加载器解决方案相同的想法,但保留在 SFDC 中以便于重用

于 2012-07-11T08:19:45.500 回答
2

找到了解决方法。

使用数据加载器 - 对 ID 和更新进行导出。这将更改上次修改日期,并导致更新后触发器触发。

于 2012-06-12T13:54:54.087 回答
0

更好的方法是在对象上创建一个虚拟字段,然后对该字段进行批量更新。这可能还有其他问题,因此您可能希望将批量大小减少到一个数字,以便在执行任何 DML 时不受 SOQL 调控器限制。

于 2012-08-13T21:09:07.067 回答