Aller au contenu
Spécification O · %EDITW · RPG III, IV, full free

Les mots d'édition, imprimer un nombre exactement comme on le veut

Un montant en euros, une date, un SIRET, un numéro de téléphone ou un chèque protégé par des astérisques : les règles du mot d'édition, caractère par caractère, et 38 exemples dont chaque résultat a été imprimé sur un IBM i 7.5, en RPG III, en RPG IV et avec %EDITW.

3parties : corps, signe, extension
43exemples imprimés, positif, négatif et zéro
26caractères au plus en RPG IV
3versions, un seul état

En une phrase

Un mot d'édition est un gabarit écrit entre apostrophes qui décrit, caractère par caractère, comment imprimer une zone numérique : chaque blanc reçoit un chiffre, et tous les autres caractères disent où supprimer les zéros, où mettre la virgule, le symbole monétaire ou le signe.

Où l'écrire

Quand aucun code d'édition (1 à 4, A à D, J à Q, X à Z) ne donne la présentation voulue, on la décrit soi-même. Le mot prend la place de la constante sur la ligne de la zone, ce qui interdit d'y mettre aussi un code d'édition.

OùComment
RPG III (RPG/400)Spécification O : nom de la zone en 32-37, colonne 38 (code d'édition) à blanc, position de fin en 40-43, mot d'édition entre apostrophes en 45-70, donc 24 caractères au plus.
RPG IV colonnéSpécification O : nom de la zone en 30-43, colonne 44 à blanc, position de fin en 47-51, mot d'édition en 53-80 (26 caractères au plus), ou le nom d'une constante nommée : 115 caractères au plus.
RPG full freePas de spécification O en format libre : la fonction %EDITW(zone : mot) rend le texte édité, à placer où l'on veut.
DDS (écran, état)Le mot-clé EDTWRD('mot') sur une zone numérique d'un DSPF ou d'un PRTF.

Dans les exemples de cette page, ␢ représente un blanc, comme dans le manuel IBM. Dans le source, on tape un vrai espace.

Les trois parties d'un mot d'édition

IBM découpe un mot d'édition en trois parties, de gauche à droite. Exemple : la zone vaut 1,23, ou -1,23.

  • Le corps va du début du mot jusqu'au dernier caractère qui peut recevoir un chiffre (un blanc, ou le 0 ou l'astérisque d'arrêt). Il doit compter au moins autant de positions de chiffres que la zone a de chiffres.
  • Le signe se termine par CR ou par -. Tout ce qui suit le corps jusqu'au signe n'est imprimé que si le nombre est négatif : ici, &30&DAY&CR donne « ␢30␢DAY␢CR » pour -1,23 et dix blancs pour 1,23.
  • L'extension suit le signe ; elle est imprimée dans tous les cas. Sans signe, elle suit directement le corps : c'est ainsi qu'on imprime « € » ou « % » derrière un nombre.

Les caractères qui ont un sens

CaractèreOùEffet
␢ (blanc)CorpsReçoit un chiffre. C'est une « position de chiffre ».
0CorpsLe premier 0 arrête la suppression des zéros : à sa droite, les zéros sont imprimés. Il compte aussi comme position de chiffre. Les 0 suivants sont des constantes.
*CorpsComme le 0, mais les zéros supprimés à sa gauche sont remplacés par des astérisques (protection d'un chèque). Un seul arrêt par mot : le premier 0 ou le premier *.
$ (ou CURSYM)CorpsCollé devant le 0 d'arrêt : symbole flottant, imprimé juste avant le premier chiffre. En première position : symbole fixe. Ailleurs : une constante.
. et ,CorpsRecopiés tels quels, mais effacés s'ils sont à gauche du premier chiffre imprimé.
&PartoutImprime un blanc. C'est le seul moyen d'avoir un blanc dans le signe ou l'extension.
CR ou -SigneImprimés seulement si le nombre est négatif, avec tout ce qui les précède depuis le dernier chiffre. Le - doit être le dernier caractère du mot.
autre caractèreCorpsUne constante : imprimée si un chiffre est imprimé à sa gauche, sinon effacée.
autre caractèreExtensionImprimé dans tous les cas.

Compter les positions

  • Seuls les blancs du corps et le 0 (ou *) d'arrêt comptent comme positions de chiffres ; le symbole monétaire flottant ne compte pas.
  • S'il y a plus de positions que de chiffres, la zone est complétée par des zéros à gauche avant l'édition.
  • Pour imprimer les zéros de tête, il faut une position de plus que la zone, avec le 0 en première position.

Les exemples, imprimés sur IBM i

Chaque mot a été appliqué à la valeur, à son opposé et à zéro, sur une zone décimale condensée de la longueur indiquée (« 9,2 » : 9 chiffres dont 2 décimales). Les trois programmes du banc, en RPG III, en RPG IV colonné et en full free avec %EDITW, ont imprimé exactement les mêmes résultats.

Le corps : blancs, point et virgule

Mot d'éditionZoneValeurPositifNégatifZéro
'␢␢␢␢␢␢␢' 7,0 72 ␢␢␢␢␢72 ␢␢␢␢␢72 ␢␢␢␢␢␢␢
'␢␢␢␢␢␢␢.␢␢' 9,2 0,12 ␢␢␢␢␢␢␢␢12 ␢␢␢␢␢␢␢␢12 ␢␢␢␢␢␢␢␢␢␢
Le point disparaît : aucun chiffre significatif à sa gauche.
'␢␢␢␢␢␢␢.␢␢' 9,2 1,23 ␢␢␢␢␢␢1.23 ␢␢␢␢␢␢1.23 ␢␢␢␢␢␢␢␢␢␢
'␢,␢␢␢,␢␢␢.␢␢' 9,2 1234567,89 1,234,567.89 1,234,567.89 ␢␢␢␢␢␢␢␢␢␢␢␢
'␢,␢␢␢,␢␢␢.␢␢' 9,2 4,56 ␢␢␢␢␢␢␢␢4.56 ␢␢␢␢␢␢␢␢4.56 ␢␢␢␢␢␢␢␢␢␢␢␢
Les virgules à gauche du premier chiffre deviennent des blancs.

Arrêter la suppression des zéros : le 0

Mot d'éditionZoneValeurPositifNégatifZéro
'␢␢␢␢␢␢0.␢␢' 9,2 0,01 ␢␢␢␢␢␢␢.01 ␢␢␢␢␢␢␢.01 ␢␢␢␢␢␢␢.00
'␢␢␢,␢␢0␢.␢␢' 8,2 0,12 ␢␢␢␢␢␢␢0.12 ␢␢␢␢␢␢␢0.12 ␢␢␢␢␢␢␢0.00
'␢␢␢,␢␢0␢.␢␢' 8,2 1,23 ␢␢␢␢␢␢␢1.23 ␢␢␢␢␢␢␢1.23 ␢␢␢␢␢␢␢0.00
'␢0␢,␢␢␢.␢␢' 8,2 1,23 ␢␢0,001.23 ␢␢0,001.23 ␢␢0,000.00
Le 0 avance l'arrêt : la virgule est imprimée.
'0␢␢␢' 4,0 156 ␢156 ␢156 ␢000
'0␢␢␢␢' 4,0 156 ␢0156 ␢0156 ␢0000
Une position de plus que la zone : le zéro de tête apparaît.
'␢␢0.␢␢000' 5,2 12,34 ␢12.34000 ␢12.34000 ␢␢␢.00000
Les 0 qui suivent le premier sont des constantes.

Protéger un montant : l'astérisque

Mot d'éditionZoneValeurPositifNégatifZéro
'*␢␢␢␢␢␢.␢␢' 9,2 1,23 *000001.23 *000001.23 *000000.00
'␢␢␢␢␢*␢.␢␢' 9,2 1,23 ******1.23 ******1.23 ******0.00
'␢␢␢␢␢*␢.␢␢**' 9,2 563,42 ****563.42** ****563.42** ******0.00**
Le second astérisque est une constante.
'␢␢*.␢␢000' 5,2 12,34 *12.34000 *12.34000 ***.00000

Le symbole monétaire, fixe ou flottant

Mot d'éditionZoneValeurPositifNégatifZéro
'␢␢,␢␢␢,␢$0.␢␢' 9,2 1234,56 ␢␢␢␢$1,234.56 ␢␢␢␢$1,234.56 ␢␢␢␢␢␢␢␢␢$.00
$ flottant : collé au premier chiffre.
'$␢,␢␢␢,␢␢0.␢␢' 9,2 1234,56 $␢␢␢␢1,234.56 $␢␢␢␢1,234.56 $␢␢␢␢␢␢␢␢␢.00
$ fixe : toujours en première position.
'$␢,␢␢␢,*␢␢.␢␢' 9,2 1234,56 $****1,234.56 $****1,234.56 $*******00.00
'$␢␢␢␢␢␢**DOLLARS&␢␢&CTS' 9,2 123,45 $****123*DOLLARS␢45␢CTS $****123*DOLLARS␢45␢CTS $********DOLLARS␢00␢CTS
Le chèque américain du manuel IBM.
'$␢␢␢␢␢␢␢&DOLLARS&␢␢&CTS' 9,2 0,06 $␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢6␢CTS $␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢6␢CTS $␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢CTS

Constantes et &

Mot d'éditionZoneValeurPositifNégatifZéro
'0AREA&␢␢␢&NO.&␢␢␢-␢␢␢␢' 10,0 4165551212 ␢AREA␢416␢NO.␢555-1212 ␢AREA␢416␢NO.␢555-1212 ␢AREA␢000␢NO.␢000-0000
Le 0 en tête est nécessaire pour imprimer AREA.
'␢␢/␢␢/␢␢␢␢' 8,0 5092026 ␢5/09/2026 ␢5/09/2026 ␢␢␢␢␢␢␢␢␢␢
Date JJMMAAAA : le zéro de tête disparaît.
'0␢␢/␢␢/␢␢␢␢' 8,0 5092026 ␢05/09/2026 ␢05/09/2026 ␢00/00/0000
Un 0 en tête le garde.
'␢␢h␢␢m␢␢s' 6,0 80530 ␢8h05m30s ␢8h05m30s ␢␢␢␢␢␢␢␢s
'0␢␢h␢␢m␢␢s' 6,0 80530 ␢08h05m30s ␢08h05m30s ␢00h00m00s

Le signe : CR et -

Mot d'éditionZoneValeurPositifNégatifZéro
'␢␢␢␢␢␢␢.␢␢-' 9,2 1,23 ␢␢␢␢␢␢1.23␢ ␢␢␢␢␢␢1.23- ␢␢␢␢␢␢␢␢␢␢␢
'␢␢␢␢␢␢␢.␢␢CR' 9,2 1,23 ␢␢␢␢␢␢1.23␢␢ ␢␢␢␢␢␢1.23CR ␢␢␢␢␢␢␢␢␢␢␢␢
'␢,␢␢␢,␢␢0.␢␢&30&DAY&CR' 9,2 1,23 ␢␢␢␢␢␢␢␢1.23␢␢␢␢␢␢␢␢␢␢ ␢␢␢␢␢␢␢␢1.23␢30␢DAY␢CR ␢␢␢␢␢␢␢␢␢.00␢␢␢␢␢␢␢␢␢␢
Tout ce qui précède CR n'est imprimé que si le nombre est négatif.

L'extension : ce qui suit le signe

Mot d'éditionZoneValeurPositifNégatifZéro
'␢,␢␢0.␢␢&CR&NET' 6,2 1,23 ␢␢␢␢1.23␢␢␢␢NET ␢␢␢␢1.23␢CR␢NET ␢␢␢␢␢.00␢␢␢␢NET
NET est imprimé dans tous les cas.
'␢␢0.␢␢&SECRET' 5,2 123,45 123.45␢␢␢␢␢ET 123.45␢SECRET ␢␢␢.00␢␢␢␢␢ET
Le CR de SECRET est pris pour le signe.
'␢␢0.␢␢&CR&&SECRET' 5,2 123,45 123.45␢␢␢␢␢SECRET 123.45␢CR␢␢SECRET ␢␢␢.00␢␢␢␢␢SECRET
Le remède : un CR avant.

À la française

Mot d'éditionZoneValeurPositifNégatifZéro
'␢␢␢&␢␢␢&␢␢0,␢␢' 10,2 12345678,90 ␢12␢345␢678,90 ␢12␢345␢678,90 ␢␢␢␢␢␢␢␢␢␢␢,00
Espace comme séparateur de milliers.
'␢␢␢.␢␢␢.␢␢0,␢␢' 10,2 12345678,90 ␢12.345.678,90 ␢12.345.678,90 ␢␢␢␢␢␢␢␢␢␢␢,00
'␢␢␢.␢␢␢.␢␢0,␢␢-' 10,2 1234,50 ␢␢␢␢␢␢1.234,50␢ ␢␢␢␢␢␢1.234,50- ␢␢␢␢␢␢␢␢␢␢␢,00␢
'0␢␢&␢␢&␢␢&␢␢&␢␢' 10,0 612345678 ␢06␢12␢34␢56␢78 ␢06␢12␢34␢56␢78 ␢00␢00␢00␢00␢00
Numéro de téléphone.
'␢␢␢&␢␢␢&␢␢␢&␢␢␢␢␢' 14,0 73282932000074 732␢829␢320␢00074 732␢829␢320␢00074 ␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢␢
Numéro SIRET.
'␢␢0,␢␢&%' 5,2 12,5 ␢12,50␢% ␢12,50␢% ␢␢␢,00␢%

L'euro, la virgule et DECEDIT

Le symbole monétaire est le $, sauf si le programme en choisit un autre : colonne 18 de la spécification H en RPG III, mot-clé CURSYM('€') en RPG IV et en full free. Le € devient alors flottant ou fixe, comme le $. Pour la virgule, en revanche, rien à régler : un mot d'édition imprime le point et la virgule là où on les a écrits. Le programme ci-dessous demande aussi la virgule décimale (colonne 21 de la spécification H à J en RPG III, DECEDIT('0,') en RPG IV) : seul le code d'édition J en tient compte.

Mot ou codeZoneValeurPositifNégatifZéro
'␢␢␢.␢␢␢.␢€0,␢␢' 10,2 1234,5 ␢␢␢␢␢€1.234,50 ␢␢␢␢␢€1.234,50 ␢␢␢␢␢␢␢␢␢␢€,00
'€␢␢.␢␢␢.␢␢0,␢␢' 10,2 1234,5 €␢␢␢␢␢1.234,50 €␢␢␢␢␢1.234,50 €␢␢␢␢␢␢␢␢␢␢,00
'␢␢␢.␢␢␢.␢␢0,␢␢' 10,2 1234,5 ␢␢␢␢␢␢1.234,50 ␢␢␢␢␢␢1.234,50 ␢␢␢␢␢␢␢␢␢␢␢,00
'␢␢␢␢␢␢␢␢.␢␢' 10,2 1,23 ␢␢␢␢␢␢␢1.23 ␢␢␢␢␢␢␢1.23 ␢␢␢␢␢␢␢␢␢␢␢
EDTCDE J 10,2 1234,5 1.234,50 1.234,50- 0,00

Le mot '␢␢␢␢␢␢␢␢.␢␢' garde son point avec DECEDIT('0,'), alors que le code J imprime 1.234,50 et 0,00. Si l'on veut des montants à la française, on les écrit donc dans le mot : '␢␢␢.␢␢␢.␢␢0,␢␢'. L'euro peut aussi être une simple constante dans l'extension, sans CURSYM : '␢␢.␢␢␢.␢␢0,␢␢&€', comme dans le relevé ci-dessous.

Exemple complet RELEVE

Un relevé de compte, en RPG III, RPG IV et full free

Le même petit programme en trois versions : il calcule la TVA et le net à payer, puis imprime un relevé dont chaque nombre passe par un mot d'édition. Une date, un numéro de client avec ses zéros, un SIRET et un téléphone groupés par des blancs, des montants suivis de € (extension), un avoir suivi de CR (signe), un net à payer protégé par des astérisques. Les trois versions impriment le même état, au caractère près :

Écran Fichier spoule (DSPSPLF) de QSYSPRT : RELEVÉ DE COMPTE, date 22/10/2026, client 004127 DUPONT QUINCAILLERIE, SIRET 732 829 320 00074, téléphone 04 67 12 34 56, montant HT 1.234,50 €, TVA 20,00 % 246,90 €, total TTC 1.481,40 €, avoir 150,00 CR, net à payer *****1.331,40 €
L'état affiché par DSPSPLF : chaque nombre sort de son mot d'édition.
RELEVÉ DE COMPTE                                    Date :  22/10/2026
  Client :  004127  DUPONT QUINCAILLERIE
  SIRET  : 732 829 320 00074            Tél : 04 67 12 34 56
Facture 26-0412       Montant HT  :       1.234,50 €
                    TVA 20,00 %   :         246,90 €
                      Total TTC   :       1.481,40 €
Avoir   26-0007       Montant     :         150,00 CR
                      Net à payer :  *****1.331,40 €

RPG III RELEVE3

     H                                                                    RELEVE
     FQSYSPRT O   F      80            PRINTER
     I              73282932000074        C         KSIRET
     C                     Z-ADD22102026  DATREL  80
     C                     Z-ADD4127      CLIENT  60
     C                     Z-ADDKSIRET    SIRET  140
     C                     Z-ADD467123456 TEL    100
     C                     Z-ADD1234.50   HT      92
     C                     Z-ADD20        TAUX    42
     C           HT        MULT TAUX      W      134
     C           W         DIV  100       TVA     92H
     C           HT        ADD  TVA       TTC     92
     C                     Z-SUB150       AVOIR   92
     C           TTC       ADD  AVOIR     SOLDE   92
     C                     EXCPTRELEVE
     C                     SETON                     LR
     OQSYSPRT E  1             RELEVE
     O                                   16 'RELEVÉ DE COMPTE'
     O                                   58 'Date :'
     O                         DATREL    70 '0  /  /    '
     OQSYSPRT E  1             RELEVE
     O                                   10 'Client :'
     O                         CLIENT    18 '0      '
     O                                   40 'DUPONT QUINCAILLERIE'
     OQSYSPRT E  1             RELEVE
     O                                   10 'SIRET  :'
     O                         SIRET     28 '   &   &   &     '
     O                                   45 'Tél :'
     O                         TEL       60 '0  &  &  &  &  '
     OQSYSPRT E  1             RELEVE
     O                                   15 'Facture 26-0412'
     O                                   35 'Montant HT  :'
     O                         HT        52 '  .   .  0,  &€'
     OQSYSPRT E  1             RELEVE
     O                                   23 'TVA'
     O                         TAUX      31 '  0,  &%'
     O                                   35 ':'
     O                         TVA       52 '  .   .  0,  &€'
     OQSYSPRT E  1             RELEVE
     O                                   35 'Total TTC   :'
     O                         TTC       52 '  .   .  0,  &€'
     OQSYSPRT E  1             RELEVE
     O                                   15 'Avoir   26-0007'
     O                                   35 'Montant     :'
     O                         AVOIR     53 '  .   .  0,  &CR'
     OQSYSPRT E  1             RELEVE
     O                                   35 'Net à payer :'
     O                         SOLDE     52 '  .   .*  ,  &€'
I 73282932000074 C KSIRET
Le SIRET a 14 chiffres, trop pour le facteur 2 d'un Z-ADD (10 colonnes) : il passe par une constante nommée, déclarée en spécification I.
OQSYSPRT E 1 RELEVE
Une ligne de l'état, imprimée par EXCPT RELEVE, puis un saut d'une ligne (colonne 18). Les huit lignes portent le même nom : un seul EXCPT les imprime toutes.
O HT 52 ' . . 0, &€'
La zone en 32-37, la position de fin 52 en 40-43, le mot d'édition à partir de la colonne 45. La colonne 38 reste vide : c'est là qu'irait un code d'édition.
O AVOIR 53 ' . . 0, &CR'
Un caractère de plus que les montants : avec la fin en 53, les chiffres restent alignés en colonne 50.
SEU, examen du membre RELEVE3 : ligne de format O, spécifications O avec les zones DATREL, CLIENT, SIRET et TEL et leurs mots d'édition en colonne 45
Dans SEU, la ligne de format O : Field en 32, End en 40, Constant/editword en 45.
SEU, suite du membre RELEVE3 : les zones HT, TAUX, TVA et TTC et leurs mots d'édition
Les montants : le même mot pour HT, TVA et TTC.
CRTRPGPGM PGM(JOBIEDT/RELEVE3) SRCFILE(JOBIEDT/QRPGSRC)
CALL PGM(JOBIEDT/RELEVE3)

RPG IV colonné RELEVE4

     FQSYSPRT   O    F   80        PRINTER
     DDATREL           S              8P 0
     DCLIENT           S              6P 0
     DSIRET            S             14P 0
     DTEL              S             10P 0
     DHT               S              9P 2
     DTAUX             S              4P 2
     DTVA              S              9P 2
     DTTC              S              9P 2
     DAVOIR            S              9P 2
     DSOLDE            S              9P 2
     C                   EVAL      DATREL = 22102026
     C                   EVAL      CLIENT = 4127
     C                   EVAL      SIRET = 73282932000074
     C                   EVAL      TEL = 467123456
     C                   EVAL      HT = 1234.50
     C                   EVAL      TAUX = 20
     C                   EVAL(H)   TVA = HT * TAUX / 100
     C                   EVAL      TTC = HT + TVA
     C                   EVAL      AVOIR = -150
     C                   EVAL      SOLDE = TTC + AVOIR
     C                   EXCEPT    RELEVE
     C                   EVAL      *INLR = *ON
     OQSYSPRT   E            RELEVE         1
     O                                           16 'RELEVÉ DE COMPTE'
     O                                           58 'Date :'
     O                       DATREL              70 '0  /  /    '
     OQSYSPRT   E            RELEVE         1
     O                                           10 'Client :'
     O                       CLIENT              18 '0      '
     O                                           40 'DUPONT QUINCAILLERIE'
     OQSYSPRT   E            RELEVE         1
     O                                           10 'SIRET  :'
     O                       SIRET               28 '   &   &   &     '
     O                                           45 'Tél :'
     O                       TEL                 60 '0  &  &  &  &  '
     OQSYSPRT   E            RELEVE         1
     O                                           15 'Facture 26-0412'
     O                                           35 'Montant HT  :'
     O                       HT                  52 '  .   .  0,  &€'
     OQSYSPRT   E            RELEVE         1
     O                                           23 'TVA'
     O                       TAUX                31 '  0,  &%'
     O                                           35 ':'
     O                       TVA                 52 '  .   .  0,  &€'
     OQSYSPRT   E            RELEVE         1
     O                                           35 'Total TTC   :'
     O                       TTC                 52 '  .   .  0,  &€'
     OQSYSPRT   E            RELEVE         1
     O                                           15 'Avoir   26-0007'
     O                                           35 'Montant     :'
     O                       AVOIR               53 '  .   .  0,  &CR'
     OQSYSPRT   E            RELEVE         1
     O                                           35 'Net à payer :'
     O                       SOLDE               52 '  .   .*  ,  &€'
DHT S 9P 2
Les zones sont déclarées en spécification D ; les calculs passent par EVAL, et EVAL(H) arrondit la TVA.
O HT 52 ' . . 0, &€'
La zone en 30-43, la fin en 47-51, le mot à partir de la colonne 53.
SEU, examen du membre RELEVE4 : ligne de format O du RPG IV, spécifications O avec les mots d'édition en colonne 53
En RPG IV, la ligne de format O : Field+++++++++ en 30, End++ en 47, Constant/editword en 53.
CRTBNDRPG PGM(JOBIEDT/RELEVE4) SRCFILE(JOBIEDT/QRPGLESRC)

Full free RELEVEF

**FREE
// Relevé de compte : les zones numériques sont éditées par %EDITW.
dcl-f QSYSPRT printer(80);
dcl-ds ligne len(80) end-ds;

dcl-s datrel packed(8:0);       // Date du relevé (JJMMAAAA)
dcl-s client packed(6:0);       // Numéro de client
dcl-s siret packed(14:0);       // Numéro SIRET
dcl-s tel packed(10:0);         // Téléphone
dcl-s ht packed(9:2);           // Montant hors taxes
dcl-s taux packed(4:2);         // Taux de TVA
dcl-s tva packed(9:2);          // Montant de la TVA
dcl-s ttc packed(9:2);          // Total TTC
dcl-s avoir packed(9:2);        // Avoir (négatif)
dcl-s solde packed(9:2);        // Net à payer

datrel = 22102026;
client = 4127;
siret = 73282932000074;
tel = 467123456;
ht = 1234.50;
taux = 20;
eval(h) tva = ht * taux / 100;
ttc = ht + tva;
avoir = -150;
solde = ttc + avoir;

ligne = *blanks;
%subst(ligne:1:16) = 'RELEVÉ DE COMPTE';
%subst(ligne:53:6) = 'Date :';
%subst(ligne:60:11) = %editw(datrel:'0  /  /    ');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:3:8) = 'Client :';
%subst(ligne:12:7) = %editw(client:'0      ');
%subst(ligne:21:20) = 'DUPONT QUINCAILLERIE';
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:3:8) = 'SIRET  :';
%subst(ligne:12:17) = %editw(siret:'   &   &   &     ');
%subst(ligne:41:5) = 'Tél :';
%subst(ligne:46:15) = %editw(tel:'0  &  &  &  &  ');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:1:15) = 'Facture 26-0412';
%subst(ligne:23:13) = 'Montant HT  :';
%subst(ligne:38:15) = %editw(ht:'  .   .  0,  &€');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:21:3) = 'TVA';
%subst(ligne:24:8) = %editw(taux:'  0,  &%');
%subst(ligne:35:1) = ':';
%subst(ligne:38:15) = %editw(tva:'  .   .  0,  &€');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:23:13) = 'Total TTC   :';
%subst(ligne:38:15) = %editw(ttc:'  .   .  0,  &€');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:1:15) = 'Avoir   26-0007';
%subst(ligne:23:13) = 'Montant     :';
%subst(ligne:38:16) = %editw(avoir:'  .   .  0,  &CR');
write QSYSPRT ligne;
ligne = *blanks;
%subst(ligne:23:13) = 'Net à payer :';
%subst(ligne:38:15) = %editw(solde:'  .   .*  ,  &€');
write QSYSPRT ligne;
*inlr = *on;
dcl-f QSYSPRT printer(80); et dcl-ds ligne len(80) end-ds;
Un fichier imprimante décrit par le programme : en format libre, on écrit une structure de données de la longueur de la ligne.
%subst(ligne:38:15) = %editw(ht:' . . 0, &€');
%EDITW rend une chaîne de la longueur du mot ; on la place à la colonne voulue, ici de 38 à 52 comme la position de fin 52 de la spécification O.
CRTBNDRPG PGM(JOBIEDT/RELEVEF) SRCFILE(JOBIEDT/QRPGLESRC)

Les pièges, vérifiés sur le banc

  • Le CR caché dans un mot. '␢␢0.␢␢&SECRET' imprime « 123.45␢␢␢␢␢ET » pour un nombre positif : le compilateur a lu le CR de SECRET comme le signe. Le remède du manuel IBM, un vrai CR avant : '␢␢0.␢␢&CR&&SECRET'.
  • Le - au milieu n'est pas un signe. Dans '0AREA&␢␢␢&NO.&␢␢␢-␢␢␢␢', le - n'est pas en dernière position : c'est une constante, imprimée même pour un nombre positif.
  • Zéro, c'est souvent tout blanc. Sans 0 ni * d'arrêt, une zone à zéro s'imprime en blancs. L'heure '␢␢h␢␢m␢␢s' à zéro donne même « ␢␢␢␢␢␢␢␢s » : h et m sont des constantes du corps, effacées, mais le s final est l'extension, toujours imprimée.
  • Le zéro de tête. La date 05/09/2026 rangée dans un nombre vaut 5092026 : '␢␢/␢␢/␢␢␢␢' imprime « ␢5/09/2026 ». Il faut le 0 en tête et une position de plus : '0␢␢/␢␢/␢␢␢␢'.
  • Pas assez de positions. Un mot de 9 positions pour une zone de 10 chiffres est refusé à la compilation : RNF8004 en RPG IV (« Le mot d'édition comporte 9 caractères remplaçables mais 10 sont requis »), QRG8004 en RPG III (« Pas assez de caractères de remplacement dans le mot d'édition »).
  • La colonne 21 du RPG III change aussi les littéraux. Avec J en colonne 21 de la spécification H, le compilateur RPG III attend la virgule dans les nombres du source : la constante 1234.5 est refusée (QRG4172, « Littéral incorrect »), il faut écrire 1234,5. Le mot d'édition, lui, ne change pas.

Sources

Les exemples ont été compilés et exécutés sur un IBM i 7.5 (voir la méthode). Les règles viennent de ces sources, consultées le 22 octobre 2026 :

  1. ILE RPG Reference (SC09-2508-12), chapitre « Edit Words », IBM, IBM i 7.5 (PDF). Les trois parties d'un mot d'édition (corps, signe, extension), le rôle du blanc, du 0, de l'astérisque, du symbole monétaire fixe ou flottant, du & et de CR ou - ; le mot en colonnes 53 à 80 (26 caractères au plus), ou dans une constante nommée, 115 caractères au plus ; %EDITW.
  2. IBM i Programming : DDS for display files, IBM (PDF). Le mot-clé EDTWRD, le mot d'édition d'une zone d'écran.
  3. RPG Tutorial : Output Edit Words, Jay Moseley. La leçon dont cette page reprend la forme : les règles, puis un tableau d'exemples avec le résultat positif et négatif.

Questions fréquentes

Qu'est-ce qu'un mot d'édition en RPG ?

Un gabarit, écrit entre apostrophes, qui décrit comment imprimer une zone numérique : chaque blanc reçoit un chiffre, le premier 0 ou le premier astérisque arrête la suppression des zéros, & donne un blanc, CR ou - n'apparaît que pour un nombre négatif, et les autres caractères sont recopiés.

Où écrit-on le mot d'édition ?

Sur la spécification O, à la place d'une constante : colonnes 45 à 70 en RPG III, avec la colonne 38 (code d'édition) à blanc ; colonnes 53 à 80 en RPG IV, avec la colonne 44 à blanc. En format libre, on utilise la fonction %EDITW(zone : mot).

Quelle différence entre un code d'édition et un mot d'édition ?

Un code d'édition (1 à 4, A à D, J à Q, X à Z) est une présentation toute faite. Le mot d'édition décrit la présentation caractère par caractère : un numéro de téléphone, un SIRET, une heure, un montant suivi de € ou protégé par des astérisques.

Pourquoi le compilateur refuse-t-il mon mot d'édition ?

Le plus souvent, il compte moins de positions de chiffres (blancs, plus le premier 0 ou *) que la zone n'a de chiffres : RNF8004 en RPG IV, QRG8004 en RPG III. Ajoutez un blanc par chiffre manquant.

DECEDIT ou l'inversion J changent-ils un mot d'édition ?

Non. Le point et la virgule d'un mot d'édition sont imprimés tels qu'ils sont écrits. DECEDIT en RPG IV et la colonne 21 de la spécification H en RPG III ne changent que les codes d'édition.

Comment garder le zéro de tête d'une date ou d'une heure ?

En écrivant un 0 en première position et une position de plus que la zone : '0 / / ' imprime 05/09/2026 là où ' / / ' imprime 5/09/2026.