I'm very new to triggers.
The following trigger updates a custom field in a custom object (Events__c) with the sum of all "TotalPrice" from a related object (OpportunityLineItem).
I'm getting the following error:
Error:Apex trigger OppTrigger caused an unexpected exception, contact your administrator: OppTrigger: execution of AfterUpdate caused by: System.DmlException: Update failed. First exception on row 0; first error: MISSING_ARGUMENT, Id not specified in an update call: []: Class.OpportunityHandler.aggregateResults: line 73, column 1
Here is the Trigger:
trigger OppTrigger on OpportunityLineItem (after delete,after update,
after insert, after undelete) {
if(trigger.isInsert)
{
OpportunityHandler oppHandler =new OpportunityHandler();
oppHandler.oppInsert(Trigger.New);
}
else if(trigger.isDelete)
{
OpportunityHandler oppHandler =new OpportunityHandler();
oppHandler.oppDelete(Trigger.Old);
}
else if(trigger.isUnDelete)
{
OpportunityHandler oppHandler =new OpportunityHandler();
oppHandler.oppundelete(Trigger.New);
}
else if(trigger.isUpdate)
{
OpportunityHandler oppHandler =new OpportunityHandler();
oppHandler.oppUpdate(Trigger.New,Trigger.Oldmap);
}
}
Here is the Class:
public class OpportunityHandler
{
list<Events__c> oppList = new list<Events__c>();
set<id> oppIDs = new set<id>();
public void oppInsert(List<OpportunityLineItem> oppLists)
{
for(OpportunityLineItem opp : oppLists)
{
if(opp.Events__c!=null)
{
oppIDs.add(opp.Events__c);
}
}
aggregateResults();
}
public void oppUpdate(List<OpportunityLineItem> oppLists,Map<Id,OpportunityLineItem> oppOldmap)
{
for(OpportunityLineItem opp : oppLists)
{
if(opp.Events__c!=null)
{
oppIDs.add(opp.Events__c);
if(oppOldmap.get(opp.id).Events__c!=opp.Events__c)
{
oppIDs.add(oppOldmap.get(opp.id).Events__c);
}
}
}
aggregateResults();
}
public void oppDelete(List<OpportunityLineItem> oppLists)
{
for(OpportunityLineItem opp : oppLists)
{
if(opp.Events__c!=null)
{
oppIDs.add(opp.Events__c);
}
}
aggregateResults();
}
public void oppundelete(List<OpportunityLineItem> oppLists)
{
for(OpportunityLineItem opp : oppLists)
{
if(opp.Events__c!=null)
{
oppIDs.add(opp.Events__c);
}
}
aggregateResults();
}
public void aggregateResults()
{
AggregateResult[] groupedResults = [SELECT SUM(TotalPrice), Events__c FROM OpportunityLineItem where Events__c IN :oppIDs GROUP BY Events__c];
for(AggregateResult ar:groupedResults)
{
Id oppId = (ID)ar.get('Events__c');
Double sum = (DOUBLE)ar.get('expr0');
Events__c opp1 = new Events__c(Id=oppId);
opp1.Confirmed__c= sum;
oppList.add(opp1);
}
if(oppList.size()>0 && oppList!=null)
{
update oppList;
}
}
}