You need to sign in to do that
Don't have an account?
BarryPlum
Trying to compare elements in a list and aggregate quantity
I have based this code off of the VF Quote tool created by Salesforce.com Labs a couple of years back.
Esentially, I'm trying to take similar line items and get rid of them from the List and aggregate the quantity. I end up with extra lines in my list for some reason. I have a feeling it's because I'm trying to remove elements while in the loop, but I can't figure out another way to do this.
Any help is appreciated.
Quote_Item__c[] items = new Quote_Item__c[]{}; Quote_Item__c[] qiList = new Quote_Item__c[]{}; for(OpportunityLineItem oli:[select Maintenance_End__c, Maintenance_Start__c, quantity, unitprice, ListPrice, pricebookEntry.product2.name, pricebookEntry.product2id, pricebookEntry.product2.sort__c from opportunitylineitem where opportunityid = :opptyId order by pricebookEntry.product2.sort__c ASC]) { qiList.add(new Quote_Item__c(quantity__c = oli.quantity, unit_price__c = oli.unitprice, List_Price__c = oli.ListPrice, quote__c = renewalQuote.id, name = oli.pricebookentry.product2.name, sort__c = oli.pricebookentry.product2.sort__c, product__c = oli.pricebookentry.product2id, Maintenance_End__c = oli.Maintenance_End__c, Maintenance_Start__c=oli.Maintenance_Start__c)); } // Iterate through working list while(qiList.size()>0){ Set<Id> removeAddress = new Set<Id>(); Quote_Item__c qiTemp = qiList.get(0); removeAddress.add(qiTemp.Id); for(Quote_Item__c qi :qiList){ If(qi.name==qiTemp.name && qi.unit_price__c==qiTemp.unit_price__c && qi.Maintenance_End__c==qiTemp.Maintenance_End__c && qi.Maintenance_Start__c==qiTemp.Maintenance_Start__c) { removeAddress.add(qi.id); qiTemp.Quantity__c += qi.Quantity__c; } } items.add(qiTemp); for(Id a : removeAddress){ for(Integer i=0; i < qiList.size(); i++){ if(a == qiList.get(i).Id) { qiList.remove(i); } } } }
I don't know if this is the best way to do it, but it generally works for me. Essentially set your iterator back 1 since you removed an item and the indices have shifted.
I think you're correct that my issue is in the remove address loop, however, just moving the cursor back doesn't work either. In my unit test where I should end up with 1 group, it works fine, but in my test where I shoul end up with 2 groups, I only have 1.
Okay, I think I'm following the code... here's another way of approaching it (if I understand it correctly). The idea being rather than trying to remove the indices after adding them, check your condition, and don't add them to the list in the beginning. Do you think this would work>
Here is my query
orderHistListRec33 = [Select Name,Account__c,Order_Status__c, Case_Number__c, Product_Description__r.Is_Package__c, Product_Description__r.Name,CreatedDate
From Order_History__c order by createdDate dsc ];
I get
List is
OrderHistoryNumber (Name): 123 Product_Description__r.Name:Branding CreatdeDate : 6/25/13
OrderHistoryNumber(Name) : 124 Product_Description__r.Name:CHAT CreatdeDate : 6/25/13
OrderHistoryNumber (Name): 125 Product_Description__r.Name:Branding CreatdeDate : 6/22/13
OrderHistoryNumber(Name) : 126 Product_Description__r.Name:CHAT CreatdeDate : 6/22/13
I want to eleiminate duplicate Product_Description__r.Name and get most recent i.e.
OrderHistoryNumber (Name): 123 Product_Description__r.Name:Branding CreatdeDate : 6/25/13
OrderHistoryNumber(Name) : 124 Product_Description__r.Name:CHAT CreatdeDate : 6/25/13
how do i modify my query .