0

I'm trying to count the number of each asset for an account and I'm not sure where I'm going wrong. I'm getting this error "Content cannot be displayed: Invalid field quantity for AggregateResult". Any ideas?

Controller Class

public class assetSummary {
    public account acc;

    public String name {get;set;}
    public integer quantity {get;set;}

    public assetSummary(string n,integer q){
        this.quantity=q;
        this.name=n;
    }
    public assetSummary(ApexPages.StandardController controller){
        this.acc = (Account)controller.getRecord();
    }

    public List<assetSummary> assetList = new List<assetSummary>();

    public list<assetSummary> getListOut(){
        AggregateResult[] ar = [SELECT Item__r.name name, count(id) FROM Serial_Tracker__c WHERE Account__c = :acc.ID GROUP BY Item__r.name];
        for (AggregateResult resultList : ar){
            assetList.add(new assetSummary(String.valueOf(resultList.get('name')),integer.valueOf(resultList.get('quantity'))));
        }
        return assetList;
    }
}

VF page`

<apex:page standardController="Account" extensions="assetSummary">   
<apex:pageblock title="Asset Summary">
    <apex:pageblocktable value="{!ListOut}" var="lo">
        <apex:column value="{!lo['name']}" headervalue="Name" >
        </apex:column>
        <apex:column value="{!lo['quantity']}" headervalue="quantity">
        </apex:column>
    </apex:pageblocktable>
</apex:pageblock>          
</apex:page>
3

It is best to create separate classes for things like controllers and data holders so something like this:

public class AssetSummaryController {

    // This inner class just holds the data needed for the page
    public class AssetSummary {

        public String name {get;set;}
        public integer quantity {get;set;}

        public AssetSummary(string name, integer quantity) {
            this.name = name;
            this.quantity = quantity;
        }
    }

    private account acc;

    public AssetSummaryController(ApexPages.StandardController controller){
        this.acc = (Account)controller.getRecord();
    }

    public list<AssetSummary> getListOut() {
        list<AssetSummary> assetList = new list<AssetSummary>();
        AggregateResult[] ar = [
                SELECT Item__r.name name, count(id) quantity
                FROM Serial_Tracker__c
                WHERE Account__c = :acc.ID
                GROUP BY Item__r.name
                ];
        for (AggregateResult resultList : ar){
            assetList.add(new AssetSummary(
                    String.valueOf(resultList.get('name')),
                    Integer.valueOf(resultList.get('quantity'))
                    ));
        }
        return assetList;
    }
}

which then allows the page to look like this:

<apex:page standardController="Account" extensions="AssetSummaryController">   
<apex:pageblock title="Asset Summary">
    <apex:pageblocktable value="{!ListOut}" var="lo">
        <apex:column value="{!lo.name}" headervalue="Name" >
        </apex:column>
        <apex:column value="{!lo.quantity}" headervalue="Quantity">
        </apex:column>
    </apex:pageblocktable>
</apex:pageblock>          
</apex:page>

The error you were seeing was that you had not provided the alias name "quantity" in the aggregate query. I strongly suggest formatting queries on multiple lines so it is easier to spot such omissions.

| improve this answer | |
  • Thanks for the help! Really appreciate it. Also thanks for the tips will take them on board :) – Nigel McIntyre Jul 21 '15 at 16:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.