Instruction RPG full free · IBM i (AS/400) · Écriture et contrôle des fichiers
FEOD
Forcer la fin de données
Force l'écriture sur disque des enregistrements gardés dans le tampon d'un fichier de sortie, sans le fermer.
Syntaxe
FEOD fichier;
FEOD(E) fichier;
fichier- Le nom du fichier déclaré par
dcl-f(en sortie). (E)- Une erreur positionne
%ERRORet%STATUS. - Effet
- Les enregistrements du tampon sont écrits dans le fichier et deviennent visibles des autres accès. Le fichier reste ouvert.
%ERRORet%STATUSrestent à 0 quand tout va bien.
À quoi ça sert
Pour aller vite, le système peut regrouper les enregistrements écrits par WRITE dans un tampon (mode séquentiel, SEQONLY) et ne les envoyer au disque que quand le tampon est plein ou que le fichier est fermé. Un autre accès au même fichier ne les voit donc pas tout de suite.
FEOD vide le tampon à la demande : on s'en sert pour qu'un lot intermédiaire de lignes soit visible, ou avant de lancer une commande qui lit le fichier.
Exemple 1 : Tampon invisible jusqu'au FEOD
**free
// FEOD : forcer l'ecriture des enregistrements gardes dans le tampon d'un fichier.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-pr qcmdexc extpgm('QCMDEXC');
cmd char(200) const;
lng packed(15:5) const;
end-pr;
// Fichier de sortie : les WRITE sont regroupes dans un tampon avant d'aller sur disque.
dcl-f clientw usage(*output) usropn extdesc('JOBISQL/CLIENTW') extfile(*extdesc);
// Meme table lue par un autre acces : il ne voit que ce qui est reellement ecrit.
dcl-f lecteur usage(*update : *delete) keyed prefix('L_')
extdesc('JOBISQL/CLIENTW') extfile(*extdesc) rename(clientwr : lecturer);
qcmdexc('OVRDBF FILE(CLIENTW) TOFILE(JOBISQL/CLIENTW) SEQONLY(*YES 50)' : 200);
open clientw;
numcli = 800;
nom = 'Client du tampon';
ville = 'Albi';
solde = 12.50;
datcre = d'2026-09-30';
write clientwr;
chain (800) lecteur;
snd-msg 'Apres WRITE, avant FEOD : vu par le lecteur = ' + %char(%found(lecteur));
feod clientw;
chain (800) lecteur;
snd-msg 'Apres FEOD : vu par le lecteur = ' + %char(%found(lecteur));
// Nettoyage : on supprime le client 800 pour laisser la table intacte.
delete lecturer;
chain (800) lecteur;
snd-msg 'Apres DELETE : vu par le lecteur = ' + %char(%found(lecteur));
close clientw;
qcmdexc('DLTOVR FILE(CLIENTW)' : 200);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Apres WRITE, avant FEOD : vu par le lecteur = 0
Apres FEOD : vu par le lecteur = 1
Apres DELETE : vu par le lecteur = 0
Le fichier de sortie est ouvert avec OVRDBF … SEQONLY(*YES 50) : les écritures sont mises en tampon. Un second accès à la même table cherche le client 800 juste après le WRITE : introuvable (0). Après feod clientw;, il le trouve (1). Le programme supprime ensuite son client.
Exemple 2 : Sans tampon, rien à vider
**free
// FEOD : sans mise en tampon (pas de SEQONLY), le WRITE est deja visible, FEOD n'apporte rien.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-f clientw usage(*output) extdesc('JOBISQL/CLIENTW') extfile(*extdesc);
dcl-f lecteur usage(*update : *delete) keyed prefix('L_')
extdesc('JOBISQL/CLIENTW') extfile(*extdesc) rename(clientwr : lecturer);
numcli = 801;
nom = 'Client sans tampon';
ville = 'Albi';
solde = 3.75;
datcre = d'2026-09-30';
write clientwr;
chain (801) lecteur;
snd-msg 'Apres WRITE seul : vu par le lecteur = ' + %char(%found(lecteur));
feod(e) clientw;
snd-msg 'FEOD : erreur = ' + %char(%error) + ', statut = ' + %char(%status(clientw));
// Nettoyage.
chain (801) lecteur;
delete lecturer;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Apres WRITE seul : vu par le lecteur = 1
FEOD : erreur = 0, statut = 0
Sans SEQONLY, le WRITE est visible tout de suite (1) et FEOD se passe sans erreur, mais n'apporte rien.
Le piège
Les écritures du tampon n'existent pas encore pour les autres accès. Dans l'exemple 1, le lecteur ne trouve pas le client 800 tant que FEOD n'a pas eu lieu : un programme qui lit la table juste après un WRITE mis en tampon ne retrouve pas les enregistrements. Appelez FEOD avant de rendre la main, ou fermez le fichier. Sans SEQONLY, FEOD est inutile (exemple 2).