-
Ich bin da demnächst mal auf dem Kundensystem und zeige davon dann mein Beispiel.
So (Auszüge):
Code:
d* Datum-Referenz
dC_C507 ds qualified template
d D_2380 20 varying
dS_DTM ds qualified template
d C_C507 likeds(C_C507)
d* Preise
dC_C509 ds qualified template
d D_5125 10 varying
d D_5118 15 varying
d D_5375 10 varying
d D_5378 10 varying
d D_5284 10 varying
d D_6411 10 varying
dS_PRI ds qualified template
d C_C509 likeds(C_C509)
dG_LIN_PRI ds qualified template
d S_PRI likeds(S_PRI)
d S_DTM likeds(S_DTM) dim(2)
d cntS_DTM 10i 0
dG_LIN ds qualified template
d S_LIN likeds(S_LIN)
d S_IMD likeds(S_IMD) dim(2)
D G_LIN_PRI likeds(G_LIN_PRI) dim(2)
d* Gesamtdokument
dXMLFACT_ORDERS ds qualified
d S_IMD likeds(S_IMD)
d G_LIN likeds(G_LIN) dim(999)
d cntG_LIN 10i 0
d G_LINi s 5i 0
dXMLName s 256 varying inz
dXMLOption s 256 varying inz
// Festlegen der XML-Optionen
XMLOption = ' trim=all' // Leerzeichen am Anfang/Ende
+ ' allowmissing=yes' // fehlende Knoten ignorieren
+ ' allowextra=yes' // zusätzliche Knoten ignorieren
+ ' countprefix=cnt' // Zählervariable für Arrays
+ ' case=convert' // ungültige Zeichen in "_" konvertieren
+ ' doc=file' // XML aus Datei lesen
;
XMLName = XMLPath + %trim(XMLOName); // Kompletter Pfadname
XML-INTO XMLFACT_ORDERS %xml(XMLName : XMLOption);
for G_LINi = 1 to XMLFACT_ORDERS.cntG_LIN;
if XMLFACT_ORDERS.G_LIN(G_LINi)
.S_LIN.C_C212.D_7140 <> *blank; // mit Sachnummer
:
:
endif;
endfor;
Analog musst du also ebenso deine XML-Struktur rekursiv aufbauen und mittels geschachteltem likeds() zusammenbauen.
Aus Sicherheitsgründen definiere ich alles als Zeichenfelder um dann Zahl-/Datumswerte per individueller Konvertierung %date(), %dec() zu erhalten.
-
vielen Dank, ich sehe es mir an !!
Gruss A.
-
Hallo Fuerchau,
muss leider doch noch mal auf das Thema zurückkommen. Irgendwie stelle ich mich etwas dumm an, jedenfalls bekomme ich das mit dem XML-INTO nicht gebacken. Wenn Du Dir bitte nochmals mein XML oben betrachtest und dann mein kleines Testprogramm unten, wie sähe nun der korrekte XML-INTO für mein XML File aus ? Ich hoffe, dass zumindest die Deklarationen der Strukturen so passen. Für eine hoffentlich letzte Hilfe wäre ich sehr (!) dankbar.
Gruß Alex
H**** Name - XMLPG001 ****
H**** Function - Test lesen XML-File ****
H**** Author - AM (BMN) am 07.09.2018 ****
H**** Copyright - AM (BMN) 2018 ****
H**** letzte Änd. - ****
H**** Release - 3.1 ****
H************************************************* ************************
D progStatus SDS
D*
D xmlElements 20i 0 Overlay(progStatus: 372)
D*
D*--------------------------------------------------------------*
D* Einzelstrukturen des XML-Files buttom up definieren *
D*--------------------------------------------------------------*
D*
D OrderLine DS Qualified template
D LineNumber 03
D ArticleNumber 08
D Qty 05
D*
D*--------------------------------------------------------------*
D*
D Order DS Qualified template
D OrderNumber 08
D OrderTypeID 02
D OrderLine Likeds(OrderLine) dim(10)
D*
D OrderLineCnt 10I 0
D*
D*--------------------------------------------------------------*
D*
D SHARK_ERP DS Qualified
D Order Likeds(Order)
D*
D*--------------------------------------------------------------*
D* Gesamtdokument (Empfangsergebnis von XML-INTO *
D*--------------------------------------------------------------*
D*
D GesDokument DS Qualified
D SHARK_ERP Likeds(SHARK_ERP)
D Order Likeds(Order)
D OrderLine Likeds(OrderLine) dim(999)
D*
D pause s 1a
D*
/free
xml-into GesDokument
%xml('/SCHÄFER.xml':'case=any doc=file');
Dsply (%Char(xmlElements) + ' GesDokument records loaded.' ) ' '
pause;
/end-free
C SETON LR
-
Dein Hauptknoten heißt bereits SHARK-ERP und nicht GesDokument.
Desweiteren schau dir bitte meine XMLOptions an:
case=convert
Dies ist erforderlich, da der Variablenname ja mit "_" definiert wird und nicht mit "-", was ja ein Operator in RPG ist.
Nun noch mal zu deinem XML:
<?xml version="1.0" encoding="UTF-8"?>
<SHARK-ERP>
<Order>
<OrderNumber>12345678</OrderNumber>
<OrderTypeID>KA</OrderTypeID>
<OrderLine>
<LineNumber>1</LineNumber>
<ArticleNumber>4712</ArticleNumber>
<Qty>12</Qty>
</OrderLine>
</OrderLine>
<LineNumber>2</LineNumber>
<ArticleNumber>4713</ArticleNumber>
<Qty>5</Qty>
</OrderLine>
</Order>
</SHARK-ERP>
d OrderLine ds qualified
d LineNumber ...
d ArticleNumber ...
d Qty ...
d Order ds qualified
d OrderNumber ...
d OrderTypeID ...
d OrderLine likeds(OrderLine) dim(999)
d CntOrderLine 5I 0
d SHARK_ERP ds qualified
d Order likeds(Order)
Mittels CntOrderLine und der XMLOption "countprefix=cnt" bekommst du dann auch die Anzahl Zeilen der OrderLine geliefert.
-
vielen Dank wieder für die Info. Bekomme aber einen Fehler beim Laufenlassen:
Der XML-Parser hat den Fehlercode 5 festgestellt. Was bedeutet das ?
Was ich auch noch nicht verstanden habe, muss dann am Ende des Programms noch was wegen der Tabelle codiert werden, oder reicht der XML-INTO. So sieht mein Progrämmchen jetzt aus.
H**** Name - XMLPG001 ****
H**** Function - Test lesen XML-File ****
H**** Author - AM (BMN) am 07.09.2018 ****
H**** Copyright - AM (BMN) 2018 ****
H**** letzte Änd. - ****
H**** Release - 3.1 ****
H************************************************* ************************
D*--------------------------------------------------------------*
D* Einzelstrukturen des XML-Files buttom up definieren *
D*--------------------------------------------------------------*
D*
D OrderLine DS Qualified
D LineNumber 03
D ArticleNumber 08
D Qty 05
D*
D*--------------------------------------------------------------*
D*
D Order DS Qualified
D OrderNumber 08
D OrderTypeID 02
D OrderLine Likeds(OrderLine) dim(999)
D*
D CntOrderLine 5I 0
D*
D*--------------------------------------------------------------*
D*
D SHARK_ERP DS Qualified
D Order Likeds(Order)
D*
D*
D XMLName S 256 varying inz
D XMLOption S 256 varying inz
D*
D*--------------------------------------------------------------*
D* Festlegen der XML-Optionen *
D*--------------------------------------------------------------*
XMLOption = ' trim=all' // Leerzeichen am Anfang/Ende
+ ' allowmissing=yes' // fehlende Knoten ignorieren
+ ' allowextra=yes' // zusätzliche Knoten ignorieren
+ ' countprefix=cnt' // Zählervariable für Arrays
+ ' case=convert' // ungült. Zeichen in "_" konv.
+ ' doc=file' // XML aus Datei lesen
;
XMLName = '/SCHÄFER.xml'; // Kompletter Pfadname
XML-INTO SHARK_ERP %xml(XMLName : XMLOption);
C*
C SETON LR
C*
-
Ich sach mal so:
XMLName = '/SCHÄFER.xml'; // Kompletter Pfadname
Bist du sicher, dass die Datei im IFS-Root ist?
Der Standardfehler 5 beim IFS-Zugriff ist übrigens "ACCESS DENIED".
Was steht u.U. im Jobblog?
-
So, jetzt kann ich mich wieder um das Drama hier kümmern.
Tägliche Arbeit erledigt.
Erstmal wieder Danke für die Antwort. Warum der Zugriff nicht
klappt, keine Ahung. Ja, XML steht im Root.
Joblog brint einen auch nicht weiter. Irgendwie werde ich das
ja wohl noch schaffen, daß der Zugriff klappt. Aber nochmal zu der einen Frage von gestern:
??
Was ich auch noch nicht verstanden habe, muss dann am Ende des Programms noch was wegen der Tabelle (Orderline) codiert werden, oder macht das auch der XML-INTO
gleich mit.
Gruss A.
-
Der XML-INTO liest die gesamte XML-Datei entsprechend der DS-Struktur passend zur XML-Struktur ein.
Wichtig zu wissen ist einfach folgendes:
XML-Tages (Knoten und Attribute) sind case sensitive!
Die RPG-Variablen werden vom Compiler grundsätzlich in Großbuchstaben erstellt und deshalb ist es egal, welche Schreibweise du wählst, zusätzlich sind Zeichen wie "-", ":" usw. erlaubt, was bei RPG-Namen nicht erlaubt ist, also "case=convert"!
Bei Arrays macht es schon Sinn, die Anzahl der gelesenen Zeilen zu haben, deshalb die "cnt"-Variablen.
Welche CCSID hat dein Job zur Laufzeit?
Ggf. kommt dein Job mit dem Umlaut im Dateinamen nicht zurecht.
Denn dein konstantes "Ä" könnte falsch übersetzt werden.
Ändere den Namen erst mal auf einfache Zeichen.
-
vielen Dank für Deine Hilfe. Bin leider bei uns in der Firma Einzelkämpfer und muss mich in Zukunft mit XML rumschlagen. Da ich bei uns keinen fragen kann, frage ich halt hier bei den Profis nach :-)
Deshalb habe ich im Vorfeld schon mal recherchiert. Wie sieht das eigentlich mit dem Schreiben in XML Dateien aus ? Könnte auch noch ein Thema werden. Aber da mache ich ein extra Thema auf. Also vielen Dank nochmal. Gruß A. und schönes WE.
-
Das Schreiben ist eher unkomfortabel, da es nicht native unterstützt wird.
Man kann das mühsam in SQL oder in RPGLE-Funktionen stricken.
Besser ist es allerdings dann direkt in Java bzw. Sprachen, die XML native unterstützen, zu machen.
Aber dein letzter Post besagt nun nicht, ob es denn nun klappt.
-
Nee, klappt leider immer noch nicht. Meldung siehe unten:
Am SCHÄFER liegt's nicht.
Und im Netz findet man zum Ursachencode folgendes:
5 |
The start and end tag names of an element did not match. |
Nachrichten-ID . . . . : RNX0351 Bewertung . . . . . . : 50
Nachrichtenart . . . . : Diagnose
Sendedatum . . . . . . : 05.10.18 Sendezeit . . . . . . : 13:05:54
Nachricht . . . : Der XML-Parser hat den Fehlercode 5 festgestellt.
Ursache . . . . : Beim Parsing eines XML-Dokuments für eine RPG-Prozedur hat
der Parser einen Fehler bei der relativen Position 252 mit Ursachencode 5
festgestellt. Das verwendete Dokument ist /SCHÄFER.xml; *N gibt an, dass das
XML-Dokument keine externe Datei war.
Fehlerbeseitigung: Mit Hilfe des Benutzers, der für die Programmpflege
verantwortlich ist, die Fehlerursache bestimmen.
-
Wo er recht hat, hat er recht!
Versuchs mal damit:
<?xml version="1.0" encoding="UTF-8"?>
<SHARK-ERP>
<Order>
<OrderNumber>12345678</OrderNumber>
<OrderTypeID>KA</OrderTypeID>
<OrderLine>
<LineNumber>1</LineNumber>
<ArticleNumber>4712</ArticleNumber>
<Qty>12</Qty>
</OrderLine>
<OrderLine>
<LineNumber>2</LineNumber>
<ArticleNumber>4713</ArticleNumber>
<Qty>5</Qty>
</OrderLine>
</Order>
</SHARK-ERP>
Bei deiner 2. Order-Line sind Start- und Ende-Tag vertauscht, also ein Fehler der XML-Erstellung!
Da frage ich mich, wo das denn herkommt....
Übrigens ist da das Notepad++ ganz hilfreich, da es matching tags markiert.
Similar Threads
-
By nico1964 in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 13-09-18, 09:54
-
By tarkusch in forum NEWSboard Programmierung
Antworten: 11
Letzter Beitrag: 26-07-17, 09:12
-
By FNeurieser in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 07-07-16, 21:35
-
By KingofKning in forum IBM i Hauptforum
Antworten: 9
Letzter Beitrag: 07-07-14, 14:15
-
By qiwi2000 in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 26-04-02, 07:51
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks