Aller au contenu

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 %ERROR et %STATUS.
Effet
Supprime l'enregistrement. Avec une clé, %FOUND vaut *ON si un enregistrement a été supprimé, *OFF sinon ; une clé absente n'est pas une erreur. Sans clé, une lecture avec verrou est requise juste avant : sinon %STATUS 1221 (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.