Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers
IN
Lire une zone de données
Lit une zone de données (objet *DTAARA) dans la zone ou la structure de données qui lui est liée par DEFN, avec ou sans verrou.
Syntaxe
C *NAMVAR DEFN zonedata zone
C *LOCK IN zone ER
C IN zone ER
- Facteur 1 (18-27)
*LOCKverrouille la zone de données ; il est indispensable avant de la réécrire avecOUT. Sans lui, la lecture ne verrouille pas.- Facteur 2 (33-42)
- La zone ou la structure de données liée à la zone de données par
*NAMVAR DEFN(facteur 2 duDEFN: nom de l'objet*DTAARA). - Indicateurs (56-57)
- Facultatif : s'allume si la lecture est impossible (zone de données absente, par exemple). Sans lui, l'erreur arrête le programme.
- Effet
- La zone du programme reçoit le contenu de la zone de données. Avec
*LOCK, la zone de données reste verrouillée jusqu'auOUTou auUNLCK.
À quoi ça sert
La zone de données est un objet IBM i (*DTAARA) partagé entre programmes : compteur de numéros, paramètres d'application. Le programme la relie à une zone par *NAMVAR DEFN nom zone puis la lit avec IN et l'écrit avec OUT.
Une structure de données permet de lire d'un coup plusieurs paramètres rangés dans une zone alphanumérique, et de les découper en sous-zones.
Dans ces exemples, le programme crée la zone de données avec CRTDTAARA (par QCMDEXC), après avoir supprimé celle d'un essai précédent (erreur ignorée), et la supprime en fin de travail.
Exemple 1 : Un compteur numérique
H* IN : lire une zone de donnees (compteur) et la verrouiller
E CMD 1 2 80
C*
C* Creation de la zone de donnees par le programme (on retire d'abord
C* une eventuelle zone laissee par un essai : erreur ignoree)
C Z-ADD80 LEN 155
C CALL 'QCMDEXC' 56
C PARM CMD,2
C PARM LEN 155
C Z-ADD80 LEN 155
C CALL 'QCMDEXC'
C PARM CMD,1
C PARM LEN 155
C *NAMVAR DEFN I3DTA NUMFAC 70
C* IN sans *LOCK : lecture simple
C IN NUMFAC
C NUMFAC DSPLY
C* IN avec *LOCK : la zone est verrouillee pour les autres travaux
C *LOCK IN NUMFAC
C ADD 1 NUMFAC
C OUT NUMFAC
C IN NUMFAC
C NUMFAC DSPLY
C* Suppression de la zone
C Z-ADD80 LEN 155
C CALL 'QCMDEXC'
C PARM CMD,2
C PARM LEN 155
C SETON LR
**
CRTDTAARA DTAARA(JOBIRPG/I3DTA) TYPE(*DEC) LEN(7 0) VALUE(1000)
DLTDTAARA DTAARA(JOBIRPG/I3DTA)
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1000
1001
La zone I3DTA (7 chiffres, valeur 1000) est liée à NUMFAC. Un premier IN lit 1000. Un IN *LOCK la verrouille, le programme ajoute 1 et l'écrit par OUT ; un nouvel IN montre 1001.
Exemple 2 : Une zone alphanumérique et sa structure
H* IN : lire une zone de donnees alphanumerique dans une structure
E CMD 1 2 80
IPARAM DS
I 1 5 MAXCLI
I 6 8 DEVISE
I 9 18 RESP
C*
C* Creation de la zone de donnees par le programme (on retire d'abord
C* une eventuelle zone laissee par un essai : erreur ignoree)
C Z-ADD80 LEN 155
C CALL 'QCMDEXC' 56
C PARM CMD,2
C PARM LEN 155
C Z-ADD80 LEN 155
C CALL 'QCMDEXC'
C PARM CMD,1
C PARM LEN 155
C *NAMVAR DEFN I3DTA PARAM
C *LOCK IN PARAM
C MAXCLI DSPLY
C DEVISE DSPLY
C RESP DSPLY
C* Aucune modification : on libere la zone
C UNLCKPARAM
C* Suppression de la zone
C Z-ADD80 LEN 155
C CALL 'QCMDEXC'
C PARM CMD,2
C PARM LEN 155
C SETON LR
**
CRTDTAARA DTAARA(JOBIRPG/I3DTA) TYPE(*CHAR) LEN(18) VALUE('00100EURDupont')
DLTDTAARA DTAARA(JOBIRPG/I3DTA)
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
00100
EUR
Dupont
La structure PARAM découpe la zone de données en MAXCLI (positions 1-5), DEVISE (6-8) et RESP (9-18). Un IN *LOCK les charge d'un coup : « 00100 », « EUR », « Dupont ». Rien n'étant modifié, le UNLCK libère la zone.
Exemple 3 : Zone de données absente
H* IN : zone de donnees inexistante, indicateur d'erreur 56-57
E CMD 1 2 80
C*
C Z-ADD80 LEN 155
C CALL 'QCMDEXC' 56
C PARM CMD,2
C PARM LEN 155
C *NAMVAR DEFN I3DTA NUMFAC 70
C MOVE '0' ERR 1
C IN NUMFAC 56
C 56 MOVE '1' ERR
C ERR DSPLY
C SETON LR
**
CRTDTAARA DTAARA(JOBIRPG/I3DTA) TYPE(*DEC) LEN(7 0)
DLTDTAARA DTAARA(JOBIRPG/I3DTA)
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
La zone de données n'existe pas : l'IN allume l'indicateur 56 (« 1 ») au lieu d'arrêter le programme.
Le piège
Lire sans *LOCK ne permet pas d'écrire ensuite : un OUT sans IN *LOCK préalable arrête le programme avec RPG0412, « Zone comm données non allouée pour sortie » (voir OUT).
Penser à libérer la zone : si le programme finit par ne pas écrire, il faut un UNLCK (exemple 2), pour libérer le verrou.
En RPG ILE full free
En RPG ILE, IN et OUT existent toujours ; la zone se déclare avec le mot-clé DTAARA.
dcl-s numfac packed(7:0) dtaara('I3DTA');
in *lock numfac;
numfac += 1;
out numfac;