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
*ALLpour fermer tous les fichiers du programme. - Indicateurs (56-57)
- Facultatif : s'allume en cas d'erreur de fermeture. Un
CLOSEsur un fichier déjà fermé ne provoque pas d'erreur. - Effet
- Le fichier est fermé. Une nouvelle ouverture (
OPEN, fichierUC) 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;