function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
EQ AdminEQ Admin 

CPU timeout error

Start Method : 

 global APTS_UsageInput_ValidateDataBatch(APTS_UsageInputWrapper uirecordsfromloadfile)
    {
        workid=uirecordsfromloadfile.EQ_WorkId;
        inputrecord = uirecordsfromloadfile;
    }
String str='select id,EQ_UsageSchedule__c,EQ_ValidationError__c,EQ_ProcessStatus__c,APTS_Legacy_ExternalID__c, EQ_ServiceCode__c,EQ_Account__c,EQ_AssetLineItem__c ,EQ_AccountLocation__c, EQ_IssueNumber__c, EQ_SourceSystem__c,EQ_RecordKey__c, EQ_WorkId__c, EQ_QuantityID__c, EQ_LoadMonth__c, EQ_Quantity__c from EQ_TempSSP1Data__c where EQ_WorkId__c=:workid';
    global database.QueryLocator start(Database.BatchableContext BC)
    {
      return Database.getQueryLocator(str);
   }
Execute Method : 
 global void execute(Database.BatchableContext BC, List<EQ_TempSSP1Data__c> scope)
   {
     String key;
           set<String> distinctTempSsp1DataSourceSystems = new set<String>();
           set<String> issueNumbers = new set<String>();
           set<String> serviceCodes = new set<string>();
           set<String> areAllIssueNumbersPresent = new set<String>();
           list<string> errors=new list<string>();
           Set<String> pickListValuesList= new Set<String>();
           String SourceSystem='004:Invalid Source System';
           string IssueNumber = '001:IssueNumber Does not exists';
           string DuplicatesFound = '012:Duplicate issue number service code pair record found';
           string NotValidDateRange = '006:sageData Date is not in the valid(Effective) Date range';
           string ServiceCode = '002:Fee Code Does not exists';
           string ServiceCodeIssueNumberCombo = '007:Asset doesnot exists for the Account-Fee Code'; 
           string missingAssetData = '008: every record from the load file doesnot have existing Account or AccountLocation';
           string MultipleAssetsPerFeeCode = '013: Multiple Assets for Account or Acc Location per Fee Code';
           string InactiveAccount = '003:Account is Inactive';
           list<String> duplicateSourcecode= new list<String>();
           list<String> encounterSourcecode= new list<String>();
           list<String> duplicateIssue= new list<String>();
           list<String> encounterIssue= new list<String>();
           list<EQ_SSP1Data__c> ssp1Data =new list<EQ_SSP1Data__c>();
           list<EQ_SSP1Data__c> ssp1DataRef =new list<EQ_SSP1Data__c>();
           map<string,list<EQ_TempSSP1Data__c>> tempSsp1DataIssueFeeCodeKey = new map<string,list<EQ_TempSSP1Data__c>>();
           map<string,list<EQ_SSP1Data__c>> ssp1DataAccountIdKey = new map<string,list<EQ_SSP1Data__c>>();
           map<string,list<EQ_SSP1Data__c>> ssp1DataAccountLocationIdKey = new map<string,list<EQ_SSP1Data__c>>();
           list<String> encounterList= new list<String>();
           list<String> duplicateList= new List<String>();
           list<ErrorTempSSP1Data > errorTempSection   = new list<ErrorTempSSP1Data >();
           
          system.debug(': Heap size is-1 ' + limits.getHeapSize() + ' enforced is ' + limits.getLimitHeapSize()); 
          tempSsp1Data=scope;
         system.debug('Validate Batch -Scope list contains---->'+tempSsp1Data);
           //---------------------------validation 1---------------------------------------------------------------------
         // ErrorChecker with tempSsp1Data for valid values of the fields and check SourceSystem is existing in system
         
                
           // Blank Check on records
          list<ErrorTempSSP1Data> errorTempSection_1= new list<ErrorTempSSP1Data>();
          for(EQ_TempSSP1Data__c record : tempSsp1Data)
              {
                 distinctTempSsp1DataSourceSystems.Add(record.EQ_SourceSystem__c);
                serviceCodes.add(record.EQ_ServiceCode__c);
                 list<String> nullerrors= new list<String>();
                  map<ID,list<String>> nullCheckmap= new map<ID,list<String>>();
                 nullerrors = ErrorChecker.ValidateImportData(record);
                 system.debug('Null Errors List ->'+nullerrors);
                 if(nullerrors.size()!=0)
                 {
                    if (!errorTempData.ContainsKey(String.valueof(record)))
                        {
                            ErrorTempSSP1Data ins = new ErrorTempSSP1Data();
                            ins.TempData=record;
                            ins.Errors=nullerrors;
                             nullCheckmap.put(ins.TempData.id,ins.Errors);
                             ins.mapErrors=nullCheckmap;
                             errorTempSection_1.add(ins);
                             system.debug('Null Errors if any ->'+ins.mapErrors );
                         } 
                 }
                  
              }
         if(errorTempSection_1.size()!= 0)
                {
                    for(ErrorTempSSP1Data errorTemp:errorTempSection_1)
                    {
                        key = string.valueof(errorTemp.TempData);

                        if (!errorTempData.ContainsKey(key))
                         {
                            errorTempData.put(key,errorTemp);
                         }
                    }
             }
        system.debug('errorTempData data1--->'+errorTempData.values());
       system.debug(': Heap size is--2 ' + limits.getHeapSize() + ' enforced is ' + limits.getLimitHeapSize());
       
       // Validation for duplicate IssueNumber-ServiceCode pairs in the load file
             for(EQ_TempSSP1Data__c x:tempSsp1Data)
             {
              list<String> error1= new list<String>();
              map<ID,list<String>> m1= new map<ID,list<String>>();
              if((x.EQ_IssueNumber__c!=null || x.EQ_IssueNumber__c!='')&& (x.EQ_ServiceCode__c!=null||x.EQ_ServiceCode__c!=''))
                
              {
                  String uniqueChecksum= x.EQ_IssueNumber__c + x.EQ_ServiceCode__c;
                  List<EQ_TempSSP1Data__c> entitiesForKey = tempSsp1DataIssueFeeCodeKey.get(uniqueChecksum);
                    if (entitiesForKey == null) 
                    {
                        entitiesForKey = new List<EQ_TempSSP1Data__c>();
                        tempSsp1DataIssueFeeCodeKey.put(uniqueChecksum, entitiesForKey);
                    }    
                  entitiesForKey.add(x);
                 tempSsp1DataIssueFeeCodeKey.put(uniqueChecksum,entitiesForKey);
                 if(!encounterList.contains(uniqueChecksum))
                 {
                    encounterList.add(uniqueChecksum);
                 }
                 else
                 {
                     ErrorTempSSP1Data ins = new ErrorTempSSP1Data();
                         ins.TempData=x;
                         error1.add(DuplicatesFound);
                         ins.Errors=error1;
                         m1.put(ins.TempData.id,ins.Errors);
                         ins.mapErrors=m1;
                         system.debug('Duplicate issue number service code error if any-->'+ ins.mapErrors);
                        errorTempSection.add(ins);
                 }
              }
           }       
             
           
             if(errorTempSection.size()!= 0)
                {
                    for(ErrorTempSSP1Data errorTemp :errorTempSection)
                    {
                        key = string.valueof(errorTemp.TempData);

                        if (!errorTempData.ContainsKey(key))
                        {
                            errorTempData.put(key, errorTemp);
                            
                         }

                    }
                }

  for(ErrorTempSSP1Data item:errorTempData.Values())
                {
                    for(String st:item.Errors)
                    {
                       errorsList.add(st);
                    }
                    
                }
         count=errorsList.size();
         system.debug('ErrorList^^^^^'+errorsList);
         system.debug('ErrorList count^^^^^'+count); 
          status = (count == 0)
                ? 'PegaCallbackStatus.Complete'
                : 'PegaCallbackStatus.Error';
       //-----------------------------
 //Update error field on tempssp1 records
        EQ_TempSSP1Data__c tempSsp1Record=new EQ_TempSSP1Data__c() ;
        String str='';
       list<EQ_TempSSP1Data__c> listtoupdate1 = new list<EQ_TempSSP1Data__c>();
       list<EQ_TempSSP1Data__c> tempSsp1Recordlist = new list<EQ_TempSSP1Data__c>();
       system.debug(': Heap size is--11 ' + limits.getHeapSize() + ' enforced is ' + limits.getLimitHeapSize());
        if(status=='PegaCallbackStatus.Error')
        {
           for(ErrorTempSSP1Data record:errorTempData.Values())
           {
               str='';
               list<String> listOferrors = record.mapErrors.get(record.Tempdata.id);
               if(listOferrors.size()>0)
               {
                for (integer i = 0; i < listOferrors.size() ;i++)
                    {
                        str=str+record.mapErrors.get(record.Tempdata.id);
                    }
                  
                    if(str!=null)
                    {
                         record.TempData.EQ_Errors__c =str;
                         record.TempData.EQ_ProcessStatus__c ='failure';
                         listtoupdate1.add(record.TempData);
                    }
                }
                
                
           }
            update listtoupdate1;
            
                
           }
  
   
   }


Finish :

global void finish(Database.BatchableContext BC)
   {
       
         status = (count == 0)
                ? 'PegaCallbackStatus.Complete'
                : 'PegaCallbackStatus.Error';
       
       
       validationHelper1.PegaCallbackServiceCall(status,count,workid,errorTempData);
}
 
SRKSRK

in muliple place you wrote for loop inside for loop you need to optimize you code such that so you won't end up writing for loop inside for loop to avoid CPU timepout 

 

for(ErrorTempSSP1Data item:errorTempData.Values())
                {
                    for(String st:item.Errors)
                    {
                       errorsList.add(st);
                    }
                    
                }

 

 

 for(ErrorTempSSP1Data record:errorTempData.Values())
           {
               str='';
               list<String> listOferrors = record.mapErrors.get(record.Tempdata.id);
               if(listOferrors.size()>0)
               {
                for (integer i = 0; i < listOferrors.size() ;i++)
                    {
                        str=str+record.mapErrors.get(record.Tempdata.id);
                    }
                  
                    if(str!=null)
                    {
                         record.TempData.EQ_Errors__c =str;
                         record.TempData.EQ_ProcessStatus__c ='failure';
                         listtoupdate1.add(record.TempData);
                    }
                }