Aller au contenu

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 *LOCK est consommé : un second OUT sans nouveau IN *LOCK est 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;