Bonjour à tous,
je vous expose ma problématique :
Je tente de produire un flux xml à 4 niveaux hiérarchiques. J'utilise les fonctions sql XMLAGG dans différentes vues sql afin d'agréger mes données.
Cela fonctionne bien dans l'ensemble mais il y a une petite particularité (il faut bien pimenter les choses ) : au niveau 3 (niveau de facture), je dois regrouper toutes les lignes de facture (niveau 4) mais aussi un groupe d'éléments synthétisant les codes TVA de la facture. Comme on ne peut par xmlagg agréger que sur un seul champ, j'ai créé un champ caractère recevant mon niveau "TVA" sous forme de "xml" (que j'ai alimenté par une requête du type XMLSERIALIZE(XMLAGG ...).
Le souci, c'est que quand j'utilise ce champ pour produire mon niveau 3, tous les caractères "<" et ">" ont été remplacés par les caractères d'échappement du xml "<" et ">".
J'ai essayé de remplacer tous les "<" et ">" de mon champ par "<" et ">" avant production du xml du niveau 3 mais ce n'est pas mieux, je me retrouve avec de "&" en plus (logique : le système a remplacé tous les "&" de mon champ alpha par le caractère d'échappement "&" !!!).
Quelqu'un voit-il une solution ?
Question subsidiaire : les fonctions sql produisant les éléments xml ne respectent pas la casse du nom que j'ai précisé dans le paramètre "name". Exemple : xmlforest(trim(lifour) as "SupName" produit <supname> (les majuscules de début de mot ont disparues).
Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques
Re: Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques
Bonjour,
XMLSERIALIZE produit une chaine de caractères depuis une expression XML => le résultat n'est donc plus interprété comme du XML (vrai type pour DB2).
Essayer sans XMLSERIALIZE.
Pouvez-vous nous fournir une requête (simplifiée si possible) ?
XMLSERIALIZE produit une chaine de caractères depuis une expression XML => le résultat n'est donc plus interprété comme du XML (vrai type pour DB2).
Essayer sans XMLSERIALIZE.
Pouvez-vous nous fournir une requête (simplifiée si possible) ?
Nathanaël
Re: Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques
Bonjour,
j'ai utilisé XMLSERIALIZE car je dois alimenter un champ de type CHAR(10000). Je précise de nouveau que je dois agréger ce champ au niveau supérieur de mon ficier xml par une requête avec un GROUP BY.
Or on ne peut pas faire de group by sur un champ de type XML (définition que j'avais donnée à mon champ au début).
En ôtant le XMLSERIALIZE, lorsque la requête s'exécute dans mon programme, j'ai une erreur sql -303 "La variable W_XMLDATA n'est pas compatible ou la valeur est trop longue."
Le champ est défini comme ceci dans mon prog : dcl-s w_xmlData varchar(10000);
Voici la requête avec XMLSERIALIZE :
Et celle sans :
j'ai utilisé XMLSERIALIZE car je dois alimenter un champ de type CHAR(10000). Je précise de nouveau que je dois agréger ce champ au niveau supérieur de mon ficier xml par une requête avec un GROUP BY.
Or on ne peut pas faire de group by sur un champ de type XML (définition que j'avais donnée à mon champ au début).
En ôtant le XMLSERIALIZE, lorsque la requête s'exécute dans mon programme, j'ai une erreur sql -303 "La variable W_XMLDATA n'est pas compatible ou la valeur est trop longue."
Le champ est défini comme ceci dans mon prog : dcl-s w_xmlData varchar(10000);
Voici la requête avec XMLSERIALIZE :
Code : Tout sélectionner
with T1 (clif, numfac, cdtval, txtval, totgoods, totTaxAmount, totInvoice)
as (select clif, numfac, cdtval, txtval, :w_totGoods, :w_totTaxAmount, :w_totInvoice
from wxmlfacivc where numfac = :numfac_sv
group by clif, numfac, cdtval, txtval
order by clif, numfac, cdtval)
select xmlserialize(xmlagg(xmlelement(name "TaxTableLine", xmlforest(trim(cdtval) as "TTTaxCode",
TXTVAL as "TTTaxRate", totgoods as "TTTotalGoodsValue",
totTaxAmount as "TTTotalTaxAmount", totInvoice as "TTTotalInvTotal") )) as char(10000))
INTO :w_xmldata
from t1 group by clif, numfac ;
Code : Tout sélectionner
with T1 (clif, numfac, cdtval, txtval, totgoods, totTaxAmount, totInvoice)
as (select clif, numfac, cdtval, txtval, :w_totGoods, :w_totTaxAmount, :w_totInvoice
from wxmlfacivc where numfac = :numfac_sv
group by clif, numfac, cdtval, txtval
order by clif, numfac, cdtval)
select xmlagg(xmlelement(name "TaxTableLine", xmlforest(trim(cdtval) as "TTTaxCode",
TXTVAL as "TTTaxRate", totgoods as "TTTotalGoodsValue",
totTaxAmount as "TTTotalTaxAmount", totInvoice as "TTTotalInvTotal") ))
INTO :w_xmldata
from t1 group by clif, numfac ;
Erwan
Re: Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques
XMLGROUP permet de constituer un flux XML en groupant sur certaines valeurs, ce serait plus approprié : https://www.ibm.com/docs/fr/i/7.4?topic ... s-xmlgroup
Difficile de faire un test sans la BD.
Difficile de faire un test sans la BD.
Nathanaël