Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Écriture et contrôle des fichiers

EXCPT

Écrire les lignes d'exception de la spécification O

Déclenche l'écriture des lignes de sortie de type E de la spécification O, repérées par un nom : état imprimé, ajout ou mise à jour d'un enregistrement disque.

Syntaxe

     C                     EXCPTnom
     C                     EXCPT
     OQSYSPRT E  1             LIGNE
     O                         NUMCLIZ    6
Facteur 2 (33-42)
Le nom de l'exception : il doit se retrouver en colonnes 32-37 de la première ligne E de la spécification O. Sans nom, l'opération écrit les lignes E qui n'en ont pas.
Spécification O, colonne 15
E pour une ligne d'exception. Les lignes suivantes (zone ou constante, sans type en colonne 15) décrivent ce qu'on écrit : nom de zone en 32-37, code d'édition en 38, position de fin en 40-43, constante entre apostrophes à partir de la colonne 45.
Spécification O, colonnes 7-14
Pour l'imprimante : le fichier (QSYSPRT). Pour un fichier disque décrit en externe : le format d'enregistrement (CLI3WR). Le nom du fichier est refusé : QRG6100, « Nom de format d'enregistrement obligatoire pour données à description externe ».
Spécification O, colonnes 16-18
ADD pour ajouter un enregistrement. Sans ADD sur un fichier disque, la ligne met à jour l'enregistrement courant.
Effet
Les lignes E portant le nom sont écrites avec les valeurs courantes des zones. Sur un fichier disque en mise à jour, seules les zones citées dans la spécification O sont modifiées ; les autres zones de l'enregistrement restent telles quelles dans le fichier.

À quoi ça sert

EXCPT sort du cycle RPG : le programme décide quand écrire. On l'utilise pour imprimer un état ligne par ligne (en-tête, détail, total) sans passer par les indicateurs de cycle, et pour mettre à jour ou ajouter des enregistrements en nommant seulement les zones concernées.

Les codes d'édition de la colonne 38 mettent en forme les nombres : Z supprime les zéros de tête, J ajoute les séparateurs et le signe moins à droite.

Exemple 1 : État des clients sur QSYSPRT

     H*  EXCPT : etat imprime par des lignes d'exception nommees
     FCLIENT3 IF  E           K        DISK
     FQSYSPRT O   F     132            PRINTER
     C*
     C                     EXCPTENTETE
     C                     Z-ADD0         TOTAL   92
     C           *LOVAL    SETLLCLIENT3
     C                     READ CLIENT3                  90
     C           *IN90     DOWEQ'0'
     C                     ADD  SOLDE     TOTAL
     C                     EXCPTLIGNE
     C                     READ CLIENT3                  90
     C                     END
     C                     EXCPTPIED
     C                     SETON                     LR
     OQSYSPRT E  1             ENTETE
     O                                   25 'LISTE DES CLIENTS'
     OQSYSPRT E  1             LIGNE
     O                         NUMCLIZ    6
     O                         NOM       38
     O                         SOLDE J   52
     OQSYSPRT E 1              PIED
     O                                   10 'TOTAL'
     O                         TOTAL J   52

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

État imprimé (spoule QSYSPRT)

        LISTE DES CLIENTS
   100  Dupont SA                          1,250.50
   200  Martin et fils                          .00
   300  Leroy SARL                           320.00-
   400  Bernard Transports                98,000.00
   500  Petit Atelier                         45.10
     TOTAL                                98,975.60

Trois noms d'exception : ENTETE (titre), LIGNE (un client) et PIED (total). La boucle de lecture appelle EXCPT LIGNE pour chaque client. NUMCLI est imprimé avec le code Z, SOLDE avec J : « 1,250.50 », « 320.00- » pour un solde négatif, et « .00 » pour zéro.

Exemple 2 : Mettre à jour une seule zone

     H*  EXCPT : mise a jour de certaines zones d'un enregistrement disque
     FCLIENT3WUF  E           K        DISK
     C*
     C                     Z-ADD300       NUMERO  50
     C           NUMERO    CHAINCLIENT3W             99
     C   99                GOTO FIN
     C                     Z-ADDSOLDE     ANCIEN  92
     C*  NOM et SOLDE changent en memoire, mais seul SOLDE est ecrit
     C                     MOVEL'Autre'   NOM
     C                     Z-ADD0         SOLDE
     C                     EXCPTMAJSOL
     C           NUMERO    CHAINCLIENT3W             99
     C           NOM       DSPLY
     C           SOLDE     DSPLY
     C*  Remise en etat
     C                     Z-ADDANCIEN    SOLDE
     C                     UPDATCLI3WR
     C           NUMERO    CHAINCLIENT3W             99
     C           SOLDE     DSPLY
     C           FIN       TAG
     C                     SETON                     LR
     OCLI3WR  E                MAJSOL
     O                         SOLDE

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Leroy SARL
        0
    32000-

Après le CHAIN du client 300, le programme met NOM à « Autre » et SOLDE à zéro, mais la ligne E ne cite que SOLDE. La relecture montre que le solde est à zéro et que NOM est resté « Leroy SARL ». Le programme remet ensuite le solde par un UPDAT (« 32000- » correspond à -320,00).

Exemple 3 : Ajouter un enregistrement avec ADD

     H*  EXCPT : ajouter un enregistrement par une ligne E ADD
     FCLIENT3WUF  E           K        DISK                      A
     C*
     C                     Z-ADD650       NUMCLI
     C                     MOVEL'Fournier'NOM
     C                     MOVEL'Lille'   VILLE
     C                     EXCPTAJOUT
     C                     Z-ADD650       NUMERO  50
     C           NUMERO    CHAINCLIENT3W             99
     C           NOM       DSPLY
     C           VILLE     DSPLY
     C*  Remise en etat
     C                     DELETCLI3WR
     C                     SETON                     LR
     OCLI3WR  EADD             AJOUT
     O                         NUMCLI
     O                         NOM
     O                         VILLE

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Fournier
Lille

La ligne E porte ADD en colonnes 16-18 : EXCPT AJOUT crée l'enregistrement du client 650 à partir des seules zones NUMCLI, NOM et VILLE. Le CHAIN le retrouve et le DELET le supprime.

Le piège

Seules les zones listées sont écrites sur un fichier disque : dans l'exemple 2, la modification de NOM en mémoire n'atteint pas le fichier parce que la ligne E ne la cite pas.

Sur un fichier disque, la spécification O porte le nom du format, pas celui du fichier : avec OCLIENT3WE, le compilateur répond QRG6100, « Nom de format d'enregistrement obligatoire pour données à description externe ».

Le zéro édité avec J s'imprime « .00 » et non « 0.00 » (premier exemple). Utilisez un autre code d'édition si cela ne convient pas.

En RPG ILE full free

L'opération EXCEPT existe toujours en RPG IV avec ses spécifications O. En full free pur, on écrit plutôt les lignes d'un fichier imprimante décrit en externe avec WRITE (PRTF), et on met à jour un enregistrement avec UPDATE ou une instruction SQL.

write ligne;
// ou, avec des spécifications O :
except ligne;