function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Zoren DomingoZoren Domingo 

Apex trigger, how to map the old record created in the custom object Campaign_Scorecard__c, to avoid creating duplicate record in opportunity?

Here's my current code.
trigger AdworksTriggerForCampaignScoreCard on OpportunityLineItem (after insert, after update, after delete) {
    
    List<Campaign_Scorecard__c> scorecardToInsert = new List<Campaign_Scorecard__c>();    
    
    public class applicationException extends Exception {}
    try{
    
        
        if(trigger.isUpdate) {
            
            for (OpportunityLineItem oli: trigger.new){
                
                OpportunityLineItem oldOli = Trigger.oldMap.get(oli.ID);
                
                if(oli.Reporting_Length__c != trigger.oldMap.get(oli.ID).Reporting_Length__c){
                    if(oli.Reporting_Length__c.contains('Closed Loop Analysis (Client Data) Acxiom 0 Days')) {
                        Campaign_Scorecard__c cs = new Campaign_Scorecard__c(Opportunity__c=oli.opportunityId);
                        cs.Vendor_Measurement__c = 'Closed Loop Analysis (Client Data) Acxiom';
                        cs.Days__c = '0';
                        scorecardToInsert.add(cs);
                    }
                    
                    if(oli.Reporting_Length__c.contains('Closed Loop Analysis (Client Data) Acxiom 30 Days')) {
                        Campaign_Scorecard__c cs = new Campaign_Scorecard__c(Opportunity__c=oli.opportunityId);
                        cs.Vendor_Measurement__c = 'Closed Loop Analysis (Client Data) Acxiom';
                        cs.Days__c = '30';
                        scorecardToInsert.add(cs);
                    }
                    if(oli.Reporting_Length__c.contains('Closed Loop Analysis (Client Data) Acxiom 60 Days')) {
                        Campaign_Scorecard__c cs = new Campaign_Scorecard__c(Opportunity__c=oli.opportunityId);
                        cs.Vendor_Measurement__c = 'Closed Loop Analysis (Client Data) Acxiom';
                        cs.Days__c = '60';
                        scorecardToInsert.add(cs);
                    }
                    if(oli.Reporting_Length__c.contains('Closed Loop Analysis (Client Data) Acxiom 90 Days')) {
                        Campaign_Scorecard__c cs = new Campaign_Scorecard__c(Opportunity__c=oli.opportunityId);
                        cs.Vendor_Measurement__c = 'Closed Loop Analysis (Client Data) Acxiom';
                        cs.Days__c = '90';
                        scorecardToInsert.add(cs);
                    }
                }
            }
            
        }
        insert scorecardToInsert;   
    
    }
    catch(Exception e)
    {
        system.debug(e.getMessage());
        throw new applicationException(e.getLineNumber() + '.Please Contact your System Administrator');        
    }
	
	

}
Raj VakatiRaj Vakati
Can you explan more .. your code seems to be good for me 
Zoren DomingoZoren Domingo

Hi Raj, these are the objects.

Campaign_Scorecard__c - custom object that has Master-Detail relationship with opportunity.

OpportunityLineItem - Reporting_Length__c is a multi-select picklist.

My problem here is when I modified the current values of the multi-select, and save it. Once the record is updated, the trigger fires again, so it will created another set of campaign scorecards. 

I need to check if the scorecard is already existing or not inside opportunity, and delete/add a record if the previous values swap/change in the multi-select picklist.