You need to sign in to do that
Don't have an account?
Pageblocktable + Inputfield + Save = not saving.
Hi guys,
I've searched high and low for some info on what I've done wrong and can't work it out.
I basically want to return a list of Prestart_Checklist__c that fall within a given date range and location - this works.
Then for each item in the list, I want to present a text box so that a user can update the name of the record. This displays correctly and retrieves the existing data - but the save button seems ineffectual. If I change any values in the inputfields and click save, the page refreshes, but no data is saved.
I know I'm missing something simple, but I've wasted too much time on this one to keep hacking away at it, so any suggestions are very welcome.
Page:
<apex:page action="{!initPage}" standardController="Prestart_Checklist__c" extensions="PSCLEditExtension" > <apex:form > <apex:pageBlock title="Filter results" > <apex:pageBlockButtons location="bottom" > <apex:commandButton value="Go" reRender="dataTable" /> </apex:pageBlockButtons> <apex:pageBlockSection columns="1"> <apex:inputField value="{!plantForLocation.Location__c}" /> <apex:inputField value="{!psclForDate.Week_Ending__c}" /> </apex:pageBlockSection> </apex:pageBlock> </apex:form> <apex:form > <apex:pageBlock title="Prestart Checklists" > <apex:pageBlockButtons location="bottom" > <apex:commandButton value="Save" action="{!save}" /> </apex:pageBlockButtons> <apex:pageBlockTable id="dataTable" value="{!thisWeeksPSCLs}" var="pscl"> <apex:column headerValue="Plant Name"> <apex:outputText value="{!pscl.Plant__r.Name}" /></apex:column> <apex:column headerValue="Plant Registration"> <apex:outputText value="{!pscl.Plant__r.Registration_Number__c}" /></apex:column> <apex:column headerValue="Prestart Checklist Number"><apex:inputField value="{!pscl.Name}" /></apex:column> </apex:pageBlockTable> </apex:pageBlock> </apex:form> </apex:page>
Controller:
public with sharing class PSCLEditExtension { public Prestart_Checklist__c psclForDate{get; set;} public Plant__c plantForLocation{get; set;} public List<Plant__c> listPlant { get { return [select Id, Name from Plant__c]; } } public List<Prestart_Checklist__c> listPSCL{get; set;} public List<Prestart_Checklist__c> thisWeeksPSCLs{ get { return [select Id, Name, Plant__r.Name, Plant__r.Registration_Number__c from Prestart_Checklist__c where Week_Ending__c = :psclForDate.Week_Ending__c and Plant__r.Location__c = :plantForLocation.Location__c];
} } } public PSCLEditExtension(ApexPages.StandardController controller) { psclForDate = new Prestart_Checklist__c(Week_Ending__c = Date.today().toStartOfWeek()); plantForLocation = new Plant__c(); } public void initPage() { } }
I see it as an issue with your get...when you reference the list it is requeried. Which is why I proposed that you restructure it. The reason ne data is being passed is because of the requery. So you will need to restructure the code. Add actionsupport to the field you are using to filter the table and have it fire the qery to populate the list with the newly selected value and then rerender the table.
All Answers
You are using the Standard Controller save and editing a custom list. Create a save method for your custom list.
public PageReference saveList(){
update thisWeeksPSCLs;
return null; //or some page you want it to go to
}
Then in your page change the Save commandbuttons action to this new method.
Haha, that's exactly what I had before and it wasn't working either. I've just tried it again and still no luck. Although, I think I just had a brain wave, am I supposed to be using the StandardSetController in this instance? Even if that's the case, I'm not sure why the custom save wouldn't work...
Add a try catch statement and <apex:pageMessages/> to your page.
public PageReference saveList(){
try{
update thisWeeksPSCLs;
}
catch(DMLException e){
ApexPages.addMessage(new ApexPages.message(ApexPages.severity.FATAL, 'DML Error:' + e));
}
return null;
}
Then in your Visualforce page add under the page tag
<apex:pageMessages/>
Nope, no errors, and no saved data.
Ok, it actually is saving the records (Last Updated field is updating on the save), but it isn't using the data from the table to do so. I'm stumped.
Your get set is the issue
In the get...you need to do the following with your get.
Really appreciate your perseverance on this, but I have tried that one before too. Just added it back in, but still no luck.
I would restructure the code like this...
That won't work because the getter returns void which will kill my pageblocktable. Tested it out of interest and that's exactly what happened. Thanks for the ideas so far though :)
I took a look at your code. So basically you are attempting to filter the results of the pageblocktable by the options selected in the upper form. Well you will need to have an actionmethod to rerender the pageblocktable based on the selected value...have the query grab the correct values and populate the table...edit the fields... and then update. Is this about right?
Exactly; and everything works except for the update (which half works).
I didn't see this but you have omitted set...which is needed to pass variables back to the controller...have you tried including set; follwoing your get block? All of this is in regards to your thisWeeksPSCLs variable.
Yeah, I thought that might be the problem, but I couldn't figure out what syntax to use in the set method. Adding in a default set; doesn't have an effect.
I see it as an issue with your get...when you reference the list it is requeried. Which is why I proposed that you restructure it. The reason ne data is being passed is because of the requery. So you will need to restructure the code. Add actionsupport to the field you are using to filter the table and have it fire the qery to populate the list with the newly selected value and then rerender the table.
You're absolutely correct and thanks for sticking it out. The only thing I missed from your suggestion earlier was to add the action to the filter commandbutton.
For anyone finding this in the future, here's what it looks like:
Page:
Controller: