Une des particularités d'ILE est la notion de liage : Rappel : il s'agit de : - a/ dupliquer (lier) le code d'une procédure. soit - b/ mémoriser la localisation d'une procédure stockée dans un programme de service. Un pgm est alors constitué de procédures liées entre elles. L'une de ces procédures est déclarée procédure d'entrée. UEP = User Entry Procedure. Il s'agit du paramètre ENTMOD de la commande CRTPGM (pour un module écrit en C, c'est la procédure main() qui est UEP.) (pour un module RPG ou COBOL, il n'y a qu'une seule procédure en V3R10.) PLUS une procédure particulière générée automatiquement par le compilateur, appellée PEP (Program Entry Procedure), que l'on voit apparaître dans la liste d'invocation. |
Liste d'appel Système: S44B0164 Travail: PCAF4S1 Util: AF400CM Numéro: 067509 Indiquez vos options, puis appuyez sur ENTREE. 5=Afficher détails Niveau Pgm ou Opt demande procédure Bibliothèque Spécification Instruction 4 QUIMGFLW QSYS 0486 5 QUICMD QSYS 03E5 QUOCPP QPDA 0591 QUOMAIN QPDA 00DF 6 QUOCMD QSYS 015E 5 PEP --> _QRNP_PEP_ ... AF4TEMP UEP --> CHXOBJG AF4TEMP 0000000105 _QRNX_WS_E ... QSYS 0000000055 QWSGET QSYS 056B QT3REQIO QSYS 017F F3=Exit F10=Mettre à jour liste F11=Groupe d'activation F12=Annuler F16=Menu travail F17=Début F18=Fin |
Détails de la liste d'appel Système: S44B0164 Travail: PCAF4S1 Util: AF400CM Numéro: 067509 Niveau de demande . . . . . . . . : Programme . . . . . . . . . . . . : CHXOBJG Bibliothèque . . . . . . . . . . : AF4TEMP Module ILE . . . . . . . . . . . . : CHXOBJG Bibliothèque . . . . . . . . . . : QTEMP Procédure . . . . . . . . . . . . : _QRNP_PEP_CHXOBJG Groupe d'activation . . . . . . . : 0000000002 *DFTACTGRP Spécification . . . . . . . . . . : Frontière de contrôle . . . . . . : Oui Fin Appuyez sur ENTREE pour continuer. F3=Exit F12=Annuler F16=Menu travail |
Cette procédure ajoutée par le compilateur est importante : -c'est elle qui prend à sa charge le lien avec le pgm appelant (le résultat du CALL, comme avec les pgms OPM), notamment les paramètres reçus. -c'est elle qui active la procédure UEP et retransmet les paramètres. - et enfin, occupant une place dans la liste d'invocation, il faudra en tenir compte lors des envois de messages. [(*PRV *) n'est plus le pgm appelant, mais la PEP, par exemple.] MODA ............. ......... CRTPGM PGM(ESSAI) : _________ : ESSAI *PGM : proc1 : MODULE(MODA + : | PEP | : :.......: MODB) : |_______| : MODB ENTMOD(MODA) : | proc1 | : ......... : |_______| : : proc2 : : | proc2 | : :.......: : |_______| : :...........: |
Le passage d'une procédure à l'autre (proc1 à proc2) se fera par : CALLB (en rpg) CALL PROCEDURE (en cobol) CALLPRC (en CL) avec les règles du passage de paramètres traditionnel. Une alternative au passage de paramètres est la déclaration de variables globales. (non supportées par le CL) proc1 : DVAR1 S 10 EXPORT proc2: DVAR1 S 10 IMPORT la variable VAR1 est globale (accessible par l'ensemble des procédures) MAIS : l'espace de stockage est alloué par proc1. il ne faut donc pas utiliser VAR1 si la procédure proc1 n'a pas été initialisée (appelée). |
En ce qui concerne les programmes de service, la mise en oeuvre peut être un peu plus complexe. avec EXPORT(*ALL) : toutes les procédures, toutes les avriables globales sont accessibles (publiques) MODA .................. ............................... : proca : CRTSRVPGM : procédure ! variables ! P : : VAR1 IMPORT : :-----------!-------------! u : : VAR2 EXPORT : SRVPGM(essaisrv) : proca ! VAR2 ! b : :................: : procb ! VAR1 ! l : MODB MODULE(MODA + : procz ! ! i : .................. MODB + :-------------------------! c : : procb : MODC) : ______________________ ! - : : VAR1 EXPORT : : | proca VAR1 IMPORT | ! P : :................: EXPORT(*ALL) : |_______VAR2 EXPORT__| ! r : MODC : | procb VAR1 EXPORT | ! i : .................. : |____________________| ! v : : procz : : | procz callb procb | ! é : : CALLB procb : : |____________________| ! : :................: :.............................: |
Vous pouvez faire en sorte que : -procb soit une procédure interne (un "sous-programme"), uniquement accessible par proca et procz. -VAR1 soit une variable réservée à la communication entre les procédures du programme de service. MODA .................. ............................... : proca : CRTSRVPGM : procédure ! variables ! P : : VAR1 IMPORT : :-----------!-------------! u : : VAR2 EXPORT : SRVPGM(essaisrv) : proca ! VAR2 ! b : :................: : procz ! ! l : MODB MODULE(MODA + : ! ! i : .................. MODB + :------------------------ ! c : : procb : MODC) : ______________________ ! - : : VAR1 EXPORT : : | proca VAR1 IMPORT | ! P : :................: EXPORT(*SRCFILE) : |_______VAR2 EXPORT__| ! r : MODC : | procb VAR1 EXPORT | ! i : .................. SRCFILE(QSRVSRC) : |____________________| ! v : : procz : SRCMBR(*SRVPGM) : | procz callb procb | ! é : : CALLB procb : : |____________________| ! : :................: :.............................: |
Il existe donc un langage de liage (langage interprété, type de source BND) Constitué de trois commandes à la syntaxe CL (F4 possible) STRPGMEXP EXPORT <-- répétée x fois. ENDPGMEXP et ce sont les coordonnées du membre source contenant ce langage que l'on indique sur la commande CRTSRVPGM (paramètre SRCFILE, SRCMBR). Exemple : (pour rendre privées procb et VAR1) commande | QSRVSRC mbr :ESSAISRSV CRTSRVPGM SRVPGM(ESSAISRV) | STRPGMEXP MODULE(MODA MODB + | EXPORT SYMBOL('proca') MODC) | EXPORT SYMBOL('procz') EXPORT(*SRCFILE) | EXPORT SYMBOL(VAR2) SRCFILE(QSRVSRC) | ENDPGMEXP SRCMBR(*SRCMBR) | SYMBOL représente soit le nom d'une procédure, soit le nom d'une variable Tout ce qui n'est pas indiqué par EXPORT est privé. |
STRPGMEXP (détail) PGMLVL *CURRENT *CURRENT,*PRV LVLCHK *YES *YES,*NO SIGNATURE *GEN *GEN,valeur-alpha le système génère une signature identifiant le programme de service, assez identique dans le principe au contrôle de niveau exercé sur les fichiers. Tout programme utilisant une procédure d'un programme de service, mémorise la signature du *SRVPGM, et effectue un contrôle lors de l'utilisation. Le paramètre SIGNATURE permet d'imposer une signature particulière (pour avoir toujours la même en cas de recompliation) Le paramètre LVLCHK(*NO) demande au système de générer une signature nulle indiquant que les programmes utilisant une des procédures ne doivent pas contrôler lors de l'appel. Le paramètre PGMLVL(*PRV) permet le support des signatures précédentes, en cas de nouvelle version du programme de service : |
Si vous ajoutez une procédure (procd) au programme de service, il faut : a/ compiler la nouvelle procédure (= nouveau module) b/ re-lier le programme de service Le but est d'éviter de re-lier tous les programmes utilisant ce *SRVPGM (ce qui serait obligatoire si nous laissons les valeurs par défaut) Solution: générer une nouvelle signature, tout en conservant l'ancienne. STRPGMEXP EXPORT SYMBOL('proca') EXPORT SYMBOL('procz') EXPORT SYMBOL(VAR2) EXPORT SYMBOL('procd') ENDPGMEXP /* génération d'une signature identique à la précédente */ STRPGMEXP PGMLVL(*PRV) EXPORT SYMBOL('proca') EXPORT SYMBOL('procz') EXPORT SYMBOL(VAR2) ENDPGMEXP |
Pour terminer, n'oubliez pas qu'une procédure d'un programme de service peut utiliser une procédure d'un autre programme de service. CRTSRVPGM SRVPGM( -- ) MODULE( -- ) BNDSRVPGM( -- ) <- autres *SRVPGM liés. et que si vous utilisez souvent les mêmes modules, les mêmes *SRVPGM vous avez intérêt à créer une BINDING DIRECTORY. CRTBNDDIR BNDDIR(TOTO) ADDBNDDIRE BNDDIR(TOTO) OBJ(MODB *MODULE) ADDBNDDIRE BNDDIR(TOTO) OBJ(MONSRV *SRVPGM) CRTSRVPGM SRVPGM(ESSAISRV) MODULE(MODA MODC) BNDDIR(TOTO) Toute référence non résolue lors du liage sera recherchée dans la Binding Directory indiquée sur la commande CRTPGM,CRTSRVPGM (paramètre BNDDIR), ce qui évite de lister à chaque fois tous les *SRVPGM utilisés. Le système utilise toujours un répertoire QUSAPIBD qui référence toutes les APIs ILE(inutile donc de lister les *SRVPGM pour ces APIs) |
Mise en évidence de tous ces concepts à travers la commande DSPSRVPGM (DSPPGM fournit des informations analogues) A suivre... |
DSPSRVPGM QLEAWI Informations sur un programme de service Ecran 1 sur 10 Programme de service . . . . . . . . . . : QLEAWI Bibliothèque . . . . . . . . . . . . . : QSYS Propriétaire . . . . . . . . . . . . . . : QSECOFR Attribut du programme de service . . . . : Détail . . . . . . . . . . . . . . . . . : *BASIC Informations sur la création du programme de service: Date et heure de création du programme de service: 04/11/94 13:16:39 Fichier source d'exportation . . . . . . . . . . : QSRVSRC Bibliothèque . . . . . . . . . . . . . . . . . : QBUILDSS1 Membre d'exportation . . . . . . . . . . . . . . : QLEAWI Attribut du groupe d'activation . . . . . . . . : *CALLER Groupe d'activation partagé . . . . . . . . . . : *NO Signature d'exportation en cours . . . . . . . . : 44F70FABA08585397BDF0CF1 95F82EC1 Profil utilisateur . . . . . . . . . . . . . . . : *USER ############################## A suivre... Appuyez sur ENTREE pour continuer. # Signature générée. # ############################## F3=Exit F11=Signature alphanumérique F12=Annuler |
Informations sur un programme de service Ecran 2 sur 10 Programme de service . . . . . . . . . . : QLEAWI Bibliothèque . . . . . . . . . . . . . : QSYS Propriétaire . . . . . . . . . . . . . . : QSECOFR Attribut du programme de service . . . . : Détail . . . . . . . . . . . . . . . . . : *SIZE Taille du programme de service (décomprimé) et maxima: Taille totale du programme de service (ko): En cours . . . . . . . . . . . . . . . . . . . : 323 Maximale . . . . . . . . . . . . . . . . . . . : 26214400 Nombre de modules: En cours . . . . . . . . . . . . . . . . . . . : 21 <- modules liés Maximal . . . . . . . . . . . . . . . . . . . : 16381 Nombre de programmes de service: En cours . . . . . . . . . . . . . . . . . . . : 5 <- autres *SRVPGM Maximal . . . . . . . . . . . . . . . . . . . : 32766 utilisés ... Appuyez sur ENTREE pour continuer. F3=Exit F12=Annuler |
Informations sur un programme de service Ecran 3 sur 10 Programme de service . . . . . . . . . . : QLEAWI ################ Bibliothèque . . . . . . . . . . . . . : QSYS # # Propriétaire . . . . . . . . . . . . . . : QSECOFR # détail # Attribut du programme de service . . . . : # des # Détail . . . . . . . . . . . . . . . . . : *MODULE # modules # # liés. # Indiquez vos options, puis appuyez sur ENTREE. # # 5=Afficher description 6=Imprimer description ################ Date de Niveau Données de Opt Module Bibliothèque Attribut création optimisation débogage QLEDEH QBUILDSS1 CLE 04/08/94 *FULL *NO QLETOOL QBUILDSS1 CLE 04/08/94 *FULL *NO QLEPM QBUILDSS1 CLE 04/08/94 *FULL *NO QLETREC QBUILDSS1 CLE 04/08/94 *FULL *NO QLESCAW QBUILDSS1 CLE 04/08/94 *FULL *NO QLESC QBUILDSS1 CLE 04/08/94 *FULL *NO QLERTX QBUILDSS1 CLE 04/08/94 *FULL *NO A suivre... F3=Exit F12=Annuler F17=Début F18=Fin |
Informations sur un programme de service Ecran 4 sur 10 Programme de service . . . . . . . . . . : QLEAWI ################### Bibliothèque . . . . . . . . . . . . . : QSYS # Détail des # Propriétaire . . . . . . . . . . . . . . : QSECOFR # *SRVPGM # Attribut du programme de service . . . . : # --------------- # Détail . . . . . . . . . . . . . . . . . : *SRVPGM # notamment leurs # # signatures # Indiquez vos options, puis appuyez sur ENTREE. # au moment # 5=Afficher # du liage avec # # QLEAWI. # Programme # # Opt de service Bibliothèque Signature ################### QLETPS QSYS D8D3C5E3D7E240404040404040404040 QLECWI QSYS FFB714CFF747ECD0DB3DFAFB271C4C8E QLESSNFP QSYS D8D3C5E2E2D5C6D74040404040404040 QC2UTIL1 QSYS CB1F803582C31AC25B4DCBDD1B6D0948 QC2UTIL2 QSYS A11653CED63C16950B06C44C1F6E95C2 Fin F3=Exit F4=Invite F11=Signature alphanumérique F12=Annuler F17=Début |
Informations sur un programme de service Ecran 5 sur 10 Programme de service . . . . . . . . . . : QLEAWI Bibliothèque . . . . . . . . . . . . . : QSYS Propriétaire . . . . . . . . . . . . . . : QSECOFR Attribut du programme de service . . . . : Détail . . . . . . . . . . . . . . . . . : *PROCEXP Exportations de procédure : Q LE leDefaultEh CEEMRCR ############################### CEEMGET # # CEEMOUT # Liste des procédures # CEEMSG # publiques. # CEENCOD # # CEEDCOD ############################### Q LE leBdyCh Q LE leBdyEpilog CEE4FCB A suivre... F3=Exit F12=Annuler F17=Début F18=Fin |
Informations sur un programme de service Ecran 6 sur 10 Programme de service . . . . . . . . . . : QLEAWI Bibliothèque . . . . . . . . . . . . . : QSYS Propriétaire . . . . . . . . . . . . . . : QSECOFR Attribut du programme de service . . . . : Détail . . . . . . . . . . . . . . . . . : *DTAEXP Exportations de données : Q LE AG_user_rc ############################### Q LE AG_prod_rc # # # Liste des variables # # globales publiques. # # # ############################### Fin F3=Exit F12=Annuler F17=Début F18=Fin |
Il est possible de ne modifier qu'une seule procédure (phase de liage) avec UPDPGM, UPDSRVPGM. Si vous modifiez le code de proca a/ modif du source, recompilation (l'ancien module est placé dans QRPLOBJ) b/ UPDSRVPGM SRVPGM(ESSAISRV) MODULE(MODA) EXPORT(*CURRENT) = liage de la nouvelle version du module MODA dans le *SRVPGM (avec EXPORT(*CURRENT), la signature est inchangée) UPDPGM fonctionne de la même manière, sans le paramètre EXPORT (les programmes ILE n'ayant pas de signature) |
DSPPGMREF qui fournissait déja la liste des programmes utilisés (par CALL) fournit maintenant la liste des *SRVPGM utilisés. si vous renseignez le paramètre OBJTYPE à *ALL (*PGM par défaut). Voir la variable WHOTYP de QADSPPGM (10 alpha) contenant le type d'objet en clair (*SRVPGM, *PGM, *FILE ...) L'API QBNLPGMI renvoie des infos concernant un pgm ILE, dans un *USRSPC. format PGML0100 = liste des modules liés PGML0200 = liste des *SRVPGM utilisés. L'API QBNLSPGM renvoie des infos concernant un *SRVPGM, dans un *USRSPC. format SPGL0100 = liste des modules liés SPGL0200 = liste des *SRVPGM utilisés SPGL0600 = liste des procédures publiques SPGL0700 = liste des variables globales publiques SPGL0800 = liste des signatures |
V3R60 : Nouvelle commande RTVBNDSRC permettant de retrouver le source (BND) ayant servi à la création d'un programme de service. Nouvelle option COPYRIGHT() sur la spécif H en RPG-IV Les noms de procédures passent à 4096 caractères !!!! Il est alors admis de noter le nom de la procédure avec des caractères de remplacement dans le source BND: exemple : "ex>>>" = la procédure commencant par 'ex' "<<<ex>>>" = la procédure contenant 'ex' Si plusieurs procédures correspondent à votre écriture, le lieur signale une erreur et le programme de service n'est pas créé. Si vous modifiez la racine ("exemp>>>" à la place de "ex>>>") le lieur génère une NOUVELLE SIGNATURE ! |