Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers
UPDAT
Réécrire l'enregistrement qui vient d'être lu
Remplace dans le fichier l'enregistrement courant (le dernier lu en mise à jour) par les valeurs des zones du format.
Syntaxe
C UPDATformat ER
C UPDATformat
- Facteur 2 (33-42)
- Le nom du format d'enregistrement. Le nom du fichier est refusé pour un fichier décrit en externe :
QRG5063, « Le nom de fichier à description externe est incorrect en Facteur 2 (positions 33 à 42) pour l'opération définie ». - Indicateurs (56-57)
- Facultatif : s'allume si la mise à jour est impossible (par exemple aucune lecture préalable). Sans lui, une erreur arrête le programme.
- Effet
- L'enregistrement lu est remplacé par les valeurs des zones. Un nouvel
UPDATn'est possible qu'après une nouvelle lecture.
À quoi ça sert
Toute modification en place suit le même schéma : CHAIN (ou READ) sur un fichier en mise à jour (U en colonne 15), changement des zones, UPDAT.
Toutes les zones du format sont réécrites, y compris celles que le programme n'a pas touchées : elles reprennent les valeurs de la lecture.
Exemple 1 : Modifier le solde puis le remettre
H* UPDAT : modifier un client lu par CHAIN puis remettre l'ancien
FCLIENT3WUF E K DISK
C*
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C 99 GOTO FIN
C Z-ADD1250.50 ANCIEN 92
C Z-ADD2000.00 SOLDE
C UPDATCLI3WR
C*
C* Relecture : le nouveau solde est bien dans le fichier
C NUMERO CHAINCLIENT3W 99
C SOLDE DSPLY
C*
C* Remise en etat
C Z-ADDANCIEN SOLDE
C UPDATCLI3WR
C NUMERO CHAINCLIENT3W 99
C SOLDE DSPLY
C FIN TAG
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
200000
125050
Le CHAIN lit le client 100. SOLDE passe à 2000,00, l'UPDAT l'écrit, et un second CHAIN montre « 200000 ». Une seconde modification remet 1250,50 (« 125050 »).
Exemple 2 : Deux UPDAT de suite
H* UPDAT sans lecture prealable : le programme s'arrete
FCLIENT3WUF E K DISK
C*
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3W 99
C* Premiere mise a jour (zones inchangees) : acceptee
C UPDATCLI3WR
C 'Apres 1' DSPLY
C* Aucune lecture depuis : seconde mise a jour refusee
C UPDATCLI3WR
C 'Apres 2' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Apres 1
Erreur : RPG1221 - MAJ ou SUPP sur CLIENT3W sans READ ou CHAIN préalable (C G S D F).
Le premier UPDAT suit un CHAIN et passe (« Apres 1 »). Le second n'est précédé d'aucune lecture : le programme s'arrête avec RPG1221.
Exemple 3 : UPDAT après une lecture avec N
H* UPDAT apres une lecture avec N en colonne 53 : refuse
FCLIENT3WUF E K DISK
C*
C Z-ADD100 NUMERO 50
C NUMERO CHAINCLIENT3W N99
C NOM DSPLY
C UPDATCLI3WR
C 'Apres' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Dupont SA
Erreur : RPG1221 - MAJ ou SUPP sur CLIENT3W sans READ ou CHAIN préalable (C G S D F).
Le CHAIN porte N en colonne 53 : il lit sans verrouiller. L'UPDAT qui suit est refusé de la même façon (RPG1221).
Le piège
UPDAT sans lecture préalable arrête le programme : RPG1221, « MAJ ou SUPP sur CLIENT3W sans READ ou CHAIN préalable ». Il en va de même pour un deuxième UPDAT consécutif (exemple 2) et après une lecture avec N en colonne 53 (exemple 3).
Avec un indicateur en 56-57, cette même erreur n'arrête plus le programme : l'indicateur s'allume et on continue. Testez-le, sinon la mise à jour peut être perdue sans que personne le voie.
En RPG ILE full free
En RPG ILE full free, UPDATE prend le nom du format. La logique est la même : il faut avoir lu l'enregistrement par CHAIN ou READ sur un fichier en mise à jour.
chain numero cli3wr clients;
if %found(client3w);
clients.solde = 2000;
update cli3wr clients;
endif;