Instruction RPG full free · IBM i (AS/400) · Écriture et contrôle des fichiers
DELETE
Supprimer un enregistrement
Supprime un enregistrement du fichier, soit celui qui vient d'être lu, soit celui désigné par une clé.
Syntaxe
DELETE format;
DELETE clé fichier;
DELETE(E) clé fichier;
format- Forme sans clé : le nom du format. Supprime le dernier enregistrement lu avec verrou.
clé- Forme avec clé : valeur ou liste de valeurs entre parenthèses,
(701). L'enregistrement qui porte cette clé est supprimé, sans lecture préalable. fichier- Avec une clé, le nom du fichier (
clientw), pas celui du format. (E)- Une erreur positionne
%ERRORet%STATUS. - Effet
- Supprime l'enregistrement. Avec une clé,
%FOUNDvaut*ONsi un enregistrement a été supprimé,*OFFsinon ; une clé absente n'est pas une erreur. Sans clé, une lecture avec verrou est requise juste avant : sinon%STATUS1221 (RNQ1221).
À quoi ça sert
Le fichier doit être déclaré avec usage(*delete). Deux écritures sont possibles. La première, la plus prudente : on lit l'enregistrement (CHAIN), on vérifie qu'il convient, puis delete clientwr;. La seconde, plus courte : delete (701) clientw; supprime directement par la clé, sans lire.
En RPG IV en colonnes, la forme avec clé s'écrivait avec la clé en facteur 1 et le nom du fichier en facteur 2. Elle revient à un CHAIN suivi d'un DELETE, en une instruction.
Exemple 1 : Supprimer après lecture, ou par la clé
**free
// DELETE : supprimer apres une lecture, ou directement par la cle.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f clientw usage(*update : *output : *delete) keyed
extdesc('JOBISQL/CLIENTW') extfile(*extdesc);
dcl-s nb int(10);
// Deux clients temporaires pour l'exemple.
numcli = 700;
nom = 'Client temporaire A';
ville = 'Nice';
solde = 0;
datcre = d'2026-09-30';
write clientwr;
numcli = 701;
nom = 'Client temporaire B';
ville = 'Nice';
solde = 0;
datcre = d'2026-09-30';
write clientwr;
// Forme 1 : on lit (CHAIN verrouille), puis DELETE supprime l'enregistrement lu.
chain (700) clientw;
delete clientwr;
chain (700) clientw;
snd-msg 'Forme 1 (apres lecture) : 700 trouve = ' + %char(%found(clientw));
// Forme 2 : DELETE avec une cle, sans lecture prealable.
delete (701) clientw;
snd-msg 'Forme 2 (par la cle) : %FOUND = ' + %char(%found(clientw));
chain (701) clientw;
snd-msg 'Forme 2 : 701 trouve = ' + %char(%found(clientw));
// Les cinq clients d'origine sont toujours la (le client 300 a une date NULL,
// d'ou ALWNULL(*USRCTL) dans CTL-OPT pour pouvoir le lire).
setll *loval clientw;
read clientw;
dow not %eof(clientw);
nb += 1;
read clientw;
enddo;
snd-msg 'Clients restants : ' + %char(nb);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Forme 1 (apres lecture) : 700 trouve = 0
Forme 2 (par la cle) : %FOUND = 1
Forme 2 : 701 trouve = 0
Clients restants : 5
Deux clients temporaires sont ajoutés. Le 700 est lu puis supprimé avec delete clientwr;. Le 701 est supprimé directement avec delete (701) clientw;, et %FOUND confirme la suppression. Il reste les cinq clients d'origine. Le client 300 ayant une date NULL, le programme déclare alwnull(*usrctl) pour pouvoir le lire.
Exemple 2 : Clé absente, et DELETE sans lecture
**free
// DELETE : une cle absente ne provoque pas d'erreur, seul %FOUND le dit.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-f clientw usage(*update : *output : *delete) keyed
extdesc('JOBISQL/CLIENTW') extfile(*extdesc);
// Cle qui n'existe pas : pas d'erreur, mais rien n'est supprime.
delete (999) clientw;
snd-msg 'DELETE (999) : %FOUND = ' + %char(%found(clientw)) + ', %ERROR = ' + %char(%error);
// Cle qui existe : %FOUND est vrai. On la recree ensuite pour laisser la table intacte.
delete (500) clientw;
snd-msg 'DELETE (500) : %FOUND = ' + %char(%found(clientw));
numcli = 500;
nom = 'Petit Atelier';
ville = 'Lyon';
solde = 45.10;
datcre = d'2024-01-08';
write clientwr;
// DELETE sans cle ni lecture reussie : refuse. Le CHAIN rate ne verrouille rien.
chain (999) clientw;
delete(e) clientwr;
snd-msg 'DELETE sans lecture : %ERROR = ' + %char(%error) + ', statut = ' + %char(%status(clientw));
delete clientwr;
snd-msg 'Cette ligne ne s''affiche pas';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
DELETE (999) : %FOUND = 0, %ERROR = 0
DELETE (500) : %FOUND = 1
DELETE sans lecture : %ERROR = 1, statut = 1221
Erreur : RNQ1221 - MAJ ou SUP sur fichier CLIENTW, sans opération d'entrée préalable.
delete (999) ne produit aucune erreur : %FOUND vaut 0 et c'est tout. Le client 500 est supprimé par sa clé puis recréé. Plus bas, le DELETE sans clé qui suit un CHAIN raté échoue avec %STATUS 1221, et RNQ1221 arrête le programme quand il n'y a pas de (E).
Le piège
Une clé absente ne fait pas d'erreur. delete (999) clientw; passe sans bruit : si vous ne regardez pas %FOUND, vous ne saurez pas que rien n'a été supprimé (exemple 2). À l'inverse, la forme sans clé exige une lecture avec verrou juste avant : sans elle, RNQ1221.