I'm trying to display the error messages of each record in the email body of the Batchable Apex.
Am I correct on iterating errorMessages into String and call it in execute method then display it in emailbody? Please help!
global class LRN_ResetSabaHoursBatchable implements Database.Batchable<sObject>, Database.Stateful {
public Set<Id> contactRecordFailures = new set<Id>();
public boolean isSuccess = true;
public List<String> errorMessages = new List<String>();
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator(
//COLLECT THE BATCHES OF RECORDS TO BE PASSED TO EXECUTE
'SELECT Id, SABA_Hours__c, Non_SABA_Hours__c FROM Contact WHERE Non_SABA_Hours__c != NULL'
);
}
global void execute(Database.BatchableContext bc, List<Contact> scope){
List<Contact> contToUpdate = new List<Contact>();
for(Contact contact : scope){
contact.SABA_Hours__c = 0;
contact.Non_SABA_Hours__c = 0;
contToUpdate.add(contact);
}
List<Database.SaveResult> updateResults = Database.update(contToUpdate, false);
for (integer i = 0; i<updateResults.size();i++ ){
if(!updateResults[i].isSuccess()){
errorMessages.add(updateResults[i].getErrors()[0].getMessage());
contactRecordFailures.add(updateResults[i].Id);
isSuccess = false;
}
}
}
global void finish(Database.BatchableContext bc){
if(!isSuccess){
Id job = bc.getJobId();
AsyncApexJob aaj = [SELECT Id, Status,ExtendedStatus,NumberOfErrors, JobItemsProcessed, TotalJobItems, CreatedBy.Email FROM AsyncApexJob where Id =:BC.getJobId()];
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {aaj.CreatedBy.Email};
mail.setToAddresses(toAddresses);
mail.setSubject('Failed to Reset Saba Hours');
mail.setPlainTextBody(aaj.Id + aaj.CreatedBy.Name + errorMessages);
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
}
}
}