1

Here i am not clear about the apex logic,

the flow is :

i have one child record Bundle__c and Product2 is parent, and i need to store multiple Product2 under Bundle__c (Product2 is located in related list under Bundle__c record)

To achieve this scenario i wrote visualforce page for multiselect product2 using checkbox and once user click on ADD Button then those all selected Products have to store under that related list of Bundle__c

here is my Page code :

<apex:page standardController="Product2" extensions="ProductSelectController">
<apex:form >
    <apex:pageBlock >
        <apex:pageBlockButtons location="TOP">
            <apex:commandButton value="Add" action="{!AddProduct}"/>
        </apex:pageBlockButtons>
        <apex:pageBlockTable value="{!productlist}" var="prlist">
            <apex:column >
                <apex:inputCheckbox value="{!selectedCheckBox}" />
            </apex:column>
            <apex:column headerValue="Product Name">
                {!prList.Name}
            </apex:column>
            <apex:column headerValue="Description">
                {!prList.Description}
            </apex:column>
            <apex:column headerValue="Price">
                {!prList.Cost__c}
            </apex:column>
        </apex:pageBlockTable>
    </apex:pageBlock>
</apex:form>

Apex Class :

Public Class ProductSelectController{

public List<Product2> productlist{get;set;}
public boolean selectedCheckBox{get;set;}
//public Product2 pr{get;set;}
public Bundle__c bundle{get;set;}

public ProductSelectController(ApexPages.StandardController Controller){

    productlist = [select Id, Name, Description, Cost__c from Product2];
    bundle = new Bundle__c();
    //pr = new Product2();

}

public Void AddProduct(){
    for(Product2 p : productlist){
        if(selectedCheckBox == True){
            p.Bundle__c = bundle.Id;
            system.debug('====P====='+p.Bundle__c);
        }
    }
}
}

Can anyone please help me !!

  • You need to use wrapper to achieve this functionality. – Tushar Sharma Dec 26 '16 at 6:43
  • thanks tushar !! honestly i am new to apex and need to know above code is correct or need some correction ? – HSdev Dec 26 '16 at 6:45
  • Nope its incorrect. You will get same checkbox value for all records thats why I am suggesting you to go through with wrapper class. – Tushar Sharma Dec 26 '16 at 7:37
1

Assuming that Bundle__c is the record being passed into the standard controller and that you are simply updating a field on product2 (those you selected) to populate the Bundle__c lookup, this illustrates the wrapper class in its most basic form:

class

Public Class ProductSelectController{

public Id bundleId{get;set;}

public productWrapper[] productList {
    get{
        if(productList == null){
            productList = New ProductWrapper[]{};

            for(Product2 p : [select Id, Name, Description, Cost__c, Bundle__ c from Product2])
                productList.add(New productWrapper(p,bundleId));

        }

        return productList;
    }
    set;
}

//Assuming the standard controller is on bundle
public ProductSelectController(ApexPages.StandardController Controller){        
    bundleId = controller.getId();
}

public Void save(){
    Product2[] tbu = New Product2[]{};

    for(ProductWrapper p : productlist){
        if(p.isSelected == True){
            p.prod.Bundle__c = bundleId;
            system.debug('====P====='+p.prod.Bundle__c);
            tbu.add(p.prod);
        }
    }

    update tbu;
}

public class productWrapper{
    public product2 prod {get;set;}
    public boolean isSelected {get;set;}

    public productWrapper(Product2 prod, Id bundleId){
        this.prod = prod;
        isSelected = prod.Bundle__c == bundleId; //If the product already is associated with the BundleId then default to already selected
    }
}
}

Then your page would use the wrapper and its values to iterate and ultimately call the save() method

<apex:page standardController="Bundle__c" extensions="ProductSelectController">
<apex:form >
    <apex:pageBlock >
        <apex:pageBlockButtons location="TOP">
            <apex:commandButton value="Add" action="{!save}"/>
        </apex:pageBlockButtons>
        <apex:pageBlockTable value="{!productlist}" var="prlist">
            <apex:column >
                <apex:inputCheckbox value="{!prList.isSelected}" />
            </apex:column>
            <apex:column headerValue="Product Name">
                {!prList.prod.Name}
            </apex:column>
            <apex:column headerValue="Description">
                {!prList.prod.Description}
            </apex:column>
            <apex:column headerValue="Price">
                {!prList.prod.Cost__c}
            </apex:column>
        </apex:pageBlockTable>
    </apex:pageBlock>
</apex:form>

I assumed you had the standardController set incorrectly since you were updating the product2 records Bundle__c lookup to be associated with the Bundle__c record. In the Example the Bundle__c is the singular record that you will be using to populated the lookup on your selected Product2 records.

  • Hey Eric, productList.add(p,bundleId); can you please try to make me understand ? – HSdev Dec 26 '16 at 9:36
  • @HSdev - Updated, forgot to add the constructor in the line of code. – Eric Dec 26 '16 at 9:37
  • bundleId = con.getRecordId(); & p.Bundle__c = bundleId; – HSdev Dec 26 '16 at 9:49
  • is there a question? the first assigns the value of the standard controller record Id (bundle__c) to a property. the second assigns that id to the product2 if selected (like you were trying to do in your example )... – Eric Dec 26 '16 at 9:52
  • 2
    Eirc, that error was solved (API is OK) only need to add object variable which is declared in Wrapper p.prod.Bundle__c = bundleId; – HSdev Dec 26 '16 at 10:23
-1

Here is the Wrapper Class outline code. Little explanations on the concept of Wrapper class. You can think of it as the structure of the C/C++ languages.

This is how you need to declare it:- Your object relationships are not very clear. Still, I made my own assumptions while coding this. Please follow it as an example.

Public Class ProductSelectController{

public ProductSelectController(ApexPages.StandardController Controller){

public List<ProductBundleSelectedWrapper> productBundlewrap = new List<ProductBundleSelectedWrapper>(); 
public ProductBundleSelectedWrapper wrap = new ProductBundleSelectedWrapper();
public Product2 productrec = new Product2();
public Bundle__c Bundlerec = new Bundle__c();
public List<Product2> productlst = new List<Product2>();
public List<Product2> productlst2 = new List<Product2>();
public List<Bundle__c> bundlelst = new List<Bundle__c>([select Id, Product__c, Name, Description, Cost__c from Bundle__c WHERE Id = (Bundle__c)controller.getRecord().id]);

public Void AddProduct(){
    for (Bundle__c tmpbundle : bundlelst){
        productlst = [SELECT ProductCode, isSelected, Name, Description FROM Product2 WHERE Product__c =: (Id)tmpbundle.Product__c]; 

        for (Product2 tmpprod : productlst)
        {
            if (tmpprod.isSelected == true)
                productlst2.add(tmpprod);
        }
        wrap.productlst = productlst2;
        wrap.buldlerec = tmpbundle;
        ProductBundleSelectedWrapper.add(wrap);
    }
    insert ProductBundleSelectedWrapper;
}   


public class ProductBundleSelectedWrapper{
    public List<Product2> productlst = new List<Product2>();
    public Boolean isSelected = false;
    public Buldle__c buldlerec = new Bundle__c();

    //Constructor
    public productSelectedWrapper()
    {
    }

}

}

  • Thank u @Prolay for your response & i apologies for relationship which is not clear.. exact relationship is.. 1. 'Bundle__c'(Custom Object) 2. 'Product2'(Standard Object), i have created lookUp relationship of Bundle__c in Product2. Now, i can see Product related list under Bundle__c record and i am going to create custom Button in related list which will open up as a visualforce page with multiple product select option and that visualforce page has Add Button which will pick those all selected values and put into Product related list under Bundle__c record. Hope This is Clear Now :) – HSdev Dec 26 '16 at 9:11
  • @HSdev, I need Little changes in my code. Please specify the custom fields which are part of the Custom Object Bundle__c. It will help me to develop the correct optimized code. – Prolay Chaudhury Dec 26 '16 at 11:49
  • Thank you Prolay but i am almost close to result, if you don't mind can you please help me get record id in constructor ? – HSdev Dec 26 '16 at 11:51
  • public ProductSelectController(ApexPages.StandardController Controller){ //Your code here public Void AddProduct(ApexPages.StandardController Controller){ productlst = [SELECT ProductCode, isSelected, Name, Description FROM Product2 WHERE Product__c =: (Id)controller.getRecord().id]; – Prolay Chaudhury Dec 26 '16 at 12:04

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.