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);
}
}
}