Programmation sur l'AS400

...EN COURS ...

Sommaire

Partie 2 - Le langage RPG

Structure d'un programme RPG

Origine historique: le cycle GAP

Le langage RPG -Report Program Generator, ou Générateur d'Application- a été créé pour la génération simple de programmes d'édition, sur des cartes perforées de 80 caractères. Il a considérablement évolué. Certains programmes RPG écrits il y a une vingtaine d'années continuent de tourner, avec de multiples adaptations et inclusion de mises à jour an 2000 et euro par des développeurs souvent multiples et sans rapport avec les concepteurs d'origine.

Le look n'a rien à voir avec les langages graphiques, mais certains programmes tournent et font tourner des entreprises depuis quelques années sans qu'un développeur n'ait eu à s'y replonger.

Sa dernière déclinaison, RPG LE, n'est pas abordée dans ce document. L'utilitaire de conversion CVTRPGSRC convertit RPG en RPG LE, qui en est une version relookée et enrichie. RPG LE supporte la gestion de de types supplémentaires, en particulier les formats dates et longueurs variables, permet une gestion améliorée d'inclusions SQL, et passe par une phase d'édition de lien permettant en particulier de générer des modules utilisables comme procédures stockées pour des applications clientes.

Un développeur RPG moyen n'a aucune difficulté à passer au RPG LE, mais pour les applications usuelles le petit supplément de complexité n'est pas compensé par une plus grande facilité d'utilisation.

Le cycle GAP prend en partie en charge les notions de lecture en concordance et de rupture. En programmation structurée, l'intérêt en est limité, pour une certaine complexité de mise en oeuvre.

Ce qui suit décrit l'architecture d'un programme RPG et sa structure.

Carte H: environnement de programme

La carte H décrit des options pour le programme.

FMT H   .....H........1..CDYI....S..............1.F...............................Pgm-id
'''''''      H             /J                                                           

Débogage

Blanc
les instructions DEBUG/DUMP ne sont pas exécutées
1
le programme est compilé pour debug et les instructions DEBUG/DUMP sont exécutées

Symbole monétaire

Blanc
$ est le symbole monétaire
autre
caractère servant de symbole monétaire. Les caractères zéro "0", astérisque "*", virgule ",", point ".", la perluète "&" le signe moins "-" et les lettres "C" et "R" ne peuvent pas être utilisés.

Format de date

Blanc
format par défaut mois/jour/année
D, I, J
le format jour/mois/année
M
format mois/jour/année
D
format jour/mois/année
Y
année/mois/jour

Edition de Date

Caractère
Séparateur pour les dates
&
Le blanc est utilisé comme séparateur

Virgule décimale

blanc
virgule et point
I
la virgule est avant les décimales et le point est séparateur de milliers
J
équivaut à I avec insertion de 0 avant la virgule si nécessaire
D
le point est avant les décimales et la virgule est séparateur de milliers

Modif séquence de caractères

Séquences de tri pour LOKUP et SORTA, rarement spécifié.

blanc
Séquence de traitement normale
S
Séquence de traitement personalisée définie dans le programme
D
Séquence de traitement personalisée définie à la compilation du programme

Impression 1P

blanc
la première ligne est imprimée une seule fois
1
la première ligne est imprimée de manière répétitive

Transcodification de fichier

blanc
pas de transcodification
F
les fichiers sont transcodés

Identifiant de programme

Nom du programme. Il s'agit d'une survivance de S36 et ce champ doit être laissé à blanc.

Carte F: fichier

Les cartes F apparaissent comme des plus hermétiques. En pratique, elles décrivent en 2 lignes ce qui peut demander plusieurs pages COBOL, et quelques variantes simples seulement sont utilisées.

Formats F et FX: fichiers à description interne et externe
FMT F   .....FFilenameIPEAF....RlenLK1AIOvKlocEDevice+......KExit++Entry+A....U1........
'''''''      FCLIENTW IF  F     256  6AI     1 DISK
                                                                                 
FMT FX  .....FFilenameIPEAF........L..I........Device+......KExit++Entry+A....U1........
'''''''      FCLIENT  UF  E           K        DISK                      A

Invite F et FX: Fichiers

Nom de fichier

Nom valide de moins de 8 caractères

Type de fichier
I
fichier d'entrée
O
fichier en sortie
U
fichier en mise à jour
O
fichier combiné, écran
Désignation de fichier
blanc
fichier de sortie
P
fichier primaire
S
fichier secondaire
R
fichier d'adresses, sorte d'index S36
T
fichier tableau ou de tables
F
fichier fichier en traitement intégral, standard
Fin de fichier
blanc
en cycle, le traitement se termine si tous les fichiers à lire sont en fin de fichier
E
en cycle, le traitement se poursuit tant que la lecture du fichier n'est pas complète
Fin de fichier
blanc ou A
traitements de concordance sur valeurs de clé croissantes
D
traitements de concordance sur valeurs de clé décroissantes
Format de fichier
E
fichier à description externe
F
fichier décrit dans le programme
Longueur d'enregistrement (fichier interne)

Taille d'enregistrement entre 1 et 9999.

Mode de traitement
blanc
traitement standard
L
traitement séquentiel entre limites par fichier d'adresses, mode S36
Identification (fichier interne)
blanc
lecture par numéros d'enregistrements relatifs, lecture séquentielle, ou lecture par clés d'adresses entre limites identiques à celles du fichier en cours de traitement.
A
touches alphabétiques
P
touches condensées
Identification (fichier externe)
blanc
lecture séquentielle ou par numéros relatifs d'enregistrements
K
accès par clé
Organisation de fichier (fichiers internes)
blanc
Traitement sans clé ou fichier externe
I
traitement indexé, pour fichier interne seulement
T
fichier d'adresse décrit en interne, S36 seulement
Indicateur de fin de page (fichier PRINTER)
blanc
pas d'indicateur fin de page
OA-OG, OV, 01-99
indicateur fin de page atteinte, pour fichiers PRINTER uniquement
Début de zone clé (fichiers internes)
blanc
Traitement sans clé ou fichier externe
1-9999
position de début de la clé dans l'enregistrement, pour fichier interne seulement
Code Extension
blanc
aucune extension ou spécification de saut
E
des spécifications d'extension complètent la description du fichier
L
des spécifications de saut complètent la description du fichier
Unité
PRINTER
fichier d'impression
DISK
fichier sur disque
WRKSTN
fichier écran
SPECIAL
fichier spécial
SEQ
fichier séquentiel
Suite
blanc
ligne de base
K
ligne de continuation
Exit

Pour les informations de continuation K, options de continuation SAUF IGNORE, PLIST,RENAME et SFILE qui ont besoin d'un nom à gauche du K. Par tradition, les informations de continuation sont plutôt spécifiées dans les lignes de continuation.

Pour un fichier SPECIAL, nom du programme utilisateur.

Nom

nom rattaché à l'option pour une de continuation K

Ajout
blanc
pas d'ajout, ou fichier en sortie seulement
A
ajout autorisé sur fichier DISK en lecture ou mise à jour
Conditionnement
blanc
ouverture et fermeture automatiques
U1-U8
ouverture et fermeture automatiques si l'indicateur est en fonction
UC
ouverture et fermeture gérées par le programme, OPEN et CLOSE explicites

Invite FC ou FK: Continuation

Option et Nom
COMIT
le fichier doit être journalisé.
/ le nom doit rester à blanc
ID / nom
zone alphanumérique de 10 caractères dont la définition est complète. / nom de l'unité programme d'où provient l'enregistrement traité dans le fichier
IGNORE
ignorer un format d'enregistrement d'un fichier à description externe. / le nom doit rester à blanc
IND / nombre
sauvegarde et restauration dans la zone Entrée les indicateurs 01 à n (n = numéro indiqué). Survivance d'une époque ou entre deux échanges interactifs les données programme devaient être sauvées à la main
/ nombre de 01 à 99 et justifié à droite
INFDS / nom
Spécification d'une zone de données pour collecter des informations sur l'état fichier
/ nom de la structure de données recevant ces informations
INFSR / nom
spécification d'un sous-programme à exécuter en cas d'erreur fichier
/ nom de sous-programme, ou *PSSR
NUM / nombre
Spécification d'un nombre maximum d'unités pour un écran (anecdotique)
/ Nombre supérieur à zéro justifié à droite
PASS / *NOIND
gestion utilisateur des indicateurs en entrée et en sortie pour un fichier WORKSTN interne
/ *NOIND doit être indiqué.
PLIST / nom
spécification de liste de paramètres communiquée à un programme donné pour un fichier SPECIAL.
/ nom de la liste de paramètres
PRTCTL
contrôle dynamique d'imprimante.
/ nom de structure de données pour le nombre de lignes et les informations de contrôle d'impression
RECNO / nom
spécification de champ clé numérique pour fichier de sortie traité par numéro d'enregistrement relatif utilisatn WRITE ou ADD / nom de champ numérique sans décimales
RENAME / nom
renommage de format d'enregistrement pour un fichier à description externe
/ nouveau nom
SAVDS / nom
spécification d'une DS pour sauvegarde de buffers écran. Survivance d'une époque ou entre deux échanges interactifs les données programme devaient être sauvées à la main
/ nom de la structure de données
SFILE / nom
spécification de sous fichier
/ nom du sous fichier. Le nom du champ clé est spécifié dans la colonne RcdNbr.
SLN / nom
spécification de nom zone contenant un numéro de la ligne de départ (SLN) pour affichage. Usage non recommandé.
/ nom du champ

Carte E: Tables et Tableaux

Description de tables et tableaux

Invite E: description de tables et tableaux
 FMT E  .....E....FromfileTofile++Name++N/rN/tbLenPDSArrnamLenPDSComments+++++++++......
'''''''      E                    CMD     1   3 80               Qsysprt                

Fichier appel

si le tableau est chargé depuis un fichier, nom du fichier d'adresses, du fichier tableau ou du fichier de table

Fichier de sortie

Indiquez un nom de fichier d'entrée ou de mise à jour, ou bien le nom d'un fichier de sortie ou combiné, mais laissez la zone à blanc si la table ou le tableau n'est pas écrit à la fin du programme.

nom de la table

nom de la table ou du tableau, un nom sur 3 caractères est recommandé

Postes par enregistrement

à blanc si le tableau est chargé par spécification d'entrée ou de traitement, ou nombre de postes de table ou de tableau de chaque enregistrement ou ligne d'entrée.

Postes par table

nombre de postes de la table, 1 à 9999. Les très grandes tables ne sont pas possibles.

Longueur du poste

taille de chaque poste, de 1 à 256. Les grandes tailles ne sont pas possibles, utiliser alors des DS à occurences multiples.

P/B/L/R

Type des postes de table

P
décimal condensé (packé)
B
binaire
L
numérique avec signe à gauche
R
numérique avec signe à droite

Nombre de décimales

à blanc pour poste alpha, nombre entre 0 et 9 pour poste numérique

Séquence

Séquence pour tri

blanc
pas de séquence ou défaut
A
tri ascendant
D
tri descendant

table associée

seconde table associée, avec le même nombre de postes

Commentaire

court mais nécessaire

Carte L: Pages imprimantes

Carte L: spécification de saut

FMT L   .....LFilename066Fl060Ol........................................................
'''''''      LQSYSPRT  66FL 60OL                                                        

Fichier

nom du fichier PRINTER

Nombre de lignes

nombre de lignes par page

Longueur de page

spécifier FL si le nombre de lignes par pages est indiqué

Numéro de ligne de fin de page

numéro de ligne de 2 à 112 à qui déclanche la mise en fonction de l'indicateur fin de page (overflow)

Ligne de fin de page

spécifier OL si le rang de la ligne fin de page est indiqué

Carte I: Formats de Fichier

Format d'enregistrement Interne: Invite I

Invite pour carte I

FMT I   .....IFilenameSqNORiPos1NCCPos2NCCPos3NCC.......................................
'''''''      ICLIENT  NS  01                                                            

Fichier

nom du fichier d'entrée décrit

Séquence

AA-ZZ
deux caractères alpha si la séquence n'est pas contrôlée - NS par convention-
01-99
deux chiffres si le programme gère un contrôle de séquence, dans le cas de fichier multi formats pour lesquel chaque format est identifié par la présence de caractères spécifiques sur une position donnée. L'approche multiformat n'est pas relationnelle et tend à être abandonnée ou fortement restreinte.

Numéro

blanc
le programme ne contrôle pas la séquence des types d'enregistrement
1
un seul enregistrement de ce type peut figurer dans le groupe en séquence
N
un ou plusieurs enregistrements de ce type peuvent être présents dans le groupe classé

ID d'enregistrement

indicateur mis en fonction quand un enregistrement correspondant aux critères est lu

01-99
indicateur général
L1-L9 ou LR
indicateur de niveau de controle
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe
**
zone d'entrée avancée, pour fichier primaire ou secondaire seulement

Codes d'identification d'enregistrement (3 fois)

Valeurs et positions des caractères permettant d'identifier le format. Ces champs doivent en général être laissés à blanc pour le dernier format décrit afin de pouvoir lire tous les types d'enregistrement du fichier.

Position
blanc si pas de test, ou position dans l'enregistrement de 1 à 9999
Non
blanc si le caractère est à sélectionner, N si à omettre
C/Z/D
C pour caractère, Z pour hors texte, D pour numérique. Les valeurs Z et D ne sont paratiquement jamais utilisées
caractère
valeur du caractère à tester

Format d'enregistrement Externe: Invite IX

Invite pour carte IX
FMT IX  .....IRcdname+....In............................................................
'''''''      IFCLIENT

Nom d'enregistrement

nom du format d'enregistrement externe

ID d'enregistrement

indicateur mis en fonction à la lecture de l'enregistrement. Voir carte I.

Zone de fichier Interne: Invite J

Définition interne d'un champ de fichier Invite pour carte J

FMT J   .....I....................................PFromTo++DFldnmeL1M1FrPlMnZr..........
'''''''      I                                        1   6 CODCLI                      

P/B/L/R

Type du champ

P
décimal condensé (packé)
B
binaire
L
numérique avec signe à gauche
R
numérique avec signe à droite

De

position de début de la zone dans l'enregistrement, 1-9999

A

position de fin de la zone dans l'enregistrement, 1-9999

Nombre de décimales

blanc
zone alphabétique
0-9
nombre de décimales pour une zone numérique

Nom de zone

nom de structure de données, de zone, de tableau, de poste indicé de tableau, ou PAGE , PAGE1-PAGE7, *IN ou *INxx

Niveau de contrôle

blanc
la zone n'est une zone de contrôle
L1-L9
zone de contrôle pour rupture

Zones de concordance

blanc
la zone n'est une zone de concordance
M1-M9
zone de concordance pour matching

Relation de zone

blanc
la zone est commune à tous les enregistrements
01-99
indicateur général
L1-L9 ou LR
indicateur de niveau de controle
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe
MR
indicateur de concordance d'enregistrement

Indicateurs de zone

indicateur positionné si la zone contient une valeur positive

Zone positive
indicateur mis en fonction si valeur numérique positive
Zone négative
indicateur mis en fonction si valeur numérique négative
Zéro ou Blanc
dans le cas de zone numérique, indicateur mis en fonction si valeur nulle
dans le cas de zone alphabéttique, indicateur mis en fonction si valeur à blanc
blanc
pas de test
01-99
indicateur général
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe

Zone Fichier à description Externe: Invite JX

Format JX: zone à description externe
FMT JX  .....I..............Ext-field+......................Field+L1M1..PlMnZr..........
'''''''      I              CLCCLI                          X1CCLIL1                                  

Nom de zone externe

nom externe de la zone à renommer

Nom de la zone

nom de la zone, ou nom interne si la zone est renommée

Niveau de contrôle

blanc
la zone n'est une zone de contrôle
L1-L9
zone de contrôle pour rupture

Zones de concordance

blanc
la zone n'est une zone de concordance
M1-M9
zone de concordance pour matching

Indicateurs de zone

indicateur positionné si la zone contient une valeur positive

Zone positive
indicateur mis en fonction si valeur numérique positive
Zone négative
indicateur mis en fonction si valeur numérique négative
Zéro ou Blanc
dans le cas de zone numérique, indicateur mis en fonction si valeur nulle
dans le cas de zone alphabéttique, indicateur mis en fonction si valeur à blanc
blanc
pas de test
01-99
indicateur général
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe

Définition de Structure de Données: Invite DS

invite DS: spécification de structure de données
FMT DS  .....IDsname....NODsExt-file++.............OccrLen+.............................
'''''''      I            DS                                                            

Nom de la structure de données

laisser à blanc ou spécifier un nom pour la structure de données

Externe

blanc
sous zones définies dans le programme
E
définition externe, format de fichier

Option

blanc
zone de donnée banalisée
S
structure de données d'état du programme (Status), décrite dans les ouvrages de référence
U
zone de données utilisateur et liée au travail, LDA également nommée ZCU
I
structure de données initialisée

Nom de fichier externe

à blanc si la zone de données est à description interne, ou nom de fichier externe dont la description est utilisée.

Occurrences

blanc
une seule occurence pour la zone de données, cas le plus général
1-9999
nombre d'occurences pour zone de données à occurences multiples

Longueur

blanc
la longueur est déterminée par la dernière position de sous zone
1-9999
longueur explicite de la zone de données

Sous zone de DS Externe: Invite SS

format SS: sous-zone de structure de données
FMT SS  .....I..............Ext-field+............PFromTo++DField+......................
'''''''      I                                        1  120TIMHR                       

Nom de zone externe

nom externe de la zone à renommer

P/B

blanc
valeur alphabétique ou numérique étendue
P
décimal condensé (Packé)
B
nombre binaire

Emplacement De A

position de début et de fin de la zone dans la structure de données, 1-9999

Nombre de décimales

blanc
zone alphabétique
0-9
nombre de décimales pour une zone numérique

Nom de la zone

nom de la zone, ou nom interne si la zone est renommée

Zone de DS avec initialisation: Invite SV

Description de zone avec initialisation

Format SV: zone en entrée avec initialisation
FMT SV  .....I.I............Init-value++++++++++++PFromTo++DField+......................
'''''''      I I            '000000'                  1   6 CLCCLI                      

Indicateur d'initialisation de sous-zone

blanc
pas d'initialisation
I
l'initialisation est utilisée et une constante doit être spécifiée

Valeur d'initialisation

Nombre ou valeur alphabétique entre apostrophes

P/B

blanc
valeur alphabétique ou numérique étendue
P
décimal condensé (Packé)
B
nombre binaire

De

position de début de la zone dans l'enregistrement, 1-9999

A

position de fin de la zone dans l'enregistrement, 1-9999

Nombre de décimales

blanc
zone alphabétique
0-9
nombre de décimales pour une zone numérique

Nom de zone

nom de zone ou nom de substitution pour description externe

Définition de Constante: Invite N

format N: définition de constante

FMT N   .....I..............Namedconstant+++++++++C.........Fldnme......................
'''''''      I              'O'                   C         OUI

Constante

valeur de la constante

Type données

C pour définition de constante

nom

nom de la constante

Carte C: Traitements

FMT C       CLON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
'''''''     C           TRT01     BEGSR

Niveau

condition de traitement selon niveau de totalisation, en cycle GAP

blanc
pas de condition de niveau
L0
traitement de totalisation inconditionnel
L1-L9
traitement de totalisation en rupture de niveau spécifié
LR
traitement de fin de lecture de fichiers
SR
sous programme. Valeur inutile, utiliser à blanc dans ce cas
AN, OR
suite AND OR de condition

N01N02N03

traitement sous condition

blanc
pas de test
01-99
indicateur général
KA-KN ou KP-KY
indicateur de touche de fonction. Utilisation directe déconseillée, associer aux touches les indicateurs 01-24
L1-L9
condition de niveau de controle, en entete de rupture
LR
traitement en fin de lecture de fichiers
MR
traitement en concordance
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe
OA-OG ou OV
traitement en fin de page d'impression

Facteur 1

zone ou constante nécessaire à une opération

Nom zone

nom de la constante

ACQ
Acquérir
ADD
Ajouter
ANDxx
Et
BEGSR
Début de sous-programme
BITOF
Dépositionner des bits
BITON
Positionner des bits
CABxx
Comparer et brancher
CALL
Appel d'un programme
CASxx
Appel conditionnel de sous-programme
CAT
Concaténer deux chaînes
CHAIN
Accès sélectif à un fichier
CHECK
Vérifier de gauche à droite
CHEKR
Vérifier de droite à gauche
CLEAR
Mettre à blanc
CLOSE
Fermer des fichiers
COMIT
Valider des modifications apportées à des fichiers
COMP
Comparer
DEBUG
Fonction de débogage de programme
DEFN
Définition de zone
DELET
Supprimer un enregistrement
DIV
Diviser
DO
Exécuter
DOUxx
Exécuter jusqu'à
DOWxx
Exécuter tant que
DSPLY
Fonction d'affichage
DUMP
Cliché programme
ELSE
Sinon
ENDyy
Mettre fin à un groupe
ENDSR
Fin de sous-programme
EXCPT
Sortie pendant le traitement
EXFMT
Ecrire puis lire le format
EXSR
Appeler un sous-programme
FEOD
Forcer la fin de données
FORCE
Forcer la lecture d'un fichier lors du cycle suivant
FREE
Désactiver un programme
GOTO
Aller à. Usage très fortement déconseillé
IFxx
Si
IN
Extraire une zone de données
ITER
Passer le contrôle à ENDxx
KFLD
Définition des parties d'une clé
KLIST
Définition d'une clé composée
LEAVE
Quitter un groupe DO
LOKUP
Rechercher dans un tableau ou une table
MHHZO
Mouvement du hors texte de position gauche vers position gauche
MHLZO
Mouvement du hors texte de position gauche vers position droite
MLHZO
Mouvement du hors texte de position droite vers position gauche
MLLZO
Mouvement du hors texte de position droite vers position droite
MOVE
Déplacer ou modifier les zones
MOVEA
Déplacer un tableau
MOVEL
Mouvement vers la gauche
MULT
Multiplier
MVR
Déplacer le reste
NEXT
Forcer l'entrée suivante
OCUR
Définir/extraire une occurrence de structure de données
OPEN
Ouvrir des fichiers
ORxx
Ou
OTHER
Sinon Select
OUT
Ecrire une zone de données
PARM
Identifier des paramètres
PLIST
Identifier une liste de paramètres
POST
Enregistrer
READ
Lire un enregistrement
READC
Lire l'enregistrement modifié suivant
READE
Lire l'enregistrement suivant avec la même clé
READP
Lire l'enregistrement précédent
REDPE
Lire l'enregistrement précédent avec la même clé
REL
Libérer
RESET
Réinitialiser
RETRN
Retour à l'appelant
ROLBK
Invalider
SCAN
Explorer une chaîne de caractères
SELEC
Commencer un groupe Select de traitements alternatifs
SETGT
Positionner sur valeur supérieure
SETLL
Positionner sur valeur supérieure ou égale
SETOF
Mettre hors fonction
SETON
Mettre en fonction
SHTDN
Arrêt du système
SORTA
Tri de tableau
SQRT
Racine carrée
SUB
Soustraire
SUBST
Sous-chaîne
TAG
Etiquette. Usage très fortement déconseillé
TESTB
Tester un bit
TESTN
Tester la partie numérique
TESTZ
Tester la partie hors texte
TIME
Heure et date
UNLCK
Déverrouiller une zone de données ou un enregistrement
UPDAT
Modifier un enregistrement existant
WHxx
Si VRAI alors Select
WRITE
Créer de nouveaux enregistrements
XFOOT
Additionner les éléments d'un tableau
XLATE
Traduire
Z-ADD
Initialiser à zéro et ajouter
Z-SUB
Initialiser à zéro et soustraire

Facteur 2

seconde zone ou constante nécessaire à une opération

Résultat

zone résultat d'une opération

Longueur

longueur de la zone résultat

blanc
zone définie ailleurs
1-30
longueur pour zone numérique
1-256
longueur pour zone alphabétique

nombre de décimales

blanc
zone alphabétique ou zone définie ailleurs
1-9
nombre de décimales pour définition de zone numérique

Extension d'opération

blanc
pas de spécification de traitement complémentaire
H
arrondi
N
lecture d'enregistrement sans verrouillage sur fichier en mise à jour
P
zone résultat complétée par des blancs pour opération alpha (padding). En l'absence de ce code, la partie de la zone non affectée par l'opération reste en l'état, avec son ancien contenu

indicateurs >> << ==

positionnement d'indicateurs, la signification dépend de la fonction.

Commentaire

la place est limitée mais des commentaires judicieusement choisis facilitent la compréhension.

Carte O: Formats en sortie

Définition de Format: Invite O

Format O: spécification de sortie d'ID d'enregistrement
FMT O   .....OName++++DFBASbSaN01N02N03Excnam...........................................
'''''''      OQSYSPRT E   01           H1   

Fichier

Nom du fichier de sortie. Peut être omis pour les formats suivant le premier défini.

type

H
sortie Entete, en cycle
D
sortie Détail, en cycle
T
sortie Total, en cycle
E
sorties exceptionelle par EXCPT

appel

blanc
pas d'option
F
Fin de page pour PRINTER
R
libére une unité de clavier-écran ou ICF après la sortie

Espace avant-après

blanc, ou valeur 1-3 pour saut de ligne avant ou après l'impression

Saut avant-après

blanc
pas de saut
0-99
saut avant-après impresssion vers ligne spécifiée
A0-A9
saut avant-après impresssion vers ligne 100-109
B0-B9
saut avant-après impresssion vers ligne 110-119

N01N02N03

sortie sous condition

blanc
pas de test
01-99
indicateur général
KA-KN ou KP-KY
indicateur de touche de fonction. Utilisation directe déconseillée, associer aux touches les indicateurs 01-24
L1-L9
condition de niveau de controle, en entete de rupture
LR
traitement en fin de lecture de fichiers
MR
traitement en concordance
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe
OA-OG ou OV
traitement en fin de page d'impression
1P
indicateur de première page

Nom EXCPT

identifiant pour sorties exceptionnelles

Définition de Format de Fichier: Invite OD

Format OD: spécifications de sortie pour les sorties disque
FMT OD  .....OName++++DADD....N01N02N03Excnam...........................................
'''''''      OFCLIENT DADD                                                            

Fichier

Nom du fichier de sortie. Peut être omis pour les formats suivant le premier défini.

type

H
sortie Entete, en cycle
D
sortie Détail, en cycle
T
sortie Total, en cycle
E
sorties exceptionelle par EXCPT

ADD/DEL

ADD
ajout d'enregistrement
DEL
suppression du dernier enregistrement lu

N01N02N03

sortie sous condition

blanc
pas de test
01-99
indicateur général
KA-KN ou KP-KY
indicateur de touche de fonction. Anecdotique à ce stade
L1-L9
condition de niveau de controle, en entete de rupture
LR
traitement en fin de lecture de fichiers
MR
traitement en concordance
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe
OA-OG ou OV
traitement en fin de page d'impression
1P
indicateur de première page

Nom EXCPT

identifiant pour sorties exceptionnelles

Zones de Fichier: Invite P

Format P: description de zone de sortie
FMT P   .....O................N01N02N03Field+YBEnd+PConstant/editword+++++++++..........
'''''''      O                 21      S1SEQ      7 '   0.  '                           

N01N02N03

sortie sous condition

blanc
pas de test
01-99
indicateur général
KA-KN ou KP-KY
indicateur de touche de fonction. Anecdotique à ce stade
L1-L9
condition de niveau de controle, en entete de rupture
LR
traitement en fin de lecture de fichiers
MR
traitement en concordance
H1-H9
indicateur d'arrêt
RT
indicateur de retour
U1-U8
indicateur externe
OA-OG ou OV
traitement en fin de page d'impression
1P
indicateur de première page

Nom de zone

nom de zone ou de constante programme

code d'édition

blanc
zone alpha ou pas de code d'édition
1-9, A-D, J-Q, X, Y, Z
code d'édition valide pour zone numérique

remise à blanc

blanc
pas de remise à blanc
B
remise à blanc ou zéro après écriture. Usage déconseillé, préférer des remises à blanc explicites dans le code.

Position de fin

blanc
positionnement après la zone précédente
+nnn
positionnement nnn caractères après la zone précédente
nnnn
position absolue de la Fin de la zone
K1-K8
longueur du nom de format pour fichier WORKSTN à description interne (programmes S36 surtout)

P/B/L/R

blanc
alphabétique ou décimal étendu
P
décimal condensé
B
binaire
L
numérique précédé d'un signe + ou -
R
numérique suivi d'un signe + ou -

Constante ou mot d'édition

constante, constante nommée, ou mot d'édition

Programmation Structurée

Ordres de Structuration

Découpage en traitements élémentaires

La programmation structurée organise un programme en un pavé principal standardisé appelant d'autres pavés, également standardisés dans la plupart des cas.

En RPG, toutes les variables sont globales au programme et les interférences de mises à jour très délicates à diagnostiquer.

Un pavé bien structuré

La production rapide de programmes de qualité est possible par écriture directe des pavés les plus standards (contrôles, remplissage d'écrans et de fichiers, affichages,...) -ce qui donne le temps de s'imprégner des fonctions du programme-, puis assemblage final. La maîtrise d'un squelette et d'un découpage standard permet de différer certains choix critiques de dynamique générale jusqu'au moment où ce que doit faire ce programme a été intégré, ce qui est rarement le cas au début de son écriture.

EXSR ... ENDSR

Chaque pavé est autonome mais partage toutes ses données avec les autres. Tout branchement par GOTO d'un pavé à un autre est impossible.

Délimitation d'un pavé de traitement
      C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
      C* Pavé de traitement
      C           TRT01     BEGSR
      C* Appel d'un autre pavé
      C                     EXSR TRT02
      C*...
      C                     ENDSR          

CASxxx ... ENDCS

Appel exclusif d'un traitement parmi plusieurs. Aucune autre instruction ne peut être intercalée avant le END.

Appel de pavé exclusif
      C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
      C* Traitement des écrans
      C           ECRAN     CASEQ01        TRT01
      C           ECRAN     CASEQ02        TRT02
      C           ECRAN     CASEQ03        TRT03
      C                     CAS            TRTFIN
      C                     ENDCS          

IF AND/OR ... ELSE ... ENDIF

Les parenthèses n'existent pas (en RPG LE, si). Des règles de précédence sont définies pour combiner OR et AND. En cas de doute quant à leur application, ne les utilisez pas.

Traitements conditionnels
      C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
      C* Si...
      C           A         IFEQ B                          Egalité
      C           A         ORNE C                          Différent
      C           A         ORGE D                          Supérieur ou =
      C* Sinon...
      C                     ELSE
      C           A         IFGT E                          Supérieur
      C           A         ANDLEF                          Inférieur ou =
      C           A         ANDLTH                          Inférieur
      C* 
      C                     ENDIF          
      C                     ENDIF          

DO ... ITER ... LEAVE ... ENDDO

Différentes variantes de boucles sont disponibles, conditionnelles ou associées à un compteur. DOU (jusqu'à ce que) existe également, mais est peu utilisé.

Boucles
      C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
      C* Boucle Conditionnelle
      C           W1FIN     DOWNE'1'
      C* Itération simple 
      C                     DO   5
      C* Itération avec compteur 
      C                     DO   7         J       50
      C* Passage direct à l'itération suivante
      C           J         IFEQ 3
      C                     ITER
      C                     ENDIF
      C* Sortie forcée de boucle
      C           W1FIN     IFEQ '1'
      C                     LEAVE
      C                     ENDIF
      C                     ENDDO 
      C* Itération avec bornes et pas
      C           0         DO   9         K       50
      C*...
      C                     ENDDO3                          Incrément de 3 
      C*
      C                     ENDDO                           5 fois
      C                     ENDDO                           W1FIN

SELEC WHxx ... OTHER ... ENDSL

Sélection de cas exclusifs, avec bloc de traitement courts ne nécessitant pas ou pas tous un pavé séparé.

Appel de pavé exclusif
      C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
      C* Traitement de l'écran détail (écran 2)
      C                     SELEC
      C* F3=Exit
      C           *IN03     WHEQ '1'
      C                     Z-ADD99        ECRAN 
      C* F12=Retour au premier écran
      C           *IN12     WHEQ '1'
      C                     Z-ADD01        ECRAN 
      C* Controle de l'écran en cours
      C                     OTHER
      C                     EXSR CTR02
      C*
      C                     ENDSL          

Ordres non structurés GOTO et CAB

Utilisation strictement prohibée.

Branchements
      C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
      C* Pour info seulement
      C                     GOTO DESTX
      C           DESTX     TAG
      C           A         CABEQB         DESTX

Normalisation

La plupart des bonnes normes RPG se ressemblent. Certains points relèvent de la religion, comme le droit d'utiliser des LEAVE ou la façon de gérer les message d'erreurs -internes ou externes au programme-.

Les normes décrites ici illustrent des directions utiles, pas des impératifs.

Normes d'indicateurs

Les indicateurs ne doivent pas être utilisés comme des booléens, mais remplacés pour cet usage par des flags alpha d'un caractère dotés d'un nom significatif. Il est très difficile de mémoriser l'usage d'un indicateur et l'utilisation doit être aussi proche que possible de l'affectation, hors attributs d'écran pour lesquels il n'existe pas d'alternative.

01-24
Touches de commandes et de fonctions
31
SFLDSP
32
SFLDSPCTL
35
SFLINZ
34
SFLCLR
33
SFLEND
39
SFLNXTCHG
37
ROLLUP
38
ROLLDOWN
36
CHANGE
40-79
Attributs d'écran en association avec la gestion d'erreur et le positionnement.
Réserver des dixaines cohérentes si une gestion d'erreur par DSPATR(PC RI) doit être gérée en parallèle avec des protections de saisie par DSPATR(PR)
91-95
Dédiés à des accès sur un fichier spécifique et un seul
97-98
Jetables, à utiliser immédiatement après leur affectation
99
Erreur générale. Préférer un flag alpha nommé ERREUR.

Normes de nommage

Les champs peuvent être nommés sur 4 caractères et préfixés par 2 caractères. Les champs liés peuvent être définis en dur ou par référence à des champs existants (*LIKE DEFN CLCCLI W1CCLI).

La réflexion et la correction des erreurs prennent du temps en programmation, pas la frappe automatique. Il est tentant d'utiliser les MOVE implicites plutôt que de créer des zones de travail intermédiaires, mais ce choix se révèle presque toujours pénalisant au bout du compte.

Préfixes de noms de champs:

Deux lettres
Caractéristiques d'un fichier ou format de fichier
K0
Clé principale d'un fichier, pour fichier physique
K1 à K9
Clé principale d'un fichier, pour fichier physique
P0
Paramètre reçu par le programme
P1
Issu de paramètre reçu par le programme, dans le cas de nombre de paramètres variables.
P2 à P9
Paramètre destiné à un programme appelé.
F1 à F9
Zones d'un format d'écran.
S1 à S9
Zones d'un format de sous fichier écran.
C1 à C9
Zones d'un format de contrôle de sous fichier.
R0
Zones de référence globale pour lecture de fichiers en concordance, valeur la plus petite parmi les clés de correspondance lues.
R1 à R9
Zones de référence Fichiers pour lecture de fichiers en concordance
D1 à D9
Lignes détail pour impression
H1 à H9
Lignes Entete pour impression
T1 à T9
Totalisation pour impression

Quelques noms courants:

I, J, K, I1 à I9, J1 à J9, K1 à K9
Indices et index numériques. Leur longueur peut être standardisée à 5 chiffres.
3 lettres, commençant par T
Tables ou tableaux
RN1 à RN9
Numéro d'enregistrement pour carte de continuation de sous fichier
RNB1 à RNB9
SFLRCDNBR, rang d'enregistrement devant apparaître à l'écran pour un sous fichier
TRN1 à TRN9
Nombre total d'enregistrements d'un sous fichier
L'utilisation d'une zone unique en tant que RN, RNB et TRN est parfois possible, avec des résultats difficilement maîtrisables dès que la moindre difficulté survient.
ENDS1 à ENDS9
Fin de sous fichier, '0' ou '1'

Squelette de programme

Squelette de programme RPG

Ce programme ne vise pas le réalisme mais découpe les traitements en pavé standard dont d'organisation est applicable à la très grande majorité des intéractifs dans une logique de "Blitz Programming".

Une approche non standardisée gérant l'enchainement de plusieurs écrans successifs dans un même pavé selon un mode normalement prévu comme séquenciel est vivement déconseillée. Des ruptures de séquence sont presque toujours à rajouter à postériori, et le traitement devient très rapidement incompréhensible.

Il peut par exemple paraître ridicule de rajouter un pavé de type TRT0x pour un simple écran de confirmation sans aucune donnée, mais l'approche

Se reporter au modèle de source de l'écran pour description des DDS associées.

     H*------------------------------------------------------------
     H* GESCOM:  Gestion de commandes normalisée
     H* 01/93  PL Version 0
     H* 09/01  PL Refonte
     H*  
     H*                               Patrick LARREYA, 1993-2001
     H*------------------------------------------------------------
     FGESCOMFMCF  E                    WORKSTN
     F                                              KINFDS ECRDS
     F                                        RN1   KSFILE F1S
     FCLIENT  IF  E           K        DISK                      
     FCOMDET  UF  E           K        DISK                      A
     FQSYSPRT O   F     132            PRINTER  
     F                                              KINFDS PRTDS
     E                    CMD     1   2 80               Qsysprt
     E                    MSG     1   2 75               Messages d'erreur
     I* INFDS: zone de données pour informations écran
     I*   - Position du curseur
     I*   - Rang de la première ligne sous fichier visible à l'écran
     IECRDS       DS
     I                                    B 370 3710POSCUR 
     I                                    B 378 3790RNTOP 
     I* PRTDS: zone de données pour informations imprimante
     I*   - numéro de la dernière ligne imprimée
     IECRDS       DS
     I                                    B 367 3680PRNLIG 
     I* PGMDS: zone de données pour informations programme
     I*   - nom du programme
     I*   - statut (gestion des erreurs)
     I*   - nom de l'écran
     I*   - nom de l'utilisateur
     I*   - nombre de paramètres reçus
     IPGMDS       DS
     I                                        1  10 PGMNAM 
     I                                       11  150PGMSTS 
     I                                      244 253 WS 
     I                                      254 263 USER
     I                                    B  37  390PARMS
     I* Date système
     I            DS
     I                                        1  120TIMHR 
     I                                        1   60H1TIME
     I                                        7  120H1DATE 
     I* Constantes
     I              12                    C         C1LPAG  
     C*============================================================ 
     C* Paramètres d'appel et de retour
     C           *ENTRY    PLIST
     C                     PARM           P0CRET  2        Code retour
     C                     PARM           P0CCLI  6        Client
     C                     PARM           P0NUCO  6        Numéro de commande
     C* Prise en compte d'un nombre de paramètres variables 
     C                     MOVE '  '      P1CRET  2
     C                     ENDIF
     C           PARMS     IFGE 2
     C                     MOVE P0CCLI    F1CCLI
     C                     ENDIF
     C           PARMS     IFGE 3
     C                     MOVE P0NUCO    F1NUCO
     C                     ENDIF
     C* Définition des clés
     C           K0COM    KLIST
     C                     KFLD           CMCCLI
     C                     KFLD           CMNUCO 
     C* Préparation du premier écran
     C* Une zone contenant des 0 est préparée pour réinitialisation des indicateurs 
     C                     Z-ADD12        C1SIZE  50
     C                     MOVE *ALL'0'   CLRIND 40
     C                     MOVE '0'       ERREUR  1
     C                     Z-ADD1         ECRAN   20
     C                     MOVE '0'       ERREUR  1
 1<--C                     EXSR INI01
     C                     CALL 'SFLCLR'
     C* Boucle d'affichage sur les écrans
  1{ C           ECRAN     DOWNE99
     C                     TIME           TIMHR
 2<--C           ECRAN     CASEQ01        TRT01
 4<--C           ECRAN     CASEQ02        TRT02
  2} C                     ENDCS
  1} C                     ENDDO
     C* Fin de traitement, renvoi du code retour
     C           PARMS     IFGE 1
     C                     MOVE P1CRET    P0CRET
     C                     ENDIF
     C                     SETON                     LR
     C*============================================================
     C           INI01     BEGSR
     C*============================================================
     C* Initialisation de l'écran de sélection
     C* 
     C* Définitions ... 
     C                     EXSR SET01
     C*
     C                     ENDSR
     C*============================================================
     C           SET01     BEGSR
     C*============================================================
     C* Chargement de la commande
     C* 
     C* Définitions
     C                     Z-ADD0         RN1     50
     C* Nettoyage de la liste
     C                     MOVE '0'       S1CHGD  1
     C                     SETOF                     3233  SFLDSP+CTL
     C                     SETON                     34    SFLCLR
     C                     WRITEF1C                        Controle sous fichier
     C                     SETOF                     34
     C                     Z-ADD0         TRN1    50       Nombre Total Lignes
     C                     MOVE '0'       C1END   1        Fin de liste
     C           K0COM     SETLLCOMDET
IFC  C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
     C* Remplissage de la liste des articles commandés
 5<--C                     EXSR ROL01                      REmplit un écran
     C                     Z-ADD1         RNB1             pour SFLRCDNBR
     C*
     C                     ENDSR
     C*============================================================
     C           ROL01     BEGSR
     C*============================================================
     C* Remplissage d'une page (ou de tout si lal liste est petite)
     C                     DO   C1LPAG
     C*-----------------------------------
     C           K0COM     READECOMDET                   97
     C           *IN97     IFEQ '1'
     C                     MOVE '1'       C1END
     C                     LEAVE
     C                     ENDIF
     C* Si un filtrage en lecture est nécessaire, le faire ici par un code 
     C* comme  W1PRIS IFNE '1' ITER, et gérer un compteur de boucle explicite
     C*
     C* Valorisation des zones de la liste, sans oublier les indicateurs
     C* Si des valeurs particulières doivent être conservées,
     C* utiliser des champs cachés.
     C                     SETOF                     31
     C                     MOVEA'00000'   *IN,51
     C                     MOVE ' '       S1SEL
     C                     MOVE CMCART    S1CART
     C                     Z-ADDCMQTAR    S1QTAR
     C                     MOVE CMCOMT    S1COMT
     C* écriture de la ligne.
     C                     ADD  1         C1TRN
     C                     Z-ADDC1TRN     RN1
     C                     WRITEF1S
     C*-----------------------------------
     C                     ENDDO
IFC  C*ON01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHILoEqComments+++++++......
     C* Rendre la dernière ligne nouvellement chargée visible
     C                     Z-ADDC1TRN     RNB1
     C*
     C                     ENDSR
     C*======================================================================
 2---C           TRT01     BEGSR
     C* Position de curseur gérée par défaut (indicateurs) si erreur
  1{ C           ERREUR    IFEQ '1'
     C                     Z-ADD0         C1LIN
     C                     Z-ADD0         C1COL
  1} C                     END
     C* Affichage de l'écran
     C                     WRITEF1
     C                     WRITEMSGC                       Messages
     C                     SETON                     33    SflDspCtl
  1{ C           C1TRN     IFNE 0
     C                     SETON                     32    SflDsp
  1| C                     ELSE
     C                     SETOF                     32
  1} C                     END
     C                     MOVE C1END     *IN35            SflEnd
     C                     WRITEF1C
     C                     READ F1C                      97(si qque chose à lire)
     C                     READ F1                       97
     C                     Z-ADDD1RRN1    C1TOP   50       Top of screen
     C                     Z-ADDC1TOP     RNB1             Sflrcdnbr
     C           D1CURS    DIV  256       C1LIN
     C                     MVR            C1COL
     C* Remise à blanc des informations d'erreur
     C                     MOVEACLRIND    *IN,40
     C                     CALL 'SFLCLR'
     C                     MOVE '0'       ERREUR  1
     C* F3=Exit, F12=Retour
  1{ C                     SELEC
  1| C           *IN03     WHEQ '1'
     C                     Z-ADD99        ECRAN
     C                     MOVE '03'      P1CRET  2
  1| C           *IN12     WHEQ '1'
     C                     Z-ADD99        ECRAN
     C                     MOVE '12'      P1CRET
     C* F4=Invite
  1| C           *IN04     WHEQ '1'
     C                     EXSR INV01
     C* Rechargement de l'écran si le client ou la commande ont changé
  1| C           F1CCLI    WHNE R1CCLI
     C           F1NCOM    ORNE R1NCOM
 3<--C                     EXSR SET01
     C* F10=Impression
  1| C           *IN10     WHEQ '1'
     C                     EXSR PRT01
     C* F6=Nouvel article, vers écran suivant
  1| C           *IN06     WHEQ '1'
     C                     Z-ADD02        ECRAN     
     C* Contrôle des options de liste sinon
     C           C1TRN     WHNE 0
     C                     EXSR CTR01S
     C*  
  1} C                     ENDSL
     C*
     C                     ENDSR
     C*======================================================================
 2---C           INV01     BEGSR
     C*
     C                     SELEC     
     C* Recherche client
     C           F1ZONC    WHEQ 'F1CCLI'
     C                     CALL 'LSTCLI'
     C                     PARM           P2CCLI  6
     C                     PARM '  '      P2CRET  2
     C           P2CRET    IFEQ '  '                          Sortie Normale
     C                     MOVE P2CCLI    F1CCLI
     C                     ENDIF
     C* Pas de recherche sur le champ
     C                     OTHER
     C                     MOVELMSG,3     MSGDTA    P
     C                     EXSR SFLMSG  
     C                     ENDSL
     C*
     C                     ENDSR
     C*======================================================================
 2---C           PRT01     BEGSR
     C* préparation de l'impression
     C                     CALL 'QCMDEXC'
     C                     PARM CMD,1     W1CMD  80
     C                     PARM 80        CMDLEN 155
     C                     OPEN QSYSPRT
     C                     EXCPTH1
     C* charger totalement la liste écran
     C           C1END     DOWEQ'0'
     C                     EXSR ROL01
     C                     ENDDO
     C* L'imprimer
     C                     DO   C1TRN     RN1
     C           RN1       CHAINF1S
     C   OA                EXCPTH1
     C                     EXCPTD1
     C                     ENDDO
     C* Afficher la liste imprimée
     C                     CLOSEQSYSPRT
     C                     CALL 'QCMDEXC'
     C                     PARM CMD,2     W1CMD  80
     C                     PARM 80        CMDLEN 155
     C*
     C                     ENDSR
     C*======================================================================
 2---C           SFLMSG    BEGSR
     C* Envoi de message d'erreur
     C                     CALL 'PGMMSG'
     C                     PARM 'CPF9897' MSGID   7
     C                     PARM 'QCPFMSG' MSGF   10
     C                     PARM '*LIBL  ' MSGFL  10
     C                     PARM           MSGDTA256
     C                     PARM '*SAME'   QREL   10
     C                     PARM PGMNAM    PGMQ   10
     C                     PARM '*INFO'   MSGTYP 10 
     C*   
     C                     ENDSR
     C*======================================================================

** CMD Affichage direct de la commande prête à l'impression
OVRPRTF QSYSPRT USRDTA('Commande') LPI(8) CPI(15) PAGESIZE(88 90) OVRFLW(80) PAGRTT(0)
DSPSPLF QSYSPRT * *LAST
** MSG Messages d'erreur
Le client n'a pas été trouvé                                                     1
Commande non trouvée
Recherche non disponible pour ce champ                                                             2

Programme d'envoi de message: PGMMSG

Ce programme se limite au lancement de la commande SNDPGMMSG, dont la forme est différente pour un message d'attente (Relation *EXT, type *STATUS) et pour les autres types (*INFO ou autres) en relation avec un programme particulier

PGMMSG : envoi de message programme
             PGM (&msgid &msgf &msglib &msgdta &rel &pgmq &msgtyp)  
                                                                    
  /* Envoi de tout type de message vers file d'attente programme */ 
                                                                    
             DCL   &ERR      *CHAR   1    VALUE('0')                
             DCL   &MSGID    *CHAR   7                              
             DCL   &MSGF     *CHAR  10                              
             DCL   &MSGLIB   *CHAR  10                              
             DCL   &MSGDTA   *CHAR 256                              
             dcl   &rel      *char  10                              
             dcl   &pgmq     *char  10                              
             dcl   &msgtyp   *char  10                              
                                                                    
             MONMSG    CPF0000  EXEC(GOTO FINFIN)                   
                                                                    
             if (&rel = '*EXT')  do                                 
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGF) MSGDTA(&MSGDTA) + 
                          TOPGMQ(*EXT) MSGTYPE(&MSGTYP)             
             enddo                                                  
             else do                                                  
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGF) MSGDTA(&MSGDTA) +   
                          TOPGMQ(&REL (&PGMQ)) MSGTYPE(&msgTYP)       
             enddo                                                    
             goto finfin                                              
                                                                      
 ERREUR:    IF (&ERR = '1')   GOTO FINFIN                             
            CHGVAR  &ERR '1'                                          
             RCVMSG     MSGTYPE(*LAST) MSGDTA(&MSGDTA) MSGID(&MSGID) +
                          MSGF(&MSGF) MSGFLIB(&MSGLIB)                
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGLIB/&MSGF) +           
                          MSGDTA(&MSGDTA)  MSGTYPE(*ESCAPE)           
FINFIN:      ENDPGM                                                   

Programme de remise à blanc des messages: SFLCLR

Simple habillage de la commande RMVMSG

SFLCLR : nettoyage des messages programme de l'appelant
            PGM
     /* Nettoie la PGMQ de l'appelant des ses anciens messages */
            RMVMSG  PGMQ(*PRV) CLEAR(*OLD)
            ENDPGM

Gestion de la position du curseur

Le positionnement par défaut du curseur convient dans de nombreux cas, en particulier pour la gestion des erreurs. Parfois, une gestion explicite est meilleure, avec dans la très grande majorité des cas conservation de la dernière position connue, alors que la gestion par défaut ramène le curseur sur le premier champ en saisie de l'écran si aucun positionnement par indicateur n'est spécifié.

Gestion de la position du curseur
Quand ? Curseur: Gestion
CSRLOC
Sous fichier: Gestion
SFLRCDNBR
Initialisation ou Rollup Utiliser le positionnement par défaut F1LIN et F1COL à 0 Afficher la dernière page écrite TRN1 dans SFLRCDNBR - RNB1
Cas standard: réaffichage sans erreur Laisser le curseur sur sa position Utiliser l'INFDS pour F1LIN et F1COL Afficher la page courante Utiliser l'INFDS pour RNB1
Erreur détectée Utiliser le positionnement par défaut F1LIN et F1COL à 0 Afficher la première ligne en erreur READC et RN1 dans RNB1 à la première erreur

 

Les indicateurs

Les indicateurs sont des booléens dotés de nomns standard sur 2 caractères. Historiquement, ils constituaient la seul moyen de gérer un branchement conditionnel.

Indicateurs banalisés et indicateurs externes

Ces indicateurs permettent la gestion d'erreurs et de comparaisons ansi que le conditionnement d'attributs écran.

Touches de commandes et de fonctions

Les indicateurs de commande KA à KN et KP à KY identifient la touche de commande ou de fonction utilisée au moment ou un écran rend la main à un programme.

Dans les DDS écran, les touches de commande et de fonction sont rattachées aux touches F1 à F24.

. . . . ! . . . . 1 . . . . ! . . . . 2 . . . .
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
A B C D E F G H I J K L M N P Q R S T U V W X Y
Pour pallier une codification difficile à lire, un indicateur en retour est souvent attaché à chaque touche de fonction. CA04(04) associe l'indicateur banalisé 04 à la touche de fonction F4.

Indicateurs d'impression

Les indicateurs d'overflow (débordement) sont positionnés quand une ligne est écrite au delà de la ligne maximum spécifiée, inférieur à la taille de la page. Des lignes peuvent encore être écrites, pour terminer un pavé par exemple, et un saut de page doit être éffectué par le programme.

Les indicateurs de fin ce page OA à OG et OV sont utilisés pour les sorties imprimantes à descriptions internes, et les indicateurs banalisés 01 à 99 sont utilisés pour les sorties imprimantes à description externe.

Indicateurs de correspondance et de rupture

La lecture en concordance consiste à synchroniser la lecture de deux ou plusieurs fichiers en fonction de valeurs de clé communes. Un fichier doit être défini comme primaire, et le ou les autre fichiers comme secondaires.

La gestion des ruptures consiste à réaliser des traitements d'entête et de totalisation lors de changement de valeurs de clé en lecture séquentielle de fichier.

Concordance et ruptures sont des concepts distincts mais souvent gérés ensembles.

Contrôle d'ouverture de fichiers

Par défaut, un programme RPG ouvre les fichiers lors de son initialisation et les referme quand il est quitté, si l'indicateur LR est en fonction. Lors d'une sortie par RETRN avec LR hors fonction, les fichiers restent ouverts.

Pour des raisons historiques, RPG se déroule séquentiellement et l'exécution reprend au début du code si la dernière ligne est atteinte sans que les indicateurs LR ou RT ne soient positionnés. Si un fichier primaire a été défini, il est lu à chaque passage et LR est positionné en fin de fichier.

Les indicateurs système U1 à U8 positionnés avant le lancement du programme conditionnent dans les cartes F l'ouverture et la fermeture automatique des fichiers.

L'indication de condition UC désactive l'ouverture et la fermeture automatique, et le fichier spécifié doit être ouvert explicitement par OPEN et fermé par CLOSE.

Codes d'affectations de champs

Opérateurs arithmétiques

Opérations sur zones alpha

Affectations alpha, cadrage, padding

Initialisation

Définition depuis référence

Test de numéricité

Concaténation

Opérations RPGLE

Les opérations RPGLE sont un peu plus nombreuses qu'en RPG, et les descripteurs optionnels accompagnent le code opération.

Liste des codes opération

ACQ(E)
Acquérir
ADD(H)
Ajouter
ADDDUR(E)
Ajouter durée
ALLOC(E)
Allouer mémoire
ANDxx
Et
BEGSR
Début de sous-programme
BITOFF
Dépositionner des bits
BITON
Positionner des bits
CABxx
Comparer et brancher
CALL(E)
Appel d'un programme
CALLB(D | E)
Appel d'une procédure liée
CALLP(M | R | E)
Appel d'un programme ou d'une procédure
CASxx
Appel conditionnel de sous-programme
CAT(P)
Concaténer deux chaînes de caractères
CHAIN(N | E)
Accès sélectif à un fichier
CHECK(E)
Vérifier de gauche à droite
CHECKR(E)
Vérifier de droite à gauche
CLEAR
Mettre à blanc
CLOSE(E)
Fermer des fichiers
COMMIT(E)
Valider
COMP
Comparer
DEALLOC(E | N)
Désallouer mémoire
DEFINE
Définition de zone
DELETE(E)
Supprimer un enregistrement
DIV(H)
Diviser
DO
Exécuter
DOU(M | R)
Exécuter jusqu'à
DOUxx
Exécuter jusqu'à
DOW(M | R)
Exécuter tant que
DOWxx
Exécuter tant que
DSPLY(E)
Fonction d'affichage
DUMP
Prise de cliché programme
ELSE
Sinon
ENDyy
Mettre fin à un groupe
ENDSR
Fin de sous-programme
EVAL(H | M | R)
Evaluation
EXCEPT
Sortie pendant le traitement
EXFMT(E)
Ecrire puis lire le format
EXSR
Appeler un sous-programme
EXTRCT(E)
Extraire des données date/heure
FEOD(E)
Forcer la fin de données
FORCE
Forcer lecture d'un fichier lors du cycle suivant
GOTO
Aller à
IF(M | R)
Si
IFxx
Si
IN(E)
Extraire une zone de données
ITER
Passer le contrôle à ENDxx
KFLD
Définition des parties d'une clé
KLIST
Définition d'une clé composée
LEAVE
Quitter un groupe DO
LOOKUP
Rechercher dans un tableau ou une table
MHHZO
Mouvement du hors texte de position gauche vers position gauche
MHLZO
Mouvement du hors texte de position gauche vers position droite
MLHZO
Mouvement du hors texte de position droite vers position gauche
MLLZO
Mouvement du hors texte de position droite vers position droite
MOVE
Déplacer ou modifier les zones
MOVEA(P)
Déplacer un tableau
MOVEL(P)
Mouvement vers la gauche
MULT(H)
Multiplier
MVR
Déplacer le reste
NEXT(E)
Forcer l'entrée suivante
OPEN(E)
Ouvrir des fichiers
ORxx
Ou
OTHER
Sinon Select
OUT(E)
Ecrire une zone de données
PARM
Identifier des paramètres
PLIST
Identifier une liste de paramètres
POST(E)
Enregistrer
READ(N | E)
Lire un enregistrement
READC(E)
Lire l'enregistrement modifié suivant
READE(N | E)
Lire l'enregistrement suivant avec la même clé
READP(N | E)
Lire l'enregistrement précédent
READPE(N | E)
Lire l'enregistrement précédent avec la même clé
REALLOC(E)
Réallouer mémoire
REL(E)
Libérer
RESET(E)
Réinitialiser
RETURN(H | M | R)
Retour à l'appelant
ROLBK(E)
Invalider
SCAN(E)
Explorer une chaîne de caractères
SELECT
Commencer un groupe Select
SETGT(E)
Positionner sur valeur supérieure
SETLL(E)
Positionner sur valeur inférieure
SETOFF
Mettre hors fonction
SETON
Mettre en fonction
SHTDN
Arrêt du système
SORTA
Tri de tableau
SQRT(H)
Racine carrée
SUB(H)
Soustraire
SUBDUR(E)
Soustraire une durée
SUBST(P | E)
Sous-chaîne
TAG
Etiquette
TEST(D | T | Z | E)
Tester date/heure/horodatage
TESTB
Tester un bit
TESTN
Tester la partie numérique
TESTZ
Tester la partie hors texte
TIME
Heure et date
UNLOCK(E)
Déverrouiller une zone de données ou un enregistrement
UPDATE
Modifier un enregistrement existant
WHEN(M | R)
Si
WHENxx
Si VRAI alors Select
WRITE
Créer de nouveaux enregistrements
XFOOT(H)
Additionner les éléments d'un tableau
XLATE(P | E)
Convertir
Z-ADD(H)
Initialiser à zéro et ajouter
Z-SUB(H)
Initialiser à zéro et soustraire

Descripteurs:

D
Entrez (D) pour envoyer à votre procédure de réception les descripteurs d'opération des zones de type alphanumérique, avec le code CALLB. Pour d'autres opérations, entrez D si elles s'appliquent à une date.
E
Tapez (E) pour activer la gestion des erreurs. Aucun indicateur d'erreur n'est admis si l'extension E est indiquée.
H
Entrez (H) si le contenu de la zone doit être arrondi.
M
Entrez (M) si la règle relative au nombre maximal de chiffres doit être appliquée
N
Entrez (N) si l'enregistrement doit être lu mais pas verrouillé. Pour les autres opérations, tapez (N) si l'opération DEALLOC doit attribuer la valeur NULL à la zone résultat
P
Entrez (P) si la zone résultat doit être complétée par des blancs.
R
Entrez (R) si la règle relative aux décimales du résultat doit être appliquée : ainsi, la précision du résultat intermédiaire décimal sera calculée de manière à ce que le nombre de décimales soit au moins égal au nombre de décimales du résultat de l'expression.
T
Entrez (T) si l'opération s'applique à des données de type heure.
Z
Entrez (Z) si l'opération s'applique à des données de type horodatage.

Traitement de fichiers

Fichier Base de Données

Cartes F: description de base et continuation

Cartes I: définition ou renommage de zone

Cartes O: sorties

Cartes C: Définitions de clé et modes d'accès

Clés: KLIST et KFLD

Positionnement: SETxx

Accès: CHAIN et READx

Modification: WRITE, UPDAT et DELET

Ouverture: OPEN, CLOSE et FEOD

Fichier Imprimante

Gestion de saut de page

Fichier imprimante à description Externe

Cartes O: Fichier à description Interne

Fichier Ecran

Cartes F: Description et continuation

Affichage: WRITE, READ et EXFMT

Sous fichiers

Tables et tableaux

Structures de données

Organisation physique et contraintes

DS internes et Externes

Définition des DS internes et Externes

NAMVAR, IN et OUT: DS et Data Area

Zone de communication utilisateur

DS d'information: INFDS et PGMDS

Approfondissement des fichiers écrans

Gestion des messages d'erreur

Gestion de la position du curseur

Aides et modules de recherche

Communications entre programmes

Appel de programme

Passage de paramètres

Sortie avec ou sans libération de ressource

Zone de communication utilisateur

File d'attente de données, et autres

Principe de fonctionnement

Ecriture par QSNDDTAQ

Lecture par QRCVDTAQ

Lancement de commande par QCMDEXC

Dispositifs émulant un écran

Traitement des erreurs et exceptions

Fonctions de traitement particulière

Programmes contrôlant plusieurs écrans: ACQ, REL

Manipulation de données binaires et hexadécimales

Comparaisons et recherches sur zones

Synchronisation des mises à jour

Instructions diverses

Gestion du fenêtrage

Lecture en concordance et gestion de ruptures

La gestion en concordance (matching )consiste à lire en parallèle deux ou plusieurs fichiers triés selon des clés composées et communes.

La gestion des ruptures consiste à réaliser des traitements spécifiques avant et après un changement de valeur sur un élément de clé composée. Les traitements avant rupture sont des traitements d'entête et les traitements après rupture des traitements totaux

Concordance et rupture sont souvent -mais pas toujours- associés, et obéissent à une logique commune.

Le cycle GAP automatise partiellement le matching et les ruptures mais ne couvre pas tous les cas. Une approche manuelle est souvent plus simple.

Soit une édition rapprochant des objectifs de vente par région et secteur et des ventes réelles.

Cette approche n'est pas simple et en général ne peut pas être simplifiée. Il est indispensable de ne pas la rendre plus complexe que nécessaire.

Source de programme avec matching et ruptures

   ... A faire ...

Sommaire