Page 1 sur 1

Flux XML en CCSID 1252

Posté : mer. 16 sept. 2020, 08:01:12
par Jean-Marie
Bonjour,

Existe-t-il un moyen de générer un fichier XML en charset Windows 1252 depuis l'AS?

J'obtiens une erreur "Le CCSID n'est pas EBCDIC" en utilisant XMLSERIALIZE avec CCSID 1252 INCLUDING XMLDECLARATION :

Code : Tout sélectionner

SELECT XMLSERIALIZE(XMLELEMENT(name "Articles", XMLAGG(XMLDATA)) AS CLOB(2G) CCSID 1252 INCLUDING XMLDECLARATION) AS Articles FROM ARTICLES
Cette requête est utilisée en EmbeddedSQL avec une zone SQLTYPE(XML_DBCLOB_FILE) pour création du fichier dans l'IFS (en ajoutant XMLDOCUMENT).

J'ai tenté de faire un QSH SETCCSID 1252 sur le fichier mais cela ne semble pas changer le contenu.

Cordialement,
Jean-Marie

Re: Flux XML en CCSID 1252

Posté : mer. 16 sept. 2020, 11:44:24
par cmasse
SQLTYPE(XML_DBCLOB_FILE) c'est pour du DOUBLE-BYTE (DB), c'est à dire UNICODE

Or, 1252 (ANSI) c'est sur un octet,

XML_CLOB_FILE plutôt?

Re: Flux XML en CCSID 1252

Posté : mer. 16 sept. 2020, 14:03:20
par Jean-Marie
Ok pour la variable XML_CLOB_FILE Merci !, cependant si j'éxecute directement la requête dans ACS j'obtiens quand même l'erreur :
err1252.png
err1252.png (223.2 Kio) Vu 7781 fois

Re: Flux XML en CCSID 1252

Posté : mer. 16 sept. 2020, 14:45:18
par cmasse
effectivement il semble que ne puisse pas préciser un CCSID non EBCDIC dans XMLSERIALIZE (et puis dans le gestionnaire de script ça donnerait quopi.

et en mettant CCSID dans la déclaration RPG ?

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

Re: Flux XML en CCSID 1252

Posté : mer. 16 sept. 2020, 15:41:30
par Jean-Marie
Je déclare la variable comme ceci :

Dcl-S Articles_XML_FILE SQLTYPE(XML_CLOB_FILE) CCSID(1252);

et en génère le fichier par :

$_Select += ' SELECT XMLSERIALIZE(XMLDOCUMENT( XMLELEMENT(name "Articles", XMLAGG(XMLDATA))) AS CLOB(1M)
EXCLUDING XMLDECLARATION) AS "Articles" FROM Articles';
EXEC SQL PREPARE X_Articles FROM :$_Select;
EXEC SQL DECLARE XC_Articles CURSOR FOR X_Articles;
EXEC SQL OPEN XC_Articles;
EXEC SQL FETCH XC_Articles INTO :Articles_XML_FILE;

Le fichier est quand même généré en ccsid 1208 mais je ne suis pas sûr de la syntaxe que j'utilise.

La valeur système QCSSID est à 65535, est-ce que ça peut être à cause de ça ?

Re: Flux XML en CCSID 1252

Posté : mar. 22 sept. 2020, 14:07:01
par monthi
Bonjour Jean Marie

j'ai fait ce petit exemple pour faire un test

**FREE

Dcl-S XML_FILE SQLTYPE(XML_CLOB_FILE) CCSID(1252);

XML_FILE_fo=SQFOVR;
XML_FILE_name='/tmp/test.xml';
XML_FILE_nl=%len(%trim(XML_FILE_name));

exec sql
DeCLARE c0 CURSOR FOR
SELECT XMLSERIALIZE(XMLDOCUMENT(XMLELEMENT(NAME "Department",
XMLATTRIBUTES(E.WORKDEPT AS "name"),
XMLAGG(XMLELEMENT ( NAME "emp", E.LASTNAME)
ORDER BY E.LASTNAME)))

AS CLOB(200)) AS "dept_list"
FROM EMPLOYEE E
WHERE E.WORKDEPT IN ('C01', 'E21')
GROUP BY WORKDEPT;

exec sql
open c0;

EXEC SQL
FETCH c0 into :XML_FILE;

exec sql
close c0;

*INLR=*ON;

Mon travail a pour CCSID(1147)

le fichier crée a comme ID codé de jeu de caractères : 1208

J'ai essaye en faisant un chgjob CCSID(65535) et j'obtient la même chose

il semblerait que le CCSID(1252) ne porte que sur XML_FILE_name pas sur le contenu du fichier

Complément d'information

dans XMLSERIALIZE on peut préciser le CCSID mais a part 1208 je n'ai pas réussit a mettre d'autre valeur.
Cela génère a la compilation le message d'erreur SQL0189 ;

ID message . . . . . . . . . : SQL0189
Fichier de messages . . . . : QSQLMSG
Bibliothèque . . . . . . . : QSYS

Message . . . . : Le CCSID &1 est incorrect.
Cause . . . . . : Le CCSID &1 est incorrect pour l'une des raisons suivantes :
- Le CCSID n'est pas en EBCDIC.
- Le CCSID n'est pas accepté par le système.
- Le CCSID est incorrect pour le type de données.
- Si le CCSID est indiqué pour les données graphiques, il doit s'agir d'un
CCSID de type DBCS.
- Si le CCSID est indiqué pour les données UCS-2 ou UTF-16, il doit s'agir
d'un CCSID de type UCS-2 ou UTF-16.
- Si le CCSID est indiqué pour les données XML, il doit être de type SBCS
ou Unicode. Il ne doit pas être de type DBCS ou 65535.
- Si le CCSID est indiqué pour des données CLOB, DBCLOB ou DATALINK, il ne
doit pas être de type 65535.
- Si le CCSID est indiqué pour a une colonne de résultat de la fonction
XMLTABLE, il doit être différent de 65535.
- S'il existe plusieurs colonnes de type DataLink associées à FILE LINK
CONTROL, elles doivent toutes avoir le même CCSID.
- La clause NORMALIZED peut seulement être indiquée pour un CCSID de type
UTF-8 ou UTF-16.

Cdlt

Re: Flux XML en CCSID 1252

Posté : ven. 30 oct. 2020, 09:48:06
par Jean-Marie
Ok, Merci beaucoup pour vos réponses.