pause-café
rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.
Pause-café # 1
Mars 1994
Nouvelle API QLICOBJD permet de modifier certaines infos d'un objet. paramètres : - CHAR(10) bibliothèque en retour. - CHAR(20) objet à modifier <--objet(10c)-><--biblio(10c)--> un nom un nom ou *LIBL,*CURLIB. - CHAR(10) type d'objet - CHAR(??) infos à modifier, découpé comme suit. BIN(4) nombre d'infos à modifier. puis x fois BIN(4) clé (détermine l'info à modifier) BIN(4) lg de la nouvelle valeur CHAR(??) nouvelle valeur. - CHAR(??) code erreur.
Les différentes clés admises: ! Clé ! lg ! valeur ---------------------------------------------------------------------- ! 1 ! 30 ! Fichier source <--fich(10c)-><-bib(10c)-><-mbr(10c)-> ! ! ! ! 2 ! 13 ! date de modif du source (format C YY MM DD HH MM SS) ! ! ! ! 3 ! 13 ! compilateur <-nom-du-produit(7c)-><-version(VxRyMz)-> ! ! ! (5738xx1) ! 4 ! 8 ! niveau de controle ! ! ! ! 5 ! 13 ! programme sous licence (idem compilateur) ! ! ! ! 6 ! 7 ! PTF (format XXzzzzz XX = préfixe zzzzz = n° ptf) ! ! ! ! 7 ! 6 ! APAR (n° d'analyse des incidents sur ce pgm /Azzzzz) ! ! ! ! 8 ! 1 ! cet objet peut-il être modifié par cette API 0=non ! ! ! 1=oui ! ! !
Les différentes clés admises: ! Clé ! lg ! valeur ---------------------------------------------------------------------- ! 9 ! 10 ! attribut défini par l'utilisateur. ! ! ! ! 10 ! 50 ! texte decriptif. ! ! ! ! 11 ! 1 ! remise à zéro du compteur nb de jours d'utilisation ! ! ! 0=non , 1=oui. ! ! ! ! 12 ! 4 ! ID langage associé à ce produit (29xx) ! ! ! ! 13 ! 4 ! option d'un logiciel sous licence 0=*BASE, 01 à 99 ! ! ! ! 14 ! 4 ! ID composant (laissé à votre imagination) ----------------------------------------------------------------------
exemple de CL renommant le source d'un objet et mettant à jour l'objet /* RNMOBJSRC */ IF (&COD *EQ 'R') DO RNMM FILE(&SRCL/&SRCF) MBR(&SRCM) + NEWMBR(&NEWNAM) /* API QUI PERMET DE MODIFIER LES INFOS DANS L'OBJET */ CHGVAR %BIN(&CHGINFO 1 4) 1 /* NBR DE MODIFS E */ CHGVAR %BIN(&CHGINFO 5 4) 1 /* CLE 1 = MODIF SOURCE */ CHGVAR %BIN(&CHGINFO 9 4) 30 /* LG MODIF */ CHGVAR %SST(&CHGINFO 13 30) + (&SRCF *CAT &SRCL *CAT &NEWNAM) CHGVAR %BIN(&ERRCOD) 0 CALL QLICOBJD PARM( + &RTNLIB + &NOMOBJ + &OBJTYP + &CHGINFO + &ERRCOD ) ENDDO
CPP de la commande CHGOBJAPI Calcul le nombre d'infos à modifier (&NBR) Concatène les différentes modifs dans une seule variable sous la forme <-clé-><-lg-><-nouvelles valeurs-> repété x fois PGM PARM(&OBJQ &OBJT &SRCELEM &SRCDATE + &COMPILELEM &PRDELEM &OPTION &ATTRIB + &COMPOS &ALWCHG) DCL VAR(&OBJQ) TYPE(*CHAR) LEN(20) DCL VAR(&OBJT) TYPE(*CHAR) LEN(10) DCL VAR(&SRCELEM) TYPE(*CHAR) LEN(32) DCL VAR(&SRCDATE) TYPE(*CHAR) LEN(13) DCL VAR(&COMPILELEM) TYPE(*CHAR) LEN(15) DCL VAR(&PRDELEM) TYPE(*CHAR) LEN(15) DCL VAR(&OPTION) TYPE(*CHAR) LEN(2) DCL VAR(&ATTRIB) TYPE(*CHAR) LEN(10) DCL VAR(&COMPOS) TYPE(*CHAR) LEN(10) DCL VAR(&ALWCHG) TYPE(*CHAR) LEN(1)
DCL VAR(&RTNLIB) TYPE(*CHAR) LEN(10) DCL VAR(&CODERR) TYPE(*CHAR) LEN(4) + VALUE(X'00000000') DCL VAR(&NBR) TYPE(*DEC) LEN(2 0) DCL VAR(&VAR2000) TYPE(*CHAR) LEN(2000) DCL VAR(&X41) TYPE(*CHAR) LEN(1) VALUE(X'41') DCL VAR(&DEP) TYPE(*DEC) LEN(4 0) VALUE(5) /* VARIABLES UTILISEES PAR LA GESTION DE MESSGAES */ DCL &ERRORSW *LGL /* SWITCH */ DCL &MSGID *CHAR LEN(7) /* ID MSG */ DCL &MSGDTA *CHAR LEN(100) /* DATA */ DCL &MSGF *CHAR LEN(10) /* FICHIER */ DCL &MSGFLIB *CHAR LEN(10) /* BIBLI */ MONMSG MSGID(CPF0000) EXEC(GOTO ERREUR) /* CORPS DU PROGRAMME */ /* SOURCE*/ IF (%BIN(&SRCELEM 1 2) > 1) DO IF (%SST(&SRCELEM 3 5) ^= '*SAME') THEN(DO) CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 1 /* CLE 1 */
CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 30 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) CHGVAR %SST(&VAR2000 &DEP 30) %SST(&SRCELEM 3 30) CHGVAR &DEP (&DEP + 30) ENDDO ENDDO /* DATE */ IF (&SRCDATE ^= '*SAME') THEN(DO) CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 2 /* CLE 2 */ CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 13 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) CHGVAR %SST(&VAR2000 &DEP 13) &SRCDATE CHGVAR &DEP (&DEP + 13) ENDDO /* COMPIL*/ IF (%BIN(&COMPILELEM 1 2) > 0) DO IF (%SST(&COMPILELEM 3 5) ^= '*SAME') THEN(DO) CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 3 /* CLE 3 */
CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 13 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) IF (%SST(&COMPILELEM 3 5) = '*BLANK') + CHGVAR %SST(&VAR2000 &DEP 13) ' ' ELSE + CHGVAR %SST(&VAR2000 &DEP 13) %SST(&COMPILELEM 3 13) CHGVAR &DEP (&DEP + 13) ENDDO ENDDO /* PROD */ IF (%BIN(&PRDELEM 1 2) > 0) DO IF (%SST(&PRDELEM 3 5) ^= '*SAME') THEN(DO) CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 5 /* CLE 5 */ CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 13 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) IF (%SST(&PRDELEM 3 5) = '*BLANK') + CHGVAR %SST(&VAR2000 &DEP 13) ' ' ELSE + CHGVAR %SST(&VAR2000 &DEP 13) %SST(&PRDELEM 3 13)
CHGVAR &DEP (&DEP + 13) ENDDO ENDDO /* OPTION*/ IF (%SST(&OPTION 1 1) ^= &X41) DO CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 13 /* CLE 13 */ CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 2 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) CHGVAR %SST(&VAR2000 &DEP 2) &OPTION CHGVAR &DEP (&DEP + 2) ENDDO /* ATTRIB*/ IF (%SST(&ATTRIB 1 1) ^= &X41) DO CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 9 /* CLE 9 */ CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 10 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) CHGVAR %SST(&VAR2000 &DEP 10) &ATTRIB CHGVAR &DEP (&DEP + 10)
ENDDO /* COMPOS*/ IF (%SST(&COMPOS 1 1) ^= &X41) DO CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 14 /* CLE 14 */ CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 4 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) CHGVAR %SST(&VAR2000 &DEP 4) &COMPOS CHGVAR &DEP (&DEP + 4) ENDDO /* MODIF */ IF (&ALWCHG ^= '2') DO CHGVAR &NBR (&NBR + 1) CHGVAR %BIN(&VAR2000 &DEP 4) 8 /* CLE 8 */ CHGVAR &DEP (&DEP + 4) CHGVAR %BIN(&VAR2000 &DEP 4) 1 /* LG INFOS */ CHGVAR &DEP (&DEP + 4) CHGVAR %SST(&VAR2000 &DEP 1) &ALWCHG ENDDO
Mise en place du nombre de modifs demandées CHGVAR VAR(%BIN(&VAR2000 1 4)) VALUE(&NBR) Appel API CALL QLICOBJD PARM( + &RTNLIB + &OBJQ + &OBJT + &VAR2000 + &CODERR) /* RENVOI DES MESSAGES DE TYPE *COMP SI FIN NORMALE */ COMPMSG: RCVMSG MSGTYPE(*COMP) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB) !--> IF (&MSGID *EQ ' ') RETURN /* FIN DU PGM */ ! SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + ! MSGDTA(&MSGDTA) MSGTYPE(*COMP) ! GOTO COMPMSG /* BOUCLE SUR MESSAGES *COMP */ ! fin du pgm si tout va bien sinon, routine de gestion d'erreurs à suivre
/*----------------------------------------*/ ERREUR: /* GESTION DES ERREURS */ /*----------------------------------------*/ IF &ERRORSW SNDPGMMSG MSGID(CPF9899) + MSGF(QCPFMSG) MSGTYPE(*ESCAPE) /* 2EME FOIS*/ /* ARRET PGM*/ CHGVAR &ERRORSW '1' /* MISE EN PLACE DU SWTICH */ /* RENVOI DES MESSAGES DE TYPE *DIAG SI FIN ANORMALE */ DIAGMSG: RCVMSG MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB) IF (&MSGID *EQ ' ') GOTO EXCPMSG SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) MSGTYPE(*DIAG) GOTO DIAGMSG /* BOUCLE SUR MESSAGES *DIAG */ /* RENVOI DU MESSAGE D'ERREUR */ EXCPMSG: RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB) SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE) ENDPGM
Les nouveaux types de variables de la base de donnée OS/400 1/ valeur nulle admises (dans l'enregistrement 1 bit par zone, 1 = ALWNULL) - SQL : sans préciser not null - SDD = ALWNULL - traitement SQL: mot-clé null RPG: CRTRPGPGM ALWNULL(*YES) si une zone a la valeur indéfinie le compilateur la remplace par une valeur par défaut. on ne peut pas donner la valeur indéfinie en sortie CRTRPGPGM ALWNULL(*NO) si une zone a la valeur indéfinie ==> erreur E/S autres langages: non supporté !!!
Les nouveaux types de variables de la base de donnée OS/400 2/ longueur variable (chaque zone est précédée de 2 octets binaires indiquant la longueur) - SQL : VARCHAR(X) ALLOCATE(y) - SDD = lg=lg maxi (ici X) VARLEN(y) - traitement SQL: pas de remarque RPG: CRTRPGPGM CVTOPT(*VARCHAR) le compilateur génère une zone alpha (lg-maxi + 2) ==> prévoir une DS pour le traitement. ==> renseigner la longueur en sortie. CBL: CRTCBLPGM CVTOPT(*VARCHAR) le compilateur génère une zone de groupe 01 ADRESSE 49 ADRESSE-LENGTH PIC S9(4) comp-4. 49 ADRESSE-DATA PIC X(xxx). ==> mêmes remarques que RPG en sortie
Les nouveaux types de variables de la base de donnée OS/400 3/ date et heure - SQL : DATE, TIME, TIMESTAMP (CURRENT DATE, CURRENT TIME, ... valides) - SDD = type de donnée L -> date mots-clés DATFMT() et DATSEP() T -> heure mots-clés TIMFMT() et TIMSEP() Z -> horodatage (pas de mot-clé) - traitement SQL: calculs autorisés RPG: CRTRPGPGM CVTOPT(*DATETIME) le compilateur génère une zone alpha. doit contenir une valeur correcte en sortie pas de traitement particuliers possibles. CBL: CRTCBLPGM CVTOPT(*DATETIME) idem RPG.
Tous ces nouveaux types ne sont reconnus par SDD que pour les fichiers physiques (par pour les DSPF, helas !) Il faut donc prévoir des zones alphas,lg fonction du type. DFU reconnait ces nouveautés. OPNQRYF aussi (y compris fonctions intégrées pour les dates) il est possible de faire des sélections sur la valeur nulle exemple de fichier utilisant ces nouveautés. * fichier PFV2R11 A R FORMAT TEXT('FORMAT PF V2R11') A NULLOK 20 ALWNULL A VARLEN 128 VARLEN(50) A VDATE L DATFMT(*DMY) DATSEP('/') A VTIME T TIMFMT(*HMS) TIMSEP(':') A VHORO Z
GESTION DE DONNEES D'UN FICHIER Mode . . . . : SAISIE Format . . . . : FORMAT Fichier . . : PFV2R11 ######## ######### NULLOK: VARLEN: VDATE: 01/01/40 VTIME: 00:00:00 VHORO: 0001-01-01-00.00.00.000000 F3=Exit F5=Réafficher F6=Sélection format F9=Insertion F10=Saisie F11=Modification Des zones acceptant les valeurs indéfinies ont été trouvées. #
Entrée d'instructions SQL Saisissez l'instruction SQL, puis appuyez sur Entrée. ===> INSERT INTO AF4TOOL/PFV2R11 Fin F14=Supprimer ligne F15=Scinder ligne F16=Choisir bibliothèques F17=Choisir fichiers F18=Choisir zones F24=Autres touches #
Définition d'une instruction INSERT Indiquez vos choix, puis appuyez sur ENTREE. INTO fichier . . . . . . . . . . PFV2R11 Nom, F4 pour liste Bibliothèque . . . . . . . . . AF4TOOL Nom, F4 pour liste Choix de zones pour insertion INTO . . . . . . . . . . . . . O O=Oui, N=Non Méthode d'insertion . . . . . . . 1 1=VALUES en entrée 2=Sous-sélection F3=Exit F4=Invite F5=Réafficher F12=Annuler F21=Instruction
Définition d'une instruction INSERT Entrez les numéros de séquence (1-999) correspondant à vos choix, puis ENTREE. Valeurs Séq Zone Type Chiffres Long indéfinies 10 NULLOK CHARACTER 20 NULL 20 VARLEN VARCHAR 128 NOT NULL WITH DEFAULT 30 VDATE DATE NOT NULL WITH DEFAULT 40 VTIME TIME NOT NULL WITH DEFAULT 50 VHORO TIMESTAMP NOT NULL WITH DEFAULT Fin F3=Exit F5=Réafficher F12=Annuler F21=Afficher instruction
Définition d'une instruction INSERT Indiquez les valeurs à insérer, puis appuyez sur ENTREE. Zone Valeur NULLOK 'renseignée par SQL' VARLEN 'renseignée par SQL' VDATE '31/12/93' VTIME '11:59:59' VHORO current timestamp Fin F3=Exit F5=Réafficher F6=Insérer ligne F10=Copier ligne F11=Type F12=Annuler F14=Supprimer ligne F15=Scinder ligne F24=Autres touches
Entrée d'instructions SQL Saisissez l'instruction SQL, puis appuyez sur Entrée. > INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO) VALUES ('renseigné par SQL', 'renseigné par SQL', '31/12/93', '11:59:59', current timestamp) 1 lignes ont été insérées dans la table PFV2R11 de la base de donnée ===> INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO) VALUES (null, 'renseignée par SQL,variable précédente non renseignée ', '31/12/93', '11:59:59', current timestamp) Fin F14=Supprimer ligne F15=Scinder ligne F16=Choisir bibliothèques F17=Choisir fichiers F18=Choisir zones F24=Autres touches #
Entrée d'instructions SQL Saisissez l'instruction SQL, puis appuyez sur Entrée. > INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO) VALUES ('renseigné par SQL', 'renseigné par SQL', '31/12/93', '11:59:59', current timestamp) 1 lignes ont été insérées dans la table PFV2R11 de la base de donnée > INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO) VALUES (null, 'renseignée par SQL,variable précédente non renseignée ', '31/12/93', '11:59:59', current timestamp) 1 lignes ont été insérées dans la table PFV2R11 de la base de donnée ===> select * from af4tool/pfv2r11 Fin F14=Supprimer ligne F15=Scinder ligne F16=Choisir bibliothèques F17=Choisir fichiers F18=Choisir zones F24=Autres touches #
Affichage des données Première ligne à afficher . . ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+.... NULLOK VARLEN renseignée 20 caractères saisis - la variable ALWNULL n'a pas étée renseignée,les zones DAT renseignée par SQL renseignée par SQL - renseignée par SQL,variable précédente non renseignée ******** Fin de données ********
Membre de fichier physique Fichier . . . . : PFV2R11 Bibliothèque . . : AF4TOOL Membre . . . . . : PFV2R11 Enregistrement . : 1 Contrôle . . . . . Colonne . . . . : 1 Recherche . . . . *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+.... renseignée 20 caractères saisis Øla variable ALWNULL n'a pas étée renseignée,les zones DAT renseignée par SQL renseignée par SQL renseignée par SQL,variable précédente non renseignée ****** FIN DES DONNEES ****** ....
OPNQRYF et les variables de type DATE, HEURE, HORODATAGE OPNQRYF reconnait et est capable de traiter ces formats 1/en comparaison avec une variable de même type 'DATCHG > DATCRT' avec une constante (charactère) 'DATCHG > "01/01/94" attention, respecter le format et les séparateurs. 2/en calcul avec des fonctions intégrées de durée %DURYEAR( ) %DURMONTH( ) %DURDAY( ) %DURHOUR( ) %DURMINUTE( ) %DURSEC %DURMICSEC( ) avec une durée numérique date = décimale 8,0 sous forme yyyymmdd (nombre d'années-mois-jours) (le résultat d'une opération date-date est sous ce format) heure= décimale 6,0 sous forme hhmmss (nombre d'heures-minutes-s) (le résultat d'une opération heure-heure est sous ce format) horodatage= décimale (20,6) sous forme yyyymmddhhmmssccccc (le résultat d'une opération timestamp-timestamp est sous ce format)
3/ avec des opérations + - + : Ajout d'une durée (incrémentation) DATE + 215 (date + 2 mois et 15 jours) DATE + %DURMONTH(2) + %DURDAY(15) idem si l'on ajoute une durée en mois (%DURMONTH) le jour reste inchangé sauf s'il est plus grand que le dernier jour du mois auquel cas il est remplacé par le dernier jour du mois. %DATE('30/01/1994') + %DURMONTH(1) devient 28/02/94 Modifier une partie de date affecte les éléments dépendants Ajouter un nombre de jours peut modifier le mois et l'année Ajouter un nombre de mois peut modifier l'année
- : différence entre .... DATE1 - DATE2 (résultat sous forme de durée) %DATE('3/15/2000') - %DATE('12/31/1999') = 215 (2 mois et 15 jours) : retrait d'une durée (décrémentation) DATE - 215 (date - 2 mois et 15 jours) mêmes remarques que pour l'incrémentation Pour une variable de type horodatage la modification de l'heure(+ ou -) peut entrainer la modification de la date. la modification des microsecondes peut entrainer une modification de l'heure.
Fonctions associées: %CURDATE, %CURTIME, %CURTIMESTP sans argument, donnent date/heure en cours QRYLST('DATCRT = %CURDATE') %DATE, %TIME, %TIMESTP renvoient date/heure de l'argument l'argument peut être une variable horodatage pour %DATE, %TIME une constante caractère (attention au format) une variable caractère QRYSLT('%DATE(DAT8) = %CURDATE) ou %DATE(VHORO) = "12/12/94" .... %DAY, %MONTH, %YEAR, %HOUR, %MIN, %SECOND, %MICSEC renvoient une PARTIE de l'argument (Binaire 4) Même remarque pour l'argument PLUS LA NOTION DE DUREE. QRYSLT('%MONTH(DATE1) = 12) ou %MONTH(DATE1 - DATE2) > 1
Fonctions associées: %CHAR(date/heure format) renvoit date ou heure sous format caractère QRYLST('%CHAR(DATE1 "EUR") = "28/02/94") %DAYS( ) renvoit une date sous format numérqiue (Binaire 4) %MIN et %MAX acceptent les variables de type DATE, HEURE, HORODATAGE A noter : la fonction %NULL est admise en comparaison avec une variable QRYSLT('VAR1 = %NULL') la fonction %USER retourne le profil en cours sous forme lg variable 18 c. le paramètre MAPFLD admet tous les nouveaux types de variables
LA possibiblité de définir ses propres ressources sous controle de validation (commit/rollback) Il faut définir une ressource sous controle de validation en lui associant un paramètre de 80 c. et un pgm d'exit. A chaque action du control de validation (commit ou rollback) le pgm d'exit sera appellé et recevra les 80 c. (entre autre) Ajouter une ressource : QTNADDCR - BIN(4,0) zone de retour (à utiliser en fin avec QNTRMVCR) - CHAR(10) nom de la ressource - CHAR(20) nom qualifé du pgm d'exit - CHAR(80) informations à envoyer au pgm d'exit - CHAR(1) appel du pgm à l'IPL (doit être N) - CHAR(??) code erreur
Enlever une ressource : QTNRMVCR - BIN(4,0) zone de retour recue de QTNADDCR - CHAR(??) code erreur Informations sur le controle de validation QTNRCMTI - CHAR(??) variable en retour (format CMTI0100: ) 1 à 4 BIN(4,0) octets renvoyés 5 à 8 BIN(4,0) octets valides 9 à 9 CHAR(1) status I=inactif,L=actif(local) R=actif(remote),A=actif 10 19 CHAR(10) verrouillage sans ressource - BIN(4,0) lg de la variable en retour - CHAR(8) format = CMTI0100 - CHAR(??) code erreur
Le pgm d'exit recoit deux paramètres 1/ les informations liées à la ressource (80 c.) 2/ une structure composée comme suit: 1 à 4 BIN(4) lg des infos (toujours 32) 5 à 5 CHAR(1) commit (C) ou rollback (R) 6 à 6 CHAR(1) Appel lors de l'IPL (toujours N) 7 à 10 CHAR(4) réservé 11 à 11 CHAR(1) état du processus (job) lors de l'appel '0' processus n'est PAS en phase de fin '1' processus en phase de fin NORMALE '2' processus en phase de fin ANORMALE 12 à 31 CHAR(20) réservé