Aller au contenu

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 avec OPEN et le ferme avec CLOSE.
Effet
Le fichier est ouvert et positionné au début. Le programme peut le lire ou l'écrire. Tant que l'OPEN n'a pas eu lieu, toute entrée-sortie sur un fichier UC est 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;