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

205 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

问题背景

在实施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类型的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使用标准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