[SalesForce] Problem with the trigger: Upsert list must not have two identically equal elements

Error message

I have a custom object same as opportunity and order line item same as opportunity product. trigger is when i add opportunity line item system will add order line item with same values.trigger working for adding 1 values.but when i try add 2 order line item same time i get this error. Error is :

Apex trigger CreatingOrderLineItem caused an unexpected exception, contact your administrator: CreatingOrderLineItem: execution of AfterInsert caused by: System.ListException: Before Insert or Upsert list must not have two identically equal elements: Trigger.CreatingOrderLineItem: line 68, column 1

Line 68 is insert(orderlineitemlist);

My trigger is:

trigger CreatingOrderLineItem on OpportunityLineItem (after insert,after update,before delete) {

    //hangi userin üzerinde işlem yapıldığını anlamak için profilin id sini tanımladım.
    id opportunityuser=userinfo.getProfileId();
    if(opportunityuser=='00eb0000000xMDF'){
    
    //Insert yapıldığı zaman yapılan işlemler:
    if(trigger.isAfter && trigger.isInsert){
    
    //Yeni orderlineitem yarattım.
    Order_Line_Item__c neworderlineitem=new Order_Line_Item__c();
    
    //Yarattığım orderlineitem için liste açtım.
    List <Order_Line_Item__c> orderlineitemlist=new List<Order_Line_Item__c>();
    
    //Pricebook id tutmak için liste açtım.
    List<ID> pricebookID=new List<ID>();
    
    //Opportunity id tutmak için liste açtım.
    List<ID> opportunityID=new List<ID>();
    
    //Yeni eklediğim opportunitylineitem fieldlarını yaratılacak orderlineitem'ın fieldları ile karşılaştırmak için değişken (opportunitylistfield) yarattım..
    List<OpportunityLineItem> newopportunitylineitemlist=trigger.new;
    for(OpportunityLineItem opportunitylistfield:newopportunitylineitemlist){
    
    //Yeni eklediğim opportunitylineitem için yaratılacak olan orderlineitem'ın alanlarını eşitledim. 
    neworderlineitem.ServiceDate__c =opportunitylistfield.ServiceDate;
    neworderlineitem.LineDescription__c=opportunitylistfield.Description;
    neworderlineitem.Discount__c=opportunitylistfield.Discount;
    neworderlineitem.Quantity__c=opportunitylistfield.Quantity;
    neworderlineitem.UnitPrice__c=opportunitylistfield.UnitPrice;
    neworderlineitem.Subtotal__c=opportunitylistfield.Subtotal;
    
     
    //Her bir opportunitylineitem için farklı pricebookentry idleri ekledim.
    pricebookID.add(opportunitylistfield.PriceBookEntryId);
     
    //Her bir opportunitylineitem için farklı opportunity idleri ekledim.
    opportunityID.add(opportunitylistfield.OpportunityId);
     
    //Yarattığım orderlineitem fieldlarını orderlineitem için açtığım listeye ekledim.
    orderlineitemlist.add(neworderlineitem);
}

    //Orderlineitemın hangi order içinde yaratılcağını bulmak için gerekli alanları çektim.:
    List<Order__c> orderlist= new List<Order__c>([Select Id,Opportunity__c From Order__c Where Opportunity__c IN:opportunityID]);
    
    //PricebookEntry den gerekli alanları çektim.
    List<PricebookEntry> pricebookentrylist = new List<PricebookEntry>([Select Id,Product2Id From PricebookEntry Where Id IN:pricebookID]);
    
    //Karşılaştırma yapmak için döngü kullandım.
    for (integer i=0;i<orderlineitemlist.size();i++){
    for (integer j=0;j<orderlist.size();j++){
     if(opportunityID[i]==(orderlist[j].Opportunity__c)){
       orderlineitemlist[i].Order__c=orderlist[j].Id;
       }
       }
      }
    for (integer k=0;k<orderlineitemlist.size();k++){
    for (integer l=0;l<pricebookentrylist.size();l++){
     if(pricebookId[k]==(pricebookentrylist[l].Id)){
       orderlineitemlist[k].Product2__c=pricebookentrylist[l].Product2Id;
       }
       }
       }
       
    //Orderlineitem için açtığım listeyi sisteme ekledim.
    insert(orderlineitemlist);
       }
       
    //Update yapıldığı zaman yapılan işlemler:
    if(trigger.isAfter && trigger.isUpdate){
       
    // Pricebook id leri için liste açtım.
    List<ID> pricebookID=new List<ID>();
    
    // Opportunity id leri için liste açtım.
    List<ID> opportunityID=new List<ID>();
       
    //Her OpportunityLineItem için opportunity id ve pricebook id ekledim.
    List<OpportunityLineItem> updatelist=trigger.new;
    for(OpportunityLineItem opportunitylineitemlist:updatelist){
    pricebookID.add(opportunitylineitemlist.PricebookEntryId);
    opportunityID.add(opportunitylineitemlist.OpportunityId);
       }
       
    //Order__c dan gerekli alanları çektim.
    List<Order__c> orderlist=new List<Order__c>([Select Id, Opportunity__c From Order__c Where Opportunity__c IN:opportunityID]);
       
    //Pricebookentry den gerekli alanları çektim.
    List<PricebookEntry> pricebookentrylist=new List<PricebookEntry>([Select Product2Id, ID From PricebookEntry Where Id IN:pricebookID]);
       
    //Order dan çektiğim idleri eklemek için liste açtım.
    List<ID> orderlistid= new List<ID>();
       
    //Pricebooktan çektiğim idleri eklemek için liste açtım.
    List<ID> pricebooklistid=new List<ID>();
       
    //Ekleme işlemlerini yaptım.
    for (integer m=0;m<orderlist.size();m++){
    orderlistid.add(orderlist[m].Id);
       }
    for (integer n=0;n<pricebookentrylist.size();n++){
    pricebooklistid.add(pricebookentrylist[n].Product2Id);
       }
       
    //Opportunityline item update edildiğinde Orderlineitemda update edilecek alanları çektim.
    List<Order_Line_Item__c> orderlineitemlist = new List<Order_Line_Item__c>([Select ServiceDate__c,LineDescription__c,TotalPrice__c,Discount__c,Quantity__c,UnitPrice__c,Subtotal__c,Product2__c,Order__c From Order_Line_Item__c Where Product2__c IN:pricebooklistid OR Order__c IN:orderlistid]);
       
    //Karşılaştırma yapıp hangi opportunitylineitemın hangi orderlineitema ve pricebooktan bilgi alacağını belirledim.
    for(integer a=0;a<orderlineitemlist.size();a++){
    for(integer b=0;b<orderlist.size();b++){
    if(orderlineitemlist[a].Order__c==orderlist[b].Id){
    for(integer c=0;c<pricebooklistid.size();c++){
    if(orderlineitemlist[a].Product2__c==pricebookentrylist[c].Product2Id){
    for (integer d=0;d<updatelist.size();d++){
    if(updatelist[d].OpportunityId==orderlist[b].Opportunity__c && updatelist[d].PricebookEntryId==pricebookentrylist[c].Id){
                 
    //Update yapılan alanları yeniden eşitledim.
    orderlineitemlist[a].ServiceDate__c=updatelist[d].ServiceDate;
    orderlineitemlist[a].UnitPrice__c=updatelist[d].UnitPrice;
    orderlineitemlist[a].LineDescription__c=updatelist[d].Description;
    orderlineitemlist[a].Discount__c=updatelist[d].Discount;
    orderlineitemlist[a].Quantity__c=updatelist[d].Quantity;
    orderlineitemlist[a].SubTotal__c=updatelist[d].SubTotal;
                 }
                 }
                 }
                 }
                 }
                 }
                 }
    //Yeni listeyi sisteme update ettim.
    update(orderlineitemlist);                   
              } 
              
    //Delete yapıldığı zaman yapılan işlemler:
    if(Trigger.isDelete && Trigger.isBefore){
              
    //Pricebook id leri için liste açtım.
    List<ID> pricebookID=new List<ID>();
    
    // Opportunity idleri için liste açtım.
    List<ID> opportunityID=new List<ID>();
       
    //Her OpportunityLineItem için opportunity id ve pricebook id ekledim.(Eski değeri için trigger.old kullandım.)
    List<OpportunityLineItem> deletelist=trigger.old;
    for (OpportunityLineItem opportunitylineitemlist:deletelist){
    pricebookID.add(opportunitylineitemlist.PricebookEntryId);
    opportunityID.add(opportunitylineitemlist.OpportunityId);
       }
    
    //Order__c dan gerekli alanları çektim.   
    List<Order__c> orderlist= new List<Order__c>([Select Id,Opportunity__c From Order__c Where Opportunity__c IN:opportunityID]);
    
    //Pricebookentry den gerekli alanları çektim.   
    List<PricebookEntry> pricebooklist= new List<PricebookEntry>([Select Id,Product2Id From PricebookEntry Where Id IN:pricebookID]);
    
    //Order dan çektiğim id leri eklemek için liste açtım.   
    List<ID> orderlistid=new List<ID>();
    
    //Pricebookentry den çektiğim id leri eklemek için liste açtım.   
    List<ID> pricebooklistid=new List<ID>();
    
    //Ekleme işlemlerini yaptım.   
    for(integer e=0;e<orderlist.size();e++){
    orderlistid.add(orderlist[e].Id);
        }
    for(integer f=0;f<pricebooklist.size();f++){
    pricebooklistid.add(pricebooklist[f].Product2Id);
        }
    
    //Silinen opportunitylineitem için yaratılan orderlineitemın da silinmesi için gerekli alanları çektim.
    List<Order_Line_Item__c> orderlineitemlist=new List <Order_Line_Item__c>([Select Id From Order_Line_Item__c Where Product2__c IN:pricebooklistid AND Order__c IN:orderlistid]);
        
    //Son olarak bu listeyi sildim.
    delete(orderlineitemlist); 
                           
       }
       }
       }

Best Answer

The error is because you are adding the same Order_Line_Item__c record to the orderlineitemlist List multiple times. The code snippet below highlights the problem. You are creating the Order_Line_Item__c record outside of the for loop and adding it to the list in the for loop.

List <Order_Line_Item__c> orderlineitemlist=new List<Order_Line_Item__c>();
...
for(OpportunityLineItem opportunitylistfield:newopportunitylineitemlist) {
    orderlineitemlist.add(neworderlineitem);
    ...
}

Try creating the Order_Line_Item__c record inside the for loop as shown below

for (OpportunityLineItem opportunitylistfield : newopportunitylineitemlist) {
    List <Order_Line_Item__c> orderlineitemlist = new List<Order_Line_Item__c>();
    ...
    orderlineitemlist.add(neworderlineitem);
    ...
}
Related Topic