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,...) |
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...) |
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). |
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) |
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. : ! : : -- : : :........................:??? |
............................................................................ : 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. : :....:.......:.......:...:.................................................: |
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) |
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) |
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 |
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. |
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) : :.............:...:................................................: |
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 |
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 */ ) |
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) |
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 |