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
sumit dsumit d 

Batch on account to update a cutom percentage field

Hi All,
         i have a batch on Account to Calculate Quality score. with a scoring system . like if the fields has values than give a particular score to the field According to  specific record type. and after calculation the result is shown in Quality score.
My batch is given below:-
 public without sharing class BatchCADUtilization implements Database.Batchable<sObject>{
    
    public Map<String, Map<String, Integer>> mapRecordTypeToScores = new Map<String, Map<String, Integer>> {
        
        'Cachet' => new Map<String, Integer> {
                        'ACH_Provider__c' => 5,
                        'Payroll_Software__c' => 3, 
                        'HR_Software__c' => 3,
                        'Payroll_Tax_Processor__c' => 3,
                        'Current_Bank__c' =>  3,
                        'Payroll_Business_Consultant__c' => 2,
                        'Time_Attendance__c' => 2,
                        'CPA_Accounting_Firm__c' => 2
                     },
       'TimeRack' =>  new Map<String, Integer> {
                        'Time_Attendance__c' => 5,
                        'CPA_Accounting_Firm__c' => 3,
                        'Payroll_Software__c' => 3,
                        'Current_Bank__c' =>  3,    
                        'HR_Software__c' => 3,
                        'Payroll_Business_Consultant__c' => 2,
                        'ACH_Provider__c' => 2,
                        'Payroll_Tax_Processor__c' => 2
                      },          
       'PTM' => new Map<String, Integer> {
                        'Payroll_Tax_Processor__c' => 5,
                        'ACH_Provider__c' => 3,
                        'Payroll_Software__c' => 3,
                        'Current_Bank__c' =>  3,
                        'Payroll_Business_Consultant__c' => 2,
                        'Time_Attendance__c' => 2,
                        'HR_Software__c' => 2,
                        'CPA_Accounting_Firm__c' => 2
                    },
       'SBS' => new Map<String, Integer> {
                        'Payroll_Software__c' => 5,
                        'ACH_Provider__c' => 3,
                        'Payroll_Tax_Processor__c' => 3,
                        'Current_Bank__c' =>  3,
                        'Time_Attendance__c' => 3,
                        'Payroll_Business_Consultant__c' => 2,
                        'HR_Software__c' => 2,
                        'CPA_Accounting_Firm__c' => 2
                    }               
    };
        
    public static void run( Set<Id> AccIds ) {
        List<Account> accountRecords =  [Select id, RecordTypeId, RecordType.Name, ACH_Provider__c,
                                         RecordType.developerName, Payroll_Software__c, HR_Software__c,
                                         Payroll_Tax_Processor__c, Current_Bank__c, Payroll_Business_Consultant__c,
                                         Time_Attendance__c, CPA_Accounting_Firm__c,Quality_Score__c
                                         from Account
                                         where Id IN:  AccIds ];
        //executeHelper( accountRecords );                  
    }
    
    public Database.querylocator start(Database.BatchableContext BC){
        String query = 'Select id, RecordTypeId, RecordType.Name, ACH_Provider__c, ' +
            'RecordType.developerName, Payroll_Software__c, HR_Software__c, ' + 
            'Payroll_Tax_Processor__c, Current_Bank__c, ' +
            'Payroll_Business_Consultant__c,Quality_Score__c, ' + 
            'Time_Attendance__c, CPA_Accounting_Firm__c ' +
            'FROM Account' ;
        return Database.getQueryLocator(query);
    }
    
    public void execute(Database.BatchableContext BC, List<Account> scope){
        List<Account> accListToUpdate = new List<Account>();
        
        for(Account acc : scope) {
           
            Integer totalScoreAchieved = 0;
            Integer totalScorePossible = 0;
            
            String recordTypeDeveloperName = acc.RecordType.developerName;
            if( recordTypeDeveloperName != null ) {
                Map<String, Integer> mapFieldAPINameToScore = mapRecordTypeToScores.get( recordTypeDeveloperName );
                totalScoreAchieved = 0;
                if( mapFieldAPINameToScore != null ) {
                    
                    for( String fieldAPIName : mapFieldAPINameToScore.keySet() ) {
                        Object fieldValue = acc.get( fieldAPIName );
                        Integer scoreForTheField = mapFieldAPINameToScore.get( fieldAPIName );
                        totalScorePossible += scoreForTheField;
                        if( fieldValue != null && String.valueOf( fieldValue ) != 'Other' ) {
                            totalScoreAchieved += scoreForTheField;

                        }
                    }
                }

                if( totalScorePossible > 0 ) {
                    acc.Quality_Score__c = (totalScoreAchieved * 100)/totalScorePossible;   
                }
            }
              System.assert(false,acc.Quality_Score__c);
  }
        update accListToUpdate;
    }
        
    public void finish(Database.BatchableContext BC){
      
    }
}
Its giving me no value in the Quality score field?
Any suugestions how to solve it?
Manvendra Chaturvedi 26Manvendra Chaturvedi 26
Hi Sumit ,

You have missed to add 

accListToUpdate.add(acc); 

================================================================================

 public void execute(Database.BatchableContext BC, List<Account> scope){
        List<Account> accListToUpdate = new List<Account>();
        
        for(Account acc : scope) {
            
            Integer totalScoreAchieved = 0;
            Integer totalScorePossible = 0;
            
            String recordTypeDeveloperName = acc.RecordType.developerName;
            if( recordTypeDeveloperName != null ) {
                Map<String, Integer> mapFieldAPINameToScore = mapRecordTypeToScores.get( recordTypeDeveloperName );
                totalScoreAchieved = 0;
                if( mapFieldAPINameToScore != null ) {
                    
                    for( String fieldAPIName : mapFieldAPINameToScore.keySet() ) {
                        Object fieldValue = acc.get( fieldAPIName );
                        system.debug('fieldValue-='+fieldValue);
                        Integer scoreForTheField = mapFieldAPINameToScore.get( fieldAPIName );
                        system.debug('scoreForTheField-='+scoreForTheField);
                        totalScorePossible += scoreForTheField;
                        if( fieldValue != null && String.valueOf( fieldValue ) != 'Other' ) {
                            totalScoreAchieved += scoreForTheField;
                            
                        }
                    }
                }
                system.debug('totalScoreAchieved-='+totalScoreAchieved);
                system.debug('totalScorePossible-='+totalScorePossible);
                if( totalScorePossible > 0 ) {
                    acc.Quality_Score__c = (totalScoreAchieved * 100)/totalScorePossible;   
                }
            }
            accListToUpdate.add(acc);
            // System.assert(false,acc.Quality_Score__c);
        }
        update accListToUpdate;
    }