You need to sign in to do that
Don't have an account?
dmani
view state error with Wrapper Class
Hi everyone,
we have developed a VF page to add campaign members from one campaign to another campaign. we have designed two paegs for this. we are getting a View State error in second page since the query fetched more than 2500 records. We are facing view state error for Wrapper list namely 'camMemListFinal '
Class:
public with sharing class addCampaignmember {
transient private List<CampaignMember> camMem = new List<CampaignMember>();
transient private List<CampMembWrapper> camMemListFinal {get;set;}
Public String Currentid {get;set;}
Public String StatusId {get;set;}
Public String RadioButId {get;set;}
Public String cmdId {get;set;}
Public Set<Id> campaignMemb = new Set<Id>();
public List<Contact> conToAdd = new List<Contact>();
public List<CampaignMember> camMemToAdd = new List<CampaignMember>();
public List<CampaignMember> finalCMList = new List<CampaignMember>();
public List<CampaignMember> preExistCMList = new List<CampaignMember>();
public Set<Id> campSet = new Set<Id>();
transient private List<CampMembWrapper> camMemList = new List<CampMembWrapper>();
public Integer camsize;
//pagination
public List<CampMembWrapper> PageList = new List<CampMembWrapper>();
transient public List<CampMembWrapper> ResultList = new List<CampMembWrapper>();
private Integer pageNumber;
private Integer pageSize;
private Integer totalPageNumber;
public addCampaignmember (ApexPages.StandardController controller)
{
Currentid = ApexPages.CurrentPage().getParameters().get('CId');
preExistCMList = [Select Id, ContactId from CampaignMember where CampaignId =: Currentid];
for(Integer i=0; i<preExistCMList.size(); i++)
{
campSet.add(preExistCMList[i].ContactId);
}
camMem = [SELECT ContactId,
Contact.Name,
Contact.AccountId,
Id,Contact.Email,Contact.Phone,
Status,
CampaignId
From CampaignMember
WHERE CampaignId =:ApexPages.CurrentPage().getParameters().get('CmId')
and ContactId Not In: campSet];
cmdId = ApexPages.CurrentPage().getParameters().get('CmId');
StatusId = ApexPages.CurrentPage().getParameters().get('StId');
RadioButId = ApexPages.CurrentPage().getParameters().get('RbId');
//pagination
pageNumber = 0;
totalPageNumber = 0;
pageSize = 15;
viewData();
}
public List<CampMembWrapper> getcamMemList()
{
// List<CampMembWrapper> camMemList = new List<CampMembWrapper>();
for(CampaignMember campMemb : camMem)
{
CampMembWrapper cm = new CampMembWrapper(campMemb);
cm.Selected = true;
camMemList.add(cm);
}
camMemListFinal = camMemList;
return camMemList;
}
public pageReference addCampMembers()
{
camsize = camMemListFinal.size();
system.debug('xxxx'+camsize);*/
for(integer i=0; i<camMemListFinal.size(); i++)
{
system.debug('ggdhghushj' + camMemListFinal[i].selected);
if(camMemListFinal[i].selected == True)
{
//camMemListFinal[i].campMem.Status = StatusId;
//camMemListFinal[i].campMem.CampaignId = Currentid;
campaignMemb.add(camMemListFinal[i].campMem.ContactId);
}
}
// This part of code fetches the contact records which are in Active state
conToAdd = [Select Id, Name from Contact where Id In: campaignMemb and Active__c = true];
for(Integer i=0; i<conToAdd.size(); i++)
{
camMemToAdd.add(new CampaignMember(ContactId=conToAdd[i].Id,CampaignId=CurrentId,Status=StatusId));
}
if(CamMemToAdd != null)
{
Database.SaveResult[] SaveResult_campMember = Database.Insert(camMemToAdd);
}
if(RadioButId == 'Override the member status')
{
finalCMList = [Select Id, CampaignId, Status from CampaignMember where CampaignId =: Currentid];
for(Integer i=0; i<finalCMList.size(); i++)
{
if(finalCMList[i].Status != StatusId)
{
finalCMList[i].Status = StatusId;
}
}
update finalCMList;
}
PageReference firstPage = new PageReference('/'+Currentid);
firstPage.setRedirect(true);
return firstPage;
}
public pageReference goBack()
{
PageReference selectCampPage = new PageReference('/apex/addCampaignMembers?Id=' + CurrentId);
selectCampPage.setRedirect(true);
return selectCampPage;
}
public class CampMembWrapper
{
public CampaignMember campMem { get; set; }
public boolean Selected { get; set; }
CampMembWrapper(CampaignMember c)
{
this.campMem = c;
}
}
//Pagination
public List<CampMembWrapper> getResultList()
{
return PageList;
}
public Integer getPageNumber()
{
return pageNumber;
}
public Integer getPageSize()
{
return pageSize;
}
public Boolean getPreviousButtonEnabled()
{
return !(pageNumber > 1);
}
public Boolean getNextButtonDisabled()
{
if (ResultList == null) return true;
else
return ((pageNumber * pageSize) >= ResultList.size());
}
public Integer getTotalPageNumber()
{
system.debug('xxxYYY'+camsize);
if (totalPageNumber == 0 && ResultList !=null)
{
totalPageNumber = camMemListFinal.size() / pageSize;
Integer mod = camMemListFinal.size() - (totalPageNumber * pageSize);
if (mod > 0)
totalPageNumber++;
}
return totalPageNumber;
}
public PageReference ViewData()
{
ResultList = getcamMemList();
totalPageNumber = 0;
BindData(1);
return null;
}
public void BindData(Integer newPageIndex)
{
try
{
PageList = new List<CampMembWrapper>();
system.debug('*****************'+ ResultList);
Transient Integer counter = 0;
Transient Integer min = 0;
Transient Integer max = 0;
if (newPageIndex > pageNumber)
{
min = pageNumber * pageSize;
max = newPageIndex * pageSize;
}
else
{
max = newPageIndex * pageSize;
min = max - pageSize;
}
for(CampMembWrapper a : ResultList)
{
counter++;
if (counter > min && counter <= max)
PageList.add(a);
}
pageNumber = newPageIndex;
if (PageList == null || PageList.size() <= 0)
ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO,'Data not available for this view.'));
}
catch(Exception ex)
{
ApexPages.addmessage(new ApexPages.message(ApexPages.severity.FATAL,ex.getMessage()));
}
}
public PageReference nextBtnClick()
{
BindData(pageNumber + 1);
return null;
}
public PageReference previousBtnClick()
{
BindData(pageNumber - 1);
return null;
}
}
VF page :
<apex:page standardController="Campaign" id="addcampaign" extensions="addCampaignmember" readonly="true">
<script>
function CheckUncheckFacet(obj)
{
document.getElementById('addContact:form1:block1:listUsers:datatableId:selectall').checked = false;
if(obj.checked)
intSelectedItemsCount = intSelectedItemsCount + 1;
else
intSelectedItemsCount = intSelectedItemsCount - 1;
}
function selectChecked(form,value)
{
var i = 0;
for (i = 0; i < form.elements.length; i++) {
if (form.elements[i].name.search('selected') > 0)
(document.getElementById(form.elements[i].name)).checked = value;
/*if (form.elements[i].name.search('selected') > 0 && form.elements[i].disabled == false) {
if (form.elements[i].checked != value){
if (value)
intSelectedItemsCount = intSelectedItemsCount + 1;
else
intSelectedItemsCount = intSelectedItemsCount - 1;
}
form.elements[i].checked = value;
}*/
}
}
function selectAllOrNoneByCheckbox(form,control)
{
selectChecked(form, control.checked);
}
function closeWindow()
{
top.window.close();
parent.window.opener.location.reload();
}
function baktoCamp(campId) {
top.window.opener.location.href="/"+campId;
}
</script>
<apex:sectionHeader title="Campaign" subtitle="Add Members" />
<apex:form id="form1">
<apex:pageBlock id="pageBlock">
<apex:pageBlockSection Title="Step 2. Select Campaign Members to be Added" id="listUsers" columns="1">
<apex:PageBlockTable value="{!ResultList}" var="c" border="1" id="datatableId">
<apex:column >
<apex:facet name="header" >
<apex:inputCheckbox id="selectall" onclick="javascript:selectAllOrNoneByCheckbox(document.forms['addcampaign:form1'], this);" selected="true"/>
</apex:facet>
<apex:inputCheckbox value="{!c.selected}" onclick="javascript:CheckUncheckFacet(this)" id="selected" />
</apex:column>
<apex:column headervalue="Name" value="{!c.campMem.Contact.Name}" />
<apex:column headervalue="Account Location " value="{!c.campMem.Contact.AccountId}" />
<apex:column headervalue="Status" value="{!c.campMem.status}" />
<!-- <apex:column headervalue="Campaign" value="{!c.campMem.Campaign.Name}" />-->
<apex:column headervalue="Phone Number" value="{!c.campMem.Contact.Phone}" />
<apex:column headervalue="E-mail" value="{!c.campMem.Contact.Email}" />
</apex:PageBlockTable>
</apex:pageBlockSection>
<br/>
<div align="right">
<br/>
<font size="1pt">Page #: <apex:outputLabel value="{!PageNumber}"/> out of <apex:outputLabel value="{!totalPageNumber}"/> </font>
<apex:commandButton value="Previous" action="{!previousBtnClick}" disabled="{!previousButtonEnabled}" reRender="pageBlock"></apex:commandButton>
<apex:commandButton value="Next" action="{!nextBtnClick}" reRender="pageBlock" disabled="{!nextButtonDisabled}"></apex:commandButton>
</div>
<br/>
<br/>
<table width="500px">
<tr>
<td align="right">
<apex:commandButton value="Add Members" action="{!addCampMembers}"
onComplete="baktoCamp('{!Currentid}'); closeWindow();" />
<apex:commandButton value="Back" action="{!goBack}"/>
</td>
</tr>
</table>
</apex:pageBlock>
</apex:form>
<script>
function backToCampaign(campId)
{
top.window.opener.location.href="/"+campId;
}
</script>
</apex:page>
Could anyone suggest a solution to solve this view state issue. I have tried with Transient Keyword. But the wrapper class list gives null point exception since i am using transient .
Tried with StandardsetController to fetch the records , but Standard set controller is not supported for Campaign Members Object.
Please suggest a Solution ASAP. Any help is much appreciated.
we have developed a VF page to add campaign members from one campaign to another campaign. we have designed two paegs for this. we are getting a View State error in second page since the query fetched more than 2500 records. We are facing view state error for Wrapper list namely 'camMemListFinal '
Class:
public with sharing class addCampaignmember {
transient private List<CampaignMember> camMem = new List<CampaignMember>();
transient private List<CampMembWrapper> camMemListFinal {get;set;}
Public String Currentid {get;set;}
Public String StatusId {get;set;}
Public String RadioButId {get;set;}
Public String cmdId {get;set;}
Public Set<Id> campaignMemb = new Set<Id>();
public List<Contact> conToAdd = new List<Contact>();
public List<CampaignMember> camMemToAdd = new List<CampaignMember>();
public List<CampaignMember> finalCMList = new List<CampaignMember>();
public List<CampaignMember> preExistCMList = new List<CampaignMember>();
public Set<Id> campSet = new Set<Id>();
transient private List<CampMembWrapper> camMemList = new List<CampMembWrapper>();
public Integer camsize;
//pagination
public List<CampMembWrapper> PageList = new List<CampMembWrapper>();
transient public List<CampMembWrapper> ResultList = new List<CampMembWrapper>();
private Integer pageNumber;
private Integer pageSize;
private Integer totalPageNumber;
public addCampaignmember (ApexPages.StandardController controller)
{
Currentid = ApexPages.CurrentPage().getParameters().get('CId');
preExistCMList = [Select Id, ContactId from CampaignMember where CampaignId =: Currentid];
for(Integer i=0; i<preExistCMList.size(); i++)
{
campSet.add(preExistCMList[i].ContactId);
}
camMem = [SELECT ContactId,
Contact.Name,
Contact.AccountId,
Id,Contact.Email,Contact.Phone,
Status,
CampaignId
From CampaignMember
WHERE CampaignId =:ApexPages.CurrentPage().getParameters().get('CmId')
and ContactId Not In: campSet];
cmdId = ApexPages.CurrentPage().getParameters().get('CmId');
StatusId = ApexPages.CurrentPage().getParameters().get('StId');
RadioButId = ApexPages.CurrentPage().getParameters().get('RbId');
//pagination
pageNumber = 0;
totalPageNumber = 0;
pageSize = 15;
viewData();
}
public List<CampMembWrapper> getcamMemList()
{
// List<CampMembWrapper> camMemList = new List<CampMembWrapper>();
for(CampaignMember campMemb : camMem)
{
CampMembWrapper cm = new CampMembWrapper(campMemb);
cm.Selected = true;
camMemList.add(cm);
}
camMemListFinal = camMemList;
return camMemList;
}
public pageReference addCampMembers()
{
camsize = camMemListFinal.size();
system.debug('xxxx'+camsize);*/
for(integer i=0; i<camMemListFinal.size(); i++)
{
system.debug('ggdhghushj' + camMemListFinal[i].selected);
if(camMemListFinal[i].selected == True)
{
//camMemListFinal[i].campMem.Status = StatusId;
//camMemListFinal[i].campMem.CampaignId = Currentid;
campaignMemb.add(camMemListFinal[i].campMem.ContactId);
}
}
// This part of code fetches the contact records which are in Active state
conToAdd = [Select Id, Name from Contact where Id In: campaignMemb and Active__c = true];
for(Integer i=0; i<conToAdd.size(); i++)
{
camMemToAdd.add(new CampaignMember(ContactId=conToAdd[i].Id,CampaignId=CurrentId,Status=StatusId));
}
if(CamMemToAdd != null)
{
Database.SaveResult[] SaveResult_campMember = Database.Insert(camMemToAdd);
}
if(RadioButId == 'Override the member status')
{
finalCMList = [Select Id, CampaignId, Status from CampaignMember where CampaignId =: Currentid];
for(Integer i=0; i<finalCMList.size(); i++)
{
if(finalCMList[i].Status != StatusId)
{
finalCMList[i].Status = StatusId;
}
}
update finalCMList;
}
PageReference firstPage = new PageReference('/'+Currentid);
firstPage.setRedirect(true);
return firstPage;
}
public pageReference goBack()
{
PageReference selectCampPage = new PageReference('/apex/addCampaignMembers?Id=' + CurrentId);
selectCampPage.setRedirect(true);
return selectCampPage;
}
public class CampMembWrapper
{
public CampaignMember campMem { get; set; }
public boolean Selected { get; set; }
CampMembWrapper(CampaignMember c)
{
this.campMem = c;
}
}
//Pagination
public List<CampMembWrapper> getResultList()
{
return PageList;
}
public Integer getPageNumber()
{
return pageNumber;
}
public Integer getPageSize()
{
return pageSize;
}
public Boolean getPreviousButtonEnabled()
{
return !(pageNumber > 1);
}
public Boolean getNextButtonDisabled()
{
if (ResultList == null) return true;
else
return ((pageNumber * pageSize) >= ResultList.size());
}
public Integer getTotalPageNumber()
{
system.debug('xxxYYY'+camsize);
if (totalPageNumber == 0 && ResultList !=null)
{
totalPageNumber = camMemListFinal.size() / pageSize;
Integer mod = camMemListFinal.size() - (totalPageNumber * pageSize);
if (mod > 0)
totalPageNumber++;
}
return totalPageNumber;
}
public PageReference ViewData()
{
ResultList = getcamMemList();
totalPageNumber = 0;
BindData(1);
return null;
}
public void BindData(Integer newPageIndex)
{
try
{
PageList = new List<CampMembWrapper>();
system.debug('*****************'+ ResultList);
Transient Integer counter = 0;
Transient Integer min = 0;
Transient Integer max = 0;
if (newPageIndex > pageNumber)
{
min = pageNumber * pageSize;
max = newPageIndex * pageSize;
}
else
{
max = newPageIndex * pageSize;
min = max - pageSize;
}
for(CampMembWrapper a : ResultList)
{
counter++;
if (counter > min && counter <= max)
PageList.add(a);
}
pageNumber = newPageIndex;
if (PageList == null || PageList.size() <= 0)
ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO,'Data not available for this view.'));
}
catch(Exception ex)
{
ApexPages.addmessage(new ApexPages.message(ApexPages.severity.FATAL,ex.getMessage()));
}
}
public PageReference nextBtnClick()
{
BindData(pageNumber + 1);
return null;
}
public PageReference previousBtnClick()
{
BindData(pageNumber - 1);
return null;
}
}
VF page :
<apex:page standardController="Campaign" id="addcampaign" extensions="addCampaignmember" readonly="true">
<script>
function CheckUncheckFacet(obj)
{
document.getElementById('addContact:form1:block1:listUsers:datatableId:selectall').checked = false;
if(obj.checked)
intSelectedItemsCount = intSelectedItemsCount + 1;
else
intSelectedItemsCount = intSelectedItemsCount - 1;
}
function selectChecked(form,value)
{
var i = 0;
for (i = 0; i < form.elements.length; i++) {
if (form.elements[i].name.search('selected') > 0)
(document.getElementById(form.elements[i].name)).checked = value;
/*if (form.elements[i].name.search('selected') > 0 && form.elements[i].disabled == false) {
if (form.elements[i].checked != value){
if (value)
intSelectedItemsCount = intSelectedItemsCount + 1;
else
intSelectedItemsCount = intSelectedItemsCount - 1;
}
form.elements[i].checked = value;
}*/
}
}
function selectAllOrNoneByCheckbox(form,control)
{
selectChecked(form, control.checked);
}
function closeWindow()
{
top.window.close();
parent.window.opener.location.reload();
}
function baktoCamp(campId) {
top.window.opener.location.href="/"+campId;
}
</script>
<apex:sectionHeader title="Campaign" subtitle="Add Members" />
<apex:form id="form1">
<apex:pageBlock id="pageBlock">
<apex:pageBlockSection Title="Step 2. Select Campaign Members to be Added" id="listUsers" columns="1">
<apex:PageBlockTable value="{!ResultList}" var="c" border="1" id="datatableId">
<apex:column >
<apex:facet name="header" >
<apex:inputCheckbox id="selectall" onclick="javascript:selectAllOrNoneByCheckbox(document.forms['addcampaign:form1'], this);" selected="true"/>
</apex:facet>
<apex:inputCheckbox value="{!c.selected}" onclick="javascript:CheckUncheckFacet(this)" id="selected" />
</apex:column>
<apex:column headervalue="Name" value="{!c.campMem.Contact.Name}" />
<apex:column headervalue="Account Location " value="{!c.campMem.Contact.AccountId}" />
<apex:column headervalue="Status" value="{!c.campMem.status}" />
<!-- <apex:column headervalue="Campaign" value="{!c.campMem.Campaign.Name}" />-->
<apex:column headervalue="Phone Number" value="{!c.campMem.Contact.Phone}" />
<apex:column headervalue="E-mail" value="{!c.campMem.Contact.Email}" />
</apex:PageBlockTable>
</apex:pageBlockSection>
<br/>
<div align="right">
<br/>
<font size="1pt">Page #: <apex:outputLabel value="{!PageNumber}"/> out of <apex:outputLabel value="{!totalPageNumber}"/> </font>
<apex:commandButton value="Previous" action="{!previousBtnClick}" disabled="{!previousButtonEnabled}" reRender="pageBlock"></apex:commandButton>
<apex:commandButton value="Next" action="{!nextBtnClick}" reRender="pageBlock" disabled="{!nextButtonDisabled}"></apex:commandButton>
</div>
<br/>
<br/>
<table width="500px">
<tr>
<td align="right">
<apex:commandButton value="Add Members" action="{!addCampMembers}"
onComplete="baktoCamp('{!Currentid}'); closeWindow();" />
<apex:commandButton value="Back" action="{!goBack}"/>
</td>
</tr>
</table>
</apex:pageBlock>
</apex:form>
<script>
function backToCampaign(campId)
{
top.window.opener.location.href="/"+campId;
}
</script>
</apex:page>
Could anyone suggest a solution to solve this view state issue. I have tried with Transient Keyword. But the wrapper class list gives null point exception since i am using transient .
Tried with StandardsetController to fetch the records , but Standard set controller is not supported for Campaign Members Object.
Please suggest a Solution ASAP. Any help is much appreciated.
https://developer.salesforce.com/forums/ForumsMain?id=906F000000099GbIAI
http://salesforce.stackexchange.com/questions/4537/how-to-reduce-a-large-internal-view-state-what-is-in-the-internal-view-state