Page 1 sur 1

XMLSERIALIZE

Posté : mer. 03 oct. 2018, 09:22:54
par fbillard
Via la requête ci-dessous je génère un fichier dans l'IFS.

SELECT
'<?xml version="1.0" encoding="UTF-8"?>' ||
xmlserialize(
xmlelement(name "info_1",
xmlelement (name "info_2" ,
xmlelement(name "detailinfo2_1" , '1234'),
xmlelement(name "deatilinfo2_2" , '12345678')
),
xmlelement(name "liste" ,
xmlagg(
xmlelement(
name "enetete",
xmlelement(name "detail_1" , BIBLIO.DATEISO(a.DATEW, '*dmy')),
xmlelement(name "detail_2" , b.VALEUR1),
xmlelement(name "detail_3" , b.VALEUR2)
)
)
)
) as VARCHAR(3000)
)
FROM BIB.FIC1 a
LEFT JOIN BIB.FIC2 b
ON a.DATEW = b.DATEW AND a.NUMERO = b.NUMERO
LEFT JOIN BIB.FIC3 c ON a.ZONE1 = c.ZONE1
WHERE
a.NUMERO BETWEEN 375 AND 400
AND a.DATTUE = 011018;

Résultat :

<?xml version="1.0" encoding="UTF-8"?>
<info_1>
<info_2>
<detailinfo2_1>1234</detailinfo2_1>
<deatilinfo2_2>12345678</deatilinfo2_2>
</info_2>
<liste>
<enetete>
<detail_1>2018-10-01</detail_1>
<detail_2>72.0</detail_2>
<detail_3>.0</detail_3>
</enetete>
<enetete>
<detail_1>2018-10-01</detail_1>
<detail_2>79.7</detail_2>
<detail_3>77.2</detail_3>
</enetete>
</liste>
</info_1>

Problème :
Je ne parviens pas à obtenir "0.0" en detail_3 lorsque ma valeur est égal à zéro. Que faire ?

Posté : mer. 03 oct. 2018, 09:34:38
par florian67
Salut,

Est-ce que tu lances cette requête dans du code RPG ?
Si oui, peut être en rajoutant dcl-opt decedit('0.') ça fonctionnera.

Florian

Posté : mer. 03 oct. 2018, 09:46:15
par fbillard
Oui, la requête s’exécute dans un RPG,
et le dcl-opt decedit('0.') est déjà présent dans le source.

DECMPT

Posté : mer. 03 oct. 2018, 09:47:39
par cmasse
ou en ajoutant l'ordre SQL "SET OPTION DECMPT = *COMMA"

Posté : mer. 03 oct. 2018, 09:54:14
par fbillard
Toujours pas,

j'utilise "Exec Sql Set Option DECMPT = *PERIOD;"
car je souhaite le "." en séparateur décimal

l'ordre SQL "SET OPTION DECMPT = *COMMA"
me donne le même resultat, mais avec la "," comme séparateur décimal

Posté : mer. 03 oct. 2018, 10:59:38
par vazymimil
Bonjour

En remplaçant b.valeur2 par varchar_format(b.valeur2, '0.00') ça devrait fonctionner comme vous le voulez.

VARCHAR_FORMAT

Posté : mer. 03 oct. 2018, 16:17:01
par cmasse
Super, merci !

pour être précis :

VARCHAR_FORMAT(xxx, '0.00') produit un résultat avec le . comme marque décimale (la virgule est considérée comme le séparateur de millier)

VARCHAR_FORMAT(xxx, '0D00') produit un résultat avec comme marque décimale le séparateur de la langue en cours (en France "," )

https://www.ibm.com/support/knowledgece ... format.htm

Posté : mer. 03 oct. 2018, 21:30:21
par monthi
Bonsoir

avec la valeur 77.2 de l'exemple :
select VARCHAR_FORMAT(77.2, '0.00') from sysibm/sysdummy1
return £££££ et non pas 77.2
pour avoir la bonne valeur pour cet exemple :
select VARCHAR_FORMAT(77.2, '00.0') from sysibm/sysdummy1

Posté : jeu. 04 oct. 2018, 08:57:01
par vazymimil
Effectivement le format doit à gauche définir autant de chiffres que nécessaire au formatage de la valeur passée, par contre à droite il y a un arrondi au nombre de chiffre indiqués

Donc pour formater un DECIMAL(11, 2) il faudrait passer:

ltrim(VARCHAR_FORMAT(-123456789.016, '999G999G990D00'))
ce qui donne -123.456.789,02

ltrim(VARCHAR_FORMAT(-123456789.016, '999999990D00'))
ce qui donne -123456789,02

(ltrim parce que les 9 sont remplacés par des blancs)

AFFAIRE RESOLUE

Posté : jeu. 04 oct. 2018, 09:17:31
par fbillard
Merci à Tous.