You need to sign in to do that
Don't have an account?

Trigger delete and then insert or update - On Opportunity
I have a trigger on the Opportunity that creates records on a custom object called the Opportunity_Revenue__c. It takes the revenue from the Opportunity and spreads it out over the quarters during the length of the deal. It works fine for insert triggers, I need to have the ability to let users re-create based on a changing contract length / deal length.
So when the record is updated I want to delete all the records in the custom object Opportunity_Revenue__c that are related to the Opportunity and then run the insert code to create the new records for the Opportunity_Revenue__c object. But it is doubling the records because once it deletes the old records it see trigger as an update and an insert.
Can you help or suggest what I might do?
Here is the code:
So when the record is updated I want to delete all the records in the custom object Opportunity_Revenue__c that are related to the Opportunity and then run the insert code to create the new records for the Opportunity_Revenue__c object. But it is doubling the records because once it deletes the old records it see trigger as an update and an insert.
Can you help or suggest what I might do?
Here is the code:
public class OpportunityRevenueTrigger2 { public static void updateOpportuntityRev(List<Opportunity> trig){ List<ID> opprtnyId = new List<ID>(); Decimal totRev; Decimal totAllottedRev; Decimal mRev; for(Opportunity opp4: trig){ if(Opp4.Auto_Generate_Quarterly_Forecast__c == 'Yes'){ opprtnyId.add(opp4.id); } List<Opportunity_Revenue__c> deleteOR = [SELECT id FROM Opportunity_Revenue__c WHERE Opportunity__c in: opprtnyID]; if(deleteOR.size() != 0){ Delete deleteOR; } List<Opportunity_Revenue__c> oppr = new List<Opportunity_Revenue__c>(); for(Opportunity opp : trig){ if(opp.amount > 0 && opp.contract_length_Months__c > 0 && opp.Auto_Generate_Quarterly_Forecast__c == 'Yes' ){ Date sDate = opp.CloseDate; Integer period = opp.Contract_Length_Months__c.intValue(); Integer period2 = period / 3; totRev = opp.Amount; mRev = totRev.divide(period2, 2); for(Integer i = 1; i <= period2; i++) { Opportunity_Revenue__c oppr2 = new Opportunity_Revenue__c(); oppr2.Account__c = opp.AccountId; oppr2.Opportunity__c = opp.id; System.debug('i '+ i); oppr2.ProjectedRevenue__c = mRev; oppr2.Month__c = sDate; if(sDate.Month()== 1 || sDate.month()==2 || sDate.month() ==3){ oppr2.Quarter__c = 'Quarter 1, '+string.valueOf(sDate.Year()); } else if (sDate.Month()== 4 || sDate.month()== 5 || sDate.month() == 6){ oppr2.Quarter__c = 'Quarter 2, '+string.valueOf(sDate.Year()); } else if (sDate.Month()== 7 || sDate.month()== 8 || sDate.month() == 9){ oppr2.Quarter__c = 'Quarter 3, '+string.valueOf(sDate.Year()); } else if (sDate.Month()== 10 || sDate.month()==11 || sDate.month() ==12){ oppr2.Quarter__c = 'Quarter 4, '+string.valueOf(sDate.Year()); } oppr.add(oppr2); sDate = sDate.addMonths(3); } } } insert oppr; } } }
trigger OpportunityRevenueTrigger on Opportunity (after insert, after update) { OpportunityRevenueTrigger2.updateOpportuntityRev(trigger.new); }
I see there was a mistake in Curly braces hence it was taking both Deletion and insertion in one loop. so please be aware of this silly mistakes in future :)
PFB updated code.
Thanks
Lokesh
All Answers
I see there was a mistake in Curly braces hence it was taking both Deletion and insertion in one loop. so please be aware of this silly mistakes in future :)
PFB updated code.
Thanks
Lokesh
Thank you, totally missed that. If you are ever in Nashville, TN, let me buy you a drink.
Robert