Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers
WRITE
Ajouter un enregistrement dans un fichier
Écrit un nouvel enregistrement dans le fichier, avec les valeurs que les zones du format contiennent à cet instant ; l'indicateur de la colonne 56-57 s'allume si l'écriture échoue.
Syntaxe
C WRITEformat ER
C WRITEformat
- Facteur 2 (33-42)
- Le nom du format d'enregistrement (
CLI3WRpourCLIENT3W). Pour un fichier décrit en externe, le nom du fichier est refusé. - Indicateurs (56-57)
- Facultatif : s'allume si l'écriture est impossible (clé en double, par exemple). Sans lui, une erreur arrête le programme.
- Colonne 66 de la spécification F
- Pour ajouter des enregistrements dans un fichier déclaré en mise à jour (
Uen colonne 15), mettreAen colonne 66. Un fichier déclaré seulement en sortie (Oen colonne 15) accepte aussi leWRITE. - Effet
- Le fichier reçoit un nouvel enregistrement construit à partir des zones du format ; un
CHAINsur sa clé le retrouve ensuite. Si l'écriture échoue, l'indicateur 56-57 s'allume et rien n'est écrit.
À quoi ça sert
WRITE crée les enregistrements : un nouveau client, une ligne de commande, une écriture comptable. Le programme charge les zones du format (MOVEL, Z-ADD…) puis écrit.
Toutes les zones du format sont écrites. Celles que le programme n'a pas renseignées gardent leur valeur du moment : zéro ou blancs au démarrage, ou le contenu du dernier enregistrement lu.
Exemple 1 : Ajouter le client 600, le relire, le supprimer
H* WRITE : ajouter un client dans un fichier en mise a jour
FCLIENT3WUF E K DISK A
C*
C* Les zones du format sont celles du programme
C Z-ADD600 NUMCLI
C MOVEL'Roux' NOM
C MOVEL'Nimes' VILLE
C Z-ADD150.25 SOLDE
C Z-ADD20260105 DATCRE
C WRITECLI3WR
C*
C* On le relit pour le prouver
C Z-ADD600 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C *IN99 IFEQ '0'
C NOM DSPLY
C VILLE DSPLY
C* Remise en etat : on supprime l'enregistrement ajoute
C DELETCLI3WR
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Roux
Nimes
Le fichier est déclaré UF avec A en colonne 66 : on peut y ajouter et y lire. Les zones sont chargées, WRITE CLI3WR crée l'enregistrement, un CHAIN le retrouve (« Roux », « Nimes »). Le DELET final remet le fichier dans l'état de départ.
Exemple 2 : Clé en double : indicateur 56
H* WRITE : cle en double, indicateur d'erreur 56-57
FCLIENT3WUF E K DISK A
C*
C Z-ADD100 NUMCLI
C MOVEL'Doublon' NOM
C MOVEL'Nice' VILLE
C Z-ADD0 SOLDE
C Z-ADD0 DATCRE
C WRITECLI3WR 56
C *IN56 IFEQ '1'
C 'Refuse' DSPLY
C END
C* Le client 100 est inchange
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C NOM DSPLY
C VILLE DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Refuse
Dupont SA
Montpellier
Le client 100 existe déjà. Le WRITE échoue, l'indicateur 56 s'allume (« Refuse ») et le client 100 d'origine, Dupont SA, est intact.
Exemple 3 : Clé en double sans indicateur
H* WRITE : cle en double sans indicateur, le programme s'arrete
FCLIENT3WUF E K DISK A
C*
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C MOVEL'Doublon' NOM
C 'Avant' DSPLY
C WRITECLI3WR
C 'Apres' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Avant
Erreur : RPG1021 - Tentative d'écriture d'un enreg déjà existant dans CLIENT3W (C G S D F).
Même erreur, mais sans indicateur en 56-57 : après « Avant », le programme s'arrête avec RPG1021. Le « Apres » n'est jamais affiché.
Le piège
Une clé déjà présente fait échouer le WRITE (ici CLIENT3W est déclaré UNIQUE). Sans indicateur en 56-57, le programme s'arrête : RPG1021, « Tentative d'écriture d'un enreg déjà existant dans CLIENT3W » (le journal du travail montre aussi CPF5009, « Clé d'enregistrement en double dans le membre CLIENT3W »). Mettez l'indicateur dès que la clé vient d'une saisie.
Sans A en colonne 66, un fichier en mise à jour refuse le WRITE à la compilation : QRG5197, « L'opération WRITE est incompatible avec le type de fichier défini ».
Un littéral en facteur 2 ne dépasse pas 8 caractères utiles : MOVEL'Garage Roux'NOM est refusé (QRG5167, « Le littéral entré en Facteur 2 est incorrect »). C'est pourquoi l'exemple écrit « Roux ».
En RPG ILE full free
En RPG ILE full free, WRITE prend le nom du format ; l'erreur se capte avec l'extension (E) et %ERROR, ou par un bloc MONITOR.
clients.numcli = 600;
clients.nom = 'Roux';
write(e) cli3wr clients;
if %error;
dsply 'Refuse';
endif;