Cette article est la suite de notre série sur le PCML

 

Nous avons vu que pour publier un programme en RPG ILE ou COBOL ILE . Le compilateur pouvait générer pour vous le PCML, mais si vous voulez publier un programme CLLE, vous devez faire vous même le PCML, ce n’est pas très compliqué à faire …

 

Pour vous faciliter la vie nous avons fait  un outil qui permet de publier des programmes en CLLE, en générant pour vous le PCML .

 

La commande s’utilise comme ceci

GENCLPCML FICSRC(QCLSRC) BICSRC(BERTHOIN) PGM(MONPGM) BIBPGM(BERTHOIN)

Vous devrez lui indiquer

  • le fichier source
  • la bibliothèque source
  • le programme
  • la bibliothèque du programme

Le paramètre IFS peut être laissé à *DFT, dans ce cas le fichier s’appelle nomdupgm.PCML et il est placé dans le répertoire courant

Le paramètre version est facultatif, par défaut il indiquera 6.0.

 

Limites d’utilisation

Vos paramètres doivent être sur la même ligne

PGM PARM(&PARM1 &PARM2 &PARM3)

La syntaxe suivante n’est pas reconnue :

PGM PARM(&PARM1 &PARM2 + 
 &PARM3)


Les paramètres doivent avoir la même casse :

PGM PARM(&PARM1 &PARM2 &PARM3) 
   DCL VAR(&PARM1) TYPE(*CHAR) LEN(10) 
   DCL VAR(&PARM2) TYPE(*DEC ) LEN(5 0) 
   DCL VAR(&PARM3) TYPE(*INT )

La syntaxe suivante n’est pas reconnue :

PGM PARM(&PARM1 &PARM2 &PARM3) 
  DCL VAR(&Parm1) TYPE(*CHAR) LEN(10) 
  DCL VAR(&pARM2) TYPE(*DEC ) LEN(5 0) 
  DCL VAR(&parm3) TYPE(*INT )

Le type des paramètres peut être uniquement *CHAR, *DEC, *INT

Exemple d’utilisation :

Le programme source suivant MONPGM

PGM PARM(&PARM1 &PARM2 &PARM3) 
   DCL VAR(&PARM1) TYPE(*CHAR) LEN(10) 
   DCL VAR(&PARM2) TYPE(*DEC ) LEN(5 0) 
   DCL VAR(&PARM3) TYPE(*INT )

Donnera comme PCML

<pcml version="6.0"> 
 <program name="MONPGM" path="/QSYS.LIB/BERTHOIN.LIB/MONPGM.PGM"> 
 <!-- Généré par GENCLPCML --> 
 <!-- CLLE program: MONPGM --> 
 <!-- created: 21/3/2018 09.16.42 --> 
 <data name="PARM1" type="char" length="10" usage="inputoutput" /> 
 <data name="PARM2" type="packed" length="5" precision="0" usage="inputoutput" />
 <data name="PARM3" type="char" length="1" usage="inputoutput" /> 
 </program> 
</pcml>

Complément :
Cette solution vous permet d’obtenir des paramètres en entrée et sortie, cas le plus usuel.

Nous avons ajouter un macro langage qui permet d’indiquer à GENCLPCML la nature de votre paramètre : vous pouvez indiquer sur la ligne de déclaration de votre variable les instructions suivantes

/*%%inp%%*/ pour un paramètre en input
/*%%out%%*/ pour un paramètre en output

Si vous n’indiquez rien votre paramètre sera en entrée/sortie

Soit le programme MONPGM

1 paramètre en entrée
1 en sortie
1 en entrée sortie

PGM PARM(&PARM1 &PARM2 &PARM3) 
DCL VAR(&PARM1) TYPE(*CHAR) LEN(10) /*%%inp%%*/ 
DCL VAR(&PARM2) TYPE(*DEC ) LEN(5 0) /*%%out%%*/ 
DCL VAR(&PARM3) TYPE(*INT )

Produira le PCML suivant

<pcml version="6.0"> 
 <program name="MONPGM" path="/QSYS.LIB/BERTHOIN.LIB/MONPGM.PGM"> 
 <!-- Généré par GENCLPCML --> 
 <!-- CLLE program: MONPGM --> 
 <!-- created: 21/3/2018 13.24.03 --> 
 <data name="PARM1" type="char" length="10" usage="input" /> 
 <data name="PARM2" type="packed" length="5" precision="0" usage="output" /> 
 <data name="PARM3" type="char" length="1" usage="inputoutput" /> 
 </program> 
</pcml>

Pour le récupérer l’outil

ci joint les sources  :  Télécharger le savf

  • La commande (GENCLPCML)
  • Le programme CLLE (GENCLPCMLC)
  • Le programme RPGLE (GENCLPCMLR)

Vous devez restaurer les sources et il suffit de les compiler en indiquant PGM(GENCLPCMLC)  pour la génération de la commande et de lancer celle-ci pour tester.

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 !

La TR4 de la 7.3, ou la TR8 de le 7.2, apporte une petite modification aux commandes

  • CRTBNDCL
  • CRTCLMOD
  • INCLUDE

Ces commandes supportent désormais le paramètre SRCSTMF : compilation d’un CL dont le source est dans l’IFS, comme le font les commandes CRTBNDRPG et CRTRPGMOD actuellement.

L’évolution peut paraître anecdotique, mais elle permet une meilleure intégration des développement Open Source, basés sur Git ou autres gestionnaires externes de sources.

 

Vous devez installer la PTF 5700SS1 SI66797 (7.3) afin de disposer de cette fonctionnalité.

 

Exemple :

Concrètement, le source est copié dans un fichier de QTEMP avant d’être compilé de façon classique :

 

Si vous utilisez des INCLUDE, cette commande est également modifiée, et vous avez la possibilité d’indiquer un répertoire contenant vos sources dans l’IFS.

 

Une remarque concernant l’intégration dans RDi :

  • impossible de compiler depuis l’IFS directement, il vous faut définir une action utilisateur (comme pour le RPGLE)
  • je vous conseille de modifier le formatage automatique de code CL pour ne pas dépasser 80 colonnes (le compilateur tronque à 80 caractères)

 

Nul doute que cette fonctionnalité va permettre rapidement l’adoption de l’IFS. D’autres alternatives existent déjà, principalement dans le projet Open Source OSSILE https://github.com/OSSILE/OSSILE/tree/master/main/crtfrmstmf. Ce dernier garde tout son sens pour compiler depuis l’IFS n’importe quel source pour lequel le compilateur ne propose que les fichiers sources classiques (DSPF, …).

 

Suite à vos retours et demandes, nous avons fait évoluer le logiciel d’administration des web services.
Principales Nouveautés de la 1.0.2
  • Abandon de XMLSERVICE, cette version fonctionne sans ce produit
  • Les commandes copiées sont mises dans /webservice/local/models, ce qui est plus lisible  pour la version multi serveurs
  • Vous avez un bouton <FILE> sur la gestion des services et des serveurs qui permet de produire une table qui liste vos ressources
  • Vous trouverez de nouveaux exemples dans le fichier source SAMPLESRC qui contient des exemples d’automatisations
  • Nous avons créer un outil de migration qui vous paramétra de garder vos logs et surtout votre paramétrage
Et surtout, nous avons réécrit une version 6.1 pour tous ceux qui ne sont pas encore en version 7.*. Cette version dispose des même fonctions que la la version standard, mais n’évoluera sans doute pas, les nouveautés n’étant livrées qu’en version 7.*.

 

La console évolue, et passe désormais en version 1.0.1 : http://www.gaia.fr/download/utilitaires/webconsole.zip.

Pour prendre en compte vos retours et commentaires, cette version apporte principalement sur la capacité de gérer plusieurs partitions depuis un système. Vous retrouverez les informations de la version précédente (cf notre article de lancement http://www.gaia.fr/console-pour-serveurs-de-services-web/).

Nous continuons à faire évoluer cet outil, et à prendre en compte vos besoins. Une des prochaines phases sera le passage en Open Source !

 

Continuez à nous transmettre vos remarques et besoins.