Show TOC Anfang des Inhaltsbereichs

Diese Grafik wird im zugehörigen Text erklärt MapExampleTwoTablesToNestedTables  Dokument im Navigationsbaum lokalisieren

Problemstellung

Dieses Beispiel ist ähnlich wie das Beispiel MapExampleTwoTablesToFlatStructure: Die Ausgangsstruktur besteht aus zwei Rekords, in denen jeweils der Name und die Telefonnummer einer Person gespeichert ist. Als zusätzliche Schwierigkeit kommt hinzu, dass die Zielstruktur nicht flach ist, sondern innerhalb eines Person-Rekords alle Telefonnummern einer Person gespeichert werden sollen.

Lösung

Diese Grafik wird im zugehörigen Text erklärt

·        Die Anzahl der Person-Rekords in der Zielstruktur muss gleich der Anzahl der Person-Rekords der Ausgangsstruktur sein. Es reicht also die Zuweisung /ns:MapExampleNestedTablesMessage/Person = /ns:MapExampleTwoTablesMessage/Persons/Person.

·        Die Werte für Id und Name in der Zielstruktur können Sie durch einfache Zuordnung aus der Ausgangsstruktur übernehmen.

·        Um die Liste der Telefonnummern übernehmen zu können, müssen Sie für jede Id eine solche parat haben. Daher verfahren Sie wie im Beispiel MapExampleTwoTablesToFlatStructure mit einer erweiterten benutzerdefinierten Funktion getPhonesById:

Diese Grafik wird im zugehörigen Text erklärt

Die Funktion arbeitet folgendermaßen:

...

       1.      Die Funktion erwartet PersonId und Number im Telephones-Kontext, so dass alle Ids und Telefonnummern innerhalb dieses Kontexts übergeben werden.

       2.      Die Grundidee ist, zu jeder Id eine Liste der zur Id gehörenden Telefonnummern in einem Container-Objekt zu speichern, um sie bei späteren Aufrufen wieder auslesen zu können. Dazu greift die Funktion am Anfang auf eine Map phones zu. Gibt es diese Map noch nicht, erzeugt die Funktion eine neue HashMap. Dann erzeugt die Funktion pro PersonId (b[i]) eine Liste (beim ersten Mal) beziehungsweise holt sich eine bereits existierende Liste für PersonId (b[i]) und fügt die zugehörige Telefonnummer (c[i]) ein. Die Map mit den Telefonnummerlisten wird an das Container-Objekt phones übergeben, so dass sie in weiteren Aufrufen der gleichen Funktion zur Verfügung steht.

       3.      Schließlich gibt die Funktion die Telefonliste zum Eingabeargument Id (a[0]) über das ResultList-Objekt zurück.

Erweiterte benutzerdefinierte Funktion getPhonesById

public void getPhonesById(String[] a, String[] b, String[] c, ResultList result, Container container){

Map map = (Map) container.getParameter("phones");
if (map == null){
  map = new HashMap();
  for (int i = 0; i<b.length; i++){ // if the payload is valid to xsd, b and c have equal length
    List list = (List) map.get(b[i]);
    if (list == null){
      list = new ArrayList();
      map.put(b[i], list);
    }
    list.add(c[i]);
  }
  container.setParameter("phones", map);
}

List list = (List)map.get(a[0]);
for (int i = 0; i< list.size(); i++) result.addValue((String) list.get(i));

}

 

 

 

 

Ende des Inhaltsbereichs