Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers

CLOSE

Fermer un fichier ou tous les fichiers

Ferme le fichier donné en facteur 2, ou tous les fichiers ouverts avec *ALL ; l'indicateur de la colonne 56-57 s'allume si la fermeture échoue.

Syntaxe

     C                     CLOSEfichier                ER
     C                     CLOSE*ALL
Facteur 2 (33-42)
Le nom du fichier à fermer, ou *ALL pour fermer tous les fichiers du programme.
Indicateurs (56-57)
Facultatif : s'allume en cas d'erreur de fermeture. Un CLOSE sur un fichier déjà fermé ne provoque pas d'erreur.
Effet
Le fichier est fermé. Une nouvelle ouverture (OPEN, fichier UC) le rouvre au début : la lecture suivante donne le premier enregistrement.

À quoi ça sert

CLOSE libère un fichier avant la fin du programme : pour le rouvrir à zéro ou avant de lancer une commande qui travaille sur le même fichier (copie, effacement, sauvegarde). Il n'est pas obligatoire en fin de programme, SETON LR ferme tout.

Exemple 1 : Fermer puis rouvrir

     H*  CLOSE : fermer puis rouvrir remet le fichier au debut
     FCLIENT3 IF  E           K        DISK                           UC
     C*
     C                     OPEN CLIENT3
     C                     READ CLIENT3                  90
     C           NOM       DSPLY
     C                     READ CLIENT3                  90
     C           NOM       DSPLY
     C                     CLOSECLIENT3
     C*  Apres la reouverture, la lecture repart du premier client
     C                     OPEN CLIENT3
     C                     READ CLIENT3                  90
     C           NOM       DSPLY
     C                     CLOSECLIENT3
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Dupont SA
Martin et fils
Dupont SA

Deux READ donnent Dupont SA et Martin et fils. Après CLOSE et un nouvel OPEN, le READ redonne Dupont SA : la lecture repart du début.

Exemple 2 : CLOSE *ALL

     H*  CLOSE *ALL : fermer tous les fichiers ouverts
     FCLIENT3 IF  E           K        DISK                           UC
     FCLIENT3VIF  E           K        DISK                           UC
     C*
     C                     OPEN CLIENT3
     C                     OPEN CLIENT3V
     C                     READ CLIENT3                  90
     C           NOM       DSPLY
     C                     READ CLIENT3V                 90
     C           NOM       DSPLY
     C                     CLOSE*ALL
     C*  Les deux fichiers sont fermes : le CLOSE suivant est en erreur
     C                     CLOSECLIENT3                56
     C   56                MOVE '1'       ERR     1
     C  N56                MOVE '0'       ERR
     C           ERR       DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Dupont SA
Bernard Transports
0

Deux fichiers (CLIENT3 et sa logique CLIENT3V) sont ouverts et lus. CLOSE *ALL les ferme tous ; un CLOSE supplémentaire sur CLIENT3 n'allume pas l'indicateur 56 (« 0 »).

Le piège

Rouvrir un fichier le remet au début : la position de lecture et le dernier enregistrement lu sont perdus (premier exemple).

Fermer un fichier fermé n'est pas une erreur (second exemple et exemple 3 de OPEN) : ne comptez pas sur l'indicateur 56-57 pour détecter un double CLOSE. Tester l'état du fichier demande %OPEN en RPG ILE.

En RPG ILE full free

La même instruction existe en RPG ILE, avec les mêmes options ; %OPEN permet de savoir si le fichier est ouvert.

close client3;
close *all;