Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers
OUT
Écrire une zone de données
Réécrit le contenu de la zone du programme dans la zone de données (objet *DTAARA) liée par DEFN ; la zone doit avoir été verrouillée par IN *LOCK.
Syntaxe
C OUT zone ER
- Facteur 2 (33-42)
- La zone ou la structure de données liée à la zone de données par
*NAMVAR DEFN. - Indicateurs (56-57)
- Facultatif : s'allume si l'écriture est impossible. Sans lui, l'erreur arrête le programme.
- Effet
- Le contenu de la zone de données est remplacé par celui de la zone du programme. Le verrou posé par
IN *LOCKest consommé : un secondOUTsans nouveauIN *LOCKest en erreur (l'indicateur 56-57 s'allume, la valeur enregistrée ne change pas).
À 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.
Le schéma classique est IN *LOCK, modification, OUT : on évite que deux travaux prennent le même numéro de facture.
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 : Incrémenter un compteur
H* OUT : ecrire une zone de donnees apres IN *LOCK
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 *LOCK IN NUMFAC
C NUMFAC DSPLY
C ADD 1 NUMFAC
C OUT NUMFAC
C* Une relecture montre la valeur enregistree
C Z-ADD0 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
IN *LOCK lit 1000, le programme ajoute 1 et OUT l'enregistre. La zone du programme est remise à zéro, un IN relit la valeur enregistrée : 1001.
Exemple 2 : Écrire une structure
H* OUT : ecriture de plusieurs zones par la 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 MOVEL'USD' DEVISE
C MOVEL'Martin' RESP
C OUT PARAM
C MOVEL'XXX' DEVISE
C MOVEL'?' RESP
C IN PARAM
C DEVISE DSPLY
C RESP 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(*CHAR) LEN(18) VALUE('00100EURDupont')
DLTDTAARA DTAARA(JOBIRPG/I3DTA)
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
USD
Martin
Sous-zones DEVISE et RESP modifiées, OUT PARAM écrit la zone entière. Le programme les remplace par « XXX » et « ? » en mémoire, puis un IN remet les valeurs écrites : « USD », « Martin ».
Exemple 3 : OUT sans IN *LOCK
H* OUT sans IN *LOCK prealable : le programme s'arrete
E CMD 1 1 80
C*
C* Zone de donnees creee dans QTEMP : elle disparait avec le travail
C Z-ADD80 LEN 155
C CALL 'QCMDEXC'
C PARM CMD,1
C PARM LEN 155
C *NAMVAR DEFN I3DTA NUMFAC 70
C IN NUMFAC
C ADD 1 NUMFAC
C NUMFAC DSPLY
C OUT NUMFAC
C NUMFAC DSPLY
C SETON LR
**
CRTDTAARA DTAARA(QTEMP/I3DTA) TYPE(*DEC) LEN(7 0) VALUE(1000)
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1001
Erreur : RPG0412 - Zone comm données non allouée pour sortie (C G S D F).
Le IN sans *LOCK lit 1000, le programme ajoute 1 (« 1001 »), mais le OUT arrête le programme avec RPG0412.
Le piège
Il faut avoir lu avec *LOCK : OUT après un IN sans *LOCK arrête le programme avec RPG0412, « Zone comm données non allouée pour sortie » (exemple 3). Même erreur après un UNLCK.
Un OUT consomme le verrou : pour écrire deux fois, relisez avec IN *LOCK entre les deux. Un second OUT sans cela est en erreur.
En RPG ILE full free
Le couple IN *LOCK / OUT est inchangé en RPG ILE.
in *lock numfac;
numfac += 1;
out numfac;