Try below, I have written this in sublime, so you might get some compile time errros, please correct accordingly.
Please mark this as closed if this solves your issue. Thankstrigger AccountTrigger on Account(after update){
if(Trigger.isAfter && Trigger.isUpdate){
Set<Id> accIds = new Set<Id>();
// Map - Key: Account Id | Value: Number_of_contacts__c
Map<Id, Integer> accIdToNumOfContacts = new Map<Id, Integer>();
// check if value of Number_of_contacts__c has changed
for(Account acc: Trigger.new){
if(acc.Number_of_contacts__c != Trigger.oldMap.get(acc.Id).Number_of_contacts__c){
accIds.add(acc.Id);
accIdToNumOfContacts.put(acc.Id, acc.Number_of_contacts__c);
}
}
List<Account> accounts = new List<Account>();
if(accIds.size() > 0){
accounts = [SELECT Id,(SELECT Id FROM Contacts) FROM Account WHERE Id IN:accIds];
}
for(Account acc: accounts){
// check if value in Number_of_contacts__c does not match with number of contacts present under that account
Integer fieldValue = accIdToNumOfContacts.get(acc.Id);
List<Contact> contacts = acc.Contacts;
Integer numberOfContacts = contacts.size();
if(fieldValue == numberOfContacts){
continue;
}else if(fieldValue > numberOfContacts){
// add contacts - implement logic here
}else if(fieldValue < numberOfContacts){
// delete contacts - implement logic here
Integer diff = numberOfContacts - fieldValue; // diff contacts needs to be deleted
List<Contact> contactsToBeDeleted = new List<Contact>();
for(Integer i =0; i<diff; i++){
contactsToBeDeleted.add(contacts[i]);
}
if(contactsToBeDeleted.size() > 0){
Database.delete(contactsToBeDeleted, false);
}
}
}
}
}
4 respostas