1

EDIT:

I have implemented the changes here based on the Daniel Ballinger now I'm not getting error but when I click on the Next button is not going to the next page i have around 25 rows.

here is my retrofit code:

in the visualforce page i have action in the form like this:

<apex:page action="{!init}" ....

Retrofit Products Method:

public List<ProductWrapper> Products 
     {
      get 
      {
                List<Product2> products2 = new List<Product2>(); 
                list<ProductWrapper> pws = new list<ProductWrapper>();                 
               for(Product2 p : (List<Product2>)this.con.getRecords()) {  

                  if(p.Asset_Line_items__r.isEmpty()){
                     pws.add(New ProductWrapper(p,New Asset_Line_Item__c(Quantity__c = 0));
                     continue;
                 }
                   for(asset_line_items__c b : p.asset_line_items__r) { 
                        //ProductWrapper pw = new ProductWrapper(p,b);
                        ProductWrapper pw = new ProductWrapper((Product2)p,b);
                        pws.add(pw);
                 }
           }    
           Products2 = pws;
           return Products2;
        }
        set;
    } 

END

Here is wrapper class:

public class ProductWrapper {

    public Product2 product {get;set;}
    public asset_line_items__c ali {get;set;}    

    public ProductWrapper(Product2 p, asset_line_items__c ali) {
        product = p;
        this.ali = ali;
    }
}

this is how I load the data in wrapper class: and the error i'm getting:

> Constructor not defined: [ProductWrapper].<Constructor>(SObject,
> Asset_Line_Item__c)

Constructor:

 public void init() {
        this.con = new ApexPages.StandardSetController(SOQL);
        this.con.setpageNumber(1);
        this.con.setPageSize(5);
    }

Loading data in wrapper:

list<ProductWrapper> pws = new list<ProductWrapper>();
for(sObject p : this.con.getRecords()) {  

  if(p.Asset_Line_items__r.isEmpty()){
      pws.add(New ProductWrapper(p,New Asset_Line_Item__c(Quantity__c = 0));
      continue;
  }
  for(asset_line_items__c b : p.asset_line_items__r) { 
     ProductWrapper pw = new ProductWrapper(p,b);
     pws.add(pw);
}

Pagination code:

    public void first() {
         con.first();
     } 
     public void last() {
         con.last();
     } 
     public void previous() {
         con.previous();
     }

     public void next() {
         con.next();
     }


 public ApexPages.StandardSetController con;

    public Boolean hasNext {
        get {
            return con.getHasNext();
        }
        set;
    }

    public Boolean hasPrevious {
        get {
            return con.getHasPrevious();
        }
        set;
    }

    public Integer pageNumber {
        get {
            return con.getPageNumber();
        }
        set;
    }

    public Integer totalPageNumber {
        get {
            Decimal totalSize = this.con.getResultSize();
            Decimal pageSize = this.con.getPageSize();
            Decimal pages = totalSize/pageSize;
            return (Integer)pages.round(System.RoundingMode.CEILING);
        }
        set;
    }

Visualforce page:

<apex:pageBlock id="pb">
  <apex:pageBlockTable value="{!products}" var="a">                     
          <apex:column headerValue="quantity" >                            
                <apex:inputField value="{!a.ali.qty}" required="true" />                    
          </apex:column>
          <apex:column value="{!a.Name}" headerValue="Name"/> 
          <apex:column value="{!a.ProductName}" headerValue="P Name"/> 
  </apex:pageBlockTable>
</apex:pageBlock> 

<apex:outputPanel rendered="{!products.size>0}" styleClass="center">
                <apex:commandButton value="|< First" action="{!first}" rerender="properties" rendered="{!HasPrevious}" />
                <apex:commandButton value="Previous" action="{!previous}" rendered="{!HasPrevious}"  rerender="properties"/>
                Page {!pageNumber} of {!totalPageNumber}
                <apex:commandButton value="Next" action="{!next}" rendered="{!HasNext}"  rerender="properties"/>
                <apex:commandButton value="Last>|" action="{!last}" rendered="{!HasNext}" rerender="properties" />
            </apex:outputPanel>
  • 1
    change for(sObject p : this.con.getRecords()) { to for(asset_line_items__c p : (List<asset_line_items__c>)this.con.getRecords()) { – Ilya Lepesh Sep 18 '16 at 3:39
  • 1
    While wrapper definition you used asset_line_items__c but while passing values you used Asset_Line_Item__c, because of this compiler is not able to find the right definition and it is saying constructor is not available. – Kiran Machhewar Sep 18 '16 at 3:49
2

You need to cast the sObject records returned by the StandartSetController to Product2 records.

E.g.

ProductWrapper pw = new ProductWrapper((Product2)p,b);

Alternatively, you could do the conversion on the for loop.

for(Product2 p : (List<Product2>)this.con.getRecords()) {  
    //...
}
  • I'm not getting the error now but when I click on the next button its not going to the next page, I have updated my question with detail, please have a look - thanks – Nick Kahn Sep 18 '16 at 14:55
  • @NickKahn Ideally you would close this question out as solved if the initial problem is resolved and then start a new question if you have encountered a new problem. – Daniel Ballinger Sep 18 '16 at 20:53
  • 1
    Fair enough, I have created the new question and I will accept this as answer. here is the question I have posted: salesforce.stackexchange.com/questions/141031/… – Nick Kahn Sep 18 '16 at 21:29

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.