%FIELDS
Mettre à jour seulement certaines zones
Limite un UPDATE aux zones citées, les autres zones de l'enregistrement restant inchangées dans le fichier.
Syntaxe
%FIELDS(zone1 : zone2 : …)
zone- Une ou plusieurs zones du format d'enregistrement, séparées par deux-points. Elles seront les seules à être réécrites.
- Résultat
- Pas de valeur : la fonction s'emploie en dernier opérande d'un
UPDATE, après le nom du format.
À quoi ça sert
Un UPDATE ordinaire réécrit toutes les zones du format. Si une zone a été modifiée par erreur dans le programme (zone de travail, valeur périmée…), elle part dans le fichier. Avec %FIELDS, on nomme ce qu'on veut vraiment changer, et le reste ne bouge pas.
C'est aussi la bonne écriture quand on ne met à jour qu'une ou deux zones d'un format de plusieurs dizaines.
Exemple 1 : Deux zones modifiées, une seule enregistrée
**free
// %FIELDS : ne mettre a jour que certaines zones de l'enregistrement.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f f_client usage(*update) keyed;
dcl-ds relu likerec(f_clientr : *input);
chain (100) f_client;
// On change deux zones en memoire, mais on n'en enregistre qu'une
solde = 1500.00;
nom = 'NOM MODIFIE EN MEMOIRE';
update f_clientr %fields(solde);
chain (100) f_client relu;
snd-msg 'Dans le fichier : ' + %trim(relu.nom) + ' / ' + %char(relu.solde);
// Remise en etat de l'enregistrement de depart
solde = 1250.50;
update f_clientr %fields(solde);
chain (100) f_client relu;
snd-msg 'Apres remise : ' + %trim(relu.nom) + ' / ' + %char(relu.solde);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Dans le fichier : Dupont SA / 1500.00
Apres remise : Dupont SA / 1250.50
Le programme change SOLDE et NOM en mémoire, mais ne cite que SOLDE dans %FIELDS. La relecture montre le nouveau solde et l'ancien nom : « Dupont SA / 1500.00 ». L'enregistrement est ensuite remis à son état de départ (1250.50). Les exemples utilisent la copie JOBIRPG/F_CLIENT.
Exemple 2 : UPDATE complet contre %FIELDS
**free
// UPDATE sans %FIELDS : toutes les zones du format sont reecrites.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl) decedit('0.');
dcl-f f_client usage(*update) keyed;
dcl-ds relu likerec(f_clientr : *input);
chain (200) f_client;
// La zone VILLE sert un instant de zone de travail, puis on met le solde a jour
ville = 'TEMPORAIRE';
solde = 10.00;
update f_clientr;
chain (200) f_client relu;
snd-msg 'UPDATE complet : ' + %trim(relu.ville) + ' / ' + %char(relu.solde);
// Remise en etat, en ne nommant que les deux zones concernees
ville = 'Lyon';
solde = 0;
update f_clientr %fields(ville : solde);
chain (200) f_client relu;
snd-msg 'Apres remise : ' + %trim(relu.ville) + ' / ' + %char(relu.solde);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
UPDATE complet : TEMPORAIRE / 10.00
Apres remise : Lyon / 0.00
Sans %FIELDS, la ville qui a servi de zone de travail (« TEMPORAIRE ») est écrite dans le fichier avec le solde. La remise en état utilise %FIELDS(ville : solde), avec la liste des deux zones.
Le piège
Sans %FIELDS, tout le format est réécrit. Le second exemple le montre : une zone du format prise pour un brouillon se retrouve dans le fichier. Attention aussi à l'inverse : avec %FIELDS, une zone modifiée mais non citée n'est pas enregistrée (le nom dans le premier exemple), sans aucun message.