Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers
OPEN
Ouvrir un fichier à l'ordre du programme
Ouvre un fichier déclaré avec le code UC (ouverture contrôlée par l'utilisateur) ; l'indicateur de la colonne 56-57 s'allume si l'ouverture échoue.
Syntaxe
C OPEN fichier ER
FCLIENT3 IF E K DISK UC
- Facteur 2 (33-42)
- Le nom du fichier à ouvrir, tel qu'il est déclaré en spécification F.
- Indicateurs (56-57)
- Facultatif : s'allume si l'ouverture échoue ; c'est aussi le cas quand le fichier est déjà ouvert. Sans lui, l'erreur arrête le programme.
- Colonnes 71-72 de la spécification F
UC: le fichier n'est pas ouvert au démarrage, c'est le programme qui l'ouvre avecOPENet le ferme avecCLOSE.- Effet
- Le fichier est ouvert et positionné au début. Le programme peut le lire ou l'écrire. Tant que l'
OPENn'a pas eu lieu, toute entrée-sortie sur un fichierUCest une erreur.
À quoi ça sert
Par défaut, RPG ouvre tous les fichiers au démarrage du programme. UC sert quand on doit préparer quelque chose avant : démarrer le contrôle de validation (STRCMTCTL) ou n'ouvrir le fichier que dans certains cas. Il évite aussi de garder ouvert un fichier utilisé seulement en fin de traitement.
Exemple 1 : Ouvrir, lire, fermer
H* OPEN : ouverture controlee par le programme (UC)
FCLIENT3 IF E K DISK UC
C*
C OPEN CLIENT3
C Z-ADD200 NUMERO 50
C NUMERO CHAINCLIENT3 99
C NOM DSPLY
C CLOSECLIENT3
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Martin et fils
La spécification F porte UC en colonnes 71-72. Le programme ouvre CLIENT3, lit le client 200, puis le ferme.
Exemple 2 : Lire avant l'OPEN
H* OPEN : lecture d'un fichier UC avant l'OPEN
FCLIENT3 IF E K DISK UC
C*
C Z-ADD200 NUMERO 50
C NUMERO IFEQ 0
C OPEN CLIENT3
C END
C 'Avant' DSPLY
C NUMERO CHAINCLIENT3 99
C 'Apres' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Avant
Erreur : RPG1211 - Opération E-S sur fichier fermé CLIENT3 (C G S D F).
Le CHAIN est exécuté sans que l'OPEN ait eu lieu (il est derrière un test qui ne passe pas). Après « Avant », le programme s'arrête : RPG1211, « Opération E-S sur fichier fermé CLIENT3 ».
Exemple 3 : Indicateur d'erreur 56-57
H* OPEN : indicateur d'erreur 56-57 et fichier deja ouvert
FCLIENT3 IF E K DISK UC
C*
C SETOF 56
C* Premier OPEN : correct
C OPEN CLIENT3 56
C MOVE '0' ERR 1
C 56 MOVE '1' ERR
C ERR DSPLY
C* Second OPEN : le fichier est deja ouvert
C OPEN CLIENT3 56
C MOVE '0' ERR 1
C 56 MOVE '1' ERR
C ERR DSPLY
C* Lecture, puis CLOSE : l'indicateur est remis a zero
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3 99
C CLOSECLIENT3 56
C MOVE '0' ERR 1
C 56 MOVE '1' ERR
C ERR DSPLY
C SETOF 56
C* Second CLOSE : le fichier est deja ferme, mais pas d'erreur
C CLOSECLIENT3 56
C MOVE '0' ERR 1
C 56 MOVE '1' ERR
C ERR DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
0
1
0
0
Le premier OPEN réussit (0), le second échoue car le fichier est déjà ouvert (1). Après le CLOSE (0), un second CLOSE ne donne pas d'erreur (0).
Le piège
Un fichier UC doit être ouvert avant toute lecture. Si le programme contient une opération d'entrée-sortie sur un fichier UC mais aucun OPEN, le compilateur répond QRG7062 (gravité 20), « Tentative d'E-S, or aucune opération OPEN pour le fichier défini avec ouverture contrôlée par l'utilisateur » ; avec un OPEN dans le source mais non exécuté, l'erreur arrive à l'exécution (exemple 2).
Sans UC, le fichier est déjà ouvert : un OPEN arrête le programme avec RPG1215, « OPEN effectué sur fichier ouvert CLIENT3 ». Avec l'indicateur 56-57, un second OPEN allume simplement l'indicateur (exemple 3).
En RPG ILE full free
En RPG ILE, le mot-clé USROPN de DCL-F joue le rôle de UC, et OPEN / CLOSE restent des instructions.
dcl-f client3 usropn;
open client3;
read client3;
close client3;