[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Jun 2015
    Beiträge
    336

    Werte aus XML-Dateien mit RPG rauslesen (Verständnisfrage)

    Hallo zusammen,
    leider habe ich bisher noch nix mit dem o..a. Thema zu tun gehabt. Mittlerweile habe ich mal ein bisschen rumgesucht und etwas mehr Klarheit gewonnen. Aber auch nur ein wenig,

    Bitte mal das folgende XML-File ansehen:

    <?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>

    Will ich nun z.B. die ORDERNUMBER rauslesen will, so kann ich das ja mit
    XML-into in ein normales Feld tun. Klappt auch bei mir.

    Wenn ich jetzt dann noch die Daten die zu ORDERLINE gehören mit auslesen will (evtl. mehrfach vorhanden), muss ich doch dann einen zweiten XML-into absetzen und das Ergebnis in eine Tabelle schreiben.

    Und jetzt meine Frage: Ist die Vorgehensweise so ok, oder kann man das auch alles in
    einem Aufwasch (ein XML-into) erledigen.

    Für Infos bin ich wie immer dankbar.

    Gruss A.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Nein!
    Du kannst alles mit einem XML-Into bis zur letzten Ebene einlesen und bearbeiten.
    Dazu muss man mit Qualified-DS'n arbeiten, so dass man anschließend XML-ähnliche Strukturen verwenden kann:

    Konten1.Knoten2.Attribute1

    Auch Arrays lassen sich da locker befüllen.
    Nur muss man halt die Strukturen einzeln (buttom up) definieren.

    D OrderLine DS qualified template
    D LineNumber ...
    D ArticelNumber...

    D Order DS qualified template
    D OrderNumber ...
    D OrderTypeID ...
    D OrderLine likeds(OrderLine) dim(10)
    D OrderLineCnt 10I 0

    D SHARK_ERP DS qualified
    D Order Likeds(Order)

    Beim XML-Into gibt es dann nur ein Ziel mit den Zusatzoptionen, dass
    - nicht alle Strukturen da sein müssen
    - Namensersetzungen stattfinden (unbekannte Zeichen werden alle zu "_")
    - Bzgl. des CNT-Eintrages gibt es eine Namensregel (Beispiel im Handbuch). Da steht dann automatisch die Anzahl der geladenen Zeilen drin.

    Somit hast du dann Zugriff auf
    SHARK_ERP.Order.OrderNumber
    SHARK_ERP.Order.OrderLine(1).LineNumber

    usw.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jun 2015
    Beiträge
    336
    ok vielen Dank schon mal. Ich probiere das aus.
    Gruss A.

  4. #4
    Registriert seit
    Jun 2015
    Beiträge
    336
    Hallo Fuerchau,
    ich komme mit dem XML-INTO - Aufruf nicht klar, sodass ich alle XML-Elemente erwische. Könntest Du mir da bitte nochmals helfen. Wie sähe der Aufruf dann aus ?
    Vielen Dank schon mal, Gruss A.

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Jun 2015
    Beiträge
    336
    vielen Dank, ich sehe es mir an !!

    Gruss A.

  7. #7
    Registriert seit
    Jun 2015
    Beiträge
    336
    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
    

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Jun 2015
    Beiträge
    336
    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*
    

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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?
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Jun 2015
    Beiträge
    336
    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.

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. SQL - Verständnisfrage
    By nico1964 in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 13-09-18, 09:54
  2. Sql Null Werte
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 26-07-17, 09:12
  3. Werte vergleichen
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 07-07-16, 21:35
  4. Performance Werte V5R4
    By KingofKning in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 07-07-14, 14:15
  5. Query 0-Werte Ausgeben???
    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
  •