You need to sign in to do that
Don't have an account?
Cal Steele
Creating a trigger to set a lookup field to the Opportunity owner
I'm trying to set a custom Opportunity lookup field Sales Rep, which is a lookup to a custom Obj for Sales Reps, to the Opportunity Owner. Pretty new to triggers and would really appreciate any help. Here is where I'm at so far -
trigger SalesRepTrigger on Opportunity (after insert, after update) { if (trigger.isAfter) { if (trigger.isUpdate || trigger.isInsert) { Opportunity ops = new Opportunity(); //get opporunity that triggered Set<ID> Ids = new set<id>(); for(Opportunity o : Trigger.new){ ids.add(o.Sales_Rep__c); } //get CC_Sales_Rep__c ids and store in Map //Map<Id, Id> RepMap = new Map<Id, Id>(); Map<Id, CC_Sales_Rep__c> salesRep = new Map<id, CC_Sales_Rep__c>([Select id, OwnerId FROM CC_Sales_Rep__c Where CC_Sales_Rep__c =:ids]); //for(CC_Sales_Rep__c sr : salesRep) { // RepMap.put(sr.Id, sr.OwnerId); //} //Get Opportunity Record Types Map<ID,Schema.RecordTypeInfo> rt_Map = Opportunity.sObjectType.getDescribe().getRecordTypeInfosById(); for(Opportunity o : Trigger.new){ //Only apply trigger to a certain record type if(rt_map.get(o.recordTypeID).getName().containsIgnoreCase('xxxx xxxx')){ ops.Sales_Rep__c = SalesRep.get(o.Sales_Rep__c).OwnerId; } } update ops; } } }
Please try below updated code:
trigger SalesRepTrigger on Opportunity (before insert, before update) {
if (trigger.isbefore) {
if (trigger.isUpdate || trigger.isInsert) {
//get opporunity that triggered
Set<ID> Ids = new set<id>();
for(Opportunity o : Trigger.new){
if(o.Sales_Rep__c!=Null)
ids.add(o.Sales_Rep__c);
}
Map<Id, CC_Sales_Rep__c> salesRep = new Map<id, CC_Sales_Rep__c>([Select id, OwnerId FROM CC_Sales_Rep__c Where CC_Sales_Rep__c =:ids]);
//Get Opportunity Record Types
Map<ID,Schema.RecordTypeInfo> rt_Map = Opportunity.sObjectType.getDescribe().getRecordTypeInfosById();
for(Opportunity o : Trigger.new){
//Only apply trigger to a certain record type
if(rt_map.get(o.recordTypeID).getName().containsIgnoreCase('xxxx xxxx')){
if(salesRep.Containskey(o.Sales_Rep__c)
{
if(SalesRep.get(o.Sales_Rep__c).OwnerId!=Null)
o.Sales_Rep__c = SalesRep.get(o.Sales_Rep__c).OwnerId;
}
}
}
}
}
}
All Answers
Are you getting record read only error? Since you are trying to update opportunity (trigger.new) records(DML operation after insert/pdate) you will receive that error.
If yes, please change the trigger to before insert and before update and let us know if any other issues?
Please try below updated code:
trigger SalesRepTrigger on Opportunity (before insert, before update) {
if (trigger.isbefore) {
if (trigger.isUpdate || trigger.isInsert) {
//get opporunity that triggered
Set<ID> Ids = new set<id>();
for(Opportunity o : Trigger.new){
if(o.Sales_Rep__c!=Null)
ids.add(o.Sales_Rep__c);
}
Map<Id, CC_Sales_Rep__c> salesRep = new Map<id, CC_Sales_Rep__c>([Select id, OwnerId FROM CC_Sales_Rep__c Where CC_Sales_Rep__c =:ids]);
//Get Opportunity Record Types
Map<ID,Schema.RecordTypeInfo> rt_Map = Opportunity.sObjectType.getDescribe().getRecordTypeInfosById();
for(Opportunity o : Trigger.new){
//Only apply trigger to a certain record type
if(rt_map.get(o.recordTypeID).getName().containsIgnoreCase('xxxx xxxx')){
if(salesRep.Containskey(o.Sales_Rep__c)
{
if(SalesRep.get(o.Sales_Rep__c).OwnerId!=Null)
o.Sales_Rep__c = SalesRep.get(o.Sales_Rep__c).OwnerId;
}
}
}
}
}
}
Please see below:
1. Create Handler Class from Developer console with same name as below and replace the code as below
===================================
Public class OpportunityTriggerHandler {
//get IDs of club car opps that are new or owner changed
Public static void updateSalesRepOnOpp (List<Opportunity> oppList,Map<Id, Opportunity>OldMap)
{
Set<ID> oppOwnerIds = new set<id>();
Id ccOppRecordTypeId = [SELECT Id FROM RecordType WHERE sObjectType='Opportunity' and DeveloperName='DevName'].Id;
for(Opportunity o : oppList){
if(( o.OwnerId != oldMap.get(o.Id).OwnerId) && o.RecordTypeId == ccOppRecordTypeId) {
oppOwnerIds.add(o.Sales_Rep__c);
}
}
if(!oppOwnerIds.isEmpty()){
//get all the associated sales rep records
Map<Id, Id> user2SalesRepMap = new Map<Id,Id>();
for(CC_Sales_Rep__c rep : [SELECT Id, CC_Sales_Rep__c FROM CC_Sales_Rep__c WHERE CC_Sales_Rep__c in :oppOwnerIds]) {
user2SalesRepMap.put(rep.CC_Sales_Rep__c,rep.Id);
}
if(!user2SalesRepMap.isEmpty()){
//update sales rep lookup on opp
for(Opportunity opp : oppList){
if(user2SalesRepMap.containsKey(opp.OwnerId)){
opp.Sales_Rep__c = user2SalesRepMap.get(opp.OwnerId);
}
}
}
}
}
}
==============================================================
2. Update the existing trigger code as below:
==============================================
trigger OpportunityTrigger1 on Opportunity (before insert) {
OpportunityTriggerHandler.updateSalesRepOnOpp(trigger.new,trigger.oldMap);
}
trigger OpportunityTrigger on Opportunity (before insert) {
OpportunityTriggerHandler.updateSalesRepOnOpp(trigger.new,trigger.oldMap);
}