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é
- assure une tâche spécifique clairement compréhensible
- est correctement documenté par des commentaires fonctionnels,
en minuscules,
en bannissant les commentaires techniques pour décrire ce qui va être
fait et que tout développeur peut constater par lui-même
(genre
* LECTURE DU FICHIER FPRX27B
)
- partage avec les autres pavés la gestion d'un nombre minimum de variables
clairement identifiables
- peut être copié avec un minimum de modifications d'un programme
à un autre
- se déroule séquentiellement, du début à la fin,
avec boucles et appels à d'autres pavés si nécessaire,
mais sans aucun branchement (
GOTO
)
- est d'autant plus bref qu'il est structurellement complexe
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
- est extrêmement rapide (plus que l'écrire de ce texte explicatif)
- ne nécessite aucune réflexion
- garantit la dynamique du fonctionnement
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é.
- Distinguer la récupération de la position du curseur et son positionnement
- utiliser la gestion par défaut avec indicateurs en cas d'erreur
en forçant à une valeur invalide (zéro) la position demandée
- ne pas confondre la gestion du curseur et la gestion d'affichage du
sous fichier par
SFLRCDNBR
qui spécifie la ligne qui doit
apparaître à l'écran (mais pas sa position). Une valeur invalide
provoque une erreur d'unité non récupérable.
RTNCSRLOC
renvoie le nom du champ sur lequel se situe
le curseur, pas sa position.
Le nom de champ est utilisable directement pour les pavés de recherche.
- la ligne de sous fichier sur laquelle est le curseur est calculable
par ajout de la ligne du curseur et du rang de la première ligne affichée.
Ici, avec un sous fichier de 9 lignes commençant sur la ligne 10:
Si F1LIN
compris entre 10 et 19:
RN1
ligne curseur = RNTOP
+ F1LIN
- 10
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.
- les indicateurs banalisés
01
à 99
sont à la disposition du programmeur, et la normalisation de leur usage
est fortement recommandée.
- les indicateurs
U1
à U8
sont spécifiques à
un travail dans sa globalité, et peuvent être positionnés par un programme
RPG, CL ou autre et lus par un autre programme.
- les indicateurs
H1
à H9
sont des indicateurs
d'arrêt pour gestion des erreurs au sain de chaînes de traitement.
- l'indicateur
RT
est un indicateur de retour
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
- Une touche de fonction
CFxx
rend la main au programme
et lui transmet les données d'entrée de l'écran
- Une touche de commande
CAxx
rend la main au programme
sans lui transmettre les buffres d'entrée.
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.
- les indicateurs
M1
à M9
gèrent les niveaux
de concordance, MR
permet de savoir si la concordance
est effective.
- les indicateurs
L1
à L9
gèrent les niveaux
de rupture et conditionnent l'exécution des traitements
entête, en partie gauche des cartes C, et total, dans les colonnes
qui suivent (N01N02N03).
- l'indicateur
LR
indique que tous les fichiers ont été
lus intégralement et que le programme doit se terminer.
Si cet indicateur (ou RT
) n'est pas positionné,
l'exécution reprend au début des cartes C quand la dernière ligne de traitement
est atteinte.
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.
-
Une
clé courante
est définie pour chacun des fichiers à traiter,
et initialisée avec une valeur plus basse que toute valeur
pouvant être atteinte (*LOVAL
)
- Un flag ou indicateur de fin de fichier est spécifié pour chacun des fichiers,
positionné à '0' pour 'non terminé'.
- Un flag de conditionnement de lecture est spécifié pour chacun des fichiers
à traiter, et positionné à '1' pour 'à lire'.
Une lecture avance est nécessaire pour savoir si une ligne devra être
traitée car synchrone ou en retard, ou non car en avance.
En début de traitement, tous les fichiers doivent être lus en avance.
- Si nécessaire, un traitement d'entete général est exécuté.
- Une boucle de lecture commence.
-
Chaque fichier devant être lu est lu, et son flag de lecture positionné
à '0' pour 'plus à lire'.
Si une fin de fichier est détectée, la clé de lecture pour ce fichier
est forcée à la valeur maximale
*HIVAL
pour comparaison
avec les autres clés, et le flag de fin de fichier positionné à '1'
-
Si un filtrage de lecture doit être réalisé sur un des fichiers
et qu'un enregistrement ne doit pas être pris en compte,
son flag de lecture est positionné à '1' pour 'à relire'
et la boucle immédiatement relancée par
ITER
-
Si une fin de fichier a été détectée pour tous les fichiers,
la boucle de traitement est abandonnée par
LEAVE
-
Une clé de référence est constituée en prenant la plus petite des clés
pour les différents fichiers.
-
La clé de référence est comparée à la clé courante, et les traitements
de rupture lancés si une différence est constatée.
- Si des totaux sont en attente de traitement, ils sont déclenchés
en partant du niveau le plus bas et en remontant jusqu'au niveau
le plus haut pour lequel une rupture existe.
Ici, un total est à sortir si le total des ventes ou des objectifs
est non nul. Dans des cas plus complexe, un top peut être
positionné dès qu'un total d'un certain niveau doit être géré.
Si le secteur ou la région ont changé,
le total département pour la clé courante est imprimé et remis à 0
Si la région a changé le total pour la clé courante
est imprimé et remis à zéro.
-
Les traitements entete sont déclenchés depuis le niveau le plus haut
ayant changé
Si la région a changé un entete région est déclenché pour la
clé de référence
Si la région ou le secteur ont changé un entete secteur est déclenché pour la
clé de référence
-
Remettre à zéro des des totaux dans un traitement entete n'est PAS
une bonne pratique. En cas d'erreur, des totaux peuvent être remis à zéro
sans avoir été imprimés, faisant disparaître les montants correspondants.
Les totaux doivent être remis à zéro immédiatement après leur impression
dans les traitements totaux. En cas d'erreur, ils n'apparaissent pas au
bon endroit mais restent totalisés, et l'analyse de l'erreur est beaucoup
plus aisée.
Concrètement, il est préférable de mal ventiler des montants
que de les perdre totalement.
-
Pour chacun des fichiers dont la clé correspond à la clé de référence,
un traitement détail est exécuté et son flag de lecture positionné
à '1' pour 'à relire'.
-
La clé courante devient la clé de référence
-
Fin du code de boucle, nouvelle itération.
-
En fin de traitement de boucle tous les niveau de totalisation
sont traités ainsi que le total génral.
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