(sans sujet)

RPG (3 et 4, free), CL, SQL, etc...
Répondre
celine.bouzat
Messages : 6
Enregistré le : mer. 16 oct. 2019, 07:47:48

(sans sujet)

Message par celine.bouzat »

Bonjour,

Je rencontre un problème pour découper du xml avec le xmltable.
J’ai une structure comme suit
<?xml version="1.0" encoding="UTF-8"?>
<podPoc>
<journey>
<routeId>PV-TEST107028104</routeId>
<site id="PAP-002" >
<consignment type="D">
<orderRef>JD1095-12123456</orderRef>
<status>X</status>
<consignmentDetail>
<detailRef>445567890245</detailRef>
<customerDetailRef>Palette 1 Cuisine Centrale</customerDetailRef>
<consignmentDetail>
<detailRef>000000015472</detailRef>
<customerDetailRef>Carton Bouillon de Volaille Knorr</customerDetailRef>
</consignmentDetail>
<consignmentDetail>
<detailRef>0000000150212</detailRef>
<customerDetailRef>Carton Tubes 1kg Nutella</customerDetailRef>
</consignmentDetail>
</consignmentDetail>
<consignmentDetail>
<detailRef>4234567890245</detailRef>
<customerDetailRef>Roll Metallique 1 Frais Cuisine Centrale</customerDetailRef>
<consignmentDetail>
<detailRef>0000000037668</detailRef>
<customerDetailRef>Jambon cuit superieur Label Rouge origine France 6,5Kg</customerDetailRef>
<clauseInfo>
<clause>CTR</clause>
<clauseQty>-2</clauseQty>
</clauseInfo>
</consignmentDetail>
<consignmentDetail>
<detailRef>0000000039439</detailRef>
<customerDetailRef>Carton de 6 Creme Excellence Cuisine et Patisserie 35%MG 1L</customerDetailRef>
</consignmentDetail>
</consignmentDetail>
</consignment>
<consignment type="D">
<orderRef>JD1095-12123465</orderRef>
<status>R</status>
<clauseInfo>
<clause>CTR</clause>
<description>Casse - Réfusée</description>
</clauseInfo>
<consignmentDetail>
<detailRef>1234567890123</detailRef>
<customerDetailRef>Palette 1 Cuisine Centrale</customerDetailRef>
<consignmentDetail>
<detailRef>1234567890130</detailRef>
<customerDetailRef>Carton Pasta Pro 5Kg</customerDetailRef>
</consignmentDetail>
</consignmentDetail>
</consignment>
<task taskName="Livraison Emballages" taskStartTime="2019-10-17T21:02:56" taskEndTime="2019-10-17T21:03:37.590" />
<task taskName="Reprise Emballage" taskStartTime="2019-10-17T21:03:37.977" taskEndTime="2019-10-17T21:03:39.657" />
</site>
</journey>
</podPoc>

Et je n’arrive pas a découper le xml avec du sql de façon à tous ramener toutes les données en une seule fois.
Voici ce que j’ai essayer :

SELECT *
FROM
XMLTABLE('$result' PASSING XMLPARSE(DOCUMENT GET_XML_FILE('fichier_test_xml.xml') ) as "result"
COLUMNS
journey_routeId varchar(100) PATH 'podPoc/journey/routeId',
site_id varchar(100) PATH 'podPoc/journey/site/@id',
consignment_type varchar(100) PATH 'podPoc/journey/site/consignment/@type',
consignment_orderRef varchar(100) PATH 'podPoc/journey/site/consignment/orderRef',
consignment_status varchar(100) PATH 'podPoc/journey/site/consignment/status',
consignmentDetail_1_detailRef varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/detailRef',
consignmentDetail_1_customerDetailRef varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/customerDetailRef',
clauseInfo_clause varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/clauseInfo/clause',
clauseInfo_clauseQty varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/clauseInfo/clauseQty',
consignmentDetail_2_detailRef varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/consignmentDetail/detailRef',
consignmentDetail_2_customerDetailRef varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/consignmentDetail/customerDetailRef',
clauseInfo_2_clause varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/consignmentDetail/clauseInfo/clause',
clauseInfo_2_clauseQty varchar(100) PATH 'podPoc/journey/site/consignment/consignmentDetail/consignmentDetail/clauseInfo/clauseQty',
taskName varchar(100) PATH 'podPoc/journey/site/taskName',
taskStartTime varchar(100) PATH 'podPoc/journey/site/taskStartTime'
) AS tmp

Merci pour votre aide.
Cordailement
Modifié en dernier par celine.bouzat le lun. 21 oct. 2019, 15:09:19, modifié 2 fois.

mgris
Messages : 3
Enregistré le : jeu. 04 oct. 2018, 13:23:57
Contact :

(sans sujet)

Message par mgris »

Bonjour,
Votre fichier XML comporte des tableaux, vous avez plusieurs items consignment et consignmentDetail, vous devez donc en tenir compte dans votre requête pour récupérer ces informations.
Si vous souhaitez retrouver toutes vos données en une seule fois, il faut que vous modifiez le path de façon à descendre au plus petit niveau, puis remonter dans l'arborescence
Sinon, vous devez préciser sur quel item se fait la sélection
Comme dans l'extrait suivant:
consignment_status varchar(100) PATH 'podPoc/journey/site/consignment[1]/status',
consignmentDetail_1_detailRef varchar(100) PATH 'podPoc/journey/site/consignment[1]/consignmentDetail[1]/detailRef',
@ bientôt
Marie

celine.bouzat
Messages : 6
Enregistré le : mer. 16 oct. 2019, 07:47:48

(sans sujet)

Message par celine.bouzat »

Bonjour Marie,

Merci pour votre réponse rapide.

Le problème c'est que je ne connais pas la taille de mes tableaux.

J'ai aussi essayer de le faire en plusieurs sous-requête mais du coup je n'ai plus le lien entre les tableaux.

Cordialement
Céline

celine.bouzat
Messages : 6
Enregistré le : mer. 16 oct. 2019, 07:47:48

(sans sujet)

Message par celine.bouzat »

J'ai aussi essayer cela pour garder la hiérarchie entre les balises.

Code : Tout sélectionner

 SELECT * FROM  
XMLTABLE&#40;'$result/podPoc/journey/site/consignment/consignmentDetail/consignmentDetail' PASSING XMLPARSE&#40;DOCUMENT GET_XML_FILE&#40;'PODPOCExport_17-10-2019_21.03.44.69.xml'&#41; &#41; as "result"                                          
COLUMNS                
    journey_routeId                       varchar&#40;100&#41; PATH '../../routeId',   
    site_id                               varchar&#40;100&#41; PATH '../../site/@id', 
    consignment_type                      varchar&#40;100&#41; PATH '@type', 
    consignment_orderRef                  varchar&#40;100&#41; PATH 'orderRef', 
    consignment_status                    varchar&#40;100&#41; PATH 'status', 
    consignmentDetail varchar&#40;10000&#41; path 'consignmentDetail'
&#41; AS tmp ,
XMLTABLE&#40;'$result1/consignmentDetail' PASSING consignmentDetail as "result1"  
COLUMNS 
    consignmentDetail_1_detailRef         varchar&#40;100&#41; PATH 'detailRef', 
    consignmentDetail_1_customerDetailRef varchar&#40;100&#41; PATH 'customerDetailRef'
&#41; AS tmp1 
Mais j'ai le message d'erreur suivant :
Etat sql : 10507
Code fournisseur : -16011
Message : le résultat d'une expression d'étape intermédiaire dans une expression XPath contient une valeur atomique.



[/code]

celine.bouzat
Messages : 6
Enregistré le : mer. 16 oct. 2019, 07:47:48

Re: (sans sujet)

Message par celine.bouzat »

celine.bouzat a écrit :J'ai aussi essayer cela pour garder la hiérarchie entre les balises.

Code : Tout sélectionner

 SELECT * FROM  
XMLTABLE&#40;'$result/podPoc/journey/site/consignment/consignmentDetail/consignmentDetail' PASSING XMLPARSE&#40;DOCUMENT GET_XML_FILE&#40;'PODPOCExport_17-10-2019_21.03.44.69.xml'&#41; &#41; as "result"                                          
COLUMNS                
    journey_routeId                       varchar&#40;100&#41; PATH '../../routeId',   
    site_id                               varchar&#40;100&#41; PATH '../../site/@id', 
    consignment_type                      varchar&#40;100&#41; PATH '@type', 
    consignment_orderRef                  varchar&#40;100&#41; PATH 'orderRef', 
    consignment_status                    varchar&#40;100&#41; PATH 'status', 
    consignmentDetail varchar&#40;10000&#41; path 'consignmentDetail'
&#41; AS tmp ,
XMLTABLE&#40;'$result1/consignmentDetail' PASSING consignmentDetail as "result1"  
COLUMNS 
    consignmentDetail_1_detailRef         varchar&#40;100&#41; PATH 'detailRef', 
    consignmentDetail_1_customerDetailRef varchar&#40;100&#41; PATH 'customerDetailRef'
&#41; AS tmp1 
Mais j'ai le message d'erreur suivant :
Etat sql : 10507
Code fournisseur : -16011
Message : le résultat d'une expression d'étape intermédiaire dans une expression XPath contient une valeur atomique.

vazymimil
Messages : 17
Enregistré le : ven. 28 sept. 2018, 17:14:46

(sans sujet)

Message par vazymimil »

Bonjour,

Dans votre dernière requête le type de consignmentDetail doit être XML pour être passé à XMLTABLE et son PATH est '.', les autres path ne sont pas corrects non plus

Code : Tout sélectionner

    journey_routeId                       varchar&#40;100&#41; PATH '../../../../routeId',   
    site_id                               varchar&#40;100&#41; PATH '../../../@id',
    consignment_type                      varchar&#40;100&#41; PATH '../../@type',
    consignment_orderRef                  varchar&#40;100&#41; PATH '../../orderRef',
    consignment_status                    varchar&#40;100&#41; PATH '../../status',
    consignmentDetail xml path '.'

Sinon voici une requête qui voit les consignmentDetail comme une hiérarchie

Code : Tout sélectionner

SELECT
    journey_routeId,
    site_id,
    consignment_type,
    consignment_orderRef,
    consignment_status,
    --consignmentDetail,
    details.parentDetailRef,
    details.parentCustomerDetailRef,
    details.detailRef,
    details.customerDetailRef
FROM 
    XMLTABLE&#40;'$result/podPoc/journey/site/consignment/consignmentDetail'
        PASSING XMLPARSE&#40;DOCUMENT GET_XML_FILE&#40;...&#41;&#41; as "result"                                         
        COLUMNS               
            journey_routeId                       varchar&#40;100&#41; PATH '../../../routeId',   
            site_id                               varchar&#40;100&#41; PATH '../../@id',
            consignment_type                      varchar&#40;100&#41; PATH '../@type',
            consignment_orderRef                  varchar&#40;100&#41; PATH '../orderRef',
            consignment_status                    varchar&#40;100&#41; PATH '../status',
            consignmentDetail xml path '.'
    &#41; AS consignment,
    XMLTABLE&#40;'$details//consignmentDetail'
        PASSING consignmentDetail as "details" 
        COLUMNS
            parentDetailRef         varchar&#40;100&#41; PATH '../detailRef',
            parentCustomerDetailRef varchar&#40;100&#41; PATH '../customerDetailRef',
            detailRef         varchar&#40;100&#41; PATH 'detailRef',
            customerDetailRef varchar&#40;100&#41; PATH 'customerDetailRef'
    &#41; AS details;
Nicolas

celine.bouzat
Messages : 6
Enregistré le : mer. 16 oct. 2019, 07:47:48

(sans sujet)

Message par celine.bouzat »

Bonjour Nicolas,

Merci beaucoup pour votre réponse et votre aide.

Cela marche :D Je vais pouvoir continuer mon découpage.

Cordialement
Céline

celine.bouzat
Messages : 6
Enregistré le : mer. 16 oct. 2019, 07:47:48

sqlstate 42926 - Locators are not allowed with COMMIT(*NONE)

Message par celine.bouzat »

Bonjour,

Voici là suite du problème de XML de l’autre jour. J’ai essayer de mettre ma petite requête sql qui récupère le XML dans un programme SQLRPGLE.

Comme je m’y attendait au premier lancement et j’ai eu une erreur sql
sqlstate : 42926 - Locators are not allowed with COMMIT(*NONE)
Bon du coup j’ai fait un CLLE qui active le contrôle de validation avec

Code : Tout sélectionner

STRCMTCTL LCKLVL&#40;*ALL&#41; CMTSCOPE&#40;*JOB&#41; 
Puis j’ai rajouter dans mon SQLRPGLE la ligne sur les options de compil sql

Code : Tout sélectionner

exec sql set option commit = *all ;
Je compile tous cela, et quand j'exécute le tout j'ai encore l'erreur sur le commit(*none) non autorisé.

Aurais-je loupé une étape ?

Merci pour votre aide

cmasse
Site Admin
Messages : 764
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

Commit

Message par cmasse »

pas de STRCMTCL avant de lancer le pgm, il faut mettre *CHG dans le paramètre COMMIT de la commande de compil. (CRTSQLRPGI)
Christian Massé (Volubis.fr)

monthi
Messages : 54
Enregistré le : mar. 11 sept. 2018, 15:37:02
Localisation : Paris

(sans sujet)

Message par monthi »

Dans le SQLRPGLE

encadrer la requête contenant DOCUMENT GET_XML_FILE

par :

exec sql
set transaction isolation level read committed;

exec sql
votre requête

exec sql
set transaction isolation level none;

Cdlt

Répondre