Beruflich Dokumente
Kultur Dokumente
Et, si l'on prend un guide en montagne, on commence par se mettre d'accord sur le
point de départ mais aussi sur le point d'arrivée.
Les prérequis
Pour tirer profit au maximum de ce livre, il est nécessaire que vous ayez au départ
les connaissances suivantes :
Lorsque vous aurez exploité ce livre, vous devriez avoir atteint les objectifs
suivants :
Ce livre ne prétend en aucun cas aborder toutes les possibilités de l'AS/400, car
IBM le fait très bien, en anglais malheureusement, et dans une centaine de
brochures aussi complètes que détaillées. Il contient quelques exercices dont tous
les corrigés sont regroupés en annexe 5.
IBM, comme la plupart des grands constructeurs informatiques, est présent dans
les 3 gammes classiques d'ordinateurs :
- les micro-ordinateurs,
Leurs machines ne sont pas compatibles entre elles, c'est-à-dire que les systèmes
d'exploitation sont différents, les langages aussi. L'échange de données entre
machines est quasi impossible.
Les machines les plus puissantes ont 32 000 octets (ou caractères) en mémoire !
Si vous avez vécu cette époque, n'en parlez surtout pas à vos enfants, c'est ce que
l'on trouve dans la moindre calculette programmable d'aujourd'hui !
C'est donc en 1981 qu'IBM lance son fameux PC. L'étiquette IBM rassure les
acheteurs qui étaient un peu perdus dans la jungle des autres marques.
L'IBM PC devient peu à peu la norme, et les autres constructeurs s'y rallient un à
un en fabriquant ce que l'on a appelé des compatibles PC.
Leur processeur était au départ capable de traiter 8 informations (ou bits) à la fois,
c'est le processeur INTEL 8086.
Dans le même temps, ces machines ont acquis un disque dur de 5 millions
d'octets, puis de 10 millions, puis de 20 millions puis 40, ou 80 mégaoctets, et
aujourd'hui couramment 200 millions d'octets.
Son architecture n'est pas compatible avec l'ancien PC. Le "bus", véritable
colonne vertébrale d'un ordinateur, a été transformé. L'ancien bus, nommé ISA,
est remplacé par le bus MCA (Micro Channel Architecture). Ce sont
essentiellement les grandes entreprises qui se sont équipées de PS/2.
Et, pour en terminer avec la micro-informatique IBM, signalons l'IBM PS/1 sorti
fin 1989 qui est un retour à l'architecture ISA et donc au compatible PC.
Vous pensez peut-être que je me suis un peu trop étendu sur la micro-informatique
dans un ouvrage dédié à la mini-informatique. C'est en fait que ces deux types
d'informatique ne peuvent plus s'ignorer, ou pis se mépriser. Elles vont
s'interpénétrer de plus en plus. Mais j'y reviendrai après vous avoir parlé de la
gamme des moyens systèmes d'IBM.
Ici commence un domaine moins connu du grand public. Puisque cela concerne
l'informatisation des PME, et parfois de certaines grosses entreprises.
IBM sort vers la fin des années 60, l'IBM 3, à cartes perforées.
Celui-ci évolue au début des années 70 vers l'IBM 32, puis l'IBM 34 à la fin des
années 70, suivi par l'IBM 36, au début des années 80.
Dans cette évolution, on passe des machines à cartes perforées aux machines à
disquettes et enfin à disques fixes.
Puis un événement important, très peu de temps après la sortie du 34 (le 36 sortira
en 1983, comme suucesseur du 34), c'est l'arrivée de l'IBM 38, très attendu et
Le 21 juin 1988, IBM annonce une nouvelle machine, l'IBM AS/400. Ce n'est pas
en fait réellement une nouvelle machine. Il est vrai que les composants hardware
sont d'une nouvelle génération, ils sont plus compacts, chauffent moins, vont plus
loin en terme de puissance de traitement de l'information.
Quelques innovations tout de même. Mais l'essentiel des principes de l'IBM 38 est
conservé. C'est-à-dire qu'hormis le niveau hardware l'AS/400 est à 90%
ressemblant à l'IBM 38. C'est tant mieux pour les PME qui n'ont pas eu, une fois
de plus, à faire un bond technologique, mais c'est un peu dommage pour le progrès
de la mini-informatique.
Aujourd'hui l'AS/400 se vend très bien : le Gartner Group estime en avril 1991
que le parc installé serait déjà 110 000 AS/400 de par le monde, sur un total de
500 000 mini-IBM en service (IBM 36 + IBM 38 + AS/400).
En France, selon des sources proches d'IBM, on en serait à 5 000 AS/400 sur un
total de 22 000 mini-IBM en service.
On peut imaginer que les 390 000 IBM 36 et 38 qui tournent encore aujourd'hui
risquent fort d'être remplacés par des AS/400 dans les années qui viennent.
Ce sont ces ordinateurs qui équipent les grosses entreprises. Il n'est pas rare de
leur voir connectés des milliers de terminaux dispersés sur le territoire national,
voire transnational.
Dans cette gamme des gros systèmes, l'ancêtre de base est l'IBM 360 des années
60. Il a évolué en IBM 370 dans les années 70, mais aujourd'hui, on retrouve
toujours la même philosophie incarnée par des machines évidemment plus
puissantes :
- l'IBM 43xx;
- l'IBM 309x;
Les IBM 43xx étant nettement plus puissants que les IBM 309x. Ce sont des
machines que l'on ne trouve que dans de très grosses entreprises. Les lettres "x"
sont à remplacer par le numéro exact du modèle. Par exemple, dans la série des
Voilà rapidement brossé le panorama des "main frames" IBM. Mais on ne peut
passer sous silence deux machines qui sortent de la typologie micro-mini-gros
systèmes.
L'IBM 9370
Le RS/6000
Et maintenant que nous avons fait le tour de la gamme IBM, recentrons-nous sur
notre cher AS/400.
Nom : IBM
Prénom : AS/400
Ce boîtier, de la taille d'un gros micro, peut contenir l'un des trois modèles
suivants.
L'AS/Entry rebaptisé Y10 : en bas de gamme, on trouve cette machine qui est en
réalité un IBM 36 construit avec les composants hardware de l'AS/400. Mais il
fonctionne bel et bien comme un IBM 36, et non un AS/400. IBM a tenu à le
conserver car c'est une machine qui convient parfaitement aux petites PME qui
n'ont que quelques postes de travail.
Les modèles D04 et D06 : ce sont, eux, de vrais petits AS/400, leurs prix
commencent aux alentours de 100 000 F.
Il peut contenir les modèles D35, D45, D50,D60, D70, D80. Le haut de gamme, le
D80, coûte la bagatelle de 10 millions de francs et offre la possibilité à 600
utilisateurs de travailler simultanément ! C'est un biprocesseur. C'est-à-dire que
l'ensemble du travail à effectuer par l'ordinateur est réparti entre 2 processeurs.
Sachez qu'IBM étudie actuellement une machine dotée de 6 processeurs.
- un organe de traitement;
La mémoire centrale
Appelée encore mémoire RAM ou mémoire vive, elle peut aller de 4 Mo à plus de
192 Mo sur les gros modèles.
Le maximum est de 3,8 Go sur les modèles 9404, et de 56 Go sur les 9406
(1 Go = 1 gigaoctet = 1 milliard d'octets).
Il n'est pas obligatoire, mais il est bien utile pour effectuer des échanges de
données entre deux AS/400 qui ne sont pas reliés par une ligne de
télécommunication. Il sert aussi parfois pour des petites sauvegardes.
Deux modèles existent : le modèle pour grandes disquettes 8 pouces, et le modèle
pour petites disquettes 5 pouces 1/4.
Les disquettes AS/400 sont compatibles avec les disquettes IBM 36 et IBM 38,
mais restent absolument incompatibles avec les disquettes 5 pouces 1/4 pour PC !
La capacité réduite (1,2 Mo sur les deux modèles) interdit d'y sauvegarder de gros
fichiers.
Il n'est pas obligatoire non plus, mais c'est le moyen le plus adapté pour faire les
sauvegardes des disques. Il s'agit de cassettes magnétiques de 1/2 ou 1/4 de pouce
de large, ressemblant un peu aux vidéocassettes. La capacité d'une cartouche va de
120 Mo à 2,3 Go.
Assez rare sur AS/400, cet appareil écrit et lit des bandes magnétiques de 1/2
pouce de large, non pas sous forme de cassettes, mais sous forme plus classique de
bobines de 30 centimètres de diamètre environ.
Les terminaux
Les postes de travail de l'AS/400 sont des terminaux, on les appelle encore
"terminaux passifs" ou plus méchamment : "terminaux bêtes". En fait un terminal
n'est qu'un écran de visualisation associé à un clavier, le tout étant relié à l'AS/400
par un câble de liaison. Le terminal n'a aucune intelligence propre: il n'a ni
processeur, ni mémoire, ni disque.
Il existe une bonne vingtaine de modèles de terminaux "5250", qui diffèrent les
uns des autres par les caractéristiques suivantes :
- couleur ou monochrome;
- alphabet classique, japonais, coréen, chinois...;
- affichage de 24 lignes de 80 caractères ou 27 lignes de 132 caractères;
- connexion par câble "twinax" ou par liaison ASCII;
- ergonomie du clavier et de l'écran.
Les imprimantes
Après avoir passé en revue les composantes d'un AS/400, examinons maintenant
comment sont reliés les terminaux à l'unité centrale. Il existe sur l'AS/400
différents types de câblages :
C'est de loin la plus usitée. Le câble le plus souvent utilisé est le câble "twinax".
La longueur du câble reliant le terminal à l'AS/400 ne doit pas dépasser 1 525
mètres, ce qui est largement suffisant dans une PME. Le câble "twinax" est
composé de deux conducteurs électriques isolés et torsadés, le tout entouré d'une
tresse métallique appelée blindage.
- sur chacune de ces prises, on peut brancher un et un seul câble "twinax"de 1 525
mètres maxi;
Rappelons qu'un terminal peut être aussi bien un écran qu'une imprimante.
Comment sont identifiées chacune des lignes, et chacun des terminaux sur une
ligne ?
Un des arguments publicitaires d'IBM est de dire que l'AS/400 est une machine
particulièrement "communicante". Et c'est vrai : on peut connecter à l'AS/400
toutes sortes d'ordinateurs (surtout des IBM !), et cela de différentes manières.
Mais nous ne rentrerons pas dans les détails assez compliqués de ces connexions...
2.1. Généralités
Sur micro compatible PC, on a le choix entre les systèmes d'exploitation suivants:
MSDOS, UNIX, PROLOGUE... Sur gros systèmes IBM, les principaux systèmes
d'exploitation sont DOS/VS, MVS, VM. Sur BULL, on trouvera GCOS et UNIX.
Sur DIGITAL, nous avons VMS. Et sur l'AS/400, on n'a pas le choix ! C'est
obligatoirement l'OS/400 qui va régir la machine. C'est un système d'exploitation
extrêmement complet, je dirais presque trop complet, tant l'éventail de ses
possibilités a été poussé loin. Rendez-vous compte : le système MSDOS tient sur
une disquette de 360 Ko, UNIX occupe 30 Mo, et l'OS/400 ? 300 millions
d'octets !
L'OS/400 a connu différents versions, comme tout logiciel. Nous en sommes
actuellement à la version 2.1.0 : ce qui signifie "version 2, release 1, numéro de
modification 0". Et nous avons connu précédemment les versions 1.1 , 1.2 , 1.3 ,
et 2.0 .
Détaillons les grandes fonctionnalités de l'OS/400.
Autre différence, si l'animateur de débat doit être équitable dans son partage du
temps de parole, l'ordinateur, lui, peut ne pas l'être. Ce sera le cas si, par exemple,
on a attribué à l'une ou à l'autre des tâches une priorité d'exécution plus faible.
Autre différence encore, si l'une des tâches est occupée à faire une lecture sur
disque, ou toute autre action extrêmement longue par rapport à la vitesse du
processeur, cette tâche passera alors son tour. Elle cédera son temps de processeur
à une autre tâche, tout comme un participant à notre débat politique pourrait céder
son temps de parole s'il sort quelques instants pour chercher un dossier.
- tout fichier peut être indexé, et avoir plusieurs index sur des champs simples ou
composés, contigus ou non contigus;
- la description des fichiers se fait à l'extérieur des programmes, donc une fois
pour toutes pour un fichier, et non pas une fois dans chaque programme qui utilise
le fichier;
- il est possible de prévoir des jointures entre deux fichiers, ce sont des liaisons
permanentes qui évitent des lectures;
Revenons à l'utilitaire IDDU. Au lieu de rédiger les SDD sur papier, puis de les
saisir à l'aide de l'utilitaire SEU, on peut faire générer automatiquement ces SDD
par IDDU. Cet utilitaire entamera avec nous un dialogue sur écran pour connaître
la structure de notre fichier. D'où le terme "interactif" justifiant le I de IDDU.
En fait, cet utilitaire, qui se veut plus convivial que la rédaction des SDD, s'avère,
à mon sens, plus complexe d'utilisation. Mais vous ferez votre choix vous-même
entre les deux solutions.
2.6.7. QUERY
En français : interrogation ou requête. Cet utilitaire permet d'imprimer toutes
sortes de listes, même assez sophistiquées, sans programmation.
Là aussi, c'est interactif. QUERY vous demande quel(s) fichier(s) vous voulez
lister, quelles colonnes vous voulez dans votre état, si vous voulez des totaux, des
sous-totaux, des comptages, des moyennes..., bref beaucoup de choses que l'on
Le traitement coopératif, comme son nom l'indique, permet de faire coopérer deux
ordinateurs, chacun ayant son rôle propre. C'est la notion très en vogue
actuellement d'architecture "client-serveur". Je me permets de m'étendre quelques
instants sur la question, car il semble que ce soit la voie de l'informatique de
demain. Sur le micro-ordinateur tournera un programme qui s'occupera surtout de
la gestion de l'interface utilisateur, autrement dit la gestion de l'écran qui sera de
type graphique, du clavier et de la souris, et demain des systèmes d'imagerie et de
son que nous promettent les futurs ordinateurs multimédias. C'est le programme
"client". Il faudra localement (au niveau du poste de travail) beaucoup de
puissance informatique pour cela, et les nouveaux micro-processeurs du marché
n'en manquent pas. On sera alors loin des terminaux non graphiques et
inintelligents actuels de type "5250" qui ne disposent, eux, d'aucune puissance
informatique locale.
Côté AS/400, un autre programme sera en fonction. C'est le programme "serveur".
Son rôle sera simplement de "servir" comme sur un plateau les données qui lui
auront été demandées par le client.
Un exemple : l'utilisateur du PC veut visualiser sur son écran les 5 dernières
sorties de stock de l'article X. A l'aide de sa souris, de son clavier, demain peut-
être de sa voix, il formule sa demande. Le PC interprète la demande, la
"décortique" et la transmet à l'AS/400 serveur, sous forme d'une requête générée
dans le langage SQL (voir explication ci-dessous). L'AS/400 fait la recherche dans
sa base de données, retourne au client la liste des 5 dernières sorties. Le PC reçoit
les données, et s'occupe de les afficher de façon conviviale, avec graphismes
agréables, icônes, couleurs...
2.6.9. EDU
IBM fournit avec l'AS/400, un logiciel d'auto-éducation. Il est en français ! Il
contient une trentaine de modules de vingt minutes chacun. Dans chaque module,
des questions sont posées à l'apprenant pour vérifier sa progression.
Très intéressant pour un débutant sur l'AS/400.
Voilà pour la liste des utilitaires. Profitons-en pour évoquer les progiciels (c'est-à-
dire PROduits loGICIELS) du marché.
L'objet est l'entité de base du disque. On dit que la gestion de l'espace disque par
le système d'exploitation est une gestion "orientée objet". Ça aussi, c'est un
concept à la mode qui prouve, à l'évidence, que vous avez évolué depuis les cartes
perforées !
Les attributs principaux d'un objet sont le nom de l'objet, le nom de son
propriétaire, le type d'objet, sa date de création, sa date de dernière sauvegarde, un
libellé en clair le décrivant sommairement, le nom de la bibliothèque auquel il
appartient.
La "valeur" de l'objet est en fait son contenu. Par exemple, la "valeur" de l'objet
fichier CLIENTS est l'ensemble des enregistrements de ce fichier. La "valeur" de
l'objet programme de paie est l'ensemble des instructions compilées de ce
programme.
Beaucoup de ces manipulations pourront être faites à l'aide de PDM, dont nous
avons parlé plus haut, et qui permet de gérer de façon conviviale les objets.
Allons encore plus loin dans notre "décorticage" de l'espace disque. Nous avons
déjà décomposé l'espace disque en bibliothèques, puis les bibliothèques en objets.
Nous allons voir maintenant que certains objets se décomposent en "membres".
Ce sont les objets de type "fichiers", qu'ils soient des fichiers de données, ou des
fichiers contenant des sources de programmes.
Revenons... aux sources. Vous devez savoir qu'un programme doit d'abord être
écrit dans un langage tel que le GAP ou le COBOL. C'est ce qu'on appelle un
programme source. Puis, ce programme source est traduit, on dit compilé, en
langage machine, directement compréhensible par le processeur de l'ordinateur qui
pourra alors l'exécuter. Ce programme en langage machine est appelé le
"programme objet". Remarquez qu'ici le mot "objet" n'a rien à voir avec la notion
d'objet, sous-ensemble d'une bibliothèque, que nous venons d'étudier il y a
quelques instants ! N'hésitez pas à relire si ce n'est pas tout à fait clair dans votre
esprit.
Vous vous doutez que les programmes source que vous écrirez seront stockés sur
disque dans des fichiers, appelés fichiers source. Mais sur AS/400, dans chaque
fichier source, on peut stocker plusieurs programmes source. Chaque
programme constituera ce qu'on appelle un "membre" du fichier source.
Attention, le piège est qu'il n'en va pas de même des programmes objet. Chaque
programme objet (c.à.d. le résultat d'une compilation) sera stocké sur disque sous
forme d'un objet (c.à.d. le sous-ensemble d'une bibliothèque).
Par exemple, prenons un espace disque, qui ne contient que deux bibliothèques :
Bibliothèque COMPTA
- Objet fichier de données COMPTES
- Objet fichier de données FACTURE
- Objet fichier de programmes sources PROGCOMPT
* Membre programme source PG1
* Membre programme source PG2
- Objet programme compilé PG1
- Objet programme compilé PG2
Bibliothèque PERS
- Objet fichier de données PERSONNEL
- Objet fichier de programmes sources PGPER
* Membre programme source PAIE1
* Membre programme source PAIE2
* Membre programme source PAIE3
- Objet programme compilé PAIE1
- Objet programme compilé PAIE2
- Objet programme compilé PAIE3
Calcul de la paie
Le premier sera celui du calcul mensuel de la paie, supposons qu'il faille une
heure à l'ordinateur pour traiter tous les salariés de l'entreprise. Pendant ce
traitement d'une heure, le programme ne va que lire ou écrire des fichiers disque,
imprimer les bulletins de paie. Ce programme ne contiendra pas de dialogue avec
le terminal. C'est ce qu'on appelle un programme batch. Eh bien, ce programme
batch peut être lancé de deux façons.
Il vaut mieux lancer un programme de type batch sous forme d'un travail batch,
car:
D'abord la JOBQ.
Nous venons de voir que certains travaux pouvaient se lancer en batch. Or
l'AS/400, bien que multitâche, est généralement configuré pour ne pouvoir
exécuter que 1 ou 2 programmes batch simultanément. Ce nombre de tâches
simultanées maximum est "réglable".
Supposez que 5 utilisateurs lancent à peu près en même temps leur travail batch,
et que "le goulot d'étranglement" qu'est le processeur ne peut en traiter que deux à
la fois :
La lettre finale Q de JOBQ, comme d'ailleurs d'OUTQ, signifie ici "queue", c'est-
à-dire file d'attente en anglais.
Je n'ose pas penser à l'employé recevant son bulletin de paie sur lequel on lui
ajoute la TVA, et le client recevant sa facture, avec des déductions pour la
Sécurité sociale !
Sur toute machine multitâche, ce problème doit être résolu. C'est ce qu'a fait IBM
en prévoyant dans l'OS/400 un système dit de "spool".
Mais le système que je viens de décrire ne suffit pas, puisque, sous prétexte
d'éviter que les états ne se mélangent sur l'imprimante, on n'imprime plus rien du
tout !
Les fichiers SPOOL en attente d'impression sont placés dans une file d'attente
qu'on appelle OUTQ. On trouve souvent plusieurs OUTQ sur un AS/400. En effet,
si l'on dispose de plusieurs imprimantes, on créera en général une OUTQ par
imprimante.
Et pour chaque imprimante de l'ordinateur, il faudra lancer un (et un seul)
programme WRITER. Il peut donc y avoir plusieurs WRITER en cours s'il y a
plusieurs imprimantes sur l'ordinateur.
Comprenez bien et retenez bien le principe du SPOOL, car vous allez forcément le
manipuler : mettre un fichier impression dans une OUTQ, démarrer un WRITER,
bloquer et débloquer un fichier dans une file d'attente, l'effacer de la file d'attente,
etc. est le lot quotidien de tout analyste-programmeur sur AS/400.
Vous verrez que les commandes à passer pour ces manipulations sont simples, si
toutefois vous avez bien compris le principe.
Vous pouvez maintenant vous mettre devant un terminal, car vous allez avoir des
manipulations à effectuer. Votre terminal est actuellement hors tension. Mettez-le
sous tension.
Après quinze secondes environ apparaît ce qu'on appelle l'écran d'ouverture, sur
lequel vous sont principalement demandés :
Mais comme tout est OK, nous avons devant nous l'écran d'ouverture qui nous
tend les bras.
Vous tapez donc votre nom de profil, puis votre mot de passe.
Lorsque l'officier de sécurité déclare à l'AS/400 un nouveau profil, le mot de passe
est généralement égal au nom de profil. Mais vous pourrez et devrez même le
changer.
Laissez pour l'instant vides les autres rubriques de l'écran d'ouverture et appuyez
sur la touche ENTREE. Alors apparaît le "menu principal".
Nous vous avons parlé au début des 900 commandes disponibles dans le langage
de l'OS/400. Une grande partie de ces 900 commandes sont directement
accessibles par un système de menus.
Il est donc possible de lancer des commandes du langage CL sans s'en rendre
compte, simplement en choisissant des options et des sous-options dans
l'importante arborescence des menus et des sous-menus.
Une autre possibilité consiste à taper la commande en toutes lettres suivie de ces
paramètres. Voici au hasard quelques exemples de commandes :
WRKSPLF
C'est un peu moins convivial que le système des menus, mais c'est souvent plus
rapide. Un analyste-programmeur doit utiliser plutôt les commandes que les
menus, au moins pour les commandes courantes.
En plus, cela lui permettra d'apprendre quelques-unes des 900 commandes, ce qui
lui rendra service quand il devra réaliser de petits programmes en langage CL,
dans lesquels il sera impossible d'utiliser le système des menus.
Mais vous devez être effrayés par le nombre de commandes à connaître d'une part,
et ensuite par la liste des paramètres à connaître pour chacune de ces commandes.
Et vous avez bien raison, car IBM explique tout cela dans 5 gros manuels de
référence, ayant chacun quelques centimètres d'épaisseur.
Heureusement, un petit résumé de ces 5 tomes existe, c'est un manuel de....
696 pages, toujours en anglais !
Comment l'utiliser ?
Vous voyez apparaître une liste des thèmes des commandes CL. Choisissez le bon
thème, et vous arrivez ainsi à trouver le nom de la commande désirée et tous ses
paramètres.
Essayez de retrouver ainsi la commande qui vous permet de modifier votre profil
utilisateur. Et changez effectivement le texte de description de votre profil, et rien
d'autre ! car vous risqueriez des ennuis par la suite. Tapez vos nom et prénom dans
cette zone de description.
CHGPRF
Supposons que vous vous souveniez que la commande s'appelle CHGPRF, mais
vous n'en connaissez pas les paramètres.
Tapez alors dans la ligne de commande, en bas de l'écran, le nom de la
commande, c'est-à-dire CHGPRF.
Puis appuyez sur la touche guide F4. Vous voyez alors apparaître la liste des
paramètres disponibles. Dans beaucoup de commandes, seuls les paramètres les
plus courants apparaissent, vous appuierez alors sur la touche F10 pour avoir la
liste exhaustive de tous les paramètres de la commande.
Faites l'essai.
Refaites maintenant des essais similaires pour changer et personnaliser votre mot
de passe.
Vous voyez qu'il ne sera pas indispensable d'apprendre tout par coeur, mais la
touche guide F4 et la touche d'aide F1 ne doivent surtout pas vous dispenser de
rechercher par vous-même dans la documentation IBM.
Car c'est toujours là que l'on retrouve l'information la plus exacte, la plus précise,
la mieux expliquée, même si c'est en anglais.
Un certain nombre de touches fonctions ont été standardisées par IBM. Cette
standardisation fait partie de la norme appelée SAA : Systems Applications
Architecture, en français : AUA = Architecture Unifiée d'Applications.
Vous risquez de rencontrer de plus en plus cette norme, puisque IBM l'applique
progressivement à toute sa gamme de machines et de logiciels, et comme IBM
n'est pas le plus petit des constructeurs informatiques... On retrouve cette norme
SAA :
Récapitulons les touches magiques SAA que nous avons déjà rencontrées :
La touche F12 vous permet de revenir à l'écran précédent, ce n'est pas exactement
la même chose que la touche F3, contrairement aux apparences.
Par exemple :
CHGPRF
verbe: CHG c'est-à-dire CHanGe
entité: PRF c'est-à-dire PRoFile = profil en français
DSPSYSVAL
verbe: DSP c'est-à-dire DiSPlay = afficher en français
entité: SYSVAL c'est-à-dire SYStem VALue = valeur
système en français
Ce qu'il ne faut jamais faire : couper le courant du terminal n'importe quand. Vous
devez impérativement revenir à l'écran d'ouverture, souvenez-vous, celui où l'on
tape le nom de profil et le mot de passe. Seulement à ce moment, vous pouvez
couper le courant du terminal.
Si par mégarde, vous coupiez le courant sans revenir sur l'écran d'ouverture, ce ne
serait pas une catastrophe pour autant. Votre terminal serait désactivé, et il
faudrait une manipulation de l'opérateur système pour le réactiver. De plus vous
risqueriez de perdre totalement les données en cours ou le programme en cours de
réalisation, ce qui peut être tout de même gênant.
tapée telle quelle sans paramètre, dans la ligne de commande. Vous pouvez aussi,
comme pour la plupart des commandes CL, déclencher une commande SIGNOFF
par une option d'un menu. C'est donc l'option 90 du menu principal qu'il faut
choisir.
Faites maintenant l'essai : arrêtez votre terminal par la commande SIGNOFF puis,
rouvrez une session, et arrêtez-la à nouveau par la deuxième méthode, c'est-à-dire
l'option 90 du menu principal.
Il va falloir vous faire une petite place dans l'espace disque de l'AS/400. Créez
donc vous-même votre propre bibliothèque. Ne lui choisissez pas n'importe quel
nom, mais renseignez-vous sur les normes en vigueur sur votre machine.
Supposons que votre profil utilisateur s'appelle XY et que vous désiriez appeler
votre bibliothèque ESSAIXY, vous taperez :
CRTLIB LIB(ESSAIXY)
Vous allez devoir maintenant indiquer à l'OS/400 que c'est cette bibliothèque
ESSAIXY que l'utilisateur XY utilisera prioritairement.
Prioritairement, cela signifie que dans la suite de votre travail sur le terminal, si
vous ne spécifiez pas de nom de bibliothèque particulier, vos programmes et vos
données iront automatiquement se placer dans la bibliothèque ESSAIXY. Pour
faire cette liaison entre le nom de profil et le nom de bibliothèque, tapez une fois
pour toutes la commande suivante :
CHGPRF CURLIB(ESSAIXY)
Ce qui signifie en clair et en français : "changer mon profil utilisateur pour que ma
bibliothèque courante (CURLIB = current library) devienne ESSAIXY".
Pour que cette commande soit réellement prise en compte, il vous faut encore
quitter la session (SIGNOFF), et la rouvrir.
Pour vérifier que la CURLIB est bien maintenant ESSAIXY, tapez la commande:
DSPLIBL
Vous allez devoir créer dans votre bibliothèque, qui est encore vide, un fichier
source. C'est dans ce fichier source que vous saisirez vos programmes GAP
(=RPG), ou COBOL à raison d'un programme par membre de fichier source.
CRTSRCPF FILE(QRPGSRC)
CRTSRCPF FILE(QCBLSRC)
Ce qui signifie : "créer un fichier source physique dont le nom sera QRPGSRC".
Vous pouvez en plus vérifier que le fichier source QRPGSRC ou QCBLSRC a
bien été créé en tapant la commande :
DSPLIB LIB(ESSAIXY)
Je suppose que vous avez compris le but de la commande DSPLIB, rien qu'en
regardant son nom. Elle signifie bien sûr : "DISPLAY LIBRARY", c'est-à-dire
"afficher le contenu de la bibliothèque ESSAIXY".
STRPDM
Essayez les 2 méthodes, et choisissez celle qui vous paraît la plus commode. Vous
pouvez saisir le source de votre programme PROG1.
Maintenant que votre programme est saisi, vous savez certainement qu'on ne peut
pas l'exécuter tel quel. Il faut d'abord le traduire dans le langage de base du
processeur : le langage machine. C'est la phase de compilation, qui a pour résultat
un programme dit "programme objet". Nous allons voir comment faire faire une
compilation.
Puis nous étudierons comment voir si la compilation s'est bien passée, et comment
voir les erreurs de compilation. Il y a erreur de compilation lorsque le compilateur
trouve un ordre mal rédigé, qu'il ne peut pas comprendre.
CRTRPGPGM
c'est-à-dire : "create RPG program". Mais dans votre cas, il est beaucoup plus
simple d'utiliser le système de menus, car les paramètres de l'ordre CRTRPGPGM
sont assez complexes et nombreux.
De plus l'utilitaire PDM nous offre une possibilité très simple de compiler. Il suffit
de taper l'option 14 en face du nom du programme à compiler. La compilation se
lancera en batch. Votre terminal va donc être libéré de suite.
WRKSBMJOB
qui signifie "WORK WITH SUBMITTED JOBS", c'est-à-dire "gérer les travaux
batch soumis".
DSPJOBLOG
Vous pouvez visualiser le résultat de la compilation, car c'est un état qui est stocké
pour l'instant sous forme d'un fichier d'impression dans une OUTQ. Revoir plus
haut ces notions si ce n'est pas tout à fait limpide. Pour visualiser la liste de vos
états en attente d'impression, tapez la commande CL:
WRKSPLF
qui signifie "WORK WITH SPOOLED FILES", c'est-à-dire "gérer les fichiers
spool". Si vous avez des erreurs de compilation, vous aurez non pas un mais deux
fichiers SPOOL, le deuxième s'appelant QPJOBLOG, et n'ayant en fait guère
d'intérêt.
Votre écran sera découpé en deux fenêtres superposées verticalement. C'est dans
SEU que cette possibilité est offerte, vous trouverez les explications dans l'aide de
SEU en pressant sur la touche F1. Essayez, cela vaut le détour.
Si votre programme, qui dans notre exemple s'appelle PROG1, est un programme
de type batch, exécutez-le sous forme d'un travail batch par l'ordre suivant :
S'il s'agit d'un programme interactif, vous ne pouvez le lancer qu'en interactif par
l'ordre :
CALL PROG1
- BASIC
- Langage C
- COBOL 85
- FORTRAN
- PASCAL
- PL/I
- RM/COBOL
et bien sûr :
- GAP
Le langage GAP est un langage créé par IBM il y a vingt ans environ. GAP
signifie Générateur Automatique de Programme, le nom anglais étant RPG, c'est-
à-dire "Report Program Generator", qui a une signification sensiblement différente
: Générateur de Programme d'Impression.
Rappelons qu'un compilateur n'est rien d'autre qu'un programme qui sert à
traduire des programmes écrits en langage évolué (de troisième génération) vers le
langage machine, qui est le seul langage que le processeur soit capable de
comprendre.
Après le GAP 1 est né le GAP 2 sur IBM34, puis le GAP 3 sur IBM 38, et enfin le
GAP 400 sur AS/400. C'est évidemment ce dernier que nous allons étudier.
Quelques autres constructeurs tels qu'UNISYS et BULL ont créé leur compilateur
GAP, mais sans grande diffusion.
Notez que 90 pour 100 des AS/400 sont programmés en GAP, et 10 pour 100
seulement en COBOL.
Quand on sait, de plus, que sur les 22 000 sites mini d'IBM installés en France
(36, 38, AS/400), 5 000 se sont déjà convertis à l'AS/400 (chiffres d'avril 1991), et
que les 17 000 autres vont vraisemblablement y passer bientôt, on voit que la
connaissance de l'AS/400 et du GAP sont des cordes indispensables à l'arc de tout
analyste-programmeur !
Il dispose d'un outil assez séduisant, qu'on ne retrouve pas dans les autres langages
: ce sont les indicateurs. Les indicateurs sont des variables binaires (zéro ou un)
que nous étudierons plus loin.
- les spécifications H;
- les spécifications F;
- les spécifications E;
- les spécifications L;
- les spécifications I;
- les spécifications C;
- les spécifications O.
Attention, sur l'AS/400, on entend par fichier aussi bien un fichier disque normal
qu'un fichier imprimante, ou un fichier écran.
En effet, lorsque l'on veut envoyer des données sur l'imprimante, ou à l'écran, on
écrit ces données dans ce qu'IBM appelle un "fichier imprimante" ou un "fichier
écran" .
Donc, si votre programme lit deux fichiers, et imprime un état, vous aurez
3 spécifications F à rédiger.
Nous reviendrons plus loin sur ce que vous devrez écrire dans ces spécifications
F.
Elles servent à définir des tableaux en mémoire, ce que nous verrons plus loin
dans un chapitre spécifique.
Elles servent à définir des sauts de page particuliers sur imprimante, que nous
n'utiliserons pas.
Comme vous l'avez vu dans l'exemple de programme GAP en annexe, écrire une
spécification GAP, c'est remplir des cases en respectant scrupuleusement les
colonnes indiquées. Programmer en GAP ressemble finalement beaucoup à
remplir une feuille de Sécurité sociale!
Nous allons entrer maintenant dans le vif du sujet, c'est-à-dire dans le détail des
ordres GAP. Vous trouverez dans la suite de ce livre le minimum pour que vous
puissiez programmer, mais vous aurez vite besoin d'aller plus loin, par exemple
pour trouver le petit paramètre qui vous fait défaut.
Ne soyez pas rebuté par l'anglais, le vocabulaire informatique est très limité, les
structures grammaticales anglaises aussi. Prenez le temps d'ouvrir le dictionnaire
anglais, votre avenir en dépend.
colonne 66 : mettre un A (comme Add) dans le cas d'un fichier disque sur
lequel vous voulez pouvoir ajouter des enregistrements.
Attention : on oublie souvent de mettre ce A quand il est
nécessaire.
C'est donc dans ces spécifications que nous écrirons l'algorithme de notre
programme. On y trouvera donc des ordres de calcul, des ordres de structures
alternatives et répétitives, des ordres d'écriture sur les fichiers, etc.
Ces différents ordres (que l'on appelle aussi codes opération) sont au nombre de
82. Nous n'en étudierons qu'une dizaine. Voyons d'abord l'ensemble des règles
communes à tous les codes opérations.
colonnes 60 à 74: c'est une deuxième possibilité pour écrire des commentaires
libres qui clarifieront la relecture du programme en cas
(plus que probable) de maintenance ultérieure.
Mais tout cela est encore bien abstrait. Passons maintenant aux principaux ordres
que vous aurez à coder dans les spécifications C.
C'est l'ordre qui permet de faire une simple addition de deux nombres.
Prenons par exemple deux zones en mémoire appelées HT et TVA que l'on veut
additionner pour obtenir le total dans la zone appelée TTC.
Ce qui donne :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Signalons au passage que les noms de zone ne doivent pas dépasser 6 caractères
en GAP.
On peut aussi additionner une constante, par exemple, pour ajouter 100 francs de
port à un montant appelé MONT :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Z-ADD 5 X
Vous aurez certainement l'occasion de les utiliser. S'il est inutile que vous les
étudiez à fond maintenant, sachez les retrouver plus tard par vous-même, puisque
leur description se trouve dans le livre RPG/400 REFERENCE. Ce sera un
excellent exercice d'auto-apprentissage, d'anglais, et de GAP !
Copie le contenu d'une zone mémoire dans une autre zone mémoire.
Par exemple, pour mettre le montant TTC calculé ci-dessus dans la zone
APAYER, il suffit d'écrire l'ordre suivant :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Ou encore :
L'ordre MOVE convient parfaitement pour copier des données numériques, mais
beaucoup moins bien pour des données alphanumériques (de type caractères).
Remplacer dans ce cas simplement le code opération MOVE par le code opération
MOVEL qui signifie MOVE LEFT (à gauche). Par exemple, pour copier NOM1
dans NOM2 :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Ou encore :
Pour convertir des zones numériques en zones caractères, faire attention au signe
qui occupe le dernier demi-octet le plus à droite des zones numériques, et faussera
le dernier chiffre de la zone résultat.
Voici d'autres exemples dans lesquels les zones déclarées en caractère sont entre
quotes, celles déclarées en numérique ne le sont pas. Rappelons que les quotes
sont des apostrophes simples, alors que l'on trouve souvent en micro-informatique
des apostrophes doubles :
En GAP, les zones mémoire que vous êtes amené à utiliser dans un programme
sont déclarées (c'est-à-dire réservées) automatiquement. Lorsque le compilateur
GAP rencontre un nouveau nom de zone qu'il n'a pas encore rencontré depuis le
début du programme, il lui réserve automatiquement un emplacement en mémoire
qui portera le nom de cette zone. Dans d'autres langages tels que le COBOL, la
déclaration est à faire explicitement. En dBASE, la déclaration est, comme en
GAP, implicite.
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Il est bien entendu que ce système de déclaration automatique des zones mémoire
ne concerne absolument pas les rubriques des enregistrements dans les fichiers.
Elles sont, elles aussi, déclarées automatiquement dans les programmes, mais par
le simple moyen des spécifications F que nous avons déjà vues.
Toute spécification F engendre donc automatiquement la réservation en mémoire
d'autant d'emplacements que de rubriques dans le fichier.
On ne retrouve pas cette particularité dans les autres langages, elle est à la fois très
puissante car elle évite des MOVE et très dangereuse si on l'oublie.
Dès lors, vous pouvez demander la lecture d'un enregistrement par le simple code
opération READ. Il n'y a pas besoin de rédiger d'ordre d'ouverture du fichier
comme dans beaucoup de langages. L'ordre READ lit sur disque le prochain
enregistrement (ou le premier enregistrement s'il s'agit de la première lecture).
Notons au passage que vous disposez en GAP de l'ordre :
READP
qui signifie "read prior record", c'est-à-dire : lire l'enregistrement précédent. C'est
donc l'équivalent de l'ordre READ, mais en "marche arrière".
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
READ ARTICLE 91
Le code opération READ se trouve bien sûr dans la colonne Code Opération. Le
nom du fichier doit se trouver dans la colonne Zone facteur 2. Et on trouve en
colonnes 58 et 59 un indicateur résultat.
Rappelons que les indicateurs sont des variables binaires qui sont l'une des
originalités du GAP. Ces indicateurs sont identifiés par leur numéros de 01 à 99.
Cependant, nous verrons prochainement qu'avec certains codes opération ils
devront être identifiés d'une manière sensiblement différente.
*IN03
Dans le cas de l'ordre READ, GAP mettra le chiffre binaire '1' dans l'indicateur
dont vous aurez spécifié le numéro en colonnes 58 et 59, uniquement si l'on est
arrivé en fin de fichier, et donc s'il n'est plus possible de lire d'enregistrement
suivant.
C'est grâce à cet indicateur que vous allez pouvoir ensuite tester pour savoir si oui
ou non vous êtes arrivé à la fin de votre fichier.
Maintenant que nous savons lire un fichier, nous pouvons aborder la structure
répétitive, au sein de laquelle nous pourrons placer, à titre d'exemple, un ordre
READ.
ordre 1
ordre 2
ordre 3
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
A DOWEQ B
ordre 1
ordre 2
ordre 3
END
Bien sûr, il faudra remplacer "ordre1", "ordre 2" et "ordre 3" par les ordres GAP
souhaités. L'ordre de structure TANT QUE se traduit par DOW, ce qui signifie
"Do While" (= faire tant que). La condition d'égalité se traduit par les 2 lettres qui
suivent DOW.
Ces 2 lettres peuvent être :
On mettra dans les zones facteurs 1 et 2 les deux noms des zones à comparer. Ces
deux facteurs doivent être de même type : tous deux numériques ou alors tous
deux alphanumériques.
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
A DOWEQ 2
B DOWNE 'ABCD'
C DOWGT '123'
D DOWLE 123
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Z-ADD 0 NOMBRE 60
READ ARTICLE 91
*IN91 DOWEQ '0'
NOMBRE ADD 1 NOMBRE
READ ARTICLE 91
END
La deuxième instruction est un READ qui sert à faire une première lecture du
fichier ARTICLE avant d'entrer dans la boucle répétitive. Ainsi, si le fichier est
vide, ce qui peut toujours arriver, on n'entrera même pas dans la répétitive.
J'ose croire que vous connaissez les principes de la programmation structurée que
j'utilise ici. Cette méthode, aujourd'hui indispensable, est devenue un véritable
label de qualité des logiciels.
Remarquez que l'indicateur 91 sera positionné à '1' en fin de fichier (c'est-à-dire ici
si le fichier est vide, puisque c'est la première lecture), et à '0' dans le cas
contraire.
La troisième instruction est le DOW . La condition de répétition est ici : "tant que
l'indicateur 91 est à 0". Notez que l'indicateur doit être identifié par son nom
complet, c'est-à-dire *IN91, et qu'il est comparé au chiffre binaire '0', qui doit être
entouré par des simples quotes. Il en va ainsi des chiffres binaires '0' et '1'.
En fin de répétitive, nous avons un nouvel ordre READ, le même que le premier,
avec son indicateur 91, qui permet de passer à l'enregistrement suivant et qui
déclenchera la sortie de la boucle dès qu'on arrivera en fin de fichier.
Voici un petit exercice. Vous trouverez son corrigé, comme tous les corrigés des
exercices de ce livre, en annexe 5.
1 000
1 003
1 006
1 009
etc.
Ce programme n'a bien sûr pas plus d'utilité que celui que nous venons de voir,
hormis son intérêt pédagogique.
Si A = B
ordre 1
ordre 2
ordre 3
Sinon
ordre 4
ordre 5
ordre 6
Fin du si
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
A IFEQ B
ordre 1
ordre 2
ordre 3
ELSE
ordre 4
ordre 5
ordre 6
END
Le "Si" est donc traduit par IF suivi, comme dans le DOW, par EQ, NE, GT, GE,
LT ou LE.
Les facteurs 1 et 2 contiennent les zones à comparer (comme dans le DOW).
Le mot END traduit le "Fin du Si". C'est le même ordre que celui qui marque la
fin d'un "Tant que".
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
A IFEQ B
ordre 1
ordre 2
ordre 3
END
Ecrire, toujours sur papier, le morceau de programme qui ajoute 100 F de port à
MONT1 si MONT1 est inférieur ou égal à 10 000 F , et qui fait une réduction de 5
pour 100 dans le cas inverse.
EXERCICE 3
Les règles de l'exercice précédent évoluent.
La règle des frais de port reste inchangée, mais la réduction de 5 pour 100 ne
s'applique désormais qu'aux montants strictement supérieurs à 50 000 F.
On dispose en GAP d'une autre façon de programmer les alternatives, qui paraît
beaucoup plus simple.
Attention : cela ne concerne que les alternatives dont la condition est composée
d'un ou plusieurs indicateurs. Cette technique ne sera donc pas utilisable pour des
conditions faisant intervenir des zones de mémoire ou des zones de fichier de type
caractère ou numérique.
La technique des alternatives par indicateurs consiste à écrire, en tête des lignes
que l'on veut conditionner, le ou les numéros des indicateurs dans les colonnes
"Indicateurs de condition", c'est-à-dire dans les colonnes 10 et 11, 13 et 14, 16 et
17. De plus on pourra inverser les conditions en placant la lettre "N" dans une des
colonnes 9, 12 ou 15.
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
02 ordre 1
12 26 ordre 2
16 05 01 ordre 3
N06 ordre 4
09 N28 ordre 5
L'ordre 3 ne sera exécuté que si les indicateurs 16, 05, et 01 sont à '1'.
L'ordre 5 ne sera exécuté que si l'indicateur 09 est à '1' et que l'indicateur 28 est à
'0'.
On voit que l'écriture de ces alternatives est plus légère qu'en utilisant l'ordre IF.
Pour mettre une valeur '0' ou '1' dans un indicateur, vous ne pouvez pas utiliser
l'ordre MOVE vu plus haut, car il ne fonctionne que pour les données numériques
décimales ou les données de type caractère, mais pas pour les indicateurs.
Vous devez utiliser les ordres SETON et SETOF, dont vous trouverez des
exemples ci-dessous :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone Indic Indic Indic
cond cond cond résultat resul résul résul
SETON 05
SETOF 09
SETON 12 01 25
Le dernier SETON met en un seul ordre des '1' binaires dans les indicateurs 12, 01
et 25.
Vous êtes embauché dans une société d'intérim pour remplacer un programmeur
surmené tombé malade.
Exercice 5
En structuré optimisé :
ordre 1
ordre 2
Tant que condition
ordre 3
ordre 4
Fin du tant que
ordre 5
ordre 6
En structuré pur:
exécuter sous-programme 1
Tant que condition
exécuter sous-programme 2
Fin du tant que
exécuter sous-programme 3
Début du sous-programme 1
ordre 1
ordre 2
Fin du sous-programme
Début du sous-programme 2
ordre 3
ordre 4
Fin du sous-programme
Début du sous-programme 3
ordre 5
ordre 6
Fin du sous-programme
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
EXSR PAVE1
A DOWEQ B
EXSR PAVE2
END
EXSR PAVE3
PAVE1 BEGSR
ordre 1
ordre 2
ENDSR
PAVE2 BEGSR
ordre 3
ordre 4
ENDSR
PAVE3 BEGSR
ordre 5
ordre 6
ENDSR
Les sous-programmes 1,2 et 3 ont été ici appelés PAVE1, PAVE2 et PAVE3.
Cela offre donc la possibilité d'exécuter n'importe quelle série d'ordres CL à partir
d'un programme GAP.
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
CALL 'SPROB'
PARM ADATE
PARM ANOM
Il peut arriver, comme dans l'exemple ci-dessus, que l'on doive transmettre des
paramètres au sous-programme. C'est le rôle des ordres PARM écrits juste après
l'ordre CALL.
RETRN
Nous avons déjà vu l'ordre de lecture READ , mais de nombreux ordres d'entrée-
sortie restent à étudier.
Il faut ensuite mettre les données dans les rubriques adéquates du fichier en
effectuant par exemple des MOVE. Attention, ces MOVE ne modifient en rien le
fichier sur disque, ils n'opèrent de changements qu'en mémoire.
Alors seulement vous pouvez écrire un ordre WRITE pour créer effectivement un
nouvel enregistrement sur disque. Les rubriques de cet enregistrement seront
égales à ce que vous aurez préalablement placé dans les rubriques équivalentes en
mémoire.
- CODE
- LIBE
- PRIX
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Total : XXXXXXX
Dans le programme GAP, pour imprimer par exemple le format d'en-tête, il nous
suffira de faire comme pour écrire un enregistrement de fichier disque; c'est-à-
dire:
Voici les trois ordres WRITE. Bien sûr, il ne faudra pas les programmer à la file
tels quels, mais les insérer au bon endroit avant, dans, et après le "do while", et il
faudra aussi insérer des ordres de remplissage des rubriques à imprimer :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
WRITE ENTET
WRITE LIGNE
WRITE TOTAL
Je ne vous donne pas ici le programme d'impression complet, car ce sera l'objet de
l'exercice suivant !
Nous avons vu pour l'instant la lecture séquentielle d'un fichier avec l'ordre
READ. Mais il existe une autre façon d'accéder à un fichier, c'est l'accès direct,
beaucoup plus puissant.
Mais si vous voulez accéder à un article d'une encyclopédie, il n'est pas vraiment
rapide de lire l'encyclopédie séquentiellement depuis la page 1 jusqu'à l'article qui
vous intéresse !
C'est la raison pour laquelle les encyclopédies ont un index (attention, ce mot est
important) qui vous adresse (celui-là aussi) directement à la page de l'article
voulu.
L'index est donc une table de correspondance entre toutes les clés classées par
ordre alphabétique (ou numérique) et les adresses des enregistrements qui leur
correspondent. Ainsi, connaissant l'adresse de l'enregistrement, on va le lire
directement, sans devoir lire tous ceux qui précèdent. Voilà pourquoi c'est plus
rapide.
La grosse majorité des fichiers sur une machine telle que l'AS/400 sont
d'organisation indexée. Cela prend plus de place (à cause de l'index) mais c'est
tellement plus rapide.
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
On place donc la clé en zone facteur 1, le code opération CHAIN pour faire une
lecture directe, le nom du fichier en zone facteur 2, et enfin un numéro
d'indicateur en zone indicateur résultat 1, c'est-à-dire en colonnes 54 et 55.
Cet indicateur sera positionné à '1' si l'enregistrement n'existe pas, ce qui peut fort
bien arriver, il sera à '0' si l'enregistrement existe. On pourra donc programmer
ensuite une alternative en se servant de cet indicateur dans la condition de
l'alternative.
L'ordre DELET ne fonctionne que pour les fichiers ayant un U (comme "update" =
mise à jour) en colonne 15 de la spécification F.
Si la zone facteur 1 est vide, c'est l'enregistrement en cours qui est supprimé.
Exemple :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Exemple :
READ PERS 91
N91 ADD 1000 SALAIR
N91 UPDAT PERSF1
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
SETON LR
Voici maintenant un petit exercice de synthèse qui met en pratique ce que nous
venons de voir.
On suppose que les SDD du fichier imprimante existent déjà et qu'elles définissent
3 formats d'impression.
Nous arrivons au terme de l'apprentissage des ordres GAP de base. Mais nous
espérons vous avoir mis en appétit pour aller plus loin avec le GAP.
Il est important de préciser que le principe de déclaration externe des fichiers est
le même pour les types de fichiers :
Pour créer un fichier d'impression, il vous faudra passer par les 3 étapes suivantes:
- saisir ces SDD à l'aide de l'éditeur de source SEU (que vous avez déjà utilisé
pour saisir du langage source GAP);
- l'ensemble des lignes qui composent le bas de facture avec tous les totaux, la
TVA, le montant TTC, etc.
- DEBUT
- LIGNE
- FIN
Rédiger des SDD consiste à décrire à l'ordinateur d'abord la liste des formats
d'impression. Puis, pour chacun des formats, on décrira la liste des champs qu'il
contient avec l'emplacement de chaque champ sur l'état (numéro de ligne et de
colonne).
Récapitulons.
Lorsque l'on définit un fichier d'impression on écrira : une SDD pour les
spécifications générales concernant le fichier d'impression dans sa globalité. Cette
ligne sera facultative s'il n'y a pas de spécification particulière à indiquer.
Toutefois, nous verrons par la suite que ce que nous venons d'appeler une SDD
peut parfois être constitué d'une ligne principale, et d'une ou de plusieurs lignes
suite, s'il n'y a pas assez de place sur la ligne principale.
A/O/* Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
7 8 11 14 17 19 29 30 35 36 38 39 42 45
R ENTETE
1 20 'Liste des primes'
MATR 5 2 12
85 NOM 25 2 +1
2 70 DATE EDTCDE(Y)
4 1 'Date Montant'
R LIGNE
DATEP 8 1 EDTCDE(Y)
N01
O 02 04 06 MONT 9 12
HSUP 1 25 HIGHLIGHT
R TOTAL
2 'TOTAL :'
MONTT 10 11
Dans cet exemple, il n'y a pas de SDD au niveau fichier, cette SDD n'est
nécessaire que dans certains cas.
Les SDD doivent être écrites en majuscules, sauf les libellés constants entre
quotes, qui peuvent contenir des minuscules, pour améliorer la présentation des
états.
Les lignes de SDD du niveau format d'impression portent la lettre "R" en colonne
17. Il y en a 3 dans cet exemple.
Passons maintenant en revue les différentes colonnes à remplir dans une SDD
d'impression.
Mais il faudra tout de même, dans votre programme, positionner à '0' ou à '1' le ou
les indicateurs de condition concernés. Voir dans l'exemple ci-dessus : la variable
NOM qui est conditionnée par l'indicateur 85.
Dans le cas de lignes définissant des champs, vous ne spécifierez un nom que pour
les champs variables. Laissez la colonne nom à blanc pour les champs constants.
Ces deux colonnes ne concernent que les SDD au niveau champ, qu'il soit
constant ou variable.
Le numéro de colonne doit être compris entre 1 et 132, si vous utilisez du listing
large (380 mm), et entre 1 et 80 pour du papier au format classique A4 (210mm x
297mm).
Les colonnes 45 à 80 peuvent être utilisées pour les SDD niveau fichier, niveau
format et niveau champ.
Cette zone fonctions peut contenir plusieurs fonctions si nécessaire. Dans ce cas,
les fonctions devront être séparées par au moins un blanc. Chaque fonction peut
avoir des paramètres qui devront être entre parenthèses.
Si une fonction nécessite plusieurs paramètres, ceux-ci devront être séparés par au
moins un blanc.
Si les colonnes 45 à 80 ne suffisent pas pour coder toutes les fonctions d'un
champ, vous pouvez utiliser des lignes-suite. Terminez la ligne de fonctions que
vous êtes en train d'écrire par un caractère "+". Continuez simplement sur la ligne
suivante la suite de vos fonctions entre les colonnes 45 et 80.
Voyons le détail des principales fonctions de SDD disponibles pour les fichiers
d'impression.
Elle permet d'imprimer des données sous forme de leur code à barre. Elle n'est
disponible que sur les imprimantes de type IPDS.
CHRSIZ(3 4)
Exemple :
CPI(10)
Cette fonction n'est disponible que sur les imprimantes matricielles de type IBM
5224 ou IBM 5225.
JJMMAA
JJ/MM/AA
ajoutez une autre fonction (que nous verrons plus loin) , c'est la fonction
EDTCDE(Y), vous taperez donc en colonne 45 de vos SDD:
Cette fonction est très utilisée. Elle permet d'afficher un champ en spécifiant un
certain format d'impression (on dit aussi "masque d'impression", ou "code
d'édition")
Elle nécessite un paramètre qui est un caractère à choisir dans la liste suivante :
chiffres de 5 à 9: codes d'édition particuliers que vous pouvez vous définir vous-
même.
Utilisez pour cela la commande CL : CRTEDTD.
Voici donc encore une autre technique qui complète celle décrite ci-dessus (avec
les codes 5 à 9).
Pour imprimer en gras les champs désirés. Cette fonction se code au niveau format
ou au niveau champ. Elle ne fonctionne qu'avec des imprimantes de type IPDS ou
SCS.
A/O/* Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
R ENTETE
2 70 'Page numéro :'
2 85 PAGNBR
A/O/* Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
PRIX SKIPA(2)
Comme SKIPA, mais le saut a lieu avant l'impression, et non après, car le "B" de
SKIPB signifie "skip before", c'est-à-dire "saute avant".
A/O/* Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
R ENTETE SKIPB(5)
Avant d'imprimer le format ENTETE et son contenu qui n'est pas détaillé ci-
dessus, l'imprimante sautera à la ligne numéro 5.
Exemple :
A/O/* Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
Il y aura donc un saut de deux lignes entre les champs CHAMP1 et CHAMP2.
A/O/* Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
R ENTETE
CHAMP1 3 1
CHAMP2 5 1 SPACEB(2)
Exemple :
A/O/* Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
R ENTETE
3 60 'Heure d'impression: '
3 75 TIME
Exemple :
R ENTETE
3 60 'Heure d'impression : '
3 75 TIME UNDERLINE
La saisie des SDD se fait à l'aide de l'éditeur de source SEU, le même qui sert à la
saisie des programmes GAP ou COBOL. La seule différence par rapport à la
saisie d'un programme est que vous allez saisir votre source SDD dans un fichier
source spécifique nommé QDDSSRC.
Rappelons que vous utilisiez jusqu'ici le fichier source QRPGSRC pour y saisir du
GAP, ou QCBLSRC pour y saisir du COBOL. Vous allez créer ce fichier
QDDSSRC qui n'existe vraisemblablement pas encore dans votre bibliothèque.
CRTSRCPF FILE(QDDSSRC)
Puis appelez l'utilitaire SEU pour saisir vos SDD dans ce fichier. Cela va donner
lieu à un premier membre source dans QDDSSRC.
STRSEU
STRPDM
Il ne vous reste plus qu'à compiler les SDD que vous venez de saisir. Le résultat
de la compilation sera :
- un compte rendu de compilation sur papier, qui sera stocké dans un fichier
SPOOL
- le fichier d'impression que vous vouliez créer, s'il n'y a pas eu d'erreur
d'impression.
Sachez que l'option 14 de PDM déclenche une commande de compilation qui est
la commande :
CRTPRTF
Si votre fichier d'impression est bien créé, vous pouvez passer ensuite à la
compilation. Puis, exécutez votre programme d'impression GAP (ou COBOL) en
utilisant l'un des deux ordres CALL ou SBMJOB que nous avons déjà rencontrés.
Bonne chance !
Sur AS/400 comme sur tout ordinateur un fichier de données est un ensemble
d'enregistrements.
Tous les enregistrements d'un même fichier ont la même structure. Toutefois, sur
AS/400, un fichier peut avoir plusieurs types d'enregistrements.
Par exemple, si notre fichier du personnel contient à la fois les employés
permanents de l'entreprise et les personnels temporaires, pour lesquels on stockera
beaucoup moins d'informations, on aura certainement intérêt à utiliser deux types
d'enregistrements.
B = numérique binaire.
Chaque octet contiendra 8 chiffres binaires.
F = flottant.
C'est la notation mathématique, avec les puissances de 10.
Par exemple : 1,649356 x 1034
A = alphanumérique.
Peut contenir n'importe quel caractère.
Chaque octet contient 1 caractère.
En effet, sur AS/400, un fichier physique de données contient les trois parties
suivantes :
- les données proprement dites du fichier, qui sont appelées "data" en anglais.
C'est l'ensemble des enregistrements.
Ou bien le fichier est indexé, ce sera le cas général, et le chemin d'accès permettra
d'accéder au fichier dans l'ordre des clés d'index, et non plus dans l'odre de
création des enregistrements.
Et en plus de cet accès séquentiel, on aura la possibilité de faire des lectures par
accès direct.
En effet le chemin d'accès du fichier est organisé en table d'index, comme un
index d'une encyclopédie, afin de pouvoir accéder directement à un enregistrement
sans lire tous ceux qui précèdent.
Un fichier indexé aura ou bien une clé simple ou bien une clé composée. Une clé
composée est constituée de plusieurs rubriques, alors qu'une clé simple n'est
composée que d'une seule rubrique.
Le schéma de la page suivante illustre bien les trois parties qui composent un
fichier physique de données. Vous y verrez aussi le principe de la table d'index qui
constitue le chemin d'accès.
Un fichier physique se définit par des SDD, tout comme un fichier d'impression.
Ces deux premières phases sont semblables à celles qui sont nécessaires à la
création d'un fichier d'impression.
Revoir le chapitre sur les SDD d'impression si ce n'est plus tout à fait clair.
Vous vous demandez peut-être comment vous remplirez les imprimés de SDD,
nous allons le voir très prochainement.
Cette troisième phase est elle aussi semblable aux fichiers d'impression.
Attention
Supposons que vous vouliez modifier le format d'enregistrement d'un fichier déjà
existant contenant des données, pour rallonger un libellé, par exemple.
Ce qui est écrit ci-dessus reste malheureusement vrai.
C'est-à-dire que la partie donnée de votre fichier sera vide après compilation!
En clair, vous aurez perdu toutes vos données.
Si vous tenez à votre emploi, évitez cet exploit !
Pour compiler les SDD, vous procéderez comme pour les fichiers d'impression, en
tapant le numéro d'option 14 en face du nom du membre source contenant les
SDD. La compilation sera ainsi lancée en batch.
CRTPF
- niveau du fichier;
Mais ces trois fonctions n'étaient là qu'à titre d'exemple, simplement pour vous
mettre en appétit.
Voici la liste complète de toutes les fonctions disponibles dans les SDD de
fichiers physiques.
Nous en détaillerons quelques-unes plus loin.
ABSVAL
ALIAS
ALTSEQ
CHECK
CMP
COLHDG
COMP
DESCEND
DFT
DIGIT
EDTCDE
EDTWRD
FIFO
FLTPCN
FORMAT
LIFO
NOALTSEQ
RANGE
REF
REFFLD
REFSHIFT
SIGNED
TEXT
UNIQUE
UNSIGNED
VALUES
ZONE
Comme indiqué ci-dessus, cette fonction déclare des en-têtes de haut de page
systématiques sur les états ou écrans générés par les utilitaires IBM, mais pas les
états et écrans générés par vos propres programmes.
COLHDG('Référence' 'article')
Alors que la spécification suivante imprime l'en-tête sur une seule ligne :
COLHDG('Référence article')
COMP(opérateur valeur)
Par exemple, pour demander à ce que la zone concernée soit inférieure à 15000 :
COMP(LT 15000)
COMP(EQ 'FRANCE')
EQ equal
NE not equal
LT less than
NL not less than
GT greater than
NG not greater than
LE less than or equal
GE greater than or equal
Cette fonction n'est utilisable que dans les lignes de spécifications de clé portant
un K en colonne 17.
Elle demande que le chemin d'accès soit constitué dans l'ordre décroissant de la
clé.
Vous avez ci-dessous un exemple de clé composée.
Le fichier sera classé par ordre de code service croissant, puis à l'intérieur de
chaque service, le classement sera par salaire décroissant.
Si vous ne spécifiez rien pour ce nom de rubrique dans votre fichier d'impression
(ou en interactif dans votre fichier écran), c'est la fonction définie au niveau du
fichier de données qui sera prise en compte.
Dans le cas où vous ne demandez pas de clé unique (pas de fonction UNIQUE en
ligne K), vous risquez d'avoir des enregistrements en double ou en triple pour une
même clé.
La question se pose alors de savoir dans quel ordre vous souhaitez les lire.
Deux possibilités :
- l'ordre de classement FIFO, c'est-à-dire First In First Out (premier entré, premier
sorti). Les enregistrements seront donc lus dans l'ordre de leur création.
- l'ordre de classement LIFO, c'est-à-dire Last In First Out (dernier entré, premier
sorti). Les enregistrements seront lus dans l'ordre inverse de leur création.
Comme nous l'avons vu dans l'exemple, cette fonction permet de définir une
fourchette de valeurs admissibles.
Le contrôle se fera uniquement au moment de la saisie de la rubrique concernée.
Si le champ est alphanumérique, ne pas oublier de mettre les valeurs entre simples
quotes.
Tout comme les fonctions RANGE et COMP, cette fonction vous permet de
décharger de certains contrôles votre programme de saisie.
La fonction VALUES va vérifier que la valeur saisie est bien dans la liste fournie.
Exemple sur les valeurs possibles du code "situation maritale" :
Un fichier logique n'a pas 3 parties comme un fichier physique mais 2 seulement.
La partie manquante est la partie "données". Un fichier logique n'a pas de données
en propre. Il "puise" ses données, non pas en lui-même comme un fichier
physique, mais dans un autre fichier physique, auquel il est lié.
Quel est l'intérêt d'avoir ainsi deux fichiers basés sur les mêmes données ?
Un fichier logique aura son propre chemin d'accès, c'est-à-dire son propre ordre de
classement des enregistrements, qui sera en général différent de l'ordre de
classement du fichier physique.
Encore plus fort, le chemin d'accès pourra ne prendre en compte que certains
enregistrements. Un fichier logique pourra donc être une sélection de certains
enregistrements d'un fichier physique, et cela éventuellement dans un autre ordre
de classement.
Un exemple.
Le fichier des articles d'une entreprise contient deux catégories d'articles : les
articles gérés en stock, et les autres gérés par commande. Le commercial a besoin
du fichier de tous les articles du fichier classés par ordre de référence article. Il
utilisera donc le fichier physique avec un classement par référence.
Le magasinier a besoin d'une simple liste des articles gérés en stock, classée par
ordre alphabétique de désignation. Il utilisera un fichier logique qui "s'appuie"
(c'est le terme dans le jargon AS/400) sur le fichier physique général des articles.
Ce fichier logique aura un chemin d'accès qui ne sélectionne que les articles en
stock, et qui les classe par désignation.
Un fichier logique se crée de la même façon qu'un fichier physique : avec des
SDD, qui, une fois compilées, donneront lieu à un nouvel objet : le fichier
logique.
Les phases de création d'un fichier logique sont donc les suivantes :
La phase de saisie des données est bien sûr inutile puisque les données existent
déjà dans le fichier physique.
La compilation des SDD se fait toujours avec l'option 14 dans PDM, et génère
automatiquement une commande CL de création de fichier logique, c'est la
commande:
CRTLF
Nous allons voir que de nouvelles fonctions vont être disponibles dans les SDD
des fichiers logiques.
Voyons par exemple les SDD d'un fichier logique associé au fichier physique du
personnel :
Autre petite différence, la longueur des rubriques PEMAT et PESER n'est pas
spécifiée. C'est tout simplement parce que l'on reprend la même longueur que dans
le fichier physique pour ces deux zones.
En revanche, le programmeur a décidé de raccourcir la rubrique PENOM dont la
longueur était de 9 dans le fichier physique.
On pourra trouver des cas où plusieurs lignes S seront nécessaires, par exemple, si
l'on veut sélectionner les matricules compris entre 100 et 300, on écrira :
Mais nous allons reprendre la liste de toutes les fonctions possibles utilisables
dans les fichiers logiques.
Puis, comme nous l'avons fait pour les fichiers physiques, nous reprendrons en
détail les fonctions les plus usitées.
ABSVAL
ALIAS
ALL
ALTSEQ
CHECK
CMP
COLHDG
COMP
CONCAT
DESCEND
DIGIT
DYNSLT
EDTCDE
EDTWRD
FIFO
FLTPCN
FORMAT
JDFTVAL
JDUPSEQ
JFILE
JFLD
JOIN
JREF
LIFO
NOALTSEQ
PFILE
RANGE
REFACCPTH
REFSHIFT
RENAME
SIGNED
SST
TEXT
TRNTBL
UNIQUE
UNSIGNED
VALUES
ZONE
Les fonctions en italique sont nouvelles par rapport aux fichiers physiques.
Avec cette fonction, le fichier logique n'aura pas son chemin d'accès propre,
comme nous l'avons expliqué plus haut, mais il partagera le chemin d'accès du
fichier spécifié en paramètre.
Cela peut permettre dans certains cas particuliers d'économiser de la place (un
chemin d'accès en moins à stocker sur disque), et aussi du temps (un chemin
d'accès en moins à mettre à jour).
Exemple :
Par exemple, pour trouver dans le numéro d'INSEE du fichier physique, le numéro
de département de naissance, il faudra extraire les deuxième et troisième
caractères.
Ce qui donne :
Dans cet exemple, on a en plus indexé le fichier logique sur l'année en décroissant.
Nous n'irons pas très loin dans l'étude des fichiers logiques multiformat car ils ne
sont pas couramment utilisés, et ne sont pas très compatibles avec une analyse
fonctionnelle correcte et rigoureuse.
Pour chaque commande, nous avons des informations générales au niveau de l'en-
tête de la commande :
- le numéro de commande;
- le numéro de client.
Puis, nous avons les lignes de commande, avec dans chaque ligne :
On pourra donc faire deux fichiers physiques ayant des formats d'enregistrement
différents :
CO1 CL1
CO2 CL2
CO3 CL1
CO1 A1 80
CO1 A2 150
CO1 A5 100
CO2 A2 50
CO2 A5 160
CO3 A1 80
CO3 A6 200
CO1 CL1
CO1 A1 80
CO1 A2 150
CO1 A5 100
CO2 CL2
CO2 A2 50
CO2 A5 160
CO3 CL1
CO3 A1 80
CO3 A6 200
CO1 A1 80 CL1
CO1 A2 150 CL1
CO1 A5 100 CL1
CO2 A2 50 CL2
CO2 A5 160 CL2
CO3 A1 80 CL1
CO3 A6 200 CL1
Les deux premiers paramètres JFILE et JOIN citent les fichier dont il faut faire la
jointure, et le paramètre JFLD indique les noms des champs qui doivent être en
correspondance pour que des enregistrements soient joints.
Ici, c'est le numéro de commande qui est commun aux deux fichiers.
Mais, pour l'instant, nous allons nous contenter d'apprendre à créer un fichier
écran. Un programme interactif utilise presque toujours un et un seul fichier écran.
Mais chaque fichier écran a, en général, plusieurs formats d'écran, chaque format
correspondant à une image écran. On retrouve donc sensiblement le même
principe que dans les fichiers d'impression, qui sont, rappelons-le, eux aussi
multiformat.
Chaque fichier écran doit être préalablement défini à l'aide de SDD qui devront
être comme d'habitude :
Cependant, nous verrons plus tard l'utilitaire IBM nommé SDA qui vous
permettra de générer automatiquement les SDD de vos fichiers écran. Cela vous
économisera les deux premières phases de rédaction et de saisie des SDD.
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
R ECRAN1
1 25 'INTERROGATION DU +
PERSONNEL'
10 5 'Tapez le matricule :'
E1MAT 4 B 10 30
R ECRAN2
1 25 'INTERRO DU PERSONNEL'
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
E2MAT 4 O 8 20
E2NOM 20 O 10 20
E2SAL 10 Y 2 O 12 20
Ce fichier écran contient les deux formats d'écran nommés ECRAN1 et ECRAN2.
Pour programmer l'affichage d'un champ constant, il suffit, outre la constante elle-
même, d'indiquer les numéros de ligne et de colonnes où commence ce champ.
Le numéro de colonne doit être compris entre 1 et 80 et le numéro de ligne entre 1
et 24.
Après les champs constants, nous allons maintenant rencontrer des champs
variables. On distingue plusieurs usages pour ces champs, le code de l'usage est à
indiquer en colonne 38 des SDD.
Dans le cas d'un champ caché, qui sera envoyé au terminal, mais restera invisible
sur l'écran, l'usage sera "H" comme "hidden" = "caché".
Champ E1MAT
Nous avons choisi de faire commencer le nom des champs par le nom du format
d'écran, c'est-à-dire que "E1" et "E2" cas se retrouvent dans les noms "E1MAT",
"E2MAT", "E2NOM", "E2SAL". Ce n'est pas obligatoire mais c'est très utile vous
y retrouver plus facilement dans vos programmes.
E1MAT est une donnée de type alphanumérique. On aurait pu mettre un "A" dans
la colonne type de données, mais comme alphanumérique est la valeur par défaut,
il n'est pas nécessaire d'écrire ce "A".
Dans l'écran ECRAN2, on trouve, hormis les constantes, trois champs en sortie,
dont l'usage est "O".
Pour le champ E2SAL, qui a la particularité d'être numérique, on mettra la lettre Y
dans la colonne "type de donnée", ce qui signifie : numérique.
C'est pour la même raison qu'on ne pourra rien afficher dans le caractère 1 de la
ligne 1, puisque tout champ doit être précédé de son attribut.
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
CA01( 01 )
R ECRAN1 CA03( 03 )
1 25 'INTERRO DU PERSONNEL'
10 5 'Tapez le matricule :'
E1MAT 4 B 10 30
R ECRAN2 CF07( 07 )
CF24( 24 )
1 25 'INTERRO DU PERSONNEL'
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
E2MAT 4 O 8 20
E2NOM 20 O 10 20
E2SAL 10 Y 2 O 12 20
Ici, nous avons simplement ajouté la possibilité d'utiliser des touches de fonction.
Rappelons que tout terminal d'AS/400 dispose des touches de fonction suivantes :
Nous avons décidé d'associer la touche fonction F3 à l'indicateur 03, ce qui n'est
pas obligatoire mais cela paraît logique !
Ainsi, lorsque l'utilisateur appuiera sur la touche F3, l'indicateur 03 du programme
sera automatiquement positionné à 1. Il restera bien sûr à zéro dans tous les autres
cas.
Vous pourrez ainsi détecter aisément la touche sur laquelle l'utilisateur a appuyé.
Dans l'écran ECRAN2, l'utilisateur aura le droit d'utiliser les touches de fonction
F7 et F24.
La fonction utilisée n'est plus CA comme dans l'écran ECRAN1, mais CF. La
différence est minime : dans la fonction CF les données en entrée (saisies) sont
transmises à l'unité centrale, alors qu'elles ne le sont pas dans le cas de la fonction
CA.
De toute façon, il est rare de prendre en compte les données en entrée lorsqu'on
utilise une touche de fonction. On préférera donc en général le mot clé CA.
Remarquez que la touche de fonction F1 a été autorisée pour tout le fichier, c'est-
à-dire pour tous les formats du fichier. En effet, elle a été codée avant le premier
format d'écran.
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
CA01( 01 )
R ECRAN1 CA03( 03 )
1 25 'INTERRO DU PERSONNEL'
10 5 'Tapez le matricule :'
E1MAT 4 B 10 30 DSPATR(HI UL)
R ECRAN2 CF07( 07 )
CF24( 24 )
1 25 'INTERRO DU PERSONNEL'
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
E2MAT 4 O 8 20
E2NOM 20 O 10 20 COLOR(BLU)
E2SAL 10 Y 2 O 12 20 DSPATR(BL)
Champ E1MAT
Champ E2SAL
Ce champ sera affiché en clignotant. On voit donc que, pour spécifier des attributs
particuliers d'affichage, on utilise la fonction DSPATR avec un ou plusieurs codes
d'affichage.
UL = underline = souligné
HI = high intensity = double brillance
BL = blinking = clignotant
CS = cursor separator = séparation des caractères
par une barre verticale fine
ND = non display = non affichable, pour les
mots de passe par exemple
PC = position cursor = le curseur sera positionné
sur le champ spécifié
RI = reverse image = inversion vidéo
MDT = modified data tag = forcer à '1' l'indicateur
interne MDT du champ.
Cet indicateur est géré par
le système. Il est
habituellement à '1'
si l'utilisateur a modifié le
champ concerné et à '0'
sinon.
Sur écran couleurs, on peut choisir la couleur des champs. La fonction à utiliser
n'est pas DSPATR mais COLOR. Par exemple le champ E2NOM s'affichera en
couleur bleue.
BLU bleu
GRN vert
WHT blanc
RED rouge
TRQ turquoise
YLW jaune
PNK rose
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
CA01( 01 )
R ECRAN1 CA03( 03 )
1 25 'MISE A JOUR DU PERSONNEL'
10 5 'Tapez le matricule :'
E1MAT 4 B 10 30 COMP( GE '1000' )
CHECK(MF)
R ECRAN2 CF07( 07 )
CF24( 24 )
1 25 'MISE A JOUR DU PERSONNEL'
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
14 10 'Sexe:'
E2MAT 4 O 8 20
E2NOM 20 B 10 20 CHECK( ME LC )
E2SAL 10 Y 2 B 12 20 RANGE( 5200.25 45678 )
E2SEX 1 B 14 20 VALUES( 'F' 'M' )
Champ E1MAT
On vérifie tout d'abord à l'aide de la fonction COMP que le matricule saisi dans ce
champ est supérieur ou égal à '1000'. Le comparateur GE a été utilisé, mais les
autres comparateurs habituels restent bien sûr utilisables, ce sont : EQ, NE, GT,
GE, LT, LE, NL, NG
On vérifie ensuite par la fonction CHECK que la zone est remplie complètement,
c'est-à-dire que l'utilisateur a bien rempli les 4 caractères.
C'est le rôle du paramètre MF, qui signifie "mandatory fill", c'est-à-dire
"remplissage obligatoire" ou encore "tout ou rien".
Champ E2SAL
Champ E2SEX
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
CA01( 01 )
R ECRAN1 CA03( 03 )
1 25 'MISE A JOUR DU PERSONNEL'
10 2 'Tapez le matricule :'
E1MAT 4 B 10 30 COMP( GE '1000' )
CHECK(MF)
R ECRAN2 CF07( 07 )
CF24( 24 )
1 25 'MISE A JOUR DU PERSONNEL'
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
14 10 'Sexe:'
E2MAT 4 O 8 20
E2NOM 20 B 10 20 CHECK( ME LC )
E2SAL 10 Y 2 B 12 20 RANGE( 5200.25 45678 )
E2SEX 1 B 14 20 VALUES( 'F' 'M' )
R ECRAN3
E3MO1 6 Y 2 O 5 13 EDTCDE(K)
E3MO2 6 Y 2 O 6 13 EDTWRD(' , ')
E3MO3 6 Y 2 O 7 13 EDTWRD(' , &-&Francs')
Nous avons ajouté un écran ECRAN3 pour les besoins de la cause, avec deux
fonctions EDTCDE et EDTWRD. Ces deux fonctions ne doivent pas être tout à
fait nouvelles pour vous puisque nous les avons déjà rencontrées dans les fichiers
d'impression.
Champ E3MO1
Le code d'édition K fait partie des codes standards d'édition (ou encore de
formatage) de zone. Les codes d'édition standard, ou "edit codes" sont à choisir
parmi les suivants :
Champ E3MO2
Ici, on utilise non plus un code d'édition, mais un mot d'édition. Les mots d'édition
ou "edit words" sont à utiliser si l'on n'arrive pas trouver un code d'édition qui
convienne.
Alors, vous pouvez personnaliser vos "edit words" qui correspondront exactement
à vos besoins.
Par exemple, E3MO2 sera affiché avec une virgule et sans signe.
Champ E3MO3
Ce champ qui utilise un autre "edit word" s'affichera avec le signe, s'il est négatif,
et suivi du mot "Francs".
Les signes "&" servent à ménager un blanc à l'endroit désiré.
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
CA01( 01 )
R ECRAN1 CA03( 03 )
1 25 'MISE A JOUR DU PERSONNEL'
10 5 'Tapez le matricule :'
E1MAT 4 B 10 30 COMP( GE '1000' )
CHECK(MF)
R ECRAN2 CF07( 07 )
CF24( 24 )
69 ALARM
1 25 'MISE A JOUR DU PERSONNEL'
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
14 10 'Sexe:'
E2MAT 4 O 8 20
E2NOM 20 B 10 20 CHECK( ME LC )
E2SAL 10 Y 2 B 12 20 RANGE( 5200.25 45678 )
E2SEX 1 B 14 20 VALUES( 'F' 'M' )
64 R ECRAN3 CA03(03)
E3MO1 6 Y 2 O 5 13 EDTCDE(K)
68 E3MO2 6 Y 2 O 6 13 EDTWRD(' , ')
E3MO3 6 Y 2 O 7 13 EDTWRD(' , &-&Francs')
Le format d'écran ECRAN2 produira un BIP sonore à chaque fois qu'il s'affichera,
à condition que l'indicateur 69 ait été positionné à '1' par le programme.
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
CA01( 01 )
R ECRAN1 CA03( 03 )
1 25 'MISE A JOUR DU PERSONNEL'
10 5 'Tapez le matricule :'
E1MAT 4 B 10 30 COMP( GE '1000' )
CHECK(MF)
E1MSG 60 O 24 5
R ECRAN2 CF07( 07 )
CF24( 24 )
69 ALARM
1 25 'MISE A JOUR DU PERSONNEL'
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
14 10 'Sexe:'
E2MAT 4 O 8 20
E2NOM 20 B 10 20 CHECK( ME LC )
E2SAL 10 Y 2 B 12 20 RANGE( 5200.25 45678 )
E2SEX 1 B 14 20 VALUES( 'F' 'M' )
62 24 18 'Salaire inadapté au travail fourni !'
64 R ECRAN3 CA03(03)
E3MO1 6 Y 2 O 5 13 EDTCDE(K)
68 E3MO2 6 Y 2 O 6 13 EDTWRD(' , ')
E3MO3 6 Y 2 O 7 13 EDTWRD(' , &-&Francs')
65 ERRMSG('Montant trop grand')
66 ERRMSGID(MES1234 FICHMESS)
Vous voulez des messages d'erreur du genre "Article absent", "Stock insuffisant"
ou encore "Espèce d'ornithorynque ! ". Une fois votre choix effectué en ce qui
concerne le nom d'animal attribué à l'utilisateur, vous pouvez utiliser une méthode
que je qualifierai de "traditionnelle". Elle consiste à déclarer dans votre écran un
champ en sortie, et d'y mettre par programme le message désiré, ou bien des
espaces quand le message ne doit pas être affiché.
Dans le cas où l'utilisateur n'a pas fait d'erreur, le champ message E1MSG sera à
remettre à blanc par votre programme.
De plus, le message peut venir en superposition d'une ligne d'écran non vide.
Cette ligne sera automatiquement restaurée dès la disparition du message.
Vous pouvez vous créer vous-même vos propres fichiers de messages, qui sont en
fait de simples listes de messages. Vous aurez ainsi très facilement la possibilité
de vous constituer plusieurs versions de votre fichier message en différentes
langues : français, allemand, anglais.
CRTMSGF
Puis vous ajouterez des messages dans votre fichier à l'aide de l'ordre CL :
ADDMSGD
ou encore :
WRKMSGD
Ind 1 Ind 2 Ind 3 Type Nom Réfé Long Type Posit. Usage Ligne Col. Fonctions
SDD donn. décim
CA01( 01 )
R ECRAN1 CA03( 03 )
PRINT
1 25 'MISE A JOUR DU PERSONNEL'
10 5 'Tapez le matricule :'
E1MAT 4 B 10 30 COMP( GE '1000' )
CHECK(MF)
R ECRAN2 CF07( 07 )
CF24( 24 )
CSRLOC(X Y)
1 25 'MISE A JOUR DU PERSONNEL'
3 30 'Le : '
3 36 DATE EDTCDE(Y)
8 10 'Matricule:'
10 10 'Nom:'
12 10 'Salaire:'
14 10 'Sexe:'
E2MAT 4 O 8 20
E2NOM 20 B 10 20 CHECK( ME LC )
E2SAL 10 Y 2 B 12 20 RANGE( 5200.25 45678 )
E2SEX 1 B 14 20 VALUES( 'F' 'M' )
C'est la fonction CSRLOC définie au niveau du format d'écran (et non au niveau
champ) qui est à utiliser.
Cette fonction indique que l'écran ECRAN1 pourra être imprimé tel quel si
l'utilisateur appuie sur la touche PRINT du clavier. L'impression donnera lieu à un
fichier d'impression classique qui sera appelé QSYSPRT et qui se rangera en file
d'attente de spool.
HELP
ROLLUP
ROLLDOWN
HOME
CLEAR
Considérons un programme qui affiche une première image écran sur laquelle on
demande à l'utilisateur de taper un code article. C'est l'image écran E1.
Puis, le programme reçoit le code article saisi par l'utilisateur, consulte le fichier
article, et enfin affiche à l'utilisateur une image écran E2 lui fournissant toutes les
caractéristiques de l'article demandé.
L'ordre WRITE bien sûr. Donc pour afficher un format d'écran sur un terminal, il
suffira d'écrire un ordre WRITE de ce format. Exemple :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
WRITE E1
Mais ce n'est pas tout, car l'ordre WRITE ne fait qu'afficher l'écran E1, puis le
programme continue à s'exécuter sans laisser la moindre fraction de seconde à
notre pauvre utilisateur pour saisir son code article. C'est normal, car l'ordre
WRITE n'est qu'un ordre d'écriture.
Il faut le faire suivre d'un ordre de lecture des données saisies par l'utilisateur.
Comme pour les fichiers de données, c'est un ordre READ qu'il faudra écrire dans
votre programme, juste après l'ordre WRITE. Alors le programme s'arrêtera sur
l'exécution de l'ordre READ. Il attendra tout le temps qu'il faut jusqu'à ce que
l'utilisateur appuie sur la touche ENTREE ou sur l'une des touches suivantes si
toutefois elles sont autorisées :
- F1 à F24
- AIDE
- HOME
- CLEAR
- PRINT
- ROLLUP
- ROLLDOWN
WRITE E1
READ E1
Mais IBM, voulant éviter des efforts aux programmeurs, propose l'ordre EXFMT,
qui effectue en un seul ordre un WRITE suivi d'un READ.
Les deux lignes de programmation ci-dessus sont équivalentes à la ligne ci-
dessous :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
EXFMT E1
Cet ordre EXFMT permet donc l'opération classique d'envoi d'une image-écran
sur un terminal, et d'attente de la réponse de l'utilisateur.
Pour expliquer à quoi servent les sous-fichiers, partons d'un cas concret.
Un exemple de dialogue
Supposons que l'on vous demande d'afficher sur écran la liste des salariés d'un
service donné.
Il est indexé sur le code service, et sur le matricule. Voici ce que pourrait être le
contenu de ce fichier :
01 001 Nicolas
01 002 Poinsignon
02 001 Arnould
02 002 Muller
02 003 Stock
02 004 Couturier
. . .
. . .
. . .
. . .
36 001 Friedrich
36 002 Gonzales
36 003 Valette
. . .
. . .
36 010 Jean
36 011 Demange
. . .
. . .
36 019 Durieux
36 020 Lemaire
36 021 Potier
36 022 Henry
37 001 Lepicard
37 002 Mangin
Si tous les services de l'entreprise n'avaient pas plus de 10 salariés, il n'y aurait
aucun problème. Nous aurions affaire à un programme d'interrogation classique.
Mais il faut aussi donner à l'utilisateur la possibilité de revenir en arrière sur les
pages-écran précédentes. Il utilisera pour cela la touche ROLLDOWN de
pagination arrière.
Voila pour ce qui est du dialogue-écran dont doit disposer votre futur bienheureux
utilisateur.
Si vous êtes sur toute machine autre que l'AS/400, donc une machine qui ne vous
permet pas d'utiliser la technique des sous-fichiers, vous devrez procéder de la
façon suivante.
D'abord, il faut déclarer dans votre écran 2, les rubriques matricule et nom pour
chacune des dix lignes d'écran.
Elles porteront par exemple les noms :
ECMAT1 ECNOM1
ECMAT2 ECNOM2
ECMAT3 ECNOM3
ECMAT4 ECNOM4
ECMAT5 ECNOM5
ECMAT6 ECNOM6
ECMAT7 ECNOM7
ECMAT8 ECNOM8
ECMAT9 ECNOM9
ECMAT10 ECNOM10
C'est une première limite du système classique; signalons toutefois qu'elle peut
être partiellement contournée par la technique des tableaux.
Vous devez réaliser que tout cela n'est pas très simple à programmer.
Et c'est pourtant le lot quotidien des pauvres analystes-programmeurs qui ne
disposent pas de la technique des sous-fichiers dans leur système d'exploitation !
Puis lorsque le programme veut afficher l'écran 2 avec les salariés 001 à 010, il ne
va pas remplir les 20 zones-écran comme nous l'avons vu précédemment.
Non, il va écrire les 10 lignes d'affichage dans le sous-fichier à raison d'une ligne
d'affichage par enregistrement.
Tout comme on ajoute de nouveaux enregistrements dans un fichier.
Votre programme va ensuite effectuer un EXFMT normal de l'écran 2.
Une fois cela réalisé, le programme va effectuer bien sûr un EXFMT de l'écran 2.
Et, automatiquement, les 10 enregistrements suivants du sous-fichier vont être
affichés.
Sachez que votre programme n'aura pas du tout à gérer la touche ROLLDOWN, je
répète car vous n'en croyez certainement pas vos jeunes oreilles d'informaticien,
vous n'aurez rien à programmer pour le cas où l'utilisateur appuie sur
ROLLDOWN !
Comme d'habitude, nous allons devoir décrire notre fichier-écran à l'aide de SDD,
afin de pouvoir le créer par compilation ensuite. Et, comme d'habitude aussi, les
SDD pourront ou bien être saisies avec SEU, ou bien être générées
automatiquement par SDA. A vous de choisir la méthode qui vous convient le
mieux. Mais, pour faire un choix, il faut essayer.
Pour l'écran 2, qui fait donc appel à un sous-fichier, nous devrons définir non pas
un, mais deux formats d'écran. En premier lieu, il faudra définir ce que l'on
appelle le format d'enregistrement de l'écran 2.
C'est le format qui décrit une des lignes d'affichage du sous-fichier. Vous avez
bien lu, on ne décrit qu'une seule ligne, et non pas chacune des 10 lignes, c'est tout
de même plus rapide !
On nommera ce format : ECRAN2E . Le choix du nom n'est bien sûr pas imposé
par l'OS/400, mais, pour des raisons de clarté, il est préférable qu'il se termine par
un E, comme Enregistrement.
R ECRAN2E SFL
E2MAT 3 O 6 10
E2NOM 20 O 6 15
R ECRAN2C SFLCTL(ECRAN2E)
SFLPAG(10)
SFLSIZ(11)
61 SFLCLR
N61 SFLDSP
N61 SFLDSPCTL
ROLLUP(31)
WRANG 4 0 H SFLRCDNBR(CURSOR)
1 35 'LISTE DES SALARIES'
4 10 'Matr'
4 15 'Nom'
Commentons. Pour l'écran 1, rien à signaler comme prévu. Pour l'écran 2, nous
avons bien les deux formats ECRAN2E et ECRAN2C.
Le seul paramètre particulier est la fonction SFL, qui indique qu'il s'agit d'un sous-
fichier : SFL est l'abréviation de Sub-FiLe.
Une petite remarque en passant : vous avez certainement déjà eu des messages
d'erreur en bas d'écran avec un signe "+" à droite. C'est tout simplement que cette
ligne de message est en fait un sous-fichier un peu particulier qui n'a qu'une ligne
en hauteur, qui a donc été défini avec la fonction SFLPAG(1).
Pour essayer de faire fonctionner ce petit sous-fichier, placez votre curseur en bas
de l'écran sur un message d'erreur qui présente un signe "+" à sa droite, et vous
pourrez paginer sur ce message avec les touches ROLLUP et ROLLDOWN.
Vous en aurez besoin lorsque après avoir interrogé le service 36, l'utilisateur
voudra interroger le service 20 par exemple.
Si vous ne videz pas le sous-fichier, tous les salariés du service 36 resteront dans
le sous-fichier et les salariés du service 20 viendront se mettre à la suite.
Et, en paginant sur le service 20, l'utilisateur va retrouver des salariés du service
36. Quelle pagaille !
Récapitulons.
Vous aurez besoin à certains endroits de votre programme d'effacer votre sous-
fichier, avant de le remplir à nouveau avec d'autres données.
Pour l'effacer, il faudra écrire un ordre WRITE de l'écran 2 dans le programme
GAP, en ayant soin d'avoir préalablement positionné à ON l'indicateur associé à la
fonction SFLCLR.
Ne pas oublier de le remettre à OFF ensuite.
SFLDSP est la fonction qui demande l'affichage des lignes du sous-fichier (format
d'enregistrement).
SFLDSPCTL est la fonction qui demande l'affichage du format de contrôle.
C'est la raison pour laquelle, dans l'exemple, on a préféré n'utiliser qu'un seul
indicateur, le numéro 61 qui sert d'indicateur d'effacement du sous-fichier.
S'il est à '1', le sous-fichier est effacé et il n'y a pas d'affichage, et s'il est à '0', le
sous-fichier n'est pas effacé et il y a affichage.
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
SETON 61
WRITE ECRAN2C
SETOF 61
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
EXFMT ECRAN2C
Cette fonction est une déclaration qui autorise l'utilisation de la touche ROLLUP,
et qui l'associe à l'indicateur 31. La fonction ROLLUP est tout à fait comparable
aux fonctions CAnn et CFnn des touches de fonction.
Vous voyez apparaître dans le format de contrôle la rubrique WRANG qui n'y
était pas prévue initialement. A quoi sert-elle ?
Les trois dernières lignes de SDD servent à afficher le titre de l'écran, ainsi que les
deux en-têtes de colonnes.
Nous venons de voir les mots clés indispensables pour manipuler un sous-fichier.
Il y en a d'autres, d'usage moins fréquent. Vous trouverez tout de même parfois les
fonctions suivantes :
Comme tout fichier écran qui se respecte, un fichier écran qui contient un sous-
fichier doit être déclaré dans une spécification F.
colonne 6 : F
colonne 47 : WRANG
colonne 53 : K
colonne 54 : SFILE
Voici comment peut être écrite la séquence de programme GAP qui prépare
l'affichage de la première page-écran d'un service interrogé :
Z-ADD 0 WRANG
SETON 61
WRITE ECRAN2C
SETOF 61
Z-ADD 0 WLIG
E1SER DOWEQ PESER
WLIG ANDLT 10
*IN91 ANDEQ '0'
ADD 1 WRANG
ADD 1 WLIG
MOVEL PEMAT E2MAT
MOVEL PENOM E2NOM
WRITE ECRAN2E
READ PERS 91
END
END
- le code service du fichier PERS est le même que celui demandé sur l'écran 1;
- et le nombre de lignes WLIG écrites ne dépasse pas 10;
- et on n'arrive pas en fin du fichier PERS.
La variable mémoire WLIG, elle, ne varie que de 0 à 10, car elle sert à compter le
nombre d'enregistrements ajoutés dans le sous-fichier à chaque ROLLUP, c'est-à-
dire 10 au maximum.
Ne pas confondre avec WRANG, qui est le nombre d'enregistrements total du
sous-fichier.
Il faut donc :
- continuer la lecture du fichier PERS à l'endroit où elle était arrêtée, et ajouter les
10 enregistrements suivants (011 à 020) dans le sous-fichier;
Il ne restera, dans les lignes de programme écrites ci-dessus, que les dernières,
soit:
Z-ADD 0 WLIG
E1SER DOWEQ PESER
WLIG ANDLT 10
*IN91 ANDEQ '0'
ADD 1 WRANG
ADD 1 WLIG
MOVEL PEMAT E2MAT
MOVEL PENOM E2NOM
WRITE ECRAN2E
READ PERS 91
END
Notez bien qu'il faut remettre à zéro WLIG mais pas WRANG. On aura intérêt à
faire un sous-programme de cette séquence d'ordres GAP, qui sera appelé par un
ordre EXSR.
Heureusement, vous n'aurez pas besoin de relire tous les enregistrements du sous-
fichier, car on dispose en GAP de l'ordre READC (= read changed).
Eh bien, dans ce cas, la rubrique sera considérée comme ayant été modifiée, alors
qu'en fait elle conserve le même contenu. Le READC s'y arrêtera donc, mais ce
n'est pas grave car votre programme fera une mise à jour de l'enregistrement du
fichier PERS en y remettant le même nom : ce n'est qu'un "coup pour rien".
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
READC ECRAN2E 92
*IN92 DOWEQ '0'
E2MAT CHAIN PERS 82
N82 MOVEL E2NOM PENOM
N82 UPDAT PERS
READC ECRAN2E 92
END
Avant de passer à la suite, je voudrais vous parler d'un autre exemple de sous-
fichier en mise à jour, car c'est un exemple extrêmement courant.
Vous allez tout simplement ajouter une rubrique d'un caractère de large dans le
format d'enregistrement ECRAN2E.
Cette rubrique sera de type B (input + output). Nous l'appellerons par exemple
E2SEL, comme sélection.
Donc, s'il tape un "1" en face d'un salarié, votre programme sera tout à fait capable
de retrouver à l'aide d'un READC le (ou les) enregistrements de sous-fichier ainsi
cochés.
Il pourra ensuite afficher l'écran 3 avec les détails de paie du salarié coché.
Voyons une autre possibilité d'utiliser les sous-fichiers. Votre programme peut lui-
même modifier tel ou tel enregistrement du sous-fichier. Assurez-vous de ne pas
faire la confusion avec le cas précédent.
Tout à l'heure, le sous-fichier était mis à jour par l'utilisateur lui-même. Et votre
programme mettait à jour le fichier, pas le sous-fichier.
Exemple:
Reprenons celui que nous venons juste de voir, celui qui donne la possibilité de
cocher un salarié pour visualiser sa paie sur un écran 3.
Si, après avoir visualisé l'écran 3, vous réaffichez le sous-fichier, le chiffre "1"
saisi dans la rubrique E2SEL restera toujours à "1" puisque personne ne l'a remis à
blanc.
Vous pouvez lui simplifier le travail, en mettant dans votre programme des ordres
qui vont remettre à blanc la rubrique E2SEL de l'enregistrement concerné du sous-
fichier.
C'est simple, quand vous êtes positionné sur le bon enregistrement du sous-fichier
par un READC, il suffit d'écrire :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Vous devez en premier afficher ce format de bas d'écran par un ordre WRITE, et
immédiatement après vous programmerez un EXFMT du format de contrôle du
sous-fichier.
Cet EXFMT vous affichera comme d'habitude le format de contrôle (c'est-à-dire
l'en-tête d'écran), et le sous-fichier lui-même.
En règle générale, même en dehors des sous-fichiers, l'affichage d'un écran par un
WRITE ou un EXFMT efface totalement l'image-écran précédente, quelle qu'elle
soit.
Sauf si le format envoyé par le WRITE ou l'EXFMT contient la fonction
OVERLAY dans les SDD.
- le numéro de client;
- le numéro de facture;
- la date de la facture.
Elles seront à afficher en haut de l'écran dans le format de contrôle. Des lignes
vierges de facture devront s'afficher ensuite afin de permettre à l'utilisateur de
saisir des données comme :
- le code article;
- la quantité facturée.
Supposons que vous décidiez d'afficher 15 lignes de facture. Vous n'allez tout de
même pas limiter les factures à 15 articles ! Alors, vous allez bien sûr utiliser un
sous-fichier de saisie. C'est un sous-fichier normal dans lequel les zones code
article et quantité facturée seront en entrée-sortie (type B = both)
Pour le premier affichage de l'écran de saisie, vous aurez créé les 15 premiers
enregistrements dans le sous-fichier, avec les codes articles à blanc, et les
quantités à zéro.
Lorsque l'utilisateur tape sur ROLLUP, vous lui créerez gentiment 15 autres
enregistrements vides, qu'il remplira lui-même. Puis il peut retaper ROLLUP, et
ainsi de suite.
VENTE01
VENTE02
VENTE03
VENTE04
VENTE05
VENTE06
VENTE07
VENTE08
VENTE09
VENTE10
VENTE11
VENTE12
Si l'on veut calculer les ventes de chaque département français, on aura presque
une centaine de zones à gérer. Pour éviter la lourdeur de gestion d'autant de zones
mémoire, on dispose en GAP de deux techniques : celle des tableaux et celle des
tables.
Nous n'étudierons ici que les tableaux, puisque les tables présentent quelques
restrictions par rapport aux tableaux et ont de ce fait moins d'intérêt.
- la déclaration du tableau;
- le remplissage du tableau;
Vous devez rédiger une spécification E pour chaque tableau, après les
spécifications F et avant les spécifications C (respect de l'ordre HFELICO).
- colonne 6 : "E"
Janvier
Février
Mars
Avril
Mai
Juin
Juillet
Août
Septembre
Octobre
Novembre
Décembre
Pour programmer ce genre de tableaux, il suffit de saisir les données (les libellés
des mois) à la fin du programme source GAP, après la dernière ligne du
programme.
C'est pourquoi, il faut dans tous les cas ajouter dans la spécification E, en plus des
indications minimales décrites plus haut, en colonnes 33 à 35, le nombre
d'éléments de tableau par ligne de données placée en fin de programme.
Exemple :
Il s'agit d'un programme utilisant un tableau des libellés des mois, et un autre
tableau indiquant le nombre de jours de chaque mois. On y retrouve bien les
spécifications E, puis les spécifications C, et enfin les données du tableau
précédées par deux astérisques :
Le fichier disque doit être de type séquentiel, et ne doit pas être décrit à l'extérieur
du programme par des SDD.
- en colonne 15, "I" si le fichier est en entrée seule, et "C" s'il est en entrée-sortie;
- "F" en colonne 19, pour indiquer le fichier est décrit dans le programme;
- "E" en colonne 39, pour signaler que la description du fichier se trouve, non pas
dans les spécification I, mais dans une spécification E de tableau;
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
ou encore :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
- égal à 0;
- inférieur à 0;
- supérieur au nombre d'éléments du tableau.
- recherche d'un élément dans le tableau simplement pour savoir s'il existe (c'est le
cas du contrôle d'une donnée saisie);
Prenons cet exemple, on peut vérifier l'existence d'un code service dans le tableau
des services. Ce code service est une zone alphanumérique de 3 caractères saisie
préalablement sur écran.
On utilisera l'ordre LOKUP (qui vient de l'anglais "to look up"= rechercher) en
plaçant :
Exemple :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Explications :
On veut maintenant savoir le nom du service connaissant son code. Cela nécessite
l'utilisation de deux tableaux :
Ces deux tableaux seront déclarés (2 cartes E) et chargés l'un après l'autre. Ils
auront bien sûr le même nombre d'éléments et on veillera à ce que l'ordre des
codes service soit le même que l'ordre des noms des services.
Notons toutefois qu'il existe une possibilité (que nous n'utiliserons pas ici) pour
imbriquer les deux tableaux (voir la documentation IBM sur les alternating arrays,
livre "RPG/400 Reference").
Par exemple :
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Z-ADD 1 X 30
CODSER LOKUP TCOD,X 61
N61 EXSR ERREUR
61 MOVEL TNOM,X ZNOM
"Débugger" un programme, c'est trouver la panne d'un programme qui ne fait pas
ce que l'on voudrait. Toutefois, avant d'utiliser le système de "debuggage" de
l'AS/400, il est préférable de vérifier les 4 points suivants :
- Etes-vous sûr que les listings sur lesquels vous cherchez votre erreur
correspondent bien à la dernière version de votre programme et de vos
fichiers de données, d'écran ou d'impression ?
Une fois tout cela vérifié, il ne vous reste plus qu'à utiliser ce puissant outil qu'est
le mode DEBUG de l'AS/400. Il fonctionne aussi bien en GAP qu'en COBOL.
Vous pouvez l'utiliser de deux façons différentes :
Ensuite, pendant ces arrêts de votre programme, vous pourrez afficher à votre
guise le contenu de n'importe quelle variable mémoire afin de vérifier son
contenu.
Supposons que votre programme s'appelle PROG1, et que vous vouliez l'arrêter
chaque fois qu'il passe sur les instructions 200 et 500.
Vous taperez les commandes CL suivantes:
STRDBG PROG1
ADDBKP 200
ADDBKP 500
Ce qui signifie : ajouter des points d'arrêt aux instructions 200 et 500. Puis tapez:
CALL PROG1
DSPPGMVAR MONT
ou
DSPPGMVAR NOM
Ce qui aura pour effet de mettre le nombre 12345 dans la variable MONT, et la
chaîne de caractères 'Dupont' dans la variable NOM.
Si vous voulez retirer un point d'arrêt que vous auriez déclaré en trop, par exemple
celui de l'instruction 200, tapez :
RMVBKP 200
Quand vous avez trouvé votre erreur, et que vous ne voulez plus être en mode
DEBUG, tapez :
Vous devez comme pour les points d'arrêt, passer en mode DEBUG.
STRDBG PROG1
ADDTRC
CALL PROG1
DSPTRCDTA
pour visualiser ou imprimer la fameuse trace. Vous aurez ainsi sous les yeux, la
liste des numéros d'instructions par lesquelles est passé votre programme.
Les boucles seront alors aisément repérable, plus difficilement cependant si elles
sont longues.
RMVTRC
ENDDBG
Notez que le nombre de lignes de trace est réglable dans l'un des paramètres de
l'ordre ADDTRC. Accédez à ce paramètre par la touche guide F4.
En conclusion, essayez au moins une fois ce mode DEBUG, car il est absolument
génial !
Que se passe-t-il lorsque l'on appuie sur la touche d'appel système ? Une ligne de
saisie vierge s'affiche instantanément tout en bas de votre écran. Vous pouvez
alors taper simplement sur la touche entrée, ce qui vous affichera un menu avec au
total 9 options numérotées 1, 2, 3, 4, 5, 6, 7, 80, 90. Mais si vous êtes un habitué
de l'appel système, vous prendrez vite l'habitude de taper le numéro d'option
directement sur la ligne de saisie vierge en bas de l'écran, plutôt que de faire
"entrée" pour afficher le menu de l'appel système.
En choisissant cette option, vous allez mettre en attente la session dans laquelle
vous êtes, et ouvrir une nouvelle session. Concrètement, un nouvel écran
d'ouverture va s'afficher, vous demandant comme d'habitude votre nom de profil,
votre mot de passe, etc.
Vous ouvrez donc une deuxième session, tout à fait indépendante de la première
session. Cette première session reste en attente, jusqu'à ce que vous y reveniez.
1) vous quittez la deuxième session par l'option 90 de son menu principal ou bien
encore par la commande SIGNOFF ; la deuxième session est alors terminée, et
votre terminal réaffiche la première session au point exact où elle était arrêtée.
L'intérêt d'ouvrir 4 sessions en même temps reste à démontrer, mais ouvrir deux
sessions sous des profils utilisateur différents permet de résoudre bien des
problèmes, par exemple de droits d'accès.
Si vous lancez une commande en mode interactif, et que cette commande dure
trop longtemps, cela peut venir de votre programme qui boucle indéfiniment, ou
bien d'un temps de réponse très long mais normal. Essayez par exemple le temps
de réponse de la commande :
DSPLIB *ALL
Si vous êtes dans cette situation, et que vous ne voulez pas attendre la fin de votre
requête, ne coupez pas le courant de votre terminal, ce n'est vraiment pas la bonne
solution. Mais faites un appel système, puis choisissez l'option 2 pour arrêter la
demande en cours. Vous reviendrez alors à la situation précédant le lancement de
la commande qui vous a rendu impatient.
DSPJOB
Mais d'où viennent les messages ? Il peut arriver que l'OS/400 vous envoie un
message signalant tel ou tel problème. Il peut aussi arriver que d'autres utilisateurs
vous envoient des messages, ou même que des programmes vous envoient des
messages. Selon le cas, ce sera l'une ou l'autre des files d'attente qui sera utilisée.
Pour consulter vos 2 boîtes aux lettres, faites simplement un appel système avec
l'option 4. Cela équivaut à la commande :
DSPMSG MSGQ(*WRKUSR)
L'option 5 permet d'envoyer un message dans une file d'attente. Vous pourrez
taper le texte du message ainsi que le nom du destinataire. Cela correspond à la
commande CL:
SNDMSG
Tous les messages de gestion de l'imprimante système, ainsi que les messages
concernant le chargement des supports magnétiques de sauvegardes (disquettes,
cassettes, bandes), mais aussi les messages concernant le réseau des terminaux
arrivent en général dans la file d'attente de l'opérateur système. L'opérateur du
système, souvent appelé pupitreur, et qu'IBM a choisi de nommer très
Lorsque l'on a des problèmes sur une imprimante, ou que l'on fait des
sauvegardes, ou que des incidents proviennent sur le réseau, il est très commode
de faire un appel système avec l'option 6, pour voir et éventuellement répondre
aux messages que l'OS/400 aurait délicatement déposé dans la file d'attente de
l'opérateur système.
DSPMSG MSGQ(QSYSOPR)
DSPWSUSR
DSCJOB
SIGNOFF
Si vous souhaitez être instantanément informé du fait que des messages arrivent
dans votre file d'attente de messages, tout comme certaines personnes demandent
au facteur de sonner quand il met une lettre dans la boîte, modifiez le mode de
délivrance des messages de votre file d'attente.
Si votre nom de profil est GASTON, tapez :
Il peut être intéressant d'imprimer vos nom et prénom en bas de toutes les pages
sorties sur imprimante. Cela permet de "dispatcher" aisément les divers listings de
compilation et autres qui sortent en permanence de l'imprimante.
CHGPRF JOBD(BIB3/QDFTJOBD)
La deuxième commande CHGPRF est une commande que nous connaissons déjà.
Elle permet de modifier les caractéristiques d'un profil utilisateur. Ici, on modifie
la spécification de l'endroit où chercher la description de job par défaut. On
demande donc à utiliser la description de job QDFTJOBD stockée dans la
bibliothèque BIB3, et non plus dans la bibliothèque QGPL, comme
précédemment.
Nous avons vu dans le chapitre concernant les fichiers-écran, qu'il est possible de
faire exécuter par le système d'exploitation des contrôles sur les champs saisis par
l'utilisateur. Cela vous fera faire des économies substantielles de programmation.
Ainsi, nous avons vu les fonctions de contrôle automatique COMP, VALUES, et
RANGE.
Mais, hélas, le contrôle de validité d'un champ ne sera effectué que si l'utilisateur a
saisi ou modifié des caractères dans le champ.
Prenons par exemple, un champ baptisé MOIS dont les SDD spécifient le contrôle
de validité suivant :
RANGE (1 12)
Ce qui signifie : contrôler que le champ MOIS a une valeur comprise entre 1 et
12. Si l'utilisateur y tape le nombre 13, le contrôle sera effectué, et une erreur sera
déclenchée, avec affichage d'un message et blocage du clavier.
Là où il y a problème, c'est qu'en revanche, si l'utilisateur saute le champ MOIS en
le laissant blanc, et passe au champ suivant, alors il n'y aura pas de contrôle du
champ MOIS. La valeur blanche de ce champ passera au travers des mailles du
système. Ce qui est généralement très gênant.
DSPATR(MDT)
Elle force tout simplement le MDT à ON, que l'utilisateur ait ou non modifié le
champ. Ainsi les contrôles demandés dans les SDD seront effectués
systématiquement dans tous les cas.
Si, après ce laps de temps, l'enregistrement reste encore verrouillé par P1,
l'indicateur d'erreur des colonnes 56 et 57 de l'ordre CHAIN de P2 sera positionné
à '1'. Votre programme pourra alors intercepter et traiter la situation comme il
convient, c'est-à-dire ici en affichant un message demandant à l'utilisateur de
refaire une tentative d'interrogation quelque temps plus tard.
Attention à éviter les blocages inextricables que sont les "dead-locks" encore
baptisés "étreintes fatales". Le "dead-lock" se produit lorsqu'un utilisateur A veut
accéder à un enregistrement verrouillé par l'utilisateur B, alors que cet utilisateur
B cherche à accéder à un enregistrement verrouillé par l'utilisateur A.
Beau problème de logique que je soumets à votre sagacité !
A = 5.00
B = 2
C = -5
D = 4
E = 1,2
F = 0
G = 10
H = 5.72
I = 42
J = 7
K = 32
L = 36
R = 0
01 Touche fonction F1
02 Touche fonction F2
03 Touche fonction F3
. .
. .
24 Touche fonction F24
51 Ecran 1 actif
52 Ecran 2 actif
53 Ecran 3 actif
. .
. .
61 Indicateur divers
62 Indicateur divers
. .
. .
91 Fin de fichier
92 Fin de fichier
. .
. .
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Z-ADD 0 PRIME 72
N05 ADD 1000 PRIME
05 ADD 500 PRIME
06 10 ADD 400 PRIME
06 N07 11 ADD 2600 PRIME
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Z-ADD 0 PRIME 72
*IN05 IFEQ '0'
PRIME ADD 1000 PRIME
ELSE
PRIME ADD 500 PRIME
END
*IN06 IFEQ '1'
*IN10 IFEQ '1'
PRIME ADD 400 PRIME
END
END
*IN06 IFEQ '1'
*IN07 IFNE '1'
*IN11 IFEQ '1'
PRIME ADD 2600 PRIME
END
END
END
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
EXSR P10
*IN91 DOWEQ '0'
EXSR REP1
END
EXSR P90
REP1 BEGSR
EXSR P20
PSEX IFEQ 'F'
EXSR P30
ELSE
EXSR P40
END
EXSR P50
ENDSR
P10 BEGSR
Z-ADD 0 NBF 60
Z-ADD 0 TOTALH 92
READ PERS 91
ENDSR
P20 BEGSR
ENDSR
P30 BEGSR
NBF ADD 1 NBF
ENDSR
P40 BEGSR
TOTALH ADD PSAL TOTALH
ENDSR
P50 BEGSR
READ PERS 91
ENDSR
P90 BEGSR
ENDSR
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Z-ADD 0 NBF 60
Z-ADD 0 TOTALH 92
READ PERS 91
*IN91 DOWEQ '0'
PSEX IFEQ 'F'
NBF ADD 1 NBF
ELSE
TOTAL ADD PSAL TOTAL
END
READ PERS 91
END
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
Z-ADD 0 TOTAL 92
'B5' CHAIN SERV 81
*IN81 IFEQ '0'
MOVEL SNOM ENOS
WRIT ENTET
READ PERS 91
*IN91 DOWEQ '0'
PSER IFEQ 'B5'
MOVEL PMAT EMAT
MOVEL PNOM ENOM
MOVE PSAL ESAL
WRITE LIGNE
TOTAL ADD PSAL TOTAL
END
READ PERS 91
END
MOVE TOTAL ETOT
WRITE FIN
END
Indic Indic Indic Zone Facteur1 Code opération Zone facteur 2 Zone résultat Indic Indic Indic
cond cond cond resul résul résul
51 03 CAS ACTION1
51 CAS ACTION2
52 03 CAS ACTION3
END
END
ACTION1 BEGSR
EXSR RAZ
...
...
SETON LR
ENDSR
BEGSR
ACTION2 EXSR
... RAZ
...
SETON 52
ENDSR
BEGSR
EXSR
ACTION3 ...
... RAZ
SETON 51
ENDSR
BEGSR
SETOF 41
SETOF 42
RAZ SETOF 51
SETOF 52
ENDSR
- ACTION2 lorsque ECRAN1 est affiché et que l'utilisateur n'appuie pas sur la
touche F3, c'est-à-dire s'il appuie sur la touche ENTREE
- ACTION3 lorsque ECRAN2 est affiché et que l'utilisateur appuie sur la touche
F3
Dans chaque action, on commence par remettre tous les indicateurs à 0. Les lignes
contenant trois petits points sont à remplacer par les instructions nécessaires au
travail demandé.
03 touche fonction F3
41 indicateur d'erreur d'accès à un fichier par exemple
42 idem
51 écran ECRAN1 actif
52 écran ECRAN2 actif
LR fin de programme