Search code examples
salesforceapex-codevisualforcesoql

Unable to output rows from SOQL query to <apex:repeat>


I'm getting this error:

Description Resource    Path    Location    Type
Save error: Unknown property 'OpportunityStandardController.getLines'   AlexHelloWorld.page /SFDC/src/pages line 0  Force.com save problem

VF Page:

<apex:page standardController="Opportunity" extensions="AlexHelloWorld">
    <apex:form >
        <apex:pageBlock title="Edit account for {!$User.FirstName}">
            <apex:pageMessages />
            <apex:pageBlockButtons >

            </apex:pageBlockButtons>
            <apex:pageBlockSection >
                <apex:outputText value="Test - {!retVal}">
                </apex:outputText>
            </apex:pageBlockSection>
            <apex:pageBlockSection >
                <apex:outputText value="OppId - {!opportunity.id}" />
                <apex:outputText value="UserId - {!$User.Id}" />
            </apex:pageBlockSection>
            <apex:pageBlockSection>
                <apex:repeat value="{!getLines}" var="line" id="theRepeat">
                    <tr>
                        <td valign="top"><apex:outputField value="{!line.Id}" /></td>
                        <td valign="top"><apex:outputField value="{!line.OpportunityId}" /></td>
                        <td valign="top"><apex:outputField value="{!line.PricebookEntryId}" /></td>
                        <td valign="top"><apex:outputField value="{!line.Quantity}" /></td>
                    </tr>
                </apex:repeat>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

Controller:

public with sharing class AlexHelloWorld {

    public boolean  showFedEx{get;set;}
    public String   mystr{get;set;}
    public Id       opportunityId{get;set;}

    //public Opportunity opportunity{get;set;}
    public Decimal retVal{get;set;}

    //Main controller class
    public AlexHelloWorld(ApexPages.StandardController controller)
    {
        mystr = [SELECT Email from User where Id =:Userinfo.getUserId()].Email;
        showFedEx = true;
        retVal = 5*5;
        System.debug('zzzzz');
    }

    public List<OpportunityLineItem> getLines()
    {       
        List<OpportunityLineItem> oli = [SELECT Id, OpportunityId, PricebookEntryId, Quantity FROM OpportunityLineItem where id =:System.currentPageReference().getParameters().get('id')];

        return oli;     
    }
}

Solution

  • Simple error :) You should skip the "get/set" in the function names. I agree it's not the most clear error message in the world.

    Your VF page should be calling {!lines}, not {!getLines} (Visualforce isn't case-sensitive, neither is Apex). Then it will compile just fine.

    ...
    <apex:repeat value="{!lines}" var="line" id="theRepeat">
    ...
    

    It's so fundamental I'm not even sure where to link to in the docs (no offense), maybe http://www.salesforce.com/us/developer/docs/pages/index_Left.htm#StartTopic=Content/pages_quick_start_controller_getter_methods.htm


    One minor point - if you have Opportunity standard controller, you might want to do this in the constructor:

    Opportunity opp = (Opportunity) controller.getRecord();
    

    In fact, you could ignore the whole controller side and display line items related list straight from Visualforce (but this won't help you if you want for example to sort them).

    <apex:repeat value="{!Opportunity.OpportunityLineItems}" var="line" id="theRepeat">
        <tr>
            <td valign="top"><apex:outputField value="{!line.Id}" /></td>
            <td valign="top"><apex:outputField value="{!line.OpportunityId}" /></td>
            <td valign="top"><apex:outputField value="{!line.PricebookEntryId}" /></td>
            <td valign="top"><apex:outputField value="{!line.Quantity}" /></td>
        </tr>
    </apex:repeat>