You need to sign in to do that
Don't have an account?
BeautifulDrifter
Need help with Wrapper Class for Nested Aggregate Classes
I am trying to wrap two aggregate classes into a Wrapper class so I can access both as needed.
I am getting the following error: Unknown property 'psqSummaryExt.pmWrap.mSum'
It also appears the pSum isn't returning anything either. I am guessing I have something wrong in my constructor. I tried using a map as well. Code for that at the bottom.
Any help would be amazing. Thanks in advance.
Current Apex:
VF:
Map Apex (removed):
I am getting the following error: Unknown property 'psqSummaryExt.pmWrap.mSum'
It also appears the pSum isn't returning anything either. I am guessing I have something wrong in my constructor. I tried using a map as well. Code for that at the bottom.
Any help would be amazing. Thanks in advance.
Current Apex:
public class psqSummaryExt { Public PSQ_Header__c Header {get;set;} Private Map<Id,List<ModuleSum>> ProdModMap = New Map<Id,List<ModuleSum>>(); public List<pmWrap> pmWrapout {get; set;} private ApexPages.StandardController stdCtrl {get; set;} public psqSummaryExt(ApexPages.StandardController std) { Header=[select Id from PSQ_Header__c where Id = 'a0541000008gjcm']; //Header =(PSQ_Header__c)std.getrecord(); stdCtrl=std; } public psqSummaryExt(){ pmWrapout = new List<pmWrap>(); } Public Class pmWrap{ ProductSum pSum {get; set;} List<moduleSum> mSum {get; set;} } public class ProductSum{ Public String ProdId {get;set;} public String ProductName {get; set;} public String phc1 {get; set;} public String phc2 {get; set;} public String phc3 {get; set;} public String phc4 {get; set;} public String pvariableHours {get; set;} Public String phcTotal {get;set;} Public ProductSum(string pi, string p,string p1, string p2, string p3, string p4, string pv, string pt){ this.ProdId = pi; this.ProductName = p; this.phc1 = p1; this.phc2 = p2; this.phc3 = p3; this.phc4 = p4; this.pvariableHours = pv; this.phcTotal = pt; } public List<ModuleSum> ModSumList = new List<ModuleSum>(); } public class ModuleSum{ Public List<PSQ_Product__c> Prod {get; set;} public String pId {get; set;} public String ModuleName {get; set;} public String ProductName {get; set;} public String mhc1 {get; set;} public String mhc2 {get; set;} public String mhc3 {get; set;} public String mhc4 {get; set;} public String mvariableHours {get; set;} Public String mhcTotal {get;set;} Public ModuleSum(string pId, string p,string m,string m1, string m2, string m3, string m4, string mv, string mt){ this.pId = pId; this.ProductName = p; this.ModuleName = m; this.mhc1 = m1; this.mhc2 = m2; this.mhc3 = m3; this.mhc4 = m4; this.mvariableHours = mv; this.mhcTotal = mt; } } //public List<pmWrap> pmWrapout = New List<pmWrap>(); public List<ProductSum> ProductSumList = new List<ProductSum>(); public List<ProductSum> getProductSumOut(){ AggregateResult[] productAR = [SELECT PSQ_Application__r.PSQ_Product__r.Id Id ,PSQ_Application__r.PSQ_Product__r.Name Product ,SUM(Class_1_Total__c) pc1 ,SUM(Class_2_Total__c) pc2 ,SUM(Class_3_Total__c) pc3 ,SUM(Class_4_Total__c) pc4 ,SUM(Variable_hours__c) pv ,SUM(Total_Hours__c) pth FROM PSQ_App_Detail__c WHERE PSQ_Header__c=:Header.Id //and PSQ_Application__r.PSQ_Product__r.Id = :pp.Id GROUP BY PSQ_Application__r.PSQ_Product__r.Id ,PSQ_Application__r.PSQ_Product__r.Name]; for (AggregateResult prodList : productAR) { ProductSumList.add(new ProductSum(String.valueOf(prodList.get('Id')), String.valueOf(prodList.get('Product')), String.valueOf(prodList.get('pc1')) , String.valueOf(prodList.get('pc2')) , String.valueOf(prodList.get('pc3')) , String.valueOf(prodList.get('pc4')) , String.valueOf(prodList.get('pv')) , String.valueOf(prodList.get('pth')) )); } return ProductSumList; } public List<ModuleSum> ModuleSumList = new List<ModuleSum>(); List<pmWrap> pmWrapper = New List<pmWrap>(); public List<ModuleSum> getModuleSumOut(){ List<PSQ_Product__c> prods = [select Id from PSQ_Product__c]; For (ProductSum p : ProductSumList){ pmWrap pW = New pmWrap(); AggregateResult[] moduleAR = [SELECT PSQ_Application__r.PSQ_Product__c prodId ,PSQ_Application__r.PSQ_Product__r.Name Product ,PSQ_Application__r.PSQ_Module__r.Name Module ,SUM(Class_1_Total__c) c1 ,SUM(Class_2_Total__c) c2 ,SUM(Class_3_Total__c) c3 ,SUM(Class_4_Total__c) c4 ,SUM(Variable_hours__c) vh ,SUM(Total_Hours__c) th FROM PSQ_App_Detail__c WHERE PSQ_Header__c=:Header.Id and PSQ_Application__r.PSQ_Product__c = :p.prodId GROUP BY PSQ_Application__r.PSQ_Product__c ,PSQ_Application__r.PSQ_Product__r.Name ,PSQ_Application__r.PSQ_Module__r.Name]; for (AggregateResult modList : moduleAR) { //PSQ_Product__c prod = [select Id from PSQ_Product__c where Id = :modList.get('prodId')]; //List<ModuleSum> msList = New List<ModuleSum>(); ModuleSumList.add(new ModuleSum(String.valueOf(modList.get('prodId')), String.valueOf(modList.get('Product')) ,String.valueOf(modList.get('Module')) , String.valueOf(modList.get('c1')) , String.valueOf(modList.get('c2')) , String.valueOf(modList.get('c3')) , String.valueOf(modList.get('c4')) , String.valueOf(modList.get('vh')) , String.valueOf(modList.get('th')) )); //ModuleSumList.addall(msList); } pW.pSum = p; pW.mSum=ModuleSumList; return ModuleSumList; pmWrapout.add(pW); system.debug(pmWrapout); ProdModMap.put(p.prodId, ModuleSumList); system.debug('Add p.Id and msList to Map. Product ID:'+p.ProdId + ' msList size: '+ModuleSumList.size()); } return Null; } }
VF:
<apex:pageblock title="Wrapper Summary"> <apex:repeat value="{!pmWrapout}" var="pw" > <apex:pageBlockSection title="pw.pSum.Name"> <apex:pageblocktable value="{!pw.mSum}" var="mSum"> <apex:column value="{!mSum.ModuleName}" headervalue="Module" /> <apex:column value="{!mSum.mhc1}" headervalue="Consulting Hours" /> <apex:column value="{!mSum.mhc2}" headervalue="Development Hours" /> <apex:column value="{!mSum.mhc3}" headervalue="QA Hours" /> <apex:column value="{!mSum.mhc4}" headervalue="Hours Class 4" rendered="false"/> <apex:column value="{!mSum.mvariableHours}" headervalue="Variable Hours" rendered="True"/> <apex:column value="{!mSum.mhcTotal}" headervalue="Total Hours" rendered="True"/> </apex:pageblocktable> </apex:pageBlockSection> </apex:repeat> </apex:pageblock>
Map Apex (removed):
List<pmWrap> pmWrapper= New List<pmWrap>(); public List<pmWrap> getpmWrapout(){ for (ProductSum ps : ProductSumList ){ pmWrap pW = New pmWrap(); pW.pSum = ps; //system.debug('ProductSum to add: '+ps); List <ModuleSum> modSum = New List <ModuleSum>(); for (ModuleSum ms : ProdModMap.get(ps.ProdId)){ modSum.add(ms); } pW.mSum=modSum; pmWrapper.add(pW); } return pmWrapper; }
public keyword is missing
All Answers
public keyword is missing
No need of getModuleSumOut()
Also, SOQL inside for loop is BIG NO - Always avoid it. Use collections wisely to achieve your goal as a work around for soql inside loop.
https://developer.salesforce.com/blogs/developer-relations/2015/01/apex-best-practices-15-apex-commandments.html
Can you please update the code and post debug log here? I want to know what I am missing
Argument cannot be null.
An unexpected error has occurred. Your development organization has been notified.
Please try this once.
Argument cannot be null.
An unexpected error has occurred. Your development organization has been notified.
I got it working though so it is fine. Below is what I ended up using, I also took the query out of the loop per your advice. Thanks for your help on everything.