I have written this trigger in this can we avoid the second for loop using map.
Trigger Sum on Contact(after insert, after update, after delete, after undelete)
{
Set<Id> accountIdSet = new Set<Id>();
List<Account> accList = new List<Account>();
Map<Id, Decimal> sumMap = new Map<Id, Decimal>();
If(Trigger.isInsert || Trigger.isUpdate || Trigger.isUndelete)
{
for(Contact con : Trigger.new)
{
accountIdSet.add(con.accountId);
if(!sumMap.containsKey(con.accountId))
{
sumMap.put(con.accountId, con.Salary__c);
}
// sumMap.get(con.accountId).add(con.Salary__c);
}
}
If(Trigger.isUpdate || Trigger.isDelete)
{
for(Contact con : Trigger.old)
{
accountIdSet.add(con.accountId);
if(!sumMap.containsKey(con.accountId))
{
sumMap.put(con.accountId, con.Salary__c);
}
// sumMap.get(con.accountId).add(con.Salary__c);
}
}
for(Account acc : [Select id, ContactsSalarySum__c, (Select id, Salary__c From Contacts) From Account Where Id In =: accountIdSet])
{
Decimal sum = 0;
for(Contact con : acc.contacts)
{
sum = sum + con.salary__c;
}
acc.ContactsSalarySum__c = sum;
//acc.ContactsSalarySum__c = sumMap.get(acc.id);
accList.add(acc);
}
update accList;
}