You need to sign in to do that
Don't have an account?
VisualForce controller problem - Index out of bounds
I am having a small issue with a controller I am trying to
build. I was hoping I can run the issue by the board to see if anyone had any
insight to the issue.
I have a VisualForce page that loads some
records into a sortable table. The sort functionality s provided by a
class called superSort(from a SFDC example posting located at
http://wiki.developerforce.com/index.php/Sorting_Tables). I am able to
successfully use it for the first time the page loads without a problem.
Also on the page I have some fields that the user can set to pass
parameters to the same query. I am running into issues with calling the
supersort class a second time from my controller via a command button.
There is an issue with my list and I am getting "Index out of bounds"
errors when calling the super sort method. So the method works fine for
my first list when the page is loded, just not the second one when I send in another request with the new parameters for the query and want the page refresed. I get the errors when I try to
set the initial List to null.
Pasting my controller and VF code below.
Thanks
Dodi
Controller :
public class SalesAndForecastSort {
public List<Sales_Forecasts__c> sf;
public String sortField {get; set;}
public String previousSortField {get; set;}
public String sfRecordType {get; set;}
public Id sfAccount {get; set;}
public Id rt {get; set;}
public Id rtInvoicesSales {get; set;}
public Id rtOpenOrders {get; set;}
public Id rtEvergreen {get; set;}
public Id Salesforecast {get; set;}
public String selectedRecordType {get; set;}
public String selectedAccountingMonth {get; set;}
public String accountingMonth {get; set;}
public String getSelectedAccountingMonth() {
return selectedAccountingMonth;
}
public String getSelectedRecordType() {
return selectedRecordType;
}
/*
public void setSelectedRecordType(Id selectedRecordType) {
this.selectedRecordType = selectedRecordType;
}
public void setSelectedAccountingMonth(String selectedAccountingMonth) {
this.selectedAccountingMonth = selectedAccountingMonth;
}
*/
public List<SelectOption> getRtOptions() {
List<SelectOption> rtOptions = new List<SelectOption>();
rtOptions.add(new SelectOption('NA','--'));
rtOptions.add(new SelectOption('Invoiced','Invoiced'));
rtOptions.add(new SelectOption('Open','Open'));
rtOptions.add(new SelectOption('Evergreen','Evergreen'));
rtOptions.add(new SelectOption('Salesforecast','Salesforecast'));
return rtOptions;
}
public List<SelectOption> getAccountingMonths() {
List<SelectOption> accountingMonths = new List<SelectOption>();
accountingMonths.add(new SelectOption('NA','--'));
accountingMonths.add(new SelectOption('January','January'));
accountingMonths.add(new SelectOption('February','February'));
accountingMonths.add(new SelectOption('March','March'));
accountingMonths.add(new SelectOption('April','April'));
accountingMonths.add(new SelectOption('May','May'));
accountingMonths.add(new SelectOption('June','June'));
accountingMonths.add(new SelectOption('July','July'));
accountingMonths.add(new SelectOption('August','August'));
accountingMonths.add(new SelectOption('September','September'));
accountingMonths.add(new SelectOption('October','October'));
accountingMonths.add(new SelectOption('November','November'));
accountingMonths.add(new SelectOption('December','December'));
return accountingMonths;
}
public List<Sales_Forecasts__c> getSF() {
//get params from URL string
sfRecordType = ApexPages.currentPage().getParameters().get('sfRecordType');
sfAccount = ApexPages.currentPage().getParameters().get('sfAccount');
//Set up maps to hold the Record Type IDs and the literal values associated
Map<String, Id> sfRecordTypeMap = new Map <String,Id>();
//insert record ids into map
for (RecordType asfRecordType : [SELECT Id, Name FROM
RecordType WHERE IsActive = TRUE AND SobjectType = 'Sales_Forecasts__c'
LIMIT 1000] ) {
sfRecordTypeMap.put(asfRecordType.Name, asfRecordType.Id);
}
//associate record type values to appropriate record types to be used in query
if (sfRecordType.equals('Invoiced')) {
rt = sfRecordTypeMap.get('Invoiced Sales');
}
if (sfRecordType.equals('Open')) {
rt = sfRecordTypeMap.get('Open Orders');
}
if (sfRecordType.equals('Evergreen')) {
rtInvoicesSales = sfRecordTypeMap.get('Evergreen');
}
if (sfRecordType.equals('SalesForecast')) {
rtInvoicesSales = sfRecordTypeMap.get('Sales Forecast');
}
if(sf == null){
sf = [Select Product2__c, Net_Proceeds_USD__c,
Net_Proceeds_LC__c, Net_Proceeds_FC__c, Account__c From
Sales_Forecasts__c Where Account__c = :sfAccount AND RecordTypeId =
:rt];
}
return sf;
}
//public List<Sales_Forecasts__c> getUserDefinedSF(String accountingMonth, String sfRecordType) {
public List<Sales_Forecasts__c> getUserDefinedSF(String sfRecordType) {
//sf.clear();
//Set up maps to hold the Record Type IDs and the literal values associated
Map<String, Id> sfRecordTypeMap = new Map <String,Id>();
//insert record ids into map
for (RecordType asfRecordType : [SELECT Id, Name FROM
RecordType WHERE IsActive = TRUE AND SobjectType = 'Sales_Forecasts__c'
LIMIT 1000] ) {
sfRecordTypeMap.put(asfRecordType.Name, asfRecordType.Id);
}
//associate record type values to appropriate record types to be used in query
if (sfRecordType.equals('Invoiced')) {
rt = sfRecordTypeMap.get('Invoiced Sales');
}
if (sfRecordType.equals('Open')) {
rt = sfRecordTypeMap.get('Open Orders');
}
if (sfRecordType.equals('Evergreen')) {
rtInvoicesSales = sfRecordTypeMap.get('Evergreen');
}
if (sfRecordType.equals('SalesForecast')) {
rtInvoicesSales = sfRecordTypeMap.get('Sales Forecast');
}
///issue is here, value has to be null...but when clearing the list...out of bound exceptions occur
if(sf == null){
//sf = [Select Product2__c, Net_Proceeds_USD__c,
Net_Proceeds_LC__c, Net_Proceeds_FC__c, Account__c From
Sales_Forecasts__c Where Account__c = :sfAccount AND RecordTypeId =
:rt];
//sf = [Select Product2__c, Net_Proceeds_USD__c,
Net_Proceeds_LC__c, Net_Proceeds_FC__c, Account__c From
Sales_Forecasts__c Where RecordTypeId = :rt];
sf = [Select Product2__c, Net_Proceeds_USD__c,
Net_Proceeds_LC__c, Net_Proceeds_FC__c, Account__c From
Sales_Forecasts__c];
}
else {
Account a = new Account(Name='VisualForce2', End_Use__c='Nexar', Ship_Account_Region__c='JAPAN');
Insert a;
}
return sf;
}
public PageReference page_search() {
//get user selected record type
sfRecordType = selectedRecordType;
//get user selected accounting Month
accountingMonth = selectedAccountingMonth;
//getUserDefinedSF(accountingMonth, sfRecordType);
getUserDefinedSF(sfRecordType);
//getSF();
sortField = 'Product2__c';
doSort();
return null;
}
public void doSort(){
String order = 'asc';
//This checks to see if the same header was click two times in a row, if so it switches the order.
if(previousSortField == sortField){
order = 'desc';
previousSortField = null;
}else{
previousSortField = sortField;
}
//To sort the table we simply need to use this one line, nice!
superSort.sortList(sf,sortField,order);
}
}
VP Page in next posting
VF Page >>>>>
<apex:page controller="SalesAndForecastSort">
<apex:form >
<apex:pageblock title="Sales & Forecast Filter Criterea" id="theBlock">
<apex:outputtext value="Which filter critera would you like to apply to the Sales and Forecasts record results?"/><BR></BR><BR><b>Type</b> <b>Accounting Month</b></BR><BR></BR>
<apex:selectList value="{!selectedRecordType}" size="1" title="Type" >
<apex:selectOptions value="{!rtOptions}"/>
</apex:selectList>
<apex:selectList value="{!selectedAccountingMonth}" size="1" title="Accounting Month" >
<apex:selectOptions value="{!accountingMonths}"/>
</apex:selectList><p/>
<apex:commandButton value="Search" action="{!page_search}" rerender="table"/>
</apex:pageBlock>
<apex:outputPanel id="table">
<apex:actionstatus id="status" startText="testing...">
<apex:facet name="stop">
<apex:outputPanel >
<p>You have selected:</p>
<apex:dataList value="{!selectedRecordType}" var="c">{!c}</apex:dataList>
<apex:dataList value="{!selectedAccountingMonth}" var="c">{!c}</apex:dataList>
</apex:outputPanel>
</apex:facet>
</apex:actionstatus>
</apex:outputPanel>
<apex:pageBlock title="Results" >
<apex:pageBlockTable value="{!sf}" var="o" id="table">
<apex:column >
<apex:facet name="header">
<apex:commandLink value="{!$ObjectType.Sales_Forecasts__c.Fields.Product2__c.Label}" action="{!doSort}" rerender="table">
<apex:param name="sortField" value="Product2__c" assignTo="{!sortField}"/>
</apex:commandLink>
</apex:facet>
<apex:outputField value="{!o.Product2__c}"/>
</apex:column>
<apex:column >
<apex:facet name="header">
<apex:commandLink value="{!$ObjectType.Sales_Forecasts__c.Fields.Net_Proceeds_USD__c.Label}" action="{!doSort}" rerender="table">
<apex:param name="sortField" value="Net_Proceeds_USD__c" assignTo="{!sortField}"/>
</apex:commandLink>
</apex:facet>
<apex:outputField value="{!o.Net_Proceeds_USD__c}"/>
</apex:column>
<apex:column >
<apex:facet name="header">
<apex:commandLink value="{!$ObjectType.Sales_Forecasts__c.Fields.Net_Proceeds_LC__c.Label}" action="{!doSort}" rerender="table">
<apex:param name="sortField" value="Net_Proceeds_LC__c" assignTo="{!sortField}"/>
</apex:commandLink>
</apex:facet>
<apex:outputField value="{!o.Net_Proceeds_LC__c}"/>
</apex:column>
<apex:column >
<apex:facet name="header">
<apex:commandLink value="{!$ObjectType.Sales_Forecasts__c.Fields.Net_Proceeds_FC__c.Label}" action="{!doSort}" rerender="table">
<apex:param name="sortField" value="Net_Proceeds_FC__c" assignTo="{!sortField}"/>
</apex:commandLink>
</apex:facet>
<apex:outputField value="{!o.Net_Proceeds_FC__c}"/>
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>