Hallo,
ich habe hier ein Problem, dass ich bisher mit normalen Bordmitteln von Primefaces 4 nicht habe lösen können. Ich möchte kurz die Situation erklären und dann zu dem eigentlchen Problem kommen.
Zuersteinmal habe ich eine Klasse Kunde und eine Klasse Vertrag. Ein Kunde kann mehrere Verträge besitzen (1:n Beziehung). Um einen Kunden neu anzulegen habe ich mich für den Wizard von Primefaces entschieden. Neben den Vetragsdaten gibts noch weitere Attribute, welche hier aber nicht weiter betrachtet werden müssen. Initial bekommt jedes Kunde-Objekt ein Vertragsobjekt in seine Liste von Verträgen zugewiesen. Diese haben ja bekanntlich noch keine ID (hier ist die DB-ID und nicht die Objekt-ID gemeint).
Im Tab des Wizards bezüglich der Vertragsdaten sind nun alle Felder des Formularteils an das Vertragsobjeckt 1 der Vertragsliste des Kundenobjekts gebunden. Falls man weitere Verträge dem Kunden hinzufügen möchte (ganz wichtig schon bei der Erstellung des Kunden) habe ich mir überlegt hierfür ein Drop-Down Menu (SelectOneMenu) nebst einem NEU-Button anzubieten. In dem Drop-Down Menu werden die bereits vorhanden Veträge mit ihrer Vertragsnummer angezeigt (Zu Begin ist hier nur ein Eintrag enthalten) Über den Button soll dann serverseitig ein neues Vertragsobjekt erzeugt und der Liste beim Kundeobjekt hinzugefügt werden und in der Managed-Bean die Variable currentCustomerAgreement mit dem neuen Vetragsobjekt belegt werden. Danach wird das Gridpanel für die Vetragsdaten neu geladen (update). Soweit funktiniert das auch und das Drop-Down-Menü zeigt dann auch auf die neue Vertragsnummer. Per onChangeEvent (<p:ajax event="change") will ich es ermöhlichen zwischen den Veträgen hin und her zu springen um nochmals Änderungen durchzuführen. Dafür müsen dann die Felder des Formulars jedes mal an das neue Vetragsobjekt gebunden werden. Das onChangeEvent feuert nur wenn auch eine tatsächliche Änderung der Drop-Down Liste vorliegt. Das wird dummerweise anhand der DB-ID des Objekt evaluiert. Deshalb habe ich initial eine Random ID erzeugt.
Doch überschreibt mir JSF bei der Serverseitigen Eventverarbeitung Das erste Vertragsobjekt mit den Daten des neuen oder umgekehrt. Je nachdem von welchem Eintrag des Drop-Down-Menus ich ausgehe. Das ist natürlich doof, da ich so niemals die Daten von zwei oder mehr Verträgen gleichzeitig pflegen kann.
Die Rheinfolge ist also:
1) Felder füllen (Vertrag 1)
2) Neuen Vertrag hinzufügen
2.1) onChangeNewCustomerAgreement() (Warum auch immer, aber nun gut)
2.2) setField von Vertrag 1
2.3) addNewCustomerAgreement()
3) Felder füllen von Vertrag 2
4) Select Vertrag 1
4.1) onChangeNewCustomerAgreement()
4.2) setField von Vertrag 1 (Hier liegt das Problem, das Object sollte eigentlich Vertrag 2 sein)
Ich habe auch schon mit dem Parameter immediate="true" herumgespielt. Das hat aber auch nicht den gewünschten Effekt erziehlt. Ich bin jetzt etwas ratlos.
Hier noch ein bisschen Code:
[XML]
<p:row>
<p:column>
<h
utputText value="Vertragsende: " />
</p:column>
<p:column>
<p:calendar tabindex="3"
value="#{customerPM.currentCustomerAgreement.agreementEndDate}"
id="newCustomerAgreementEnd" showOn="both" mode="popup"
showButtonPanel="false" navigator="true"
pattern="dd. MMMM yyyy" converterMessage="Falsches Format!"
style="width: 260px; margin-right: 50px;" locale="de"
converter="DateConverter" />
<p:message for="newCustomerAgreementEnd" display="tooltip" />
</p:column>
<p:column id="newCustomerPowerSystemInstalledDateLabel">
<h
utputText value="Produktionsbegin: " />
<h
utputText style="color: red;" value="*" />
</p:column>
<p:column id="newCustomerPowerSystemInstalledDateContent">
<p:calendar tabindex="7"
value="#{customerPM.currentCustomerAgreement.powerSystem.installedDate}"
id="newCustomerPowerSystemInstalledDate" showOn="both"
mode="popup" showButtonPanel="false" navigator="true"
required="true"
requiredMessage="Kein Produktionsbegin angegeben!"
pattern="dd. MMMM yyyy" converterMessage="Falsches Format!"
style="width: 260px; margin-right: 50px;" locale="de"
converter="DateConverter" />
<p:message for="newCustomerPowerSystemInstalledDate"
display="both" />
</p:column>
</p:row>
[/XML]
ich habe hier ein Problem, dass ich bisher mit normalen Bordmitteln von Primefaces 4 nicht habe lösen können. Ich möchte kurz die Situation erklären und dann zu dem eigentlchen Problem kommen.
Zuersteinmal habe ich eine Klasse Kunde und eine Klasse Vertrag. Ein Kunde kann mehrere Verträge besitzen (1:n Beziehung). Um einen Kunden neu anzulegen habe ich mich für den Wizard von Primefaces entschieden. Neben den Vetragsdaten gibts noch weitere Attribute, welche hier aber nicht weiter betrachtet werden müssen. Initial bekommt jedes Kunde-Objekt ein Vertragsobjekt in seine Liste von Verträgen zugewiesen. Diese haben ja bekanntlich noch keine ID (hier ist die DB-ID und nicht die Objekt-ID gemeint).
Im Tab des Wizards bezüglich der Vertragsdaten sind nun alle Felder des Formularteils an das Vertragsobjeckt 1 der Vertragsliste des Kundenobjekts gebunden. Falls man weitere Verträge dem Kunden hinzufügen möchte (ganz wichtig schon bei der Erstellung des Kunden) habe ich mir überlegt hierfür ein Drop-Down Menu (SelectOneMenu) nebst einem NEU-Button anzubieten. In dem Drop-Down Menu werden die bereits vorhanden Veträge mit ihrer Vertragsnummer angezeigt (Zu Begin ist hier nur ein Eintrag enthalten) Über den Button soll dann serverseitig ein neues Vertragsobjekt erzeugt und der Liste beim Kundeobjekt hinzugefügt werden und in der Managed-Bean die Variable currentCustomerAgreement mit dem neuen Vetragsobjekt belegt werden. Danach wird das Gridpanel für die Vetragsdaten neu geladen (update). Soweit funktiniert das auch und das Drop-Down-Menü zeigt dann auch auf die neue Vertragsnummer. Per onChangeEvent (<p:ajax event="change") will ich es ermöhlichen zwischen den Veträgen hin und her zu springen um nochmals Änderungen durchzuführen. Dafür müsen dann die Felder des Formulars jedes mal an das neue Vetragsobjekt gebunden werden. Das onChangeEvent feuert nur wenn auch eine tatsächliche Änderung der Drop-Down Liste vorliegt. Das wird dummerweise anhand der DB-ID des Objekt evaluiert. Deshalb habe ich initial eine Random ID erzeugt.
Doch überschreibt mir JSF bei der Serverseitigen Eventverarbeitung Das erste Vertragsobjekt mit den Daten des neuen oder umgekehrt. Je nachdem von welchem Eintrag des Drop-Down-Menus ich ausgehe. Das ist natürlich doof, da ich so niemals die Daten von zwei oder mehr Verträgen gleichzeitig pflegen kann.
Die Rheinfolge ist also:
1) Felder füllen (Vertrag 1)
2) Neuen Vertrag hinzufügen
2.1) onChangeNewCustomerAgreement() (Warum auch immer, aber nun gut)
2.2) setField von Vertrag 1
2.3) addNewCustomerAgreement()
3) Felder füllen von Vertrag 2
4) Select Vertrag 1
4.1) onChangeNewCustomerAgreement()
4.2) setField von Vertrag 1 (Hier liegt das Problem, das Object sollte eigentlich Vertrag 2 sein)
Ich habe auch schon mit dem Parameter immediate="true" herumgespielt. Das hat aber auch nicht den gewünschten Effekt erziehlt. Ich bin jetzt etwas ratlos.
Hier noch ein bisschen Code:
[XML]
<p:row>
<p:column>
<h
</p:column>
<p:column>
<p:calendar tabindex="3"
value="#{customerPM.currentCustomerAgreement.agreementEndDate}"
id="newCustomerAgreementEnd" showOn="both" mode="popup"
showButtonPanel="false" navigator="true"
pattern="dd. MMMM yyyy" converterMessage="Falsches Format!"
style="width: 260px; margin-right: 50px;" locale="de"
converter="DateConverter" />
<p:message for="newCustomerAgreementEnd" display="tooltip" />
</p:column>
<p:column id="newCustomerPowerSystemInstalledDateLabel">
<h
<h
</p:column>
<p:column id="newCustomerPowerSystemInstalledDateContent">
<p:calendar tabindex="7"
value="#{customerPM.currentCustomerAgreement.powerSystem.installedDate}"
id="newCustomerPowerSystemInstalledDate" showOn="both"
mode="popup" showButtonPanel="false" navigator="true"
required="true"
requiredMessage="Kein Produktionsbegin angegeben!"
pattern="dd. MMMM yyyy" converterMessage="Falsches Format!"
style="width: 260px; margin-right: 50px;" locale="de"
converter="DateConverter" />
<p:message for="newCustomerPowerSystemInstalledDate"
display="both" />
</p:column>
</p:row>
[/XML]
Java:
public void addNewCustomerAgreement(){
CustomerAgreement customerAgreement = new CustomerAgreement("V00001-14-02");
this.currentCustomer.getCustomerAgreements().add(customerAgreement);
this.currentCustomerAgreement=customerAgreement;
}
public void onChangeNewCustomerAgreement(ValueChangeEvent event){
logger.debug("+ CustomerPM.onChangeNewCustomerAgreement()");
this.currentCustomerAgreement=(CustomerAgreement)event.getNewValue();
logger.debug("- CustomerPM.onChangeNewCustomerAgreement()");
}
Anhänge
Zuletzt bearbeitet: