Есть кастомный объект Appointment, пишу для него кастомный контроллер. В одном из мест VF странички есть поля inputField для ввода Datetime и числа, которые потом должны пойти в новый объект. Но при попытке добавить новый объект в базу с данными из этих полей, получаю ошибку о том, что необходимые поля пустые. В чём проблема? Почему метод, добавляющий объект в базу в контроллере, не видит значения этих полей со странички? (проблема с полями Appointment_Date__c и Duration__c)
Вот код:
VF страница
<apex:page docType="html-5.0" controller="HospitalController" showHeader="false" sidebar="false">
<apex:form >
<apex:pageBlock title="Appointmets Table">
<!-- Select a doctor -->
<apex:pageBlockSection >
<apex:selectList label="Select a doctor" value="{! selectedDoctor }" size="1">
<apex:selectOptions value="{! doctors }"/>
<apex:actionSupport event="onchange"
reRender="app_list1, app_list2, app_list3"/>
</apex:selectList>
</apex:pageBlockSection>
<!-- Select a patient -->
<apex:pageBlockSection >
<apex:selectList label="Select a patient" value="{! selectedPatient }" size="1">
<apex:selectOptions value="{! patients }"/>
</apex:selectList>
</apex:pageBlockSection>
<!-- Appointment date -->
<apex:pageBlockSection >
<apex:inputField label="Appointment date"
value="{!appt.Appointment_Date__c}"
required="false"/>
</apex:pageBlockSection>
<!-- Duration -->
<apex:pageBlockSection >
<apex:inputField label="Duration in minutes"
value="{!appt.Duration__c}"
required="false"/>
</apex:pageBlockSection>
<!-- Add new appointment button -->
<apex:pageBlockSection >
<apex:commandButton immediate="false" reRender="app_list3" action="{!addNewAppt}" value="Add New Appointment" />
</apex:pageBlockSection>
<apex:pageBlockTable id="app_list3" value="{! tableAppointments }" var="apt">
<apex:column headerValue="Action">
<apex:outputLink value="{! URLFOR('/' + apt.Id)}">
View
</apex:outputLink>
</apex:column>
<apex:column headerValue="Doctor's Name" value="{! apt.Doctor__c }"/>
<apex:column headerValue="Patient's Name" value="{! apt.Patient__c }"/>
<apex:column headerValue="Appointment Date" value="{! apt.Appointment_Date__c }"/>
<apex:column headerValue="Duration in minutes" value="{! apt.Duration__c }"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
public class HospitalController {
private Appointment__c appt;
public String selectedDoctor {get; set;}
public String selectedPatient {get; set;}
public Datetime appDate {get; set;}
public Integer duration {get; set;}
public Appointment__c getAppt(){
return appt;
}
public void addNewAppt(){
Appointment__c app = new Appointment__c();
app.Appointment_Date__c = appt.Appointment_Date__c;
app.Doctor__c = selectedDoctor;
app.Duration__c = appt.Duration__c;
app.Patient__c = selectedPatient;
insert app;
}
}
Есть кастомный объект Appointment, пишу для него кастомный контроллер. В одном из мест VF странички есть поля inputField для ввода Datetime и числа, которые потом должны пойти в новый объект. Но при попытке добавить новый объект в базу с данными из этих полей, получаю ошибку о том, что необходимые поля пустые. В чём проблема? Почему метод, добавляющий объект в базу в контроллере, не видит значения этих полей со странички? (проблема с полями Appointment_Date__c и Duration__c) Вот код: VF страница [code]<apex:page docType="html-5.0" controller="HospitalController" showHeader="false" sidebar="false"> <apex:form > <apex:pageBlock title="Appointmets Table"> <!-- Select a doctor --> <apex:pageBlockSection > <apex:selectList label="Select a doctor" value="{! selectedDoctor }" size="1"> <apex:selectOptions value="{! doctors }"/> <apex:actionSupport event="onchange" reRender="app_list1, app_list2, app_list3"/> </apex:selectList> </apex:pageBlockSection> <!-- Select a patient --> <apex:pageBlockSection > <apex:selectList label="Select a patient" value="{! selectedPatient }" size="1"> <apex:selectOptions value="{! patients }"/> </apex:selectList> </apex:pageBlockSection> <!-- Appointment date --> <apex:pageBlockSection > <apex:inputField label="Appointment date" value="{!appt.Appointment_Date__c}" required="false"/> </apex:pageBlockSection> <!-- Duration --> <apex:pageBlockSection > <apex:inputField label="Duration in minutes" value="{!appt.Duration__c}" required="false"/> </apex:pageBlockSection> <!-- Add new appointment button --> <apex:pageBlockSection > <apex:commandButton immediate="false" reRender="app_list3" action="{!addNewAppt}" value="Add New Appointment" /> </apex:pageBlockSection> <apex:pageBlockTable id="app_list3" value="{! tableAppointments }" var="apt"> <apex:column headerValue="Action"> <apex:outputLink value="{! URLFOR('/' + apt.Id)}"> View </apex:outputLink> </apex:column> <apex:column headerValue="Doctor's Name" value="{! apt.Doctor__c }"/> <apex:column headerValue="Patient's Name" value="{! apt.Patient__c }"/> <apex:column headerValue="Appointment Date" value="{! apt.Appointment_Date__c }"/> <apex:column headerValue="Duration in minutes" value="{! apt.Duration__c }"/> </apex:pageBlockTable> </apex:pageBlock> </apex:form> </apex:page>[/code] Контроллер [code]public class HospitalController { private Appointment__c appt; public String selectedDoctor {get; set;} public String selectedPatient {get; set;} public Datetime appDate {get; set;} public Integer duration {get; set;} public Appointment__c getAppt(){ return appt; } public void addNewAppt(){ Appointment__c app = new Appointment__c(); app.Appointment_Date__c = appt.Appointment_Date__c; app.Doctor__c = selectedDoctor; app.Duration__c = appt.Duration__c; app.Patient__c = selectedPatient; insert app; } }[/code]
Потому что проперти appt не имеет публичного сеттера.
Замени
private Appointment__c appt;
на
public Appointment__c appt {get; set;}
Потому что проперти appt не имеет публичного сеттера. Замени private Appointment__c appt; на public Appointment__c appt {get; set;}
Вылетает ошибка "Attempt to de-reference a null object
Error is in expression '{!addNewAppt}' in component <apex:commandButton> in page hospital: Class.HospitalController.addNewAppt: line 66, column 1"
на строке
app.Duration__c = appt.Duration__c;
[quote="Rustam Muhametdinov"]Потому что проперти appt не имеет публичного сеттера. Замени private Appointment__c appt; на public Appointment__c appt {get; set;}[/quote] Вылетает ошибка "Attempt to de-reference a null object Error is in expression '{!addNewAppt}' in component <apex:commandButton> in page hospital: Class.HospitalController.addNewAppt: line 66, column 1" на строке [code] app.Duration__c = appt.Duration__c;[/code]
ну так appt надо инициализировать прежде чем использовать
как и остальные переменные класса
ну так appt надо инициализировать прежде чем использовать как и остальные переменные класса
Так разве те его поля, которые мне нужны, не инициализируются через inputField?
Вернее именно в этом и состоит мой изначальный вопрос. Почему нужные мне поля не инициализируются через inputField?
[quote="Rustam Muhametdinov"]ну так appt надо инициализировать прежде чем использовать[/quote] Так разве те его поля, которые мне нужны, не инициализируются через inputField? Вернее именно в этом и состоит мой изначальный вопрос. Почему нужные мне поля не инициализируются через inputField?
чтобы инициализировать "его" поля - нужно чтобы "он" существовал
т.е. не достаточно просто обьявить переменную - нужно присвоить ей значение
добавь конструктор в класс
присвой в нем начальные значения для своих полей класса
примерно вот так
public class HospitalController {public Appointment__c appt {get; set;}
public String selectedDoctor {get; set;}
public String selectedPatient {get; set;}
public Datetime appDate {get; set;}
public Integer duration {get; set;}public HospitalController() {
this.appt = new Appointment__c();
this.selectedDoctor = '';
this.selectedPatient = '';
this.appDate = System.now();
this.duration = 30;
}public PageReference addNewAppt() {
try {
this.appt.Doctor__c = selectedDoctor;
this.appt.Patient__c = selectedPatient;
//Duration and Appointment Date will be populated by VF page
insert this.appt;
}
catch (Exception ex) {
ApexPages.addMessages(ex);
}
return NULL;
}
}
чтобы инициализировать "его" поля - нужно чтобы "он" существовал т.е. не достаточно просто обьявить переменную - нужно присвоить ей значение добавь конструктор в класс присвой в нем начальные значения для своих полей класса примерно вот так [code]public class HospitalController { public Appointment__c appt {get; set;} public String selectedDoctor {get; set;} public String selectedPatient {get; set;} public Datetime appDate {get; set;} public Integer duration {get; set;} public HospitalController() { this.appt = new Appointment__c(); this.selectedDoctor = ''; this.selectedPatient = ''; this.appDate = System.now(); this.duration = 30; } public PageReference addNewAppt() { try { this.appt.Doctor__c = selectedDoctor; this.appt.Patient__c = selectedPatient; //Duration and Appointment Date will be populated by VF page insert this.appt; } catch (Exception ex) { ApexPages.addMessages(ex); } return NULL; } }[/code]
добавь конструктор в класс
присвой в нем начальные значения для своих полей класса
примерно вот так
public class HospitalController {public Appointment__c appt {get; set;}
public String selectedDoctor {get; set;}
public String selectedPatient {get; set;}
public Datetime appDate {get; set;}
public Integer duration {get; set;}public HospitalController() {
this.appt = new Appointment__c();
this.selectedDoctor = '';
this.selectedPatient = '';
this.appDate = System.now();
this.duration = 30;
}public PageReference addNewAppt() {
try {
this.appt.Doctor__c = selectedDoctor;
this.appt.Patient__c = selectedPatient;
//Duration and Appointment Date will be populated by VF page
insert this.appt;
}
catch (Exception ex) {
ApexPages.addMessages(ex);
}
return NULL;
}
}
[quote="Rustam Muhametdinov"]чтобы инициализировать "его" поля - нужно чтобы "он" существовал т.е. не достаточно просто обьявить переменную - нужно присвоить ей значение добавь конструктор в класс присвой в нем начальные значения для своих полей класса примерно вот так [code]public class HospitalController { public Appointment__c appt {get; set;} public String selectedDoctor {get; set;} public String selectedPatient {get; set;} public Datetime appDate {get; set;} public Integer duration {get; set;} public HospitalController() { this.appt = new Appointment__c(); this.selectedDoctor = ''; this.selectedPatient = ''; this.appDate = System.now(); this.duration = 30; } public PageReference addNewAppt() { try { this.appt.Doctor__c = selectedDoctor; this.appt.Patient__c = selectedPatient; //Duration and Appointment Date will be populated by VF page insert this.appt; } catch (Exception ex) { ApexPages.addMessages(ex); } return NULL; } }[/code][/quote] Да уж, глупая ошибка) Спасибо большое за помощь!