Instruction RPG full free · IBM i (AS/400) · Écriture et contrôle des fichiers
OPEN
Ouvrir et fermer un fichier
Ouvre un fichier déclaré avec USROPN au moment choisi par le programme, et CLOSE le ferme quand on n'en a plus besoin.
Syntaxe
OPEN fichier;
OPEN(E) fichier;
CLOSE fichier;
CLOSE(E) fichier;
fichier- Le nom du fichier tel que déclaré par
dcl-f. PourOPEN, il doit porter le mot-cléusropn. (E)- Une erreur positionne
%ERRORet%STATUSau lieu d'arrêter le programme. - Effet
- Après
OPEN,%OPEN(fichier)vaut*ON; aprèsCLOSE,*OFF. Une réouverture repart du début du fichier. Ouvrir un fichier déjà ouvert donne%STATUS1215 ; lire un fichier fermé donne 1211 (RNQ1211sans (E)).
À quoi ça sert
Par défaut, le programme ouvre ses fichiers au démarrage et les ferme à la fin. Avec usropn, la main passe au programme. C'est utile pour préparer l'environnement avant l'ouverture (OVRDBF, STRCMTCTL), pour n'ouvrir un fichier que dans certains cas, ou pour le rouvrir et relire depuis le début sans quitter le programme.
On vérifie l'état avec %OPEN, pratique avant un CLOSE dans une routine d'erreur.
Exemple 1 : Ouvrir, lire, fermer, rouvrir
**free
// OPEN et CLOSE : ouvrir un fichier a la demande, le fermer quand on a fini.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
// USROPN : le fichier n'est pas ouvert au demarrage, c'est le programme qui decide.
dcl-f client keyed usropn extdesc('JOBIRPG/CLIENT') extfile(*extdesc);
dcl-s nb int(10);
snd-msg 'Au demarrage : ouvert = ' + %char(%open(client));
open client;
snd-msg 'Apres OPEN : ouvert = ' + %char(%open(client));
read client;
dow not %eof(client);
nb += 1;
read client;
enddo;
snd-msg 'Clients lus : ' + %char(nb);
close client;
snd-msg 'Apres CLOSE : ouvert = ' + %char(%open(client));
// On peut le rouvrir : la lecture repart du debut du fichier.
open client;
read client;
snd-msg 'Premier client apres reouverture : ' + %trim(nom);
close client;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Au demarrage : ouvert = 0
Apres OPEN : ouvert = 1
Clients lus : 5
Apres CLOSE : ouvert = 0
Premier client apres reouverture : Dupont SA
Le fichier est fermé au démarrage (%OPEN à 0). open l'ouvre, la boucle compte cinq clients, close le ferme. Une fois rouvert, la lecture reprend au premier client. Le client 300 a une date NULL : le programme déclare alwnull(*usrctl) pour pouvoir le lire.
Exemple 2 : OPEN oublié, OPEN en double
**free
// OPEN : un fichier USROPN doit etre ouvert avant la premiere lecture.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f client keyed usropn extdesc('JOBIRPG/CLIENT') extfile(*extdesc);
// Lecture sur un fichier pas encore ouvert : (E) capte l'erreur.
chain(e) (100) client;
snd-msg 'CHAIN avant OPEN : erreur = ' + %char(%error) + ', statut = ' + %char(%status(client));
// Ouvrir deux fois de suite le meme fichier est aussi une erreur.
open client;
open(e) client;
snd-msg 'Second OPEN : erreur = ' + %char(%error) + ', statut = ' + %char(%status(client));
// Le fichier reste utilisable apres ces erreurs.
chain (100) client;
snd-msg 'CHAIN 100 : [' + %trim(nom) + ']';
close client;
// Sans (E), le programme s'arrete sur le message RNQ.
chain (100) client;
snd-msg 'Cette ligne ne s''affiche pas';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
CHAIN avant OPEN : erreur = 1, statut = 1211
Second OPEN : erreur = 1, statut = 1215
CHAIN 100 : [Dupont SA]
Erreur : RNQ1211 - Opération d'E-S sur fichier fermé CLIENT.
Lire avant open donne %STATUS 1211 ; ouvrir deux fois de suite donne 1215. Le fichier reste utilisable : le CHAIN suivant fonctionne. Après close, la même lecture sans (E) arrête le programme sur RNQ1211.
Le piège
Avec USROPN, la première lecture n'ouvre rien. Si vous oubliez open, le CHAIN ou le READ échoue avec RNQ1211 (exemple 2). Et ouvrir deux fois est aussi une erreur (1215) : testez %OPEN si vous n'êtes pas sûr de l'état.