Aller au contenu

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 UPDAT n'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;