Aller au contenu

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. Pour OPEN, il doit porter le mot-clé usropn.
(E)
Une erreur positionne %ERROR et %STATUS au lieu d'arrêter le programme.
Effet
Après OPEN, %OPEN(fichier) vaut *ON ; après CLOSE, *OFF. Une réouverture repart du début du fichier. Ouvrir un fichier déjà ouvert donne %STATUS 1215 ; lire un fichier fermé donne 1211 (RNQ1211 sans (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.