Sur AS/400, un programme de n'importe quel langage peut appeler un pgm de n'importe quel langage. Ceci est particulièrement vrai pour RPG, COBOL, CLP. Le lien avec le pgm appelé est dynamique, c'est à dire : - que le programme appelant ne le connaît pas avant l'exécution. - le pgm appelé est recherché quand l'ordre CALL est rencontré. + adressage du pgm + vérification des droits + chargement en mémoire, réservation d'espace pour les variables. + seules les variables passées en tant que paramètres sont partagées. - retour à l'instruction qui suit le CALL à la fin du pgm appelé. |
pgm appelant (A) ........................ : mémoire : : nocli : 00006 : : nomcli: Durant : :----------------------: : : : CALL PGMB : : PARM NOCLI : : : : : : : : : : : :......................: |
pgm appelant (A) Pgm B addressé (suivant *LIBL) chargé en mémoire si les droits sont corrects. ........................... ........................ : mémoire : : mémoire : : : : nocli : 00006 : : nomcli: : : nomcli: Durant : : nocli.adr : : :----------------------: :-------------------------: : : : LINKAGE SECTION : : CALL PGMB : : 77 NOCLI PIC 9(5) : : PARM NOCLI : : (ou *ENTRY PLIST) : : : : : : : : : : : : : : : : : : : : : :......................: : : : : :.........................: pgm appelé (B) |
pgm appelant (A) Pgm B reçoit l'adresse du paramètre et non sa valeur. ........................... ........................ : mémoire : : mémoire : : : 12345> : nocli : 00006 : : nomcli: : : nomcli: Durant : /------> nocli.adr : x'12345' : :----------------------: / :-------------------------: : :/ : LINKAGE SECTION : : CALL PGMB /: : 77 NOCLI PIC 9(5) : : PARM NOCLI / : : : : : : : : : : : : : : : : : : : : : : : :......................: : : : : :.........................: pgm appelé (B) |
pgm appelant (A) Il travaille donc sur la mémoire du pgm appelant. ........................... ........................ : mémoire : : mémoire : : : 12345> : nocli : 00001 <----\ : : nomcli: : : nomcli: Durant \ : nocli.adr : x'12345' : :----------------------: \ :-------------------------: : : \ : LINKAGE SECTION : : CALL PGMB : \ : 77 NOCLI PIC 9(5) : : PARM NOCLI : \ : : : : \ : PROCEDURE DIVISION : : : \ USING NOCLI. : : : : \ : : : : \ MOVE 1 TO NOCLI. : : : : : :......................: : : : : :.........................: pgm appelé (B) |
pgm appelant (A) UNIQUEMENT pour les paramètres reçus. ........................... ........................ : mémoire : : mémoire : : : : nocli : 00001 : : nomcli: Dupont' <----------| : nomcli: Durant : : nocli.adr : x'12345' : | :----------------------: :-------------------------: | : : : LINKAGE SECTION : | : CALL PGMB : : 77 NOCLI PIC 9(5) : | : PARM NOCLI : : : | : : : PROCEDURE DIVISION : | : : : USING NOCLI. : | : : : : | : : : MOVE 1 TO NOCLI. : | : : : MOVE 'Dupont' -----| :......................: : to NOMCLI. : : : :.........................: pgm appelé (B) |
pgm appelant (A) A la fin du pgm appelé, retour à l'instruction qui suit le CALL. ........................... ........................ : mémoire : : mémoire : : : nocli : nocli : 00001 : : nomcli: Dupont' : = 1. : nomcli: Durant : : nocli.adr : x'12345' : :----------------------: :-------------------------: : : : LINKAGE SECTION : : CALL PGMB : : 77 NOCLI PIC 9(5) : : PARM NOCLI : : : : .... <-------------\ : PROCEDURE DIVISION : : .... : \ : USING NOCLI. : : : \ : : : : \ : MOVE 1 TO NOCLI. : : : \ : MOVE 'Dupont' : :......................: \ : to NOMCLI. : \ STOP RUN. : :.........................: pgm appelé (B) |
Le pgm appelé peut rendre la main à l'appelant sans pour autant être désactivé. en RPG : RETRN/RETURN (LR OFF) en COBOL : EXIT PROGRAM. ATTENTION: ne fonctionne que si le pgm appelant est un COBOL. GOBACK en cas de doute. ou passer par un pgm COBOL "intermédiaire". en CL : cela est malheureusement impossible (RETURN = ENDPGM) si cela est possible faire en sorte que ce soit le pgm CL qui appelle (d'entrée de jeu). |
Si le pgm n'est pas désactivé: toute la phase de chargement est inhibée. sa mémoire reste intacte (telle quelle lors du RETRN/EXIT PROGRAM) il reste positionné sur ces fichiers (lecture séquentielle) en RPG , le cycle ne passe pas par la phase d'ouverture des fichiers. en COBOL, conditionner OPEN avec un flag (puisque la mémoire est intacte) Pour désactiver les pgms appelés (et fermer les fichiers) utiliser le pgm suivant: "MENAGE" (CLP) PGM RCLRSC LVL(*CALLER) ENDPGM par un CALL avant la fin du programme appelant ! |
Et ENFIN: si les deux programmes utilisent des fichiers écran (DSPF) les fichiers écrans sont suspendus et le système peut être "perdu" lors d'un réaffichage. Penser alors à indiquer RSTDSP(*YES) sur les commandes CRTDSPF ou CHGDSPF Afin que le système sauvegarde la totalité de l'image avant suspension du DSPF et la restaure avant réaffichage. Cette manipulation n'est, bien entendu, pas gratuite, particulièrement avec des terminaux éloignés. C'est pourquoi la valeur par défaut est à *NO sur la commande de création. |