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
Salesforce Admin 110Salesforce Admin 110 

code fails after one transaction please help

this code works fine per single transaction but when i einsert multiple contacts at same time the insert fails

 
public with sharing class easycontacttriggerhelper {
public static void buyerconConveyancy2(list<Contact> cons) {
system.debug('###list<Contact> cons ' +  cons);



list<Easy_Opportunity__c> opplist = new list <Easy_Opportunity__c>();

recordtype[] tt = [Select  r.Id, r.SobjectType, r.Name From RecordType r where sobjecttype ='Easy_Opportunity__c' and Name = 'Residential Sales'];

for(Contact con : cons){

system.debug('### con ' +  con);

if( con.Stage__c == 'Lead' && con.contacttype__c != null && con.contacttype__C.contains('Buyer')){

Easy_Opportunity__c newopp = new Easy_Opportunity__c ();



            
            newopp.ownerid = con.Allocated_Negotiator__c;
            newopp.name = 'Applicant Conveyancy Opportunity'; 
            newopp.account_name__c = con.accountid;
            newopp.CurrencyIsoCode = con.currencyisocode;
            newopp.stage__c = 'New';
            newopp.recordtypeid = tt[0].Id;
            newopp.Contact_Name__c = con.id;
            newopp.Close_Date__c = Date.today().addDays(2);
            
            
            

            opplist.add(newopp);

   insert opplist; 
system.debug('### opplist ' +  opplist);
List<Product__c> Pd = (List<Product__c>) System.Json.deserialize('[{"attributes":{"type":"Product__c"},"Name":"Conveyancing","Sale_Price__c":"111.00"}]', List<Product__c>.class);
    for (Product__c eachProd : Pd)
 eachProd.Easy_Opportunity__c = opplist[0].id;
    
insert Pd;
 system.debug('### pd ' +  pd);
 


}
}
}
}

 
Tarun J.Tarun J.
Hello,

How are you calling this class from trigger? Can you share your trigger code also.

Also, the above code is having multiple DML operations under FOR Loop. It would be good if you move them outside the loop.

-Thanks,
TK
Salesforce Admin 110Salesforce Admin 110
hi yes i am relatively new to this.......i am not sure how to move dml out of for loop......here is my trigger below.....i have many methods largely the same in the class
 
trigger easycontacttrigger on Contact (before insert, after insert, before update, after update, before delete, after delete, after undelete){
    
if(Trigger.isUpdate  && Trigger.isAfter){
 
   
    

easycontacttriggerhelper.sellercon(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconConveyancy(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconMortgage(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconhomebuyerreport(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconutilityswitchgas(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconutilityswitchwater(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconutilityswitchelec(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconremovals(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyercongassafetycheck(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconpattest(Trigger.new, trigger.oldmap);
easycontacttriggerhelper.buyerconaffiliates(Trigger.new, trigger.oldmap);



}
    

if(Trigger.isinsert && Trigger.isafter){
    
easycontacttriggerhelper.sellercon2 (Trigger.new);
   
easycontacttriggerhelper.buyerconConveyancy2(Trigger.new);
    
easycontacttriggerhelper.buyerconMortgage2(Trigger.new);
easycontacttriggerhelper.buyerconhomebuyerreport2(Trigger.new);
easycontacttriggerhelper.buyerconutilityswitchgas2(Trigger.new);
easycontacttriggerhelper.buyerconutilityswitchwater2(Trigger.new);
easycontacttriggerhelper.buyerconutilityswitchelec2(Trigger.new);
easycontacttriggerhelper.buyerconremovals2(Trigger.new);
easycontacttriggerhelper.buyercongassafetycheck2(Trigger.new);
easycontacttriggerhelper.buyerconpattest2(Trigger.new);
easycontacttriggerhelper.buyerconaffiliates2(Trigger.new);








}

    if(Trigger.isinsert && Trigger.isbefore){
        
easycontacttriggerhelper.contactuserfields(Trigger.new);        
        
    }
if(Trigger.isupdate && Trigger.isbefore){
        
easycontacttriggerhelper.contactuserfields(Trigger.new);        
        
    }

    
}

 
Tarun J.Tarun J.
What is the error message your are getting for multiple insert?
Salesforce Admin 110Salesforce Admin 110
easycontacttrigger: execution of AfterInsert

caused by: System.DmlException: Insert failed. First exception on row 0 with id a13250000005OnzAAE; first error: INVALID_FIELD_FOR_INSERT_UPDATE, cannot specify Id in an insert call: [Id]

Class.easycontacttriggerhelper.buyerconConveyancy2: line 139, column 1
Trigger.easycontacttrigger: line 28, column 1
Tarun J.Tarun J.
Update the code by moving below part outside the FOR LOOP. I have also added condition for checking blank list.
if(oppList.size() > 0){

insert opplist; 
system.debug('### opplist ' +  opplist);
List<Product__c> Pd = (List<Product__c>) System.Json.deserialize('[{"attributes":{"type":"Product__c"},"Name":"Conveyancing","Sale_Price__c":"111.00"}]', List<Product__c>.class);
    for (Product__c eachProd : Pd)
 eachProd.Easy_Opportunity__c = opplist[0].id;
    
insert Pd;
 system.debug('### pd ' +  pd);
 
}

 
Salesforce Admin 110Salesforce Admin 110
initial test shows your answer has worked, thankyou.....i will finish changing the whole class in this way and test again.......i will mark as best answer then, thanks again
Salesforce Admin 110Salesforce Admin 110
hi , there is still an issue - only the first inserted opportunity has a product record attached.......i need to be able to insert product to every opp added to the opplist....can you help with that?
Tarun J.Tarun J.
This is due to the code where each product is being associated with first Opportunity record only.
 
for (Product__c eachProd : Pd)
 eachProd.Easy_Opportunity__c = opplist[0].id;

 
Salesforce Admin 110Salesforce Admin 110
ok how can i change that?
Tarun J.Tarun J.
Both Product and Oppotunity are custom objects. Also, by looking at your code, it seems like a product is associated with an Opportunity (Opportunity is parent to Product). While in your previous comment you mentioned that only first Opp is associated with Product. Can you please clarify it more?