Salesforce Batch Apex 批处理(三)Database.Stateful接口
2023-03-15 22:06:59 时间
Using State in Batch Apex
Batch处理中,根据特定需求,会有在处理中计算数量的业务,例如现在需要计算所有满足条件的Opportunity表total__c的总额。
具体代码如下,
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。
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接口
public with sharing class SummarizeAccountTotal implements Database.Stateful{
具体代码如下,
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){
}
}
String queryS = 'SELECT Id,Name,total__c FROM Opportunity WHERE DeleteFlg__c = true';
SummarizeAccountTotal batchTest = new SummarizeAccountTotal(queryS);
Database.executeBatch(batchTest, 2);
相关文章
- 最新版本PHP 7与HHVM 多角度比较
- “口罩厂”霍尼韦尔搞出的量子计算机,刚刚获得Nature认可
- 如何在HTML 5&JavaScript环境下保障开发安全
- Apache Mesos 正在投票讨论是否退役
- 面试官:如何让主线程等待所有的子线程结束之后再执行?我懵了
- C#程序员经常用到的10个实用代码片段
- 鸿蒙内核源码分析(消息队列篇) | 进程间如何异步解耦传递大数据
- 如何做好软件测试工作?
- 程序员必备:100本免费编程图书
- 2015年十五个热门的 PHP 开发工具
- 这五个编程谬论值得大家注意
- 程序员既要写好代码,又要写好文档
- PHP之父:PHP7 性能翻倍关键大揭秘
- 优秀的代码是反复修改后创造出来的
- 只要你一句话,马斯克就得留扫把头,项目已开源
- 关于PHP程序员解决问题的能力
- 管理 | 第1次带项目,我干赔了...
- Hello World 程序的起源与历史
- 非科班出身的人学习编程不负责任指南
- PHP 8.1新特性公布 增加 Enums、Fsync功能