User space - exemple d'utilisation

BoTTom |    Changer de couleur
 
          Exemple d'utilisation d'un user space. 
 
              1/ Appel d'un pgm CL "EXEMP01"  
                       + création *USRSPC "EXEMP" dans QTEMP.
                       + remplissage par API QUSMBRL (liste des membres)
              2/ Appel d'un pgm RPG "EXEMP02" 
                       + lecture du user space et traitement
 
              /* PGM CL "EXEMPL01" */
          PGM PARM(&FIC &LIB)
          DCL &FIC    *CHAR 10
          DCL &LIB    *CHAR 10
          DCL &FICLIB *CHAR 20
 
 
     /*                                         */
     /*  Ce pgm reçoit en paramètre             */
     /*         1/ un nom de fichier            */
     /*         2/ un nom de bibli (ou *LIBL)   */
     /*                                         */
 


|    Changer de couleur
 
     /*  Il va remplir un user space dans qtemp */
     /*    avec la liste des membres de ce      */
     /*    fichier puis appeler un pgm RPG      */
     /*                                         */
     /* SI LE *USRSPC N'EXISTE PAS ==> CREATION */
     /*                                         */
 
 
             CHKOBJ     OBJ(QTEMP/EXEMP) OBJTYPE(*USRSPC)
              MONMSG CPF9801 EXEC(DO)
 
               CALL QUSCRTUS PARM('EXEMP     QTEMP     '             +
     /* Attribut          */      'MBRLIST '                         +
     /* Taille initiale   */     X'00000FFF'                         +
     /* caractere initial */      ' '                                +
     /* Autorisations     */      '*CHANGE   '                       +
     /* Texte             */      'USER SPACE POUR LISTE DES MEMBRES')
 
                                  ENDDO
 
 


|    Changer de couleur
 
        /* STOCKAGE TEXTE DE LA BIBLI DANS 64 OCTETS LIBRES */
 
             IF (&LIB = '*LIBL') CHGVAR &TXTL 'Liste de bibliothèque'
             ELSE RTVOBJD    OBJ(&LIB) OBJTYPE(*LIB) TEXT(&TXTL)
 
             CALL QUSCHGUS   PARM('EXEMP     QTEMP     '             +
     /* Position de début */     X'00000001'                         +
     /* Lg des données=50 */     X'00000032'                         +
     /* Données (=TXTL)   */      &TXTL                              +
     /* FEOD (0=no)       */      '0'                                )
 
        /* REMPLISSAGE AVEC LISTE DES MEMBRES        */
 
             CHGVAR &FICLIB (&FIC *CAT &LIB)
             CALL QUSLMBR    PARM('EXEMP     QTEMP     '             +
    /* Format API        */       'MBRL0200'                         +
    /* Fichier-bibli     */       &FICLIB                            +
    /* Membre            */       '*ALL      '                       +
    /* Tenir compte des OVRDBF */ '0'                                )
 
             CALL EXEMP02      /* Appel du pgm rpg */


|    Changer de couleur
-----------------------------------------------------------------------
      *
      *  Pgm EXEMP02 (GAP III) va lire le contenu du user space
      *
      *  Data structures RTVINF ==> Extraction d'infos dans l'entete
      *                  BINDS  ==> Déclaration de données binaires
      *                  QUALDS ==> User space + bibliothèque
      *
     IRTVINF      DS
     I                                    B   1   40FIN
     I                                    B   5   80TAILLE
     I                                        1   8 RTVH
     I                                    B   9  120NBPOST
     I                                    B  13  160LGPOST
     IBINDS       DS
     I                                    B   1   40DEBUT
     I                                    B   5   80LG
     I                                    B   9  120LGDS
     IQUALDS      DS
     I                                        1  10 SPCNAM
     I                                       11  20 SPCLIB
     I                                        1  20 USRSPC


|    Changer de couleur
      *
      *  Data structures HEADER ==> Entete générée par l'API
      *                  LIST   ==> Découpage d'un poste de la liste
     IHEADER      DS
     I                                        1  10 FICNAM
     I                                       11  20 FICLIB
     I                                       21  30 FILATR
     I                                       31  80 FICTXT
     I                                    B  81  840MBRNAH
     I                                       85  85 SRCF
     ILIST        DS
     I                                        1  10 MBRNAM
     I                                       11  20 TYPE
     I                                       21  33 CRTDAT
     I                                       34  46 LSTCHG
     I                                       47  96 MBRTXT
      *
      *  Initialisation des variables (user space et bibliothèque)
      *
     C                     MOVEL'EXEMP '  SPCNAM
     C                     MOVEL'QTEMP'   SPCLIB
      *


|    Changer de couleur
      *
      * Extraction texte de la bibliothèque, placé par le pgm CL.
      *                                      (rappel de la DS utilisée)
      *BINDS       DS
      *                                   B   1   40DEBUT
      *                                   B   5   80LG
 
     C                     Z-ADD1         DEBUT
     C                     Z-ADD50        LG
     C                     CALL 'QUSRTVUS' 
     C                     PARM           USRSPC
     C                     PARM           DEBUT
     C                     PARM           LG
     C                     PARM           TXTLIB
 
 
 
 
 
 
 
 


|    Changer de couleur
      *
      * Extraction position de l'entète (renvoyée dans FIN) ----
      *                                                        !
      *RTVINF      DS                                          !
      *                                   B   1   40FIN   <----!
      *                                   B   5   80TAILLE
      *                                       1   8 RTVH
 
 
     C                     Z-ADD117       DEBUT
     C                     Z-ADD8         LG
     C                     CALL 'QUSRTVUS' 
     C                     PARM           USRSPC
     C                     PARM           DEBUT
     C                     PARM           LG
     C                     PARM           RTVH
     C           FIN       ADD  1         DEBUT 
     C                     Z-ADDTAILLE    LG
 
 
 
 


|    Changer de couleur
      *
      * Extraction des infos d'entète (Retrouve nom du fichier) ---
      *                                                           !
      *HEADER      DS                                             !
      *                                       1  10 FICNAM <------!
      *                                      11  20 FICLIB
      *                                      21  30 FILATR
      *                                      31  80 FICTXT
      *                                   B  81  840MBRNAH
      *                                      85  85 SRCF
 
 
     C                     CALL 'QUSRTVUS' 
     C                     PARM           USRSPC
     C                     PARM           DEBUT
     C                     PARM           LG
     C                     PARM           HEADER
 
 
 
 
 


|    Changer de couleur
      *
      * Extraction des infos sur la liste
      *        (POSITION DE DEBUT    NOMBRE DE POSTES  LG D'UN POSTE)
      *                   !            !                       !
      *RTVINF      DS     !            !                       !
      *                   !------------!->B   1   40FIN        !
      *                                !  B   5   80TAILLE     !
      *                                !->B   9  120NBPOST     !
      *                                   B  13  160LGPOST <---!
 
     C                     Z-ADD125       DEBUT
     C                     Z-ADD16        LG
     C                     CALL 'QUSRTVUS' 
     C                     PARM           USRSPC
     C                     PARM           DEBUT
     C                     PARM           LG
     C                     PARM           RTVINF
     C                     Z-ADDLGPOST    LG
     C           FIN       ADD  1         DEBUT            1ER POSITION
 
 
 


|    Changer de couleur
      *
      *
      * Boucle sur nombre de postes extraits
      *
     C                     DO   NBPOST
      *
      * Extraction d'un poste par API QUSRTVUS
      *
      *LIST        DS
      *                                       1  10 MBRNAM
      *                                      11  20 TYPE
      *                                      21  33 CRTDAT
      *                                      34  46 LSTCHG
      *                                      47  96 MBRTXT
     C                     CALL 'QUSRTVUS' 
     C                     PARM           USRSPC
     C                     PARM           DEBUT
     C                     PARM 96        LGDS         (lg de LIST)
     C                     PARM           LIST
      *
     C*  traitement du poste lu
     C*                (par exemple ecriture dans sous-fichier)


|    Changer de couleur
      *
      * Positionnement sur prochain poste
     C                     ADD  LG        DEBUT
     C                     ENDDO
      *
      * Fin du pgm RPG
      *
     C                     MOVE *ON       *INLR
 
-----------------------------------------------------------------------
 
   /* Retour au pgm CL EXEMP01
 
              DLTUSRSPC QTEMP/EXEMP  /* ou API QUSDLTUS */
 
              ENDPGM
 
 
 
 
 
 


|    Changer de couleur
 
 Autre exemple en RPG-IV avec des pointeurs (Spécif C étendue)
 
     Dusrspc           s             20    inz('EXEMP     QTEMP')
 
      * va contenir l'adresse de début du User Space
     Dpointeur         s               *
     DI                s             10i 0
 
      * l'entête
     Dptrinfos         s               *
     DRTVINF           ds                  based(ptrinfos)
     D  offset                       10i 0
     D  taille                       10i 0
     D  nbpostes                     10i 0
     D  lgposte                      10i 0
 
      * la liste
     dptrliste         s               *
     DLIST             ds                  based(ptrliste)
     d  ... (informations membre, idem RPG III)
 


|    Changer de couleur
 
      * prototype pour API qui retrouve pointeur de début
     dQUSPTRUS         PR                  EXTPGM('QUSPTRUS')
     d  space                        20
     d  ptr                            *
 
 
      * extraction du pointeur de début
     c                   callp     QUSPTRUS(usrspc : pointeur)
 
      * positionnement sur la partie entête
     c                   eval      ptrinfos = pointeur + 124
 
 
      * maintenant RTVINF  (DS) a un contenu valide
      * (rappel)
      *DRTVINF   e       ds                  based(ptrinfos)
      *D  offset                       10i 0
      *D  taille                       10i 0
      *D  nbpostes                     10i 0
      *D  lgposte                      10i 0
 


|    Changer de couleur
 
      * positionnement sur le premier poste
      *  (la structure "LIST" vient se positionner "par dessus")
 
     c                   eval      ptrliste = pointeur + offset
 
 
 
      * boucle (nbpostes fois)
     c                   for       i = 1 to nbpostes
      * traitement d'un élément
     c                   ...
     c                   ...
     c                   ...
     c                   ...
     c                   ...
     c                   if        i < nbpostes
     c                   eval        ptrliste = ptrliste + lgposte
     c                   endif
 
     c                   endfor
 


|    Changer de couleur
 
      /free
 
          // en format libre
 
          QUSPTRUS(usrspc : pointeur);
          ptrinfos = pointeur + 124;
          ptrliste = pointeur + offset;
 
 
          // boucle (nbpostes fois)
         for  i = 1 to nbpostes;
              // traitement d'un élément
                      ...
                      ...
                      ...
              if        i < nbpostes;
                   ptrliste = ptrliste + lgposte;
              endif;
         endfor;
 
      /end-free


|    Changer de couleur
             PGM        PARM(&BIB)
 /* ===================================================================== */
 /* BUT : lister les RÉCEPTEURS DE JOURNAUX AFIN DE LES DÉTRUIRE          */
 /*        -> utilisation des pointeurs en CL V5R40                       */
 /*        -> utilisation des variables basées sur pointeur               */
 /*        -> utilisation des sous zones (comme une DS en RPG)            */
 /* ===================================================================== */
             DCL        VAR(&COMPTEUR) TYPE(*INT)
             DCL        VAR(&QUAL) TYPE(*CHAR) LEN(20) VALUE(*ALL)
             DCL        VAR(&BIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&pointeur) TYPE(*PTR)
 
                        /* un pointeur */ 
             DCL        VAR(&PTRINFOS) TYPE(*PTR)
             DCL        VAR(&DATA) TYPE(*CHAR) STG(*BASED) LEN(16) +
                          BASPTR(&PTRINFOS) /* basée sur un pointeur */ 
             DCL        VAR(&DEBUT) TYPE(*INT) STG(*DEFINED) +
                          DEFVAR(&DATA)  /* sous zone de &DATA */ 
             DCL        VAR(&NOMBRE) TYPE(*INT) STG(*DEFINED) DEFVAR(&DATA +
                          9)             /* sous zone de &DATA */
             DCL        VAR(&TAILLE) TYPE(*INT) STG(*DEFINED) DEFVAR(&DATA +
                          13)            /* sous zone de &DATA */


|    Changer de couleur
 
             DCL        VAR(&ptrretour) TYPE(*PTR)
             DCL        VAR(&RETOUR) TYPE(*CHAR) STG(*BASED) LEN(30) +
                          BASPTR(&PTRRETOUR)
             DCL        VAR(&OBJ) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
                          DEFVAR(&RETOUR)
             DCL        VAR(&OBJLIB) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
                          DEFVAR(&RETOUR 11)
             DCL        VAR(&OBJTYPE) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
                          DEFVAR(&RETOUR 21)
 
             DLTUSRSPC QTEMP/DLTLIBRCV
              MONMSG     MSGID(CPF2105) EXEC(RCVMSG PGMQ(*SAME) +
                          MSGTYPE(*EXCP))
 
 /* CRÉATION DU USER SPACE */
              CALL       PGM(QUSCRTUS) PARM('DLTLIBRCV QTEMP' /* USRSPC   */ +
                                            '          '      /* ATTRIBUT */ +
                                            X'0000FFFF'       /* TAILLE   */ +
                                            X'00'             /* VAL INIT */ +
                                            '*USE'            /* DROITS   */ +
                                            'POUR DLTLIBRCV') /* TEXTE    */


|    Changer de couleur
 
 /* REMPLISSAGE, LISTE DES OBJETS (de type *JRNRCV) */
             CHGVAR     VAR(%SST(&QUAL 11 10)) VALUE(&BIB)
             CALL QUSLOBJ  PARM('DLTLIBRCV QTEMP'  /* USRSPC   */       +
                                'OBJL0100'         /* FORMAT   */       +
                                &QUAL              /* bib/obj  */       +
                                '*JRNRCV'          /* type     */       +
                               )
 
 /* positionnement sur début du User Space (adresse 1) */
             CALL       PGM(QUSPTRUS) PARM('DLTLIBRCV QTEMP' &Pointeur)
 
 /* récupération de &DATA, donc de &DEBUT &TAILLE ET &NOMBRE */
             chgvar     &ptrinfos &pointeur
             CHGVAR     %OFFSET(&ptrinfos) VALUE(%OFFSET(&ptrinfos) + 124 )
 
 
 /* positionnement début de liste (on place &retour DANS le USer Space)*/
             chgvar     &ptrretour &pointeur
             CHGVAR     %OFFSET(&ptrretour) VALUE(%OFFSET(&ptrretour) +
                          + &DEBUT )
 


|    Changer de couleur
 
 
             DOFOR      VAR(&COMPTEUR) FROM(1) TO(&NOMBRE) BY(1)
 
                DLTJRNRCV  JRNRCV(&OBJLIB/&OBJ)
                  MONMSG     MSGID(CPF7022) /* récepteur attaché */
 
               if         (&compteur < &nombre) then(do)
                  CHGVAR     %OFFSET(&ptrretour) VALUE(%OFFSET(&ptrretour) +
                               + &TAILLE)
               ENDDO
             ENDDO
 
 
 /* RENVOI D'UN MASSAGE d'ACHEVEMENT */
 COMPMSG:
             DLTUSRSPC QTEMP/DLTLIBRCV
             SNDPGMMSG  MSG('Ménage sur les récepteurs de journaux +
                          effectué') TOPGMQ(*PRV (*PGMBDY)) +
                          MSGTYPE(*COMP)
 ENDPGM
 





©AF400