Aller au contenu

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)
*LOCK verrouille la zone de données ; il est indispensable avant de la réécrire avec OUT. 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 du DEFN : 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'au OUT ou au UNLCK.

À 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;