Регистрация  |  Вход

Трудности с inputField

Есть кастомный объект 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;}

Rustam Muhametdinov
Потому что проперти 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 надо инициализировать прежде чем использовать
как и остальные переменные класса


Rustam Muhametdinov
ну так 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]

Rustam Muhametdinov
чтобы инициализировать "его" поля - нужно чтобы "он" существовал
т.е. не достаточно просто обьявить переменную - нужно присвоить ей значение


добавь конструктор в класс
присвой в нем начальные значения для своих полей класса
примерно вот так

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]
Да уж, глупая ошибка) Спасибо большое за помощь!