Triggers 致命错误| System.LimitException:太多SOQL查询:201
我在apex类中遇到太多SOQL查询错误 我试图检查循环中的查询数量 以下是准确的错误- 11:48:43.9 2785518121 |致命错误| System.LimitException:太多SOQL查询:201 11:48:43.9 285111444 |代码|单元|完成| GEN | ActonFactsCoreUserEligibleBatch 11:48:43.9 2852614277 |执行完成| 下面是GEN_CalculateAttoWinScores.CalculatSerQualified方法的代码-Triggers 致命错误| System.LimitException:太多SOQL查询:201,triggers,salesforce,apex,force.com,Triggers,Salesforce,Apex,Force.com,我在apex类中遇到太多SOQL查询错误 我试图检查循环中的查询数量 以下是准确的错误- 11:48:43.9 2785518121 |致命错误| System.LimitException:太多SOQL查询:201 11:48:43.9 285111444 |代码|单元|完成| GEN | ActonFactsCoreUserEligibleBatch 11:48:43.9 2852614277 |执行完成| 下面是GEN_CalculateAttoWinScores.CalculatSerQ
我正在尝试分析消除这些错误的最佳方法,或者是否有其他方法来实现这些错误。所有这些都是循环中的查询: 对于用户userElement:usersList{ ... List actonfacts=[从Act_on_Facts___c中选择id,其中查找_User__c=:userElement.id limit 1]; ... countResult=[从帐户中选择count,其中OwnerId=:userElement.id限制:limitQuery]; ... [从Opportunity中选择count,其中OwnerId=:userElement.id和StageName位于:oppOpenStageNameSet和RecordType.DeveloperName不在:oppReadOnlyRecordTypeNameSet限制:limitQuery]; 作为一个非常快速且不干净的解决方案,您可以更改批的大小—每个执行传递多少条记录。默认值为200 使用可选参数Database.executeBatchnew GEN_actonFactsCoreUserEligibleBatch,10;调用您的类,并查看是否有帮助 正确的修复需要一些重构,将查询从循环中移除,可能使用一些以用户id为关键的映射 如果这些是pro Apex开发人员会欺骗的自定义对象,则一次完成这些查询,提取用户和相关列表,比如 选择Id, 从帐户限制1中选择Id, 从商机中选择Id,其中…限制1, 从事实上的行动中选择Id 来自用户 其中Id位于:范围 这在这里不起作用,因为从帐户到所有者的关系没有一个好的名称。帐户将不起作用。在我的示例中,您应该仍然能够在自定义对象的最后一个子查询上进行此操作,您可以在循环外调用它
您可能仍然能够完成类似的操作,但可能需要查看共享相关的表…我会说可行,但如果您有时间玩的话。如果您不更改范围大小,请暂停。将执行更长的时间,但在我的书中,单行修复是一个胜利。感谢Eyescream提供的输入。
Class.GEN_CalculateActToWinScores.calcUserEligible: line 1343, column 1
Class.GEN_ActonFactsScoreUserEligibleBatch.execute: line 74, column 1
// Method for set user as ready for AoF
public static void calcUserEligible(List<User> usersList ){
List<Act_on_Facts__c> actOnFactDelete = new List<Act_on_Facts__c>();
Set<String> oppOpenStageNameSet = new Set<String>();
oppOpenStageNameSet.add(GEN_Constants.OPPORTUNITY_IDENTIFY);
oppOpenStageNameSet.add(GEN_Constants.OPPORTUNITY_QUALIFY);
oppOpenStageNameSet.add(GEN_Constants.OPPORTUNITY_PROPOSE);
oppOpenStageNameSet.add(GEN_Constants.OPPORTUNITY_NEGOTIATE);
Set<String> oppReadOnlyRecordTypeNameSet = new Set<String>();
oppReadOnlyRecordTypeNameSet.add(GEN_Constants.READONLY_SINGLE_ACCOUNT_OPP_RECORDTYPENAME);
oppReadOnlyRecordTypeNameSet.add(GEN_Constants.READONLY_WON_AND_DONE_OPP_RECORDTYPENAME);
oppReadOnlyRecordTypeNameSet.add(GEN_Constants.READONLY_CHILD_OPP_RECORDTYPENAME);
oppReadOnlyRecordTypeNameSet.add(GEN_Constants.READONLY_MULTI_ACCOUNT_OPP_RECORDTYPENAME);
if(usersList.size() > 0){
List<Id> idList = new List<Id>();
Integer countResult = 0;
List<User> newUserList = new List<User>();
Integer limitQuery; //10000 //2001
Integer limitResult; //2000
if(CSL_ActOnFactsLimits__c.getValues('QUERY_LIMIT') != null){
limitQuery = Integer.valueOf(CSL_ActOnFactsLimits__c.getValues('QUERY_LIMIT').Value__c);
}
if(CSL_ActOnFactsLimits__c.getValues('MAX_QUERY_RESULTS') != null){
limitResult = Integer.valueOf(CSL_ActOnFactsLimits__c.getValues('MAX_QUERY_RESULTS').Value__c);
}
Boolean eligible = true;
for (User userElement : usersList){
String logDetail = ' QUERY_LIMIT:limitQuery: '+limitQuery+' MAX_QUERY_RESULTS:limitResult: '+limitResult;
logDetail += ' userElement.id: '+userElement.id;
eligible = true;
CSH_ActOnFacts_UserEligible__c userEligible = null;
if(CSH_ActOnFacts_UserEligible__c.getValues(userElement.id) != null){
userEligible = CSH_ActOnFacts_UserEligible__c.getValues(userElement.id);
}
CSH_ActOnFacts_UserEligible__c profileEligible = null;
if(CSH_ActOnFacts_UserEligible__c.getValues(userElement.ProfileId) != null){
profileEligible = CSH_ActOnFacts_UserEligible__c.getValues(userElement.ProfileId);
}
List<Act_on_Facts__c> actonfacts = [select id from Act_on_Facts__c where Lookup_User__c = : userElement.id limit 1];
if(userElement.ManagerId == null){
userElement.Line_Manager_Optional__c = true;
userElement.Act_On_Facts_Manager_List__c = null;
}
if(userElement.Default_Macro_Segment__c == null){
userElement.Default_Macro_Segment__c = 'None';
}
if (userElement.IsActive == false){
eligible = false;
}else if(profileEligible != null || userEligible != null) {
eligible = false;
}else{
countResult = [select count() from Account WHERE OwnerId = :userElement.id LIMIT :limitQuery];
logDetail += ' Account.countResult: '+countResult;
if(countResult!=null && countResult > limitResult ){
eligible = false;
}
if(eligible){
if(oppOpenStageNameSet !=null && oppOpenStageNameSet.size()>0 && oppReadOnlyRecordTypeNameSet !=null && oppReadOnlyRecordTypeNameSet.size()>0){
countResult = [select count() from Opportunity WHERE OwnerId = :userElement.id AND StageName IN:oppOpenStageNameSet AND RecordType.DeveloperName NOT IN: oppReadOnlyRecordTypeNameSet LIMIT :limitQuery];
logDetail += ' Opportunity.countResult: '+countResult;
if(countResult!=null && countResult > limitResult ){
eligible = false;
}
}
}
}
if(!eligible){
userElement.Act_on_Facts_Eligible__c = false;
// remove user from Act on Facts
if(actonfacts != null && actonfacts.size()>0){
for(Act_on_Facts__c a : actonfacts){
actOnFactDelete.add(a);
}
}
}else{
userElement.Act_on_Facts_Eligible__c = true;
}
logDetail += ' userElement.Act_on_Facts_Eligible__c: '+userElement.Act_on_Facts_Eligible__c;
ApplicationLog.logEntry(ApplicationLog.SEVERITY_INFO, 'A2WBatch', 'GEN_ActonFactsScoreUserEligibleBatch:'+userElement.id+': ', logDetail);
newUserList.add(userElement);
}
try{
if(newUserList.size()>0){
update newUserList;
system.debug('HC Update- newUserList ' + newUserList);
}
if(actOnFactDelete.size()>0){
delete actOnFactDelete;
system.debug('HC Update- actOnFactDelete ' + actOnFactDelete);
}
}catch (Exception e){
system.debug('Error updating user ' + e);
}
}
}
global void execute(Database.BatchableContext BC, List<sObject> scope){
CSH_A2W_Settings__c a2wCS = CSH_A2W_Settings__c.getInstance();
if(scope != null){
List<User> userList = scope;
if(userList.size()>0){
if(CSL_ActOnFactsLimits__c.getValues('run_userTrigger') != null){
CSL_ActOnFactsLimits__c run_userTrigger = CSL_ActOnFactsLimits__c.getValues('run_userTrigger');
run_userTrigger.Value__c = 'false';
update run_userTrigger;
}
//GEN_CalculateActOnFactsScores.calcUserEligible(userList); //Commented as part of Decommission activity of AoF
if(a2wCS != null && a2wCS.Enabled_in_Batches__c == True){
GEN_CalculateActToWinScores.calcUserEligible(userList);
}
}
}
}