Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Écriture et contrôle des fichiers

WRITE

Ajouter un enregistrement

Écrit un nouvel enregistrement dans un fichier à partir des valeurs courantes des zones du format, ou d'une structure de données.

Syntaxe

WRITE format;
WRITE format structure;
WRITE(E) format structure;
format
Le nom du format d'enregistrement à écrire (CLIENTWR). C'est le nom du format qu'on donne, pas celui du fichier.
structure
Facultatif : une structure de données (souvent déclarée avec likerec(format : *all)) qui fournit les valeurs. Sans elle, ce sont les zones du format, créées par la déclaration du fichier, qui sont écrites.
(E)
Extender : une erreur n'arrête plus le programme, elle positionne %ERROR et %STATUS.
Effet
Ajoute l'enregistrement au fichier. Aucune lecture n'a lieu : %FOUND et %EOF ne changent pas. En cas d'erreur (clé en double par exemple), %ERROR vaut *ON avec (E) et %STATUS donne le code (1021 pour une clé déjà présente) ; sans (E), le programme s'arrête sur un message RNQ.

À quoi ça sert

C'est l'instruction de création du RPG. Le fichier doit être déclaré avec usage(*output) ou usage(*update : *output : *delete). On remplit les zones, puis write clientwr;. En RPG IV en colonnes, c'était l'opération WRITE avec le nom du format en facteur 2.

Avec une structure de données, on évite de polluer le programme de zones globales : la structure se remplit proprement et se passe à write en un mot. Un CHAIN retrouve aussitôt l'enregistrement écrit.

Exemple 1 : Ajouter un client puis le retrouver

**free
// WRITE : ajouter un enregistrement avec les valeurs des zones du format.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-f clientw usage(*update : *output : *delete) keyed
      extdesc('JOBISQL/CLIENTW') extfile(*extdesc);

// Etape 1 : on remplit les zones du format, puis on ecrit.
numcli = 600;
nom    = 'Garcia Menuiserie';
ville  = 'Nimes';
solde  = 780.25;
datcre = d'2026-09-30';
write clientwr;

// Etape 2 : on relit l'enregistrement pour verifier qu'il existe.
chain (600) clientw;
snd-msg 'Apres WRITE : trouve = ' + %char(%found(clientw));
snd-msg 'Client      : [' + %trim(nom) + '] [' + %trim(ville) + '] ' + %char(solde);

// Nettoyage : la table doit rester comme avant.
delete clientwr;
chain (600) clientw;
snd-msg 'Apres DELETE : trouve = ' + %char(%found(clientw));

*inlr = *on;

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

Apres WRITE : trouve = 1
Client      : [Garcia Menuiserie] [Nimes] 780.25
Apres DELETE : trouve = 0

On remplit les zones du format, write clientwr; ajoute le client 600. Le CHAIN qui suit le retrouve (%FOUND à 1). Le programme supprime ensuite son enregistrement pour laisser la table intacte.

Exemple 2 : Clé en double, avec et sans (E)

**free
// WRITE : ecrire une cle qui existe deja, avec et sans (E).
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-f clientw usage(*update : *output : *delete) keyed
      extdesc('JOBISQL/CLIENTW') extfile(*extdesc);

dcl-ds nouveau likerec(clientwr : *all);

// Le client 100 existe deja : on tente de le recreer.
nouveau.numcli = 100;
nouveau.nom    = 'Doublon SARL';
nouveau.ville  = 'Paris';
nouveau.solde  = 10;
nouveau.datcre = d'2026-09-30';

write(e) clientwr nouveau;
snd-msg 'Avec (E) : erreur = ' + %char(%error) + ', statut = ' + %char(%status(clientw));

// Le client 100 d'origine n'a pas ete touche.
chain (100) clientw;
snd-msg 'Client 100 : [' + %trim(nom) + ']';

// Sans (E), le programme s'arrete sur le message d'erreur.
write clientwr nouveau;
snd-msg 'Cette ligne n''est jamais atteinte';

*inlr = *on;

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

Avec (E) : erreur = 1, statut = 1021
Client 100 : [Dupont SA]
Erreur : RNQ1021 - Tentative d'écriture d'un enreg déjà existant dans fichier CLIENTW.

Le client 100 existe déjà. Avec write(e), le programme continue : %ERROR vaut 1 et %STATUS vaut 1021. L'enregistrement d'origine n'est pas touché. Sans (E), le même ordre arrête le programme sur RNQ1021.

Le piège

Un WRITE ne remplace jamais un enregistrement existant. Sur un fichier à clé unique, écrire une clé déjà présente échoue : %STATUS 1021, message RNQ1021 si vous n'avez pas mis (E) (exemple 2). Pour créer ou modifier selon le cas, testez d'abord avec CHAIN : trouvé, on fait UPDATE ; pas trouvé, on fait WRITE.