You need to sign in to do that
Don't have an account?
IKZ
Trigger doesn't update a field
Whenever there is an active complaint linked to an account I would like to update Account.Active_Complaints__c checkbox. Objects are linked through a lookup Complaints__c.AccountName__c, but my trigger/class doesn't update the checkbox as expected. Any ideas please?
My trigger:
and handler:
and helper:
My trigger:
trigger ComplaintTrigger on Complaint__c (after delete, after insert, after undelete, after update, before delete, before insert, before update) { if (TriggerSettings.getInstance().isEnabled(ComplaintTriggerHandler.class.getName())) { TriggerHandler.ITrigger handler = new ComplaintTriggerHandler(Trigger.oldMap, Trigger.newMap, Trigger.old, Trigger.new); if (Trigger.isBefore) { handler.bulkBefore(); if (Trigger.isDelete) { for (SObject so : Trigger.old) { handler.beforeDelete(so); } } else if (Trigger.isInsert) { for (SObject so : Trigger.new) { handler.beforeInsert(so); } } else if (Trigger.isUpdate) { for (SObject so : Trigger.old) { handler.beforeUpdate(so, Trigger.newMap.get(so.Id)); } } handler.beforePostProcessing(); } else { handler.bulkAfter(); if (Trigger.isDelete) { for (SObject so : Trigger.old) { handler.afterDelete(so); } } else if (Trigger.isInsert) { for (SObject so : Trigger.new) { handler.afterInsert(so); } } else if (Trigger.isUpdate) { for (SObject so : Trigger.old) { handler.afterUpdate(so, Trigger.newMap.get(so.Id)); } } handler.postProcessing(); } } }
and handler:
public with sharing class ComplaintTriggerHandler extends TriggerHandler implements TriggerHandler.ITrigger { public ComplaintTriggerHandler(Map<Id, SObject> oldMap, Map<Id, SObject> newMap, List<SObject> oldList, List<SObject> newList) { super(oldMap, newMap, oldList, newList); } public void bulkBefore() { } public void bulkAfter() { if (Trigger.isDelete) { ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount(); } } public void beforeInsert(SObject so) { } public void beforeUpdate(SObject oldSo, SObject so) { } public void beforeDelete(SObject so) { } public void afterInsert(SObject so) { ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount(); } public void afterUpdate(SObject oldSo, SObject so) { ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount(); } public void afterDelete(SObject so) { ComplaintTriggerHelper.getInstance().setHasActiveComplaintsOnAccount(); } public void postProcessing() { ComplaintTriggerHelper.getInstance().updateAccounts(); } }
and helper:
public with sharing class ComplaintTriggerHelper { public List <Complaint__c> Complaints; private Map<Id, Boolean> accountsToUpdateMap; private static ComplaintTriggerHelper instance; public static ComplaintTriggerHelper getInstance() { if (instance ==null) { instance = new ComplaintTriggerHelper(); } return instance; } private ComplaintTriggerHelper() { accountsToUpdateMap = new Map<Id, Boolean>(); Complaints = new List<Complaint__c>(); } public void setHasActiveComplaintsOnAccount() { Set<Id> parentIds = new Set<Id>(); for (Complaint__c com : Complaints) { parentIds.add(com.AccountName__c); } for (Account accountToUpdate : [SELECT Id, Active_Complaints__c, (Select Id, AccountName__c from Complaints__r WHERE Status__c = 'Open' OR Status__c = 'Pending') FROM Account WHERE Id IN :parentIds]) { accountsToUpdateMap.put(accountToUpdate.Id, accountToUpdate.Complaints__r.size() > 0); } } public void updateAccounts() { List<Account> acc = new List<Account>(); for (Id accId : accountsToUpdateMap.keySet()){ acc.add(new Account(Id = accId, Active_Complaints__c = accountsToUpdateMap.get(accId))); } update acc; } }