【问题背景】:在实施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 -》触发限制