trigger RollUpSummaryTrigger on Contact (after insert, after update, after delete, after undelete) {
Set<Id> accSet = new Set<Id>();
for(Contact c : Trigger.new){
accSet.add(c.AccountId);
}
Map<Id,Account> accMap = new Map<Id,Account> ();
for(Account acc : [SELECT id, Total_Salary__c FROM Account WHERE id IN :accSet]){
accMap.put(acc.ID,acc);
}
for(Contact con : Trigger.new){
accMap.get(con.AccountId).Total_Salary__c = accMap.get(con.AccountId).Total_Salary__c + con.Salary__c;
}
upsert accmap.values();
}
Make sure Salary and Total Salary field are currency or number fields.
Hope this helps.
Please mark Solved if it works.
Mahalo, Aamir AH Khan Lead Salesforce Lightning Developer
Not sure why you are looking trigger for this functionality. You can use RollUp Summary field to achieve same functionality withou writing any code. Just create new field on Account, select field type as "RollUp Summary" field. You can choose "SUM" method and specifiy contact salary field there.
Please find the below code for Rolling up the Salary field from contact to the Total Salary on the Account Object.
The trigger by Amir doesn't take care of the delete operation also it doesn't consider the scenario of the Contact not related to any account i.e AccountID field is NULL and thus it would fail while you try to test the trigger by deleting the record or update/ insert the contact without the related account record.
@Manish: Roll-Up summary fields aren't available for Lookup Relationship and Account-Contact is one of them. Account-Opportunity is an exception, which was delivered later.
The below code takes care of all the Scenario and also abides by all the Governor limit.
trigger UpdateAccSalary on Contact (after insert, after update, after delete, after undelete) {
Map<ID,Account> accountMap = new Map<ID,Account>();
List<ID> accID = new List<ID>();
//Check for type of DML Operation, For Insert, Update and Undelete we have Trigger.New
if(Trigger.IsInsert || Trigger.IsUpdate || Trigger.IsUndelete){
for(Contact C1: Trigger.new){
//Add all new AccountID in the List
if(C1.AccountID != NULL)
accID.add(C1.AccountID);
}
}
//Check for type of DML Operation, For Delete we have Trigger.Old
if(Trigger.IsDelete){
for(Contact C2: Trigger.old){
if(C2.AccountID != NULL)
accID.add(C2.AccountID);
}
}
//Check if List is not empty
if(accID!=NULL && accID.size()>0){
//Add all the accounts in the Map, to map ID with the Account Cost
for(ID AccountID : accID){
accountMap.put(AccountID, new Account(ID = AccountID, Total_Salary__c = 0));
}
//Calculate the Total Account Cost based on the Contact Cost
for(Contact C : [SELECT ID, AccountID, Salary__c FROM Contact WHERE AccountID IN :accID]){
accountMap.get(C.AccountID).Total_Salary__c += c.Salary__c;
}
//Commit to the Database
Database.update(accountMap.values());
}
}
Please mark this as the solution if it solved your purpose.
Also if possible look-out the tech blog released by the Varasi Team for the similar scenario on the below link. It might be able to help you on your future implementation.
Hi Sir, I tried your code that you had shown on the screen to help raji ch 8 but i am getting an exception namely " UpdateAccSalary: execution of AfterUpdate caused by: System.NullPointerException: Argument cannot be null. Trigger.UpdateAccSalary: line 29, column 1"
Please follow the code below: Make sure Salary and Total Salary field are currency or number fields.
Hope this helps.
Please mark Solved if it works.
Mahalo,
Aamir AH Khan
Lead Salesforce Lightning Developer
Not sure why you are looking trigger for this functionality. You can use RollUp Summary field to achieve same functionality withou writing any code.
Just create new field on Account, select field type as "RollUp Summary" field. You can choose "SUM" method and specifiy contact salary field there.
More on this: https://help.salesforce.com/articleView?id=fields_about_roll_up_summary_fields.htm&type=5
Please let me know if you need further help on this.
Thanks,
Manish
Please find the below code for Rolling up the Salary field from contact to the Total Salary on the Account Object.
The trigger by Amir doesn't take care of the delete operation also it doesn't consider the scenario of the Contact not related to any account i.e AccountID field is NULL and thus it would fail while you try to test the trigger by deleting the record or update/ insert the contact without the related account record.
@Manish: Roll-Up summary fields aren't available for Lookup Relationship and Account-Contact is one of them. Account-Opportunity is an exception, which was delivered later.
The below code takes care of all the Scenario and also abides by all the Governor limit.
Please mark this as the solution if it solved your purpose.
Also if possible look-out the tech blog released by the Varasi Team for the similar scenario on the below link. It might be able to help you on your future implementation.
http://varasi.com/salesforce/implementing-roll-up-summary-when-you-are-dealt-with-a-lookup-relationship/
Cheers:)
Thanks,
Jainam Contractor,
Salesforce Consultant,
Varasi LLC
www.varasi.com