2

I have written the code below and for some reason it works in Sandbox but fails in Production when I try to update an Opportunity. Error code appears: "PrimaryContactOpp: System.LimitException: Too many DML rows: 10001"

I have listed the Opportunity Trigger below.

trigger PrimaryContactOpp on Opportunity (after update) {
 if(checkRecursive.runOnce()){
  list<OpportunityContactRole> ocr0 = [SELECT Id, OpportunityId, ContactId, IsPrimary, Role FROM   OpportunityContactRole WHERE IsPrimary = true];
  set<ID> oppIds = new set<ID>();
  map<ID, ID> oppContactMap = new map<ID, ID>();
  map<ID, string> contactRoleMap = new map<ID, string>();

 list<Opportunity> oppUpdate = new list<Opportunity>();

for (Opportunity opp0: trigger.new){
  for (OpportunityContactRole ocr1: ocr0){
    oppIds.add(ocr1.OpportunityId);
    oppContactMap.put(ocr1.OpportunityId, ocr1.ContactId);
    contactRoleMap.put(ocr1.ContactId, ocr1.Role);
  }
}
  list<Opportunity> prime = [SELECT Id FROM Opportunity WHERE ID IN: oppIds];
 list<Opportunity> noPrime = [SELECT Id FROM Opportunity WHERE ID NOT IN: oppIds];

for (Opportunity opp0: trigger.new){
  for(Opportunity opp1: prime){
    opp1.Primary_Contact__c = oppContactMap.get(opp1.id);
    opp1.Role__c = contactRoleMap.get(oppContactMap.get(opp1.id));
    oppUpdate.add(opp1);
  }

  for(Opportunity opp2: noPrime){
    opp2.Primary_Contact__c = null;
    opp2.Role__c = null;
    oppUpdate.add(opp2);
  }
}
try {
update oppUpdate;
        }
    catch (DMLException e) {
        for (Opportunity con : trigger.new) {
            con.addError(e.getDmlMessage(0));
        }
    }
}
}
10
  • What is the error you are getting?
    – EricSSH
    Dec 11, 2014 at 18:14
  • oops sorry I forgot to copy the error. Just added now, thanks! Dec 11, 2014 at 18:16
  • 2
    your second select statement will fetch almost every oppo in PROD!
    – cropredy
    Dec 11, 2014 at 18:18
  • To add onto crop, If that is really what you are trying to do I believe you will need to create a batch class
    – EricSSH
    Dec 11, 2014 at 18:19
  • There is only one Primary Contact assigned to each Opportunity and there are only 548 records of Opportunities that returns after the first SELECT statement, and I have also made sure that all SOQL queries are outside of all FOR loops... Dec 11, 2014 at 18:27

1 Answer 1

1

I have figured it out! Now it works!!

 trigger PrimaryContactOpp on Opportunity (after update) {
if(checkRecursive.runOnce()){

    set<ID> firstOpp = new set<ID>();
    for (Opportunity opp0: trigger.new){
        if(opp0.id != null){
            firstOpp.add(opp0.id);
        }
    }


  list<OpportunityContactRole> ocr0 = [SELECT Id, OpportunityId, ContactId, IsPrimary, Role FROM OpportunityContactRole WHERE OpportunityId IN: firstOpp AND IsPrimary = true];
  set<ID> oppIds = new set<ID>();
  map<ID, ID> oppContactMap = new map<ID, ID>();
  map<ID, string> contactRoleMap = new map<ID, string>();
  list<Opportunity> oppUpdate = new list<Opportunity>();

    for (Opportunity opp0: trigger.new){
      for (OpportunityContactRole ocr1: ocr0){
        oppIds.add(ocr1.OpportunityId);
        oppContactMap.put(ocr1.OpportunityId, ocr1.ContactId);
        contactRoleMap.put(ocr1.ContactId, ocr1.Role);
      }
    }
  list<Opportunity> prime = [SELECT Id, StageName FROM Opportunity WHERE ID IN: oppIds AND StageName != 'Award/Negotiation' AND StageName != 'Contract Signed' AND StageName != 'Lost Opportunity' AND StageName != 'Completed Downgrade' AND StageName != 'Saved Downgrade' AND StageName != 'Closed Project' AND StageName != 'Center Closed' AND StageName != 'Project Complete' AND StageName != 'Service Intro' AND StageName != 'Closed' AND StageName != 'Closed Lost'];

    for (Opportunity opp0: trigger.new){
      for(Opportunity opp1: prime){
        opp1.Primary_Contact__c = oppContactMap.get(opp1.id);
        opp1.Role__c = contactRoleMap.get(oppContactMap.get(opp1.id));
        oppUpdate.add(opp1);
      }

    }
try {
update oppUpdate;
        }
        catch (DMLException e) {
            for (Opportunity con : trigger.new) {
                con.addError(e.getDmlMessage(0));
            }
        }
}

}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .