Aller au contenu

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 (CLI3WR pour CLIENT3W). 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 (U en colonne 15), mettre A en colonne 66. Un fichier déclaré seulement en sortie (O en colonne 15) accepte aussi le WRITE.
Effet
Le fichier reçoit un nouvel enregistrement construit à partir des zones du format ; un CHAIN sur 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;