前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Salesforce Batch Apex 批处理(三)Database.Stateful接口

Salesforce Batch Apex 批处理(三)Database.Stateful接口

原创
作者头像
repick
修改2021-11-22 19:12:56
8230
修改2021-11-22 19:12:56
举报
文章被收录于专栏:Salesforce

Using State in Batch Apex

Batch处理中,根据特定需求,会有在处理中计算数量的业务,例如现在需要计算所有满足条件的Opportunity表total__c的总额。

具体代码如下,

代码语言:javascript
复制
public with sharing class SummarizeAccountTotal implements Database.Batchable<sObject>{
    public final String Query;
    public integer Summary;
    public SummarizeAccountTotal(String q) {
        Query=q;
        Summary = 0;
    }
    public Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator(query);
    }

    public void execute(Database.BatchableContext BC,List<sObject> scope){
        for(Opportunity opportunityItem : (List<Opportunity>)scope) {
            system.debug('>>>>>>>>>opportunityItem.total__c>>::'+opportunityItem.total__c);
            Summary = Integer.valueOf(opportunityItem.total__c) + Summary;
            system.debug('>>>>>>>>>Summary>>::'+Summary);
        }
    }
    public void finish(Database.BatchableContext BC){
    }
}

现有4条数据,每条数据的total__c的值是1

执行如下操作,预想结果总额应该是4,但是执行结果却是2。

代码语言:javascript
复制
String queryS = 'SELECT Id,Name,total__c FROM Opportunity WHERE DeleteFlg__c = true';
SummarizeAccountTotal batchTest = new SummarizeAccountTotal(queryS);
Database.executeBatch(batchTest, 2);

原因分析:

方法【Database.executeBatch】的第二个参数是2,所以分两次执行,每次执行完execute方法之后,Summary变量都会被清空。

改善方法:

只需实现Database.Stateful接口

代码语言:javascript
复制
public with sharing class SummarizeAccountTotal implements Database.Stateful{

具体代码如下,

代码语言:javascript
复制
public with sharing class SummarizeAccountTotal implements Database.Batchable<sObject>, Database.Stateful{
    public final String Query;
    public integer Summary;
    public SummarizeAccountTotal(String q) {
        Query=q;
        Summary = 0;
    }
    public Database.QueryLocator start(Database.BatchableContext BC){
        return Database.getQueryLocator(query);
    }

    public void execute(Database.BatchableContext BC,List<sObject> scope){
        for(Opportunity opportunityItem : (List<Opportunity>)scope) {
            system.debug('>>>>>>>>>opportunityItem.total__c>>::'+opportunityItem.total__c);
            Summary = Integer.valueOf(opportunityItem.total__c) + Summary;
            system.debug('>>>>>>>>>Summary>>::'+Summary);
        }
    }

    public void finish(Database.BatchableContext BC){
    }
}
代码语言:javascript
复制
String queryS = 'SELECT Id,Name,total__c FROM Opportunity WHERE DeleteFlg__c = true';
SummarizeAccountTotal batchTest = new SummarizeAccountTotal(queryS);
Database.executeBatch(batchTest, 2);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Using State in Batch Apex
    • 具体代码如下,
      • 原因分析:
      • 改善方法:
      相关产品与服务
      批量计算
      批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档