View Full Version : XML Extender for iSeries (die Zweite)
So, mein "XML Extender for iSeries" läuft.
Ich habe auch schon ein XML-File erfolgreich "zerlegt", sprich, die Inhalte der Elmente und Attribute in eine phys.Datei übertragen. Dabei war das XML-File "flach" aufgebaut, also ohne Elemente die sich wiederholen können und es hat in eine einzige phys.Datei reingepasst.
So weit so gut.
Zum "zerlegen" in mehrere Dateien fehlt mir aber noch etwas KnowHow.
Beispiel:
<NettoPreise>
<ArtikelNR>692960603</ArtikelNR>
<ArtikelBez.>Schraube M14</ArtikelBez.>
<Waehrung>EUR</Waehrung>
<Preis gueltig="2006010120061231">99.95</Preis>
<StaffelPreise>
<Staffel gueltig="2006010120061231" Menge="10">98.95</Staffel>
<Staffel gueltig="2006010120061231" Menge="100">97.95</Staffel>
<Staffel gueltig="2006010120061231" Menge="1000">96.95</Staffel>
</StaffelPreise>
</NettoPreise>
Bei diesem XML-File müssen die Daten in zwei phys.Dateien (Nettopreise und Staffelpreise) zerlegt werden, weil die "StaffelPreise" 0 bis unendlich vorkommen, so die Dekompositionsregel des Extenders.
Ich habe mir deshalb zwei phys.Dateien erstellt, beide haben den Schlüssel "ArtikelNR", was mir fehlt ist der Trick wie ich den Inhalt vom Schlüssel NettoPreise.ArtikelNR in den Schlüssel StaffelPreise.ArtikelNR reinbekomme.
Ich hoffe ich habe mich richtig ausgedrückt. Das ganze ist doch ein bisschen heavy.
Gruß Alex
Du kannst dir XML als Baumstruktur vorstellen.
In diesem Fall ist eben "Staffelpreise" ein Unterast von "Nettopreise" und somit gilt der Schlüssel "ArtikelNR" des übergeordneten Astes.
D.h., dass die letzte verwendete ArtikelNR für die Staffelpreise gilt.
Allerdings:
XML ist nicht zwingend in der Reihenfolge !
D.h., dass ArtkelNR durchaus nach Staffelpreise kommen kann.
Bei der Verarbeitung kommt es eben darauf an, erst alle Hauptattribute zu verarbeiten bevor man an die untergeordneten geht.
Klaro, XML ist hierarchisch aufgebaut. Mit root-Element, Eltern und Kindern usw.
Auf die Vearbeitung habe ich wenig Einfluss, das soll ja der Extender erledigen. Ich habe lediglich dieses DAD-File, welches für das Zerlegen benötigt wird. Dieses File, ebnfalls in XML, wird mir automatisch vom WebsphereDevelpStudioClient bei der Aktion RDB-Node-mapping erstellt. Es ist zwar editierbar, aber ich weiss nicht wo ich da eingreifen kann/muss.
Da kann ich dir nun auch nicht weiterhelfen.
Aber ich denke, bei der Mappingfunktion muss es auch eine Abbildung auf hierarchische Datenbankstrukturen geben.
Ggf. wird hier nicht direkt mit den Schlüsseln gearbeitet sondern mit Referenzen. Meist sind dies automatisch generierte ID's die den Bezug zwischen den Ebenen (Eltern->Kind) herstellen.
OK, trotzdem vielen Dank. Ich mach mich weiter auf die Suche nach einer Lösung, die ich, falls gewünscht, hier präsentieren werde. :)
Eine Präsentation der Lösung ist immer willkommen, schließlich wird im Forum ja erst nach Antworten gesucht, bevor man eine eigene Frage stellt ;)
Hi,
hier die Lösung bzw. der Weg den ich gegangen bin.
Für Rückfragen stehe ich gerne zur Verfügung.
------------------------------------------------------------------------
Das ist das empfangene XML-Document.
XML-File:
<?xml version="1.0" encoding="UTF-8"?>
<neuePreise>
<NettoPreise>
<ArtikelNR>692960603</ArtikelNR>
<ArtikelBez>Schraube M14</ArtikelBez>
<Waehrung>EUR</Waehrung>
<Preis gueltig="2006010120061231">99.95</Preis>
<StaffelPreise>
<Staffel gueltig="2006010120061231" Menge="10">98.95</Staffel>
<Staffel gueltig="2006010120061231" Menge="100">97.95</Staffel>
<Staffel gueltig="2006010120061231" Menge="1000">96.95</Staffel>
</StaffelPreise>
</NettoPreise>
</neuePreise>
--------------------------------------------------------------------------
Nicht erschrecken, dieses File wurde automat. mit WDSC 5.1 erstellt.
Das muß man/frau nicht selber reinklopfen.
DAD-File:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DAD PUBLIC "dadId" "dad.dtd">
<DAD>
<dtdid>Test01.dtd</dtdid>
<validation>NO</validation>
<Xcollection>
<prolog>?xml version="1.0"?</prolog>
<doctype>!DOCTYPE neuePreise PUBLIC "Test01Id" "Test01.dtd"</doctype>
<root_node>
<element_node name="neuePreise">
<RDB_node>
<table name="deinebibl.NETTPRS" key="ARTIKELNR"/>
<table name="deinebibl.STAFFPR" key="ARTIKELNR GUELTIG MENGE"/>
<condition>
deinebibl.NETTPRS.ARTIKELNR=deinebibl.STAFFPR.ARTI KELNR
</condition>
</RDB_node>
<element_node name="NettoPreise" multi_occurrence="YES">
<element_node name="ArtikelNR">
<text_node>
<RDB_node>
<table name="deinebibl.NETTPRS"/>
<column name="ARTIKELNR" type="Character(20)"/>
</RDB_node>
</text_node>
</element_node>
<element_node name="ArtikelBez">
<text_node>
<RDB_node>
<table name="deinebibl.NETTPRS"/>
<column name="ARTIKELBEZ" type="Character(40)"/>
</RDB_node>
</text_node>
</element_node>
<element_node name="Waehrung">
<text_node>
<RDB_node>
<table name="deinebibl.NETTPRS"/>
<column name="WAEHRUNG" type="Character(3)"/>
</RDB_node>
</text_node>
</element_node>
<element_node name="Preis">
<text_node>
<RDB_node>
<table name="deinebibl.NETTPRS"/>
<column name="PREIS" type="Decimal(9,2)"/>
</RDB_node>
</text_node>
<attribute_node name="gueltig">
<RDB_node>
<table name="deinebibl.NETTPRS"/>
<column name="GUELTIG" type="Character(16)"/>
</RDB_node>
</attribute_node>
</element_node>
<element_node name="StaffelPreise">
<element_node name="Staffel" multi_occurrence="YES">
<text_node>
<RDB_node>
<table name="deinebibl.STAFFPR"/>
<column name="STAFFEL" type="Decimal(9,2)"/>
</RDB_node>
</text_node>
<attribute_node name="gueltig">
<RDB_node>
<table name="deinebibl.STAFFPR"/>
<column name="GUELTIG" type="Character(16)"/>
</RDB_node>
</attribute_node>
<attribute_node name="Menge">
<RDB_node>
<table name="deinebibl.STAFFPR"/>
<column name="MENGE" type="Decimal(6,0)"/>
</RDB_node>
</attribute_node>
</element_node>
</element_node>
</element_node>
</element_node>
</root_node>
</Xcollection>
</DAD>
--------------------------------------------------------------------------
In diese zwei Dateien wird das XML-Document "zerlegt".
Diese Dateien natürlich als erstes erstellen.
SQL-Anweisung:
CREATE TABLE deinebibl.NettPrs (
ArtikelNR CHAR (20) primary key,
ArtikelBez CHAR (40),
Waehrung CHAR (3),
Preis dec (9,2),
gueltig CHAR (16));
CREATE TABLE deinebibl.StaffPr (
ArtikelNR CHAR (20),
Staffel dec (9,2),
gueltig CHAR (16),
Menge dec (6,0),
PRIMARY KEY (ArtikelNR, gueltig, Menge),
foreign key (ArtikelNR) references deinebibl.NettPrs(ArtikelNR));
--------------------------------------------------------------------------
Ergebnis:
Der XML-Extender hat das XML-Document schön sauber auf zwei Tabellen zerlegt.
Physische Teildatei anzeigen
Datei . . . . . : NETTPRS Bibliothek . . . : deinebibl
Teildatei . . . : NETTPRS Satz . . . . . . : 1
Steuerung . . . : Spalte . . . . . : 1
Suchen . . . . . :
*...+....1....+....2....+....3....+....4....+....5 ....+....6....+....7....+....8....
692960603 Schraube M14 EUR r^2006010120061231
****** DATENENDE ******
Physische Teildatei anzeigen
Datei . . . . . : STAFFPR Bibliothek . . . : deinebibl
Teildatei . . . : STAFFPR Satz . . . . . . : 1
Steuerung . . . : Spalte . . . . . : 1
Suchen . . . . . :
*...+....1....+....2....+....3....+....4....+
692960603 i^2006010120061231
692960603 `^2006010120061231
692960603 Ñ^2006010120061231
****** DATENENDE ******
Gruß mom:D