You need to sign in to do that
Don't have an account?
Suchismita Mukherjee 7
Advance apex specialist challenge 3
I got stucked in challenge 3 getting below error.
Challenge Not yet complete... here's what's wrong:
Ensure that the save method inserts only Products and Pricebooks for rows that have all fields populated.
tried all possible ways but no hope.. :(
...............................Pelase help......
my code:
Product2Extension>>>>>>>>>>>>>>>>>>>>>
public class Product2Extension {
public List<ProductWrapper> productsToInsert {get;set;}
public Product2Extension(ApexPages.StandardController controller){
productsToInsert = new List<ProductWrapper>();
addRows();
}
public List<SelectOption> GetFamilyOptions() {
List<SelectOption> options = new List<SelectOption>();
options.add(new SelectOption(Constants.SELECT_ONE, Constants.SELECT_ONE));
for(PickListEntry eachPicklistValue : Constants.PRODUCT_FAMILY) {
options.add(new SelectOption(eachPicklistValue.getValue(), eachPicklistValue.getLabel()));
}
return options;
}
public void AddRows(){
for (Integer i=0; i<Constants.DEFAULT_ROWS; i++ ){
productsToInsert.add(new ProductWrapper());
}
}
public List<ChartHelper.ChartData> GetInventory(){
return ChartHelper.GetInventory();
}
public PageReference Save(){
SavePoint sp = Database.setSavepoint();
Integer insertedCount = 0;
try {
list<product2> newProducts = new list<product2>();
list<PriceBookEntry> newPBEntries = new list<PriceBookEntry>();
for(ProductWrapper eachPW : productsToInsert) {
if(eachPW.productRecord.Name != null && eachPW.productRecord.Family != null && constants.SELECT_ONE != eachPW.productRecord.Family && eachPW.productRecord.Initial_Inventory__c != null && eachPW.pricebookEntryRecord.UnitPrice != null) {
newProducts.add(eachPW.productRecord);
eachPW.pricebookEntryRecord.IsActive = true;
eachPW.pricebookEntryRecord.Pricebook2Id = Constants.STANDARD_PRICEBOOK_ID;
newPBEntries.add(eachPW.pricebookEntryRecord);
}
}
insert newProducts;
insert newPBEntries;
//If successful clear the list and display an informational message
apexPages.addMessage(new ApexPages.message(ApexPages.Severity.INFO,insertedCount + ' Inserted'));
productsToInsert.clear(); //Do not remove
addRows(); //Do not remove
}
catch (Exception e){
System.debug('Exception occured:'+e.getMessage());
Database.rollback(sp);
apexPages.addMessage(new ApexPages.message(ApexPages.Severity.ERROR, Constants.ERROR_MESSAGE));
}
return null;
}
public class ProductWrapper {
public Product2 productRecord {get;set;}
public PriceBookEntry pricebookEntryRecord {get;set;}
public ProductWrapper() {
productRecord = new Product2();
pricebookEntryRecord = new PricebookEntry();
}
}
}
Product2New vf >>>>>>>>>>>>>>>>>>>>>
<apex:page standardcontroller="Product2" extensions="Product2Extension">
<apex:sectionHeader title="New Product" subtitle="Add Inventory" />
<apex:pageMessages id="pageMessages" />
<apex:form id="form" >
<apex:actionRegion >
<apex:pageBlock title="Existing Inventory" id="existingInv">
<apex:chart data="{!Inventory}" width="600" height="400">
<apex:axis type="Category" fields="name" position="left" title="Product Family"/>
<apex:axis type="Numeric" fields="val" position="bottom" title="Quantity Remaining"/>
<apex:barSeries axis="bottom" orientation="horizontal" xField="val" yField="name"/>
</apex:chart>
</apex:pageBlock>
<apex:pageBlock title="New Products" >
<apex:pageBlockButtons location="top">
<apex:commandButton action="{!save}" value="Save" reRender="existingInv, orderItemTable, pageMessages"/>
</apex:pageBlockButtons>
<apex:pageBlockButtons location="bottom">
<apex:commandButton action="{!addRows}" value="Add" reRender="orderItemTable, pageMessages" />
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!productsToInsert}" var="p" id="orderItemTable" >
<apex:column headerValue="{!$ObjectType.Product2.Fields.Name.Label}" >
<apex:inputText value="{!p.productRecord.Name}" />
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.Fields.Family.Label}" >
<apex:selectList value="{!p.productRecord.Family}" size="1" multiselect="false">
<apex:selectOptions value="{!FamilyOptions}"></apex:selectOptions>
</apex:selectList>
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.Fields.IsActive.Label}" >
<apex:inputField value="{!p.productRecord.isActive}" />
</apex:column>
<apex:column headerValue="{!$ObjectType.PricebookEntry.Fields.UnitPrice.Label}" >
<apex:inputText value="{!p.pricebookEntryRecord.UnitPrice}" />
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.Fields.Initial_Inventory__c.Label}" >
<apex:inputField value="{!p.productRecord.Initial_Inventory__c}" />
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:actionRegion>
</apex:form>
</apex:page>
ChartHelper class>>>>>>>>>>>>>>>>>>>>>>>>
public without sharing class ChartHelper {
@AuraEnabled
public static List<chartData> GetInventory(){
List<chartData> cht = new List<chartData>();
for(AggregateResult ar : [SELECT Family, SUM(Quantity_Remaining__c) FROM Product2 WHERE Quantity_Remaining__c > 0 AND IsActive = true GROUP BY Family]) {
cht.add(new ChartData(String.ValueOf(ar.get('Family')), Integer.ValueOf(ar.get('expr0'))));
}
return cht;
}
public class ChartData {
public String name {get; set;}
public Decimal val {get; set;}
public ChartData(String name, Decimal val){
this.name = name;
this.val = val;
}
}
}
Challenge Not yet complete... here's what's wrong:
Ensure that the save method inserts only Products and Pricebooks for rows that have all fields populated.
tried all possible ways but no hope.. :(
...............................Pelase help......
my code:
Product2Extension>>>>>>>>>>>>>>>>>>>>>
public class Product2Extension {
public List<ProductWrapper> productsToInsert {get;set;}
public Product2Extension(ApexPages.StandardController controller){
productsToInsert = new List<ProductWrapper>();
addRows();
}
public List<SelectOption> GetFamilyOptions() {
List<SelectOption> options = new List<SelectOption>();
options.add(new SelectOption(Constants.SELECT_ONE, Constants.SELECT_ONE));
for(PickListEntry eachPicklistValue : Constants.PRODUCT_FAMILY) {
options.add(new SelectOption(eachPicklistValue.getValue(), eachPicklistValue.getLabel()));
}
return options;
}
public void AddRows(){
for (Integer i=0; i<Constants.DEFAULT_ROWS; i++ ){
productsToInsert.add(new ProductWrapper());
}
}
public List<ChartHelper.ChartData> GetInventory(){
return ChartHelper.GetInventory();
}
public PageReference Save(){
SavePoint sp = Database.setSavepoint();
Integer insertedCount = 0;
try {
list<product2> newProducts = new list<product2>();
list<PriceBookEntry> newPBEntries = new list<PriceBookEntry>();
for(ProductWrapper eachPW : productsToInsert) {
if(eachPW.productRecord.Name != null && eachPW.productRecord.Family != null && constants.SELECT_ONE != eachPW.productRecord.Family && eachPW.productRecord.Initial_Inventory__c != null && eachPW.pricebookEntryRecord.UnitPrice != null) {
newProducts.add(eachPW.productRecord);
eachPW.pricebookEntryRecord.IsActive = true;
eachPW.pricebookEntryRecord.Pricebook2Id = Constants.STANDARD_PRICEBOOK_ID;
newPBEntries.add(eachPW.pricebookEntryRecord);
}
}
insert newProducts;
insert newPBEntries;
//If successful clear the list and display an informational message
apexPages.addMessage(new ApexPages.message(ApexPages.Severity.INFO,insertedCount + ' Inserted'));
productsToInsert.clear(); //Do not remove
addRows(); //Do not remove
}
catch (Exception e){
System.debug('Exception occured:'+e.getMessage());
Database.rollback(sp);
apexPages.addMessage(new ApexPages.message(ApexPages.Severity.ERROR, Constants.ERROR_MESSAGE));
}
return null;
}
public class ProductWrapper {
public Product2 productRecord {get;set;}
public PriceBookEntry pricebookEntryRecord {get;set;}
public ProductWrapper() {
productRecord = new Product2();
pricebookEntryRecord = new PricebookEntry();
}
}
}
Product2New vf >>>>>>>>>>>>>>>>>>>>>
<apex:page standardcontroller="Product2" extensions="Product2Extension">
<apex:sectionHeader title="New Product" subtitle="Add Inventory" />
<apex:pageMessages id="pageMessages" />
<apex:form id="form" >
<apex:actionRegion >
<apex:pageBlock title="Existing Inventory" id="existingInv">
<apex:chart data="{!Inventory}" width="600" height="400">
<apex:axis type="Category" fields="name" position="left" title="Product Family"/>
<apex:axis type="Numeric" fields="val" position="bottom" title="Quantity Remaining"/>
<apex:barSeries axis="bottom" orientation="horizontal" xField="val" yField="name"/>
</apex:chart>
</apex:pageBlock>
<apex:pageBlock title="New Products" >
<apex:pageBlockButtons location="top">
<apex:commandButton action="{!save}" value="Save" reRender="existingInv, orderItemTable, pageMessages"/>
</apex:pageBlockButtons>
<apex:pageBlockButtons location="bottom">
<apex:commandButton action="{!addRows}" value="Add" reRender="orderItemTable, pageMessages" />
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!productsToInsert}" var="p" id="orderItemTable" >
<apex:column headerValue="{!$ObjectType.Product2.Fields.Name.Label}" >
<apex:inputText value="{!p.productRecord.Name}" />
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.Fields.Family.Label}" >
<apex:selectList value="{!p.productRecord.Family}" size="1" multiselect="false">
<apex:selectOptions value="{!FamilyOptions}"></apex:selectOptions>
</apex:selectList>
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.Fields.IsActive.Label}" >
<apex:inputField value="{!p.productRecord.isActive}" />
</apex:column>
<apex:column headerValue="{!$ObjectType.PricebookEntry.Fields.UnitPrice.Label}" >
<apex:inputText value="{!p.pricebookEntryRecord.UnitPrice}" />
</apex:column>
<apex:column headerValue="{!$ObjectType.Product2.Fields.Initial_Inventory__c.Label}" >
<apex:inputField value="{!p.productRecord.Initial_Inventory__c}" />
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:actionRegion>
</apex:form>
</apex:page>
ChartHelper class>>>>>>>>>>>>>>>>>>>>>>>>
public without sharing class ChartHelper {
@AuraEnabled
public static List<chartData> GetInventory(){
List<chartData> cht = new List<chartData>();
for(AggregateResult ar : [SELECT Family, SUM(Quantity_Remaining__c) FROM Product2 WHERE Quantity_Remaining__c > 0 AND IsActive = true GROUP BY Family]) {
cht.add(new ChartData(String.ValueOf(ar.get('Family')), Integer.ValueOf(ar.get('expr0'))));
}
return cht;
}
public class ChartData {
public String name {get; set;}
public Decimal val {get; set;}
public ChartData(String name, Decimal val){
this.name = name;
this.val = val;
}
}
}
Trailhead Help (https://trailhead.salesforce.com/en/help?support=home)can provide assistance for situations where Trailhead does not appear to be functioning correctly. You can reach out to them if this is the case.
Please close the thread by selected as Best Answer so that we can keep our community clean
Thanks,