XMLSERIALIZE

RPG (3 et 4, free), CL, SQL, etc...
Répondre
fbillard
Messages : 12
Enregistré le : lun. 16 avr. 2007, 10:49:18

XMLSERIALIZE

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

florian67
Messages : 129
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message 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

fbillard
Messages : 12
Enregistré le : lun. 16 avr. 2007, 10:49:18

Message 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.

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

DECMPT

Message par cmasse »

ou en ajoutant l'ordre SQL "SET OPTION DECMPT = *COMMA"
Christian Massé (Volubis.fr)

fbillard
Messages : 12
Enregistré le : lun. 16 avr. 2007, 10:49:18

Message 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

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

Message par vazymimil »

Bonjour

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

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

VARCHAR_FORMAT

Message 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
Christian Massé (Volubis.fr)

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

Message 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

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

Message 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)
Nicolas

fbillard
Messages : 12
Enregistré le : lun. 16 avr. 2007, 10:49:18

AFFAIRE RESOLUE

Message par fbillard »

Merci à Tous.

Répondre