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
Ede la spécification O. Sans nom, l'opération écrit les lignesEqui n'en ont pas. - Spécification O, colonne 15
Epour 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
ADDpour ajouter un enregistrement. SansADDsur un fichier disque, la ligne met à jour l'enregistrement courant.- Effet
- Les lignes
Eportant 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;