Triggers 致命错误| System.LimitException:太多SOQL查询:201

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

我在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方法的代码-


我正在尝试分析消除这些错误的最佳方法,或者是否有其他方法来实现这些错误。

所有这些都是循环中的查询:

对于用户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);
                }
            } 
        } 
    }