Utiliser des API en CLP

BoTTom |    Changer de couleur
 
      A P I  Présentation.  (Application Program Interface)
 
             Routines de l'OS/400 permettant à des pgms utilisateurs
              d'exécuter par appel de pgm, certaines fonctions système
              (ou logiciel, cf API d'office/400)
 
      API déja connues :   cdes + QCMDEXC
                                + QCMDCHK
 
                        Chaînes + QCLSCAN
                        de car. + QDCXLATE
 
                         Dtaq   + QSNDDTAQ
                                + QRCVDTAQ
                                + QCLRDTAQ
                                + QMHQRDQD (retrouver déf. d'une dtaq)
 
                         plus   API pour office/400
                                API diverses (terminal virtuel,...)
 
 


|    Changer de couleur
 
 Nous parlerons ici, des API retournant des informations système.
 
      Nous les classerons dans deux catégories :
 
      1/ capables de retourner de l'information sur un élément connu
 
         - on fournit les coordonnées de l'élément (un nom d'unité par ex.)
 
         - le système retourne toutes les infos concernant cette unité.
 
 
      2/ API de liste
 
         - le système fournit dans un objet de type *USRSPC, une liste
            d'éléments (liste des spools d'un utilisateur, par exmple)
 
         - la manipulation du USER SPACE (suite d'octets simple)
            se fait elle meme par API (création, lecture, etc...)
 
 
 


|    Changer de couleur
 
   LES FORMATS API.
 
       Chaque API d'extraction de données ou de remplissage de *USRSPC
        a besoin d'une notion de format.
 
       Le format permet d'indiquer à l'API comment formater les
        données renvoyées ou stockées dans le *USRSPC.
 
       Certaines API ne reconnaissent qu'un format.
       D'autre plusieurs.
 
       Les formats sont reconnus par leur nom xxxxzzzz
           xxxx = identification de l'API XXXX
 
           zzzz = N° d'ordre du format 0100,0200,0300 etc...
 
       Le format 0200 est toujours plus complet que le format 0100,
        mais le traitement plus long.
 
  Tous les formats sont donnés dans QSYSINC (option 13 de l'OS/400).
 


|    Changer de couleur
 
 En V3R20,V3R70 on peut retrouver l'adresse IP d'une session TELNET
    (fonction disponible via PTF), à l'aide de l'API QDCRDEVD
    mais dans le format DEVD0600, uniquement.
 
Exemple :
 
 
   DCL &RETOUR *CHAR 900
   DCL &BIN *CHAR 4
   DCL &FORMAT *CHAR 8 'DEVD0600'
   DCL &DEV    *CHAR 10
   DCL &ERR    *CHAR 8  X'0000000000000000'
   DCL &IPADR  *CHAR 15
 
   CHGVAR     %BIN(&BIN) 900
   RTVJOBA    JOB(&DEV)
 
   CALL QDCRDEVD  PARM(&RETOUR &BIN &FORMAT &DEV &ERR)
 
   CHGVAR &IPADR %SST(&RETOUR 878 15)
 


|    Changer de couleur
 
                  Structure d'un USER SPACE.
              De                          à  
                ..........................           --
      1       01: Espace utilisateur     :            ! Octets à blanc pour
                : (64 octets à blanc)    :            ! la communication
                ..........................64         -- entre programmes
      2       65: ENTETE GENERALE        :            !
                :   DU USER SPACE        :             > Découpage image
                :                        :            !   suivante
                ..........................140        --
      3      141: Rappel des paramètres  :  INPUT     !
                :  reçus par l'API       :            !
                ..........................            !
      4         : En-tête API            :  HEADER    !  voir structures
                :  (valeurs rencontrées) :             > dans QSYSINC
                ..........................            !  (5769ss1 opt 13.)
      5         : Liste générée par      :  LIST      !
                :  l'API.                :            !
                :                        :           --
                :                        :
                :........................:???


|    Changer de couleur
............................................................................
: X  :  De   :   à   :Fmt: Signification                                   :
:..........................................................................:
: 40 :  65   :  68   : B : Taille de l'en-tête générale (2)                :
: 44 :  69   :  72   : C : Version, "0100" pour V2R1.0                     :
: 48 :  73   :  80   : C : Nom du format utilisé par l'API (ex:OBJD0100)   :
: 50 :  81   :  90   : C : Nom de l'API ayant généré la liste              :
: 5A :  91   : 103   : C : Siècle-date-heure(SDDDDDDHHHHHH) de remplissage :
: 67 : 104   : 104   : C : Etat (C=Complet,I=Incomplet,P=Partiel)          :
: 68 : 105   : 108   : B : Nb d'octets utilisés dans le user space         :
:    :       :       :                                                     :
: 6C : 109   : 112   : B : Déplacement pour atteindre la zone INPUT        :
: 70 : 113   : 116   : B : Taille de la zone INPUT                         :
:    :       :       :                                                     :
: 74 : 117   : 120   : B : Déplacement pour atteindre la zone HEADER       :
: 78 : 121   : 124   : B : Taille de la zone HEADER                        :
:    :       :       :                                                     :
: 7C : 125   : 128   : B : Déplacement pour atteindre la liste (LIST)      :
: 80 : 129   : 132   : B : Taille de la liste                              :
: 84 : 133   : 136   : B : Nb d'entrées dans la liste                      :
: 88 : 137   : 140   : B : Taille de chaque entrée.                        :
:....:.......:.......:...:.................................................:


|    Changer de couleur
 
   Les adresses hexa (colonne X) sont données à titre indicatif pour
    pouvoir lire un DUMP.
 
   Tous les DEPLACEMENTS sont relatifs (c'est le nombre d'octets dont il
    faut se déplacer à partir du début du user space pour atteindre l'info
    désirée).
   ==> il faut ajouter 1 pour avoir la position du 1er octet.
       (cet ajout a été fait sur le tableau ci-dessus)
 
   La zone INPUT contient un rappel des paramètres envoyés à l'API
 
   La zone HEADER contient des infos sur le(s) objet(s) rencontré(s).
 
     Cette zone n'est pas toujours présente (suivant les API)
 
     Par exemple pour la liste des membres elle contient le nom de la
      bibliothèque du fichier à la place de *LIBL, et le nombre de membres
      dans le fichier.
 
   La zone LIST (dans QSYSINC) donne le découpage d'UN poste, à vous
    de boucler autant de fois que nécessaire (suivant nombre de postes)


|    Changer de couleur
 
  Il est possible de récupérer une information binaire contenue dans
      une structure (très utile avec les API) par %BIN.
 
              DCL        VAR(&A) TYPE(*CHAR) LEN(256)  VALUE(X'0000000A')
              DCL        VAR(&I) TYPE(*DEC)  LEN(10 0)
 
            /*                                                         */
            /* Je veux récupérer l'information binaire en position 1   */
            /*                                                         */
              CHGVAR     VAR(&I) VALUE(%BIN(&A 1 4))
                !                        !  !-----!
       ----------------                  !      !
       modif. d'une                      !      !
       variable               ----------------  !
      (ici, numérique)        extraction d'une  ---------------------------
                              information       Variable extraite depuis la
                               binaire          position 1 sur 4 octets
 
  Depuis la V5R30, nous pouvons déclarer directement des variables binaires
 
             DCL        VAR(&NOMBRE)   TYPE(*INT)


|    Changer de couleur
 
       Les API permettant de manipuler un user space.
 
 
         Création
                           + QUSCRTUS
 
                           - CHAR(20) <-*usrspc(10c)-><-biblio(10c)->
                           - CHAR(10) attribut (ce que vous voulez)
                           - BIN(4,0) Taille initiale
                           - CHAR(1)  Valeur initiale de chaque octet
                             [mettre x'00' augmente les performances]
                           - CHAR(10) Autorisation pour *PUBLIC
                           - CHAR(50) texte descriptif
                      ------------------Paramètres optionnels---------------
                           - CHAR(10) remplacement (*yes/*no)
                           - CHAR(?)  code retour
                      ------------------Paramètre optionnel (2)-------------
                           - CHAR(10) domaine
 
 
 


|    Changer de couleur
 
       Les API permettant de manipuler un user space.
 
 
         Extraction
                           + QUSRTVUS
 
                           - CHAR(20) <-*usrspc(10c)-><-biblio(10c)->
                           - BIN(4,0) Position de début dans le user space
                           - BIN(4,0) Lg des données à extraire
                           - CHAR(?)  Variable de retour
 
 
          La position de début est donnée par le format de l'en-tête
           (voir structure d'un user space) ou par un déplacement "lu"
           dans l'en-tête par un appel précédent (voir l'exemple)
 
 
          La manipulation d'USER SPACE en RPG-IV peut se faire par pointeur
           (plus rapide) grace à l'API QUSPRTUS.
 
 


|    Changer de couleur
 
       Les API permettant de manipuler un user space.
 
 
         Suppression:
                           + QUSDLTUS   (ou cde CL DLTUSRSPC)
 
                           - CHAR(20) <-*usrspc(10c)-><-biblio(10c)->
                           - CHAR(?)  Code retour
 
         La structure du code retour (commun à toutes les API) est :
 
        ....................................................................
        :  DE  :  A   :Fmt: Signification                                  :
        :..................................................................:
 envoyé :  1   :  4   : B : Lg du code retour(=0 -> envoi msg *ESCAPE)    :
 ------ :      :      :   :                  (>8 -> erreur "monitorée")    :
 reçus  :  5   :  8   : B : Lg nécessaire pour recevoir l'erreur           :
   !    :  9   : 15   : C : MSGID                                          :
   !    : 16   : 16   :   : Réservé                                        :
   v    : 17   :  x   : C : MSGDTA (x étant donné par positions 1 à 4)     :
        :.............:...:................................................:


|    Changer de couleur
             PGM     /* ATTENTION, V5R30 minimum */ 
 /*                                                                      */
 /* BUT : obtenir la liste des spools d'un utilisateur (API QUSLSPL)     */
 /*  afin de détruire tous les spools de plus d'un jour à l'état RDY/HLD */
 /* ==================================================================== */
             DCL        VAR(&COMPTEUR) TYPE(*INT)
             DCL        VAR(&TAILLE)   TYPE(*INT)  VALUE(32767)
             DCL        VAR(&DEBUT)    TYPE(*INT)
             DCL        VAR(&DEBUTS)   TYPE(*INT)
             DCL        VAR(&TAILLEP)  TYPE(*INT)
             DCL        VAR(&NOMBRE)   TYPE(*INT)
             DCL        VAR(&RETOUR)   TYPE(*CHAR) LEN(136)
             DCL        VAR(&CURDATE)  TYPE(*CHAR) LEN(6)
             DCL        VAR(&CURDAT7)  TYPE(*CHAR) LEN(7)
             /* DONNÉES DE SPLF0300 */
             DCL        &SPLJOB *CHAR 10
             DCL        &SPLUSR *CHAR 10
             DCL        &JOBNBR *CHAR  6
             DCL        &SPLNAM *CHAR 10
             DCL        &SPLNBR *INT
             DCL        &SPLDAT *CHAR  7
             DCL        &STATUS *INT


|    Changer de couleur
 
             RTVJOBA    DATE(&CURDATE)
             CVTDAT     DATE(&CURDATE) TOVAR(&CURDAT7) FROMFMT(*JOB) +
                          TOFMT(*CYMD) TOSEP(*NONE)
             DLTUSRSPC QTEMP/DLTALLSPLF
              MONMSG CPF0000
 
 /* CRÉATION DU USER SPACE */
             CALL QUSCRTUS PARM('DLTALLSPLFQTEMP'  /* USRSPC   */       +
                                '          '       /* ATTRIBUT */       +
                                &TAILLE            /* TAILLE   */       +
                                X'00'              /* VAL INITIALE */   +
                                '*USE'             /* DROITS */         +
                                'POUR DLTALLSPLF'  /* texte associé */  )
 /* REMPLISSAGE, LISTE DES SPOOLS */
             CALL QUSLSPL  PARM('DLTALLSPLFQTEMP'  /* USRSPC   */       +
                                'SPLF0300'         /* FORMAT   */       +
                                '*CURRENT  '       /* USER     */       +
                                '*ALL'             /* OUTQ     */       +
                                '*ALL'             /* FORMTYPE */       +
                                '*ALL'             /* USRDTA   */       )
 


|    Changer de couleur
             CHGVAR     VAR(&DEBUT) VALUE(125) /* Début de liste */
             CHGVAR     VAR(&TAILLE) VALUE(4)
             CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +
                          &TAILLE &DEBUTS)
 
             CHGVAR     VAR(&DEBUT) VALUE(133) /* Nombre de postes */
             CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +
                          &TAILLE &NOMBRE)
             CHGVAR     VAR(&DEBUT) VALUE(137) /* Taille d'1 poste */
             CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +
                          &TAILLE &TAILLEP)
 
             CHGVAR     VAR(&DEBUT) VALUE(&DEBUTS + 1) /* DEBUT de liste */
             CHGVAR     VAR(&TAILLE) VALUE(136)        /* lg de &RETOUR  */
 
             DOFOR      VAR(&COMPTEUR) FROM(1) TO(&NOMBRE) BY(1)
              CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +
                           &TAILLE &RETOUR) /* lecture */
 
              /* position pour prochaine "lecture" */
              CHGVAR &DEBUT (&DEBUT + &TAILLEP)
 


|    Changer de couleur
              CHGVAR   &SPLDAT %SST(&RETOUR 45 7)
 
              IF (&SPLDAT < &CURDAT7) THEN(DO)
 
               CHGVAR   &STATUS  %BIN(&RETOUR 41 4)
 
               IF ((&STATUS = 1) *OR (&STATUS = 6)) /* RDY OU HLD */  +
                  THEN(DO)
                CHGVAR   &SPLJOB  %SST(&RETOUR 1 10)
                CHGVAR   &SPLUSR  %SST(&RETOUR 11 10)
                CHGVAR   &JOBNBR  %SST(&RETOUR 21 6)
                CHGVAR   &SPLNAM  %SST(&RETOUR 27 10)
                CHGVAR   &SPLNBR  %BIN(&RETOUR 37 4)
 
                DLTSPLF    FILE(&SPLNAM) JOB(&JOBNBR/&SPLUSR/&SPLJOB) +
                           SPLNBR(&SPLNBR)
               ENDDO
              ENDDO
 
             ENDDO
 
             ENDPGM





©AF400