Oracle Fusion Middleware Blog

Deutsche Informationen rund um Oracle Fusion Middleware

ADF – Nested Collections als WebService Response individuell darstellen

leave a comment »

Problem:
Wie behandelt man eine Master Detail Beziehung außerhalb der Standard MD UI Komponenten (Master Form/Table –> Detail Form/Table), zum Beispiel in einem Panel Accordion, wenn die Daten statt über ADF BC aus einem Web Service Request bereitgestellt werden und die Datenobjekte geschachtelte Collections sind? Genauer gesagt sollten die showDetailItems des panelAccordion über die Master Daten und commandNavigationItems über die Detail Daten iterieren. Die Darstellung soll in etwa so aussehen:

Master 1 image
    Detail 1.1- Link
    Detail 1.2- Link
Master 2 image
    Detail 2.1- Link
    Detail 2.2- Link
    Detail 2.3- Link
Master 3 image
Master 4 image
Master n image

Lösung

Gehen wir also von folgender Datentyp Definition aus als Ergebnis der Aufbereitung der Datentypen unseres WS Requests:

DetailsType
int linkId;
String linkTitel;
String linkUrl;
. . .

MasterType
int masterId;
String masterTitel;
List<DetailsType> details;
. . .

MDListType
List<MasterType> mdList;

Eine Methode (getMDdata()) in einer Pojo (MDSample) liefert eine Rückgabe vom Typ MDListType. Somit sieht das Data Control in der DC Palette wie folgt aus

image

Als erstes wollen wir den Iterator über die Master Collection aufbauen. Dazu platzieren wir das panelAccordion auf die JSF und darin ein forEach Element. Es wird dabei ein showDetailItem automatisch eingefügt. Bitte die Anordnung derart verändern, dass das showDetailItem als Kindelement zum forEach Element wird. Wir wollen ja pro Master Datensatz ein showDetailItem erhalten.

image

Nun müssen wir ein tree Binding in der PageDefinition anlegen, auf das wir die forEach Komponente binden. Dabei wird als Root Data Source die mdList Collection ausgewählt, dann auf Add Rule geklickt und es wird der MasterType angewählt. Hier bitte den Detail Type hinzufügen und auf beiden Typen die gewünschten Attribute zur Darstellung hinzufügen. Das Binding sollte dann in etwa so aussehen.

image

Jetzt können wir die forEach Komponenten des Masters binden und dem Binding einen Variablennamen vergeben.

<af:forEach items=“#{bindings.mdList.children}“ var=“masterVar“>

Als nächstes wird eine zweite forEach Komponente auf das showDetailItem gezogen und wie folgt gebunden.

<af:forEach items=“#{masterVar.children}“ var=“detailsVar“/>

Die Variable detailsVar ist nun die Basis für alles weitere Binding der Details, z.B. commandNavigationItem oder ähnliches. Der Source Code der Seite sieht dann in etwa so aus

<af:panelAccordion id=“pa1″>
<af:forEach items=“#{bindings.mdList.children}“ var=“masterVar“>
<af:showDetailItem text=“showDetailItem 1″ id=“sdi1″>
<af:navigationPane id=“np1″>
<af:forEach items=“#{masterVar.children}“ var=“detailsVar“>
<af:commandNavigationItem text=“#{detailsVar.linkTitel}“ id=“cni1″/>
</af:forEach>
</af:navigationPane>
</af:showDetailItem>
</af:forEach>
</af:panelAccordion>

Man kann nun die Action des Navigation Items mit dem Attribut detailsVar.linkUrl assoziieren.

<DM>

Written by fmtechteam

16/10/2012 um 11:18

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: