Aller au contenu

%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.