Flux XML en CCSID 1252

RPG (3 et 4, free), CL, SQL, etc...
Répondre
Jean-Marie
Messages : 19
Enregistré le : lun. 02 nov. 2015, 17:21:20

Flux XML en CCSID 1252

Message 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

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

Re: Flux XML en CCSID 1252

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

Jean-Marie
Messages : 19
Enregistré le : lun. 02 nov. 2015, 17:21:20

Re: Flux XML en CCSID 1252

Message 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 258 fois

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

Re: Flux XML en CCSID 1252

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

Jean-Marie
Messages : 19
Enregistré le : lun. 02 nov. 2015, 17:21:20

Re: Flux XML en CCSID 1252

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

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

Re: Flux XML en CCSID 1252

Message 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
Modifié en dernier par monthi le mar. 22 sept. 2020, 17:53:35, modifié 2 fois.

Répondre