In this article I will create a Trigger on Opportunity to get count of total opportunities on Account. To store the count I have created a custom field on Account "TotalOpp__c" datatype "Number".
I will create the trigger on after insert, after delete and after undelete of Opportunity.
The after undelete trigger event only fires for the following objects:
- Account
- Asset
- Campaign
- Case
- Contact
- ContentDocument
- Contract
- Custom objects
- Event
- Lead
- Opportunity
- Product
- Solution
- Task
Please follow below trigger code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | trigger getRelatedOpportunitiesCount on Opportunity (after insert, after delete, after undelete){ Set<Id> accID = new Set<Id>(); if(Trigger.isInsert || Trigger.isUndelete){ for(Opportunity opp : Trigger.New){ accID.add(opp.AccountId); } updateAcc(accID); } else if(Trigger.isDelete){ for(Opportunity opp : Trigger.old){ accID.add(opp.AccountId); } updateAcc(accID); } private void updateAcc(Set<Id> accIds){ List<Account> accList = [select id, TotalOpp__c from Account where Id in :accIds]; List<Opportunity> oppsList = [select id from Opportunity where AccountId in :accIds]; for(Account a : accList){ a.TotalOpp__c= oppsList.size(); } update accList; } } |
4 Comments
What happens if opportunities are inserted via file upload(Bulk) having different accountids?? I think it will not work in that case..
ReplyDeleteIt is a bulkified trigger, try and let me know in case of any issue.
DeleteHi kapil,
DeleteAs per the above code. In bulk,more than one opportunity with different account id's inserted, then all account will have same opportunities count.
At line 18 you could have used subquery to get the opportunities related to account.
Please correct me if i am missing here anything.
Thanks
Abdul
Absolutely correct Abdul, kudos to you. I realized it after submitting the blog.
Delete