如何解决Salesforce中Cannot have more than 10 chunks in a single operation问题?

在Salesforce中,批量更新多种SObject类型时,可能触发Cannothavemorethan10chunksinasingleoperation错误。本文分析了触发此错误的场景,包括一次性更新超过10种SObjectType及不同类型SObject未正确排序的情况,并提供了通过排序List<SObject>来避免此限制的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景】:在实施Lead自动Conversion时,需要将Lead相关列表项(A, B, C Sobjects)转化到转化后的Contact底下,即更新子记录的ContactId。代码执行时,触发了SF限制,造成了此问题:"System.TypeException: Cannot have more than 10 chunks in a single operation. Please rearrange the data to reduce chunking."。本篇博客将结合下面问题代码,总结遇到此问题的几种情景以及解决办法。

List<SObject> relatedList = new List<SObject>();

for(Lead ld : [SELECT Id, ConvertedAccountId, ConvertedContactId, OwnerId, 
                    (SELECT Id, Client__c, Contact__c FROM Financial_Plannings__r),
                    (SELECT Id, Client__c, Contact__c FROM Risk_Aptitudes__r),
                    (SELECT Id, Client__c, Contact__c FROM FinanicalPlanningMes__r)
               FROM Lead
               WHERE Id IN : leIds]) {

    String accid = ld.ConvertedAccountId,
           conid = ld.ConvertedContactId;

    for(Financial_Planning__c fp : ld.Financial_Plannings__r) {
        fp.Client__c  = accid;
        fp.Contact__c = conid;
        relatedList.add(fp);
    }

    for(Risk_Aptitude__c ra : ld.Risk_Aptitudes__r) {
        ra.Client__c  = accid;
        ra.Contact__c = conid;
        relatedList.add(ra);
    }

    for(FinancialPlanningMes__c fpm : ld.FinanicalPlanningMes__r) {
        fpm.Client__c  = accid;
        fpm.Contact__c = conid;
        relatedList.add(fpm);
    }
}

if(relatedList.size() > 0) List<Database.SaveResult> results = Database.update(relatedList, false);

问题分析】:上面代码中我们使用List<Sobject>类型的relatedList变量接收了3种Sobject Type,记为A,B,C。假设Lead和A,B,C为1:1关系,当遍利第一个Lead L1时,relatedList = [A1, B1, C1],那么一旦上述场景中Lead超过3个,比如到L4时,relatedList = [A1, B1, C1, A2, B2, C2, A3, B3, C3, A4, B4, C4],这时在做Database.update(relatedList, false)操作时,一个事务超出了10个chunks。

解决方法】:Sorting Lists of sObjects
在update relatedList前,我们需要对List<Sobject>使用标准sort()方法排序,使update relatedList = [A1-n, B1-n, C1-n]时,只有3类,即Sobject相同类型的数据在更新列表中始终在一组。修改后代码如下:

if(relatedList.size() > 0) {
    // to solve more than 10 chunks in a single operation issue.
    relatedList.sort();
    List<Database.SaveResult> results = Database.update(relatedList, false);
}

常见场景归纳】:
场景1:如果我们使用一次update更新 > 10种Sobject Types时,会触发限制,如:
Database.update([A, B, C, D, E, F, G, H, I, J, K], false);

场景2:如果我们使用一次update更新 <= 10种Sobject Types时,
如果在类型A和B的列表中传递12条记录,则此列表包含2个块:
A, A, A, A, A, A, B, B, B, B, B, B -》不触发限制
但是下面同一个列表将包含12个块:
A, B, A, B, A, B, A, B, A, B, A, B -》触发限制

参考资料】:
How to deal with: "System.TypeException: Cannot have more than 10 chunks in a single operation" in SFDC

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值