0

我想使用 apex 在 salesforce 中实现同步。

我的要求是,我必须从将来的方法中更新一个字段。

我在数据库中有一个名为 Counter_c 的字段,我正在调用一个方法,该方法将调用 3 个未来方法。那些未来的方法将尝试将计数器_c 的值增加 1。但字段没有得到更新。

这是我的代码:

公共无效生成报告(){

  ReportHistory__c repHst = new ReportHistory__c();
  repHst.Counter__c = 0;
  insert repHst;

  generateReport1(repHst.Id);
  generateReport2(repHst.Id);
  generateReport3(repHst.Id);

}

@future
public static void generateReport1(Id id) {

List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
     if(!lstRep.isEmpty()) {
        ++lstRep[0].Counter__c;
     }
     update lstRep;
}


@future
public static void generateReport2(Id id) {

List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
     if(!lstRep.isEmpty()) {
        ++lstRep[0].Counter__c;
     }
     update lstRep;
}


@future
public static void generateReport3(Id id) {

List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
     if(!lstRep.isEmpty()) {
        ++lstRep[0].Counter__c;
     }
     update lstRep;
}

执行上述代码后,我希望 Counter__c 应为 3。但它仍然为 0 或有时为 1。

请帮助我,如果有任何方法可以控制将来的调用,以便将来的每个调用都应将 Counter__c 的值更新 1。

谢谢,维维克

4

1 回答 1

1

从您的示例代码看来,lstRep.isEmpty()检查缺少否定。

例如!,在 if 条件中添加 a。

@future
public static void generateReport1(Id id) {

    List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
    if(!lstRep.isEmpty()) {
        lstRep[0].Counter__c++;
    }
    update lstRep;
}

您未来的方法也有可能从队列中拉出并由不同的应用程序服务器并行处理。如果是这种情况,您会遇到并发问题。阅读Force.com 中的异步处理。您可以尝试将FOR UPDATE关键字添加到您的 SOQL 查询中,但这可能会导致您未来的某些方法超时。

于 2013-03-17T02:40:12.620 回答