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
Daniel Gonzalez 209Daniel Gonzalez 209 

Trigger to (count number of contacts associated with an account)

Hi guys, I need help for a Trigger, I new in Salforce and develop but I need solve this:

"However, field in Membership Sales (Number_Of_Members__c) will require automation, because roll up summary fields cannot be created between a Contact (Member) and Account (Membership). For this field, create an Apex trigger on after insert, update (only run code for update when the Account field on the Contact is updated), and delete Contact that will set the number of Contact records on the parent Account. Create a custom number field on Account named Number_Of_Members__c, which will not appear on the Membership's page layouts. This field will be updated to the count of Contacts on the Membership"

I have this code and I have to add code for the request:
trigger MemberTrigger on Contact (before insert, after insert, after update, after delete) {
    
    if (Trigger.isInsert) {
        if (Trigger.isBefore) {
            Map<String, Communication_Preferences__c> preferenceMap = new Map<String, Communication_Preferences__c>();
            for (Contact member : Trigger.New) {
                
                if (member.Communication_Preferences__c == null) {
                    Communication_Preferences__c newPreference = new Communication_Preferences__c();
                    newPreference.Name = member.lastName;
                    preferenceMap.put(member.Id, newPreference);
                }
            }
            
            insert preferenceMap.values();
            
            for (Contact member : Trigger.new) {
                member.Communication_Preferences__c = preferenceMap.get(member.Id).Id;
            }
        }
        
        if (Trigger.isAfter) {
            List<String> accountIds = new List<String>();
            
            for (Contact member : Trigger.New) {
                if (!accountIds.contains(member.AccountId)) {
                    accountIds.add(member.AccountId);
                }
            }
            
            List<Account> accountList = [SELECT Id, First_Membership_Members__c FROM Account WHERE Id IN : accountIds];
            List<Account> updatedAccounts = new List<Account>();
            
            for (Contact member : Trigger.New) {
                for (Account accountElement : accountList) {
                    if (member.AccountId == accountElement.Id) {
                        if (accountElement.First_Membership_Members__c == null) {
                            String nameString;
                            if (member.FirstName != null) {
                                nameString = member.FirstName + ' ' + member.LastName;
                            }else {
                                nameString = member.LastName;
                            }
                            accountElement.First_Membership_Members__c += member.Id + ':' + nameString;
                        }
                        else {
                            String nameString;
                            if (member.FirstName != null) {
                                nameString = member.FirstName + ' ' + member.LastName;
                            }else {
                                nameString = member.LastName;
                            }
                            accountElement.First_Membership_Members__c += ',' + member.Id + ':' + nameString;
                        }
                        
                        updatedAccounts.add(accountElement);
                    }
                }
            }
            
            update updatedAccounts;
        }
        
    }else if (Trigger.isUpdate) {
        if (Trigger.isAfter) {
        

    


    }else if (Trigger.isDelete) {
        if (Trigger.isAfter) {
           



        }
    }
    
}

I hope you can help me.
Thanks.
Best Answer chosen by Daniel Gonzalez 209
CharuDuttCharuDutt
Hii Daniel
Try Below Trigger
trigger NumberOfChild on Contact (After Insert,After Update,After Delete) {

   List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
    if(Trigger.isInsert){
         if(trigger.isAfter){
        for(Contact con : Trigger.new){
            if(con.AccountId != null){
            setAccIds.add(con.AccountId);
            	}
			}
		}
    } 
    system.debug('setAccIds ==> '+setAccIds);
    if(Trigger.isUpdate){
         if(trigger.isAfter){
        for(Contact con : Trigger.new){ 
            if(con.AccountId!=Trigger.oldMap.get(con.Id).AccountId){
               	setAccIds.add(con.AccountId);
                setAccIds.add(Trigger.oldMap.get(con.Id).AccountId);
            	}
          
			}        
        }
    }
    if(Trigger.isDelete){
        if(trigger.isAfter){
        for(Contact con : Trigger.old) { 
            if(con.AccountId != null){
            setAccIds.add(con.AccountId);
            	}
        	}
        }
    }    
    for(Account acc :[Select id,Total_Contacts__c ,(Select id from contacts) from Account where Id in : setAccIds]){
        acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
}
Please Mark It As Best Answer If It Helps
Thank You!

All Answers

CharuDuttCharuDutt
Hii Daniel
Try Below Trigger
trigger NumberOfChild on Contact (After Insert,After Update,After Delete) {

   List<Account> accList=new List<Account>();

    Set<Id> setAccIds = new Set<Id>();
    if(Trigger.isInsert){
         if(trigger.isAfter){
        for(Contact con : Trigger.new){
            if(con.AccountId != null){
            setAccIds.add(con.AccountId);
            	}
			}
		}
    } 
    system.debug('setAccIds ==> '+setAccIds);
    if(Trigger.isUpdate){
         if(trigger.isAfter){
        for(Contact con : Trigger.new){ 
            if(con.AccountId!=Trigger.oldMap.get(con.Id).AccountId){
               	setAccIds.add(con.AccountId);
                setAccIds.add(Trigger.oldMap.get(con.Id).AccountId);
            	}
          
			}        
        }
    }
    if(Trigger.isDelete){
        if(trigger.isAfter){
        for(Contact con : Trigger.old) { 
            if(con.AccountId != null){
            setAccIds.add(con.AccountId);
            	}
        	}
        }
    }    
    for(Account acc :[Select id,Total_Contacts__c ,(Select id from contacts) from Account where Id in : setAccIds]){
        acc.Total_Contacts__c = acc.contacts.size();
        acclist.add(acc);
    }
    if(acclist.size()>0){
        update accList;     
    }
}
Please Mark It As Best Answer If It Helps
Thank You!
This was selected as the best answer
Giancarlo BaileyGiancarlo Bailey
Thank you very much for your advice. It is very important for me.
CharuDuttCharuDutt
Please Close Your Query By Marking It As Best Answer If It Helps
Thank You!
ravi soniravi soni
hi Giancarlo.
if you liked @CharuDutt answer then don't forget to mark it as best answer so that it can help to others.
Thank you