PCML : mieux le comprendre pour en tirer partie
Le PCML (Program Call Markup Language), est un document généré par le compilateur pour décrire l’interface de vos programmes ou programmes de service. Il permet d’automatiser l’appel des programmes via Java ou d’autres langages.
En RPGLE, il existe 2 méthodes pour déclarer des paramètres.
Première solution
En carte C, méthode que l’on trouve encore sur des programmes existants : les paramètres sont considérés comme en entrée/sortie dans le PCML.
C *entry plist C parm Tempin 10 C parm Tempout 10
PCML généré :
<pcml version="6.0"> <!-- RPG module: TESTPCML --> <!-- created: 2018-03-14-09.22.22 --> <!-- source: BERTHOIN/QRPGLESRC(TESTPCML) --> <!-- 2 --> <program name="TESTPCML" entrypoint="TESTPCML"> <data name="TEMPIN" type="char" length="10" usage="inputoutput" /> <data name="TEMPOUT" type="char" length="10" usage="inputoutput" /> </program> </pcml>
Deuxième solution
En les prototypant soit en carte D soit en format full free.
On peut jouer en indiquant « const » sur les paramètres en entrée, ils seront bien uniquement en input dans le PCML.
Mais les autres paramètres resteront en entrée/sortie :
D PI DTempin 10 const DTempout 10
ou
dcl-pi *n ; Tempin char(10) const ; Tempout char(10) ; end-pi;
PCML généré :
<pcml version="6.0"> <!-- RPG module: TESTPCML --> <!-- created: 2018-03-14-09.22.22 --> <!-- source: BERTHOIN/QRPGLESRC(TESTPCML) --> <!-- 2 --> <program name="TESTPCML" entrypoint="TESTPCML"> <data name="TEMPIN" type="char" length="10" usage="input" /> <data name="TEMPOUT" type="char" length="10" usage="inputoutput" /> </program> </pcml>
En CBLLE, il existe une seule solution pour déclarer les paramètres
LINKAGE SECTION. 01 TEMPIN PIC X(10). 01 TEMPOUT PIC X(10). … PROCEDURE DIVISION USING TEMPIN TEMPOUT.
Et les paramètres sont en entrée/sortie ….
Lors de la publication par l’interface web, on peut ajuster ces paramètres. Le plus souvent, en entrée ou en sortie, pour générer un WSDL efficace :
PCML obtenu après modification par l’outil de déploiement :
<pcml version="6.0"> <!-- RPG module: TESTPCML --> <!-- created: 2018-03-14-09.22.22 --> <!-- source: BERTHOIN/QRPGLESRC(TESTPCML) --> <!-- 2 --> <program name="TESTPCML" entrypoint="TESTPCML"> <data name="TEMPIN" type="char" length="10" usage="input" /> <data name="TEMPOUT" type="char" length="10" usage="output" /> </program> </pcml>
La complexité intervient, dans le cas où l’on veut bypasser l’interface web, pour automatiser des déploiements en utilisant les scripts SH.
Nos outils permettent la modification du PCML sans intervention manuelle. Pour cela, il vous faudra générer le fichier PCML dans un fichier IFS, celui généré dans le module n’étant pas modifiable :
CRTBNDRPG PGM(BERTHOIN/TESTPCML) SRCFILE(BERTHOIN/QRPGLESRC) PGMINFO(*PCML *STMF) INFOSTMF('/home/PLB/testpcml.pcml')
Ces options ne peuvent pas être intégrés dans vos cartes H ou CTL-OPT
Vous devrez modifier le type de vos paramètres et indiquer votre fichier STMF dans la publication du webservice :
installWebService.sh ... -pcml '/home/PLB/testpcml_modifie.pcml'
Versions
PCML a subi quelques évolutions il en est actuellement la version 7 depuis fin 2017. La version usuelle est toujours la 6 aujourd’hui. Cette dernière est indiquée dans le tag PCML :
<pcml version="6.0">
Les principales évolutions
- PCML version 2.0 or higher
« entrypoint »
« passby »
« returnvalue »
- PCML version 3.0 or higher
« bidistringtype »
« threadsafe »
- PCML version 4.0 or higher
« chartype »
« epccsid »
« trim »
- PCML version 6.0 or higher
« dateformat »
« dateseparator »
« timeformat »
« timeseparator »
- PCML version 7.0 or higher
« varchar »
Remarque :
Vous n’obtenez pas la même syntaxe si vous générez directement le programme.
CRTBNDRPG ...
<program name="TESTPCML" path="/QSYS.LIB/BERTHOIN.LIB/TESTPCML.PGM">
ou si vous générez d’abord le module
CRTRPGMOD ...
<program name="TESTPCML" entrypoint="TESTPCML">
Soit pour un module
<pcml version="6.0"> <!-- RPG module: TESTPCML --> <!-- created: 2018-03-14-09.22.22 --> <!-- 2 --> <program name="TESTPCML" entrypoint="TESTPCML"> ... </pcml>
et pour un programme
<pcml version="6.0"> <!-- RPG module: TESTPCML --> <!-- created: 2018-03-14-09.22.22 --> <!-- source: BERTHOIN/QRPGLESRC(TESTPCML) --> <!-- 1 --> ... </pcml>
La version par défaut est PCML 6, pour utiliser la version 7, vous devez le spécifier explicitement.
De plus, cela nécessite : PTF SI66150 (7.3) ou SI66149 (7.2) du 10/11/2017.
Pour l’utiliser
- Soit par une variable d’environnement
ADDENVVAR ENVVAR(QIBM_RPG_PCML_VERSION) VALUE(7.0) LEVEL(*SYS)
- Soit par CTL-OPT
ctl-opt pgminfo(*pcml:*module:*dclcase:*v7) ;
La différence V6/V7 porte sur la gestion des VARCHAR
V6 : VARCHAR considéré comme une DS
<struct name="STRIN" usage="input"> <data name="length" type="int" length="2" precision="16" usage="inherit" /> <data name="string" type="char" length="length" usage="inherit" /> </struct>
V7 : supporté nativement via le type « varchar »
<data name="STRIN" type="varchar" length="25" usage="input" />
Cet article est le premier d’une série à suivre sur le PCML, rendez-vous très vite !