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

Salesforce Batch Apex 批处理(一)

原创
作者头像
repick
修改2021-11-20 08:06:49
1.5K0
修改2021-11-20 08:06:49
举报
文章被收录于专栏:SalesforceSalesforce

Apex SOQL 每次最多只能查询50000条数据,DML 可以操作的数据更少只有10000条,如果想要处理大量数据,就要考虑使用Batch Apex功能,Batch Apex实现Database.batchable接口

Datebase.Batchable封装了以下三个方法:

1.start方法

代码语言:javascript
复制
public (Database.QueryLocator | Iterable<sObject>) start(Database.BatchableContext bc) {} 

用于收集要操作的数据,然后将数据传到execute()进行具体操作,使用SOQL取得的合计数没有制限,

例如,对于Account来说,最大可以存储5000万件,全部可以返回。

2.execute方法

代码语言:javascript
复制
public void execute(Database.BatchableContext BC, list<P>){} 

对start方法传进来的数据进行处理。

3.finish方法

代码语言:javascript
复制
public void finish(Database.BatchableContext BC){}

batch执行完毕执行,一般用作邮件通知,或者后续操作。

4.Database.executeBatch方法

调用此方法,可以开始执行批处理,

有两个参数,第一个是被执行Batch的Class名,第二个是传入execute方法的Record数

5.实装例

代码语言:javascript
复制
global with sharing class ExampleUpdateRecordBatch implements Database.Batchable<sObject>,Database.Stateful,Database.AllowsCallouts {
    public ExampleUpdateRecordBatch() {

    }
    global Database.QueryLocator start(Database.BatchableContext BC) {
        String queryS = 'SELECT Id,Name FROM Opportunity WHERE DeleteFlg__c = true';
        return Database.getQueryLocator(queryS);
    }
    global void execute(Database.BatchableContext BC, list<sObject> scope) {
        Savepoint sp = Database.setSavepoint();
        try {
            List<Opportunity> newOppList = new List<Opportunity>();
            for(Opportunity opportunityItem : (List<Opportunity>)scope) {
                opportunityItem.stageName = 'Closed Won';
                newOppList.add(opportunityItem);
            }
            update newOppList;
        } catch (Exception ex) {
            Database.rollback(sp);
        }
    }

    global void finish(Database.BatchableContext BC) {

    }
}

Batch执行:为了测试,我们在匿名框中执行以下代码

代码语言:javascript
复制
ExampleUpdateRecordBatch batchTest = new ExampleUpdateRecordBatch();
Database.executeBatch(batchTest, 2000);

执行结果:

6.测试类

代码语言:javascript
复制
@IsTest
private with sharing class ExampleUpdateRecordBatchTest {
    @TestSetup
    static void initialOrgInfo(){
        String strUserName = 'BatchTest001';
        Profile profile = [SELECT Id FROM Profile WHERE Name = 'System Administrator' LIMIT 1];
        User batchTestUser = new User();
        batchTestUser.ProfileId = profile.Id;
        batchTestUser.UserName = strUserName + '@sample.com';
        batchTestUser.FirstName = '';
        batchTestUser.LastName = strUserName;
        batchTestUser.EMail = 'testuser@sample.com';
        batchTestUser.Alias = 'testuser';
        batchTestUser.TimeZoneSidKey = 'Asia/Tokyo';
        batchTestUser.LocaleSidKey = 'ja_JP';
        batchTestUser.EmailEncodingKey = 'ISO-2022-JP';
        batchTestUser.LanguageLocaleKey = 'ja';
        Database.insert(batchTestUser, false);

        PermissionSet permissionSet = [SELECT Id
                                        FROM PermissionSet
                                        WHERE Name = 'Ursus_Park_User'];
        PermissionSetAssignment assignmentAss = new PermissionSetAssignment();
        assignmentAss.AssigneeId = batchTestUser.Id;
        assignmentAss.PermissionSetId = permissionSet.Id;
        Database.insert(assignmentAss, false);
    }
    @IsTest static void testBatch001() {
        User runUser = [SELECT ID, UserName FROM User WHERE username='BatchTest001@sample.com'];
        List <Opportunity> oppList = new List<Opportunity>();
        for(integer i = 0; i<200; i++){
            Opportunity oppItem = new Opportunity(Name='testOpportunity'+ i,
                                StageName='Perception Analysis',
                                Ownerid = runUser.Id,
                                CloseDate = Date.Today(),
                                DeleteFlg__c = true);
            oppList.add(oppItem);
        }
        insert oppList;
        System.runAs(runUser) {
            Test.StartTest();
            ExampleUpdateRecordBatch reassign = new ExampleUpdateRecordBatch();
            ID batchprocessid = Database.executeBatch(reassign, 200);
            Test.StopTest();
        }
        List<Opportunity> oppUpdateList = [SELECT Id,StageName FROM Opportunity WHERE Ownerid = :runUser.Id];
        System.assertEquals(200, oppUpdateList.size());
        if (oppUpdateList != null && oppUpdateList.size() >0) {
            for (Opportunity oppUpdate : oppUpdateList) {
                System.assertEquals('Closed Won', oppUpdate.StageName);
            }
        }
    }
}

TestClass执行

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Datebase.Batchable封装了以下三个方法:
    • 1.start方法
      • 2.execute方法
        • 3.finish方法
          • 4.Database.executeBatch方法
            • 5.实装例
              • 6.测试类
              相关产品与服务
              批量计算
              批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档