COBOL, un langage de programmation. Module A206 : Programmation fichiers - COBOL. Chapitre 2. Avant-propos. COBOL, un langage de programmation
|
|
|
- Chantal Lafleur
- il y a 10 ans
- Total affichages :
Transcription
1 COBOL, un langage de programmation Avant-propos La structure de ce chapitre est la suivante : Module A206 (version V3) Programmation fichiers COBOL Chapitre 2 COBOL, un langage de programmation 1. Introduction Alain Vailly [email protected] Dans cette partie, nous présentons tout d'abord la structure générale d'un programme. La forme d'une instruction est ensuite évoquée. Puis le langage lui-même est replacé dans l'histoire. Les limites que nous avons volontairement imposées à cet exercice sont enfin définies. 1.1 Structure générale Il y a des "tas" de sortes de langages. Certains sont graphiques : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 1 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 2 / 95
2 NB : pour les curieux, les idéogrammes ci-dessus ont été extraits d'une enveloppe et indiquent un numéro de boîte aux lettres. Les sections sont constituées de paragraphes, ayant tous la même structure composée d'un nom de paragraphe et de phrases. D'autres sont très mathématiques d'aspect : 1 NB : cette formule mathématique est extraite d'une spécification d'un logiciel de facturation. Rédigée en langage Z (un langage défini dans les années 70 par un informaticien français, Jean Raymond ABRIAL), elle décrit une partie de ce qui se passe lors de la mise-à-jour d'un stock. D'autres sont plus élaborés et font appel à des écrans de saisie proposant différents choix au programmeur. COBOL, lui, est un langage que l'on peut qualifier de "littéraire", dans la mesure où il est structuré en divisions, sections, paragraphes, phrases, mots... et où le nombre de lignes de programme à rédiger est assez conséquent. Un programme COBOL comprend quatre divisions, de taille différente (il y en a deux grosses et deux petites) et jouant des rôles distincts : 1 la première (IDENTIFICATION) sert à identifier le programme ; la deuxième (ENVIRONMENT) précise l'environnement de ce programme, essentiellement (mais pas seulement) en matière de fichiers ; la troisième (DATA) décrit les données utilisées dans le programme ; la quatrième (PROCEDURE) et dernière correspond au code lui-même, à la procédure. 7A B ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. NB : un paragraphe s'arrête là où commence le paragraphe suivant OU là où commence une autre section OU là où commence une autre division OU à la fin du programme. Les phrases commencent par un mot-clé du langage. Elles se terminent par un point OU quand la phrase suivante commence. 1 7A B DISPLAY "BONJOUR" WRITE LIGNE. DISPLAY "AU REVOIR" La dernière phrase d'un paragraphe est obligatoirement terminée par un point. Dans l'exemple précédent, la phrase DISPLAY "AU REVOIR" n'est pas la "dernière phrase" d'un paragraphe (elle ne se termine pas par un point). 1.2 Forme générale 7A B IDENTIFICATION DIVISION. --ENVIRONMENT DIVISION. --DATA DIVISION. --PROCEDURE DIVISION. La forme générale d'un programme COBOL peut surprendre un observateur novice, surtout s'il oublie de repositionner ce langage dans le temps et s'il ne pense pas au fait qu'autrefois les programmes étaient stockés sur des cartes perforées. NB : ces divisions sont présentes DANS CET ORDRE dans TOUS les programmes. La plupart des divisions sont découpées en sections, celles-ci étant différentes d'une division à une autre. 1 7A B DATA DIVISION. FILE SECTION. --WORKING-STORAGE SECTION. --LINKAGE SECTION. NB : cette image est extraite du site Internet L'instruction qu'elle contient est la suivante : NB : l'ordre dans lequel les sections de cette division des données sont présentées n'a aucune importance. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 3 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 4 / 95
3 IF MOD-G-JAHR NOT NUMERIC MOVE ZERO TO MOD-G-JAHR Ces cartes (elles correspondaient à une ligne de programme) étaient découpées en quatre zones : numérotation continuation instruction identification Les programmes de l'époque correspondaient à des paquets (au vrai sens du terme) de 100, cartes, ce qui obligeait à des prouesses physiques pour transporter les programmes sans faire tomber les paquets et à employer des élastiques. NB : cette image est extraite du site Internet À propos de la colonne 7 Du fait de ces chutes potentielles et des zones réservées à la numérotation des cartes, la seule zone utile occupait ET OCCUPE TOUJOURS les colonnes 7 à 72, extrémités comprises, la colonne 7 jouant un rôle particulier. Si, par mégarde, un programmeur dépasse cette colonne 72 et continue à écrire au delà, le compilateur ignorera superbement ce qu'il y a. Attention donc aux mots ou aux chaînes de caractères tronqués. En principe (surtout pour réduire la taille des paquets), les programmeurs remplissaient au mieux chaque carte. Il s'agissait de faire un compromis entre le poids des programmes et leur intelligibilité. Rien n'empêchait en effet un programmeur de "s'étaler" et d'écrire une phrase sur plusieurs cartes, un mot par carte : DISPLAY "BONJOUR" WRITE LIGNE. DISPLAY "AU REVOIR" Trois instructions, six lignes. NB : cette image est extraite du site Internet Comme, malgré tout, les chutes arrivaient de temps en temps, chaque carte comportait, en colonne 73 à 80, le nom du programme auquel elle appartenait. Elle était également numérotée (une numérotation séquentielle discontinue) en colonnes 1 à 6. En cas de chute, il suffisait de ramasser les cartes, les remettre toutes à l'endroit et les passer dans une trieuse comme celle-ci : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 5 / 95 DISPLAY "BONJOUR" WRITE LIGNE. DISPLAY "AU REVOIR" Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 6 / 95
4 Trois instructions, quatre lignes. Les deux formes précédentes sont équivalentes en termes de résultat d'exécution. A priori donc, il ne pouvait pas y avoir de mot coupé en deux, dans la mesure où il suffisait de prendre une nouvelle carte et d'y écrire le mot en entier. Il pouvait toutefois arriver que, dans certains cas bien précis (celui de chaînes de caractères longues notamment), il soit nécessaire de pratiquer une césure. Pour indiquer au compilateur que la chaîne sur la première carte se continuait sur la carte suivante, sans espace, il fallait un signal spécial. Celui-ci (un tiret) devait obligatoirement être placé en colonne 7. L'élément trop grand était écrit sur la première carte jusqu'en colonne 72 INCLUSE et reprenait sur la carte suivante, en colonne 12 et suivantes, APRÈS UN ", symbole du début de chaîne de caractères DISPLAY "CECI EST UNE CHAINE COMPOSEE DE "BEAUCOUP DE CARACTERES QU IL FAUT COUPER EN "TROIS MORCEAUX.". Le tiret dans la colonne 7 servait également en cas de coupure de mot : 73 DISPLAY --, WTOT - AL. NB : cet usage est à proscrire, tant la compréhension du programme en souffre. La colonne 7 a plusieurs autres usages : * Toute la ligne est prise comme commentaire. / Ce caractère provoque un saut de page lors de l'édition du code source. D La ligne est utilisée pour le déboguage (à employer seulement quand la clause WITH DEBUGGING MODE est utilisée) Zone instruction La zone instruction (colonnes 8 à 72) était, quant à elle, découpée en deux parties, une de 8 à 11 et une allant de 12 à 72. La première (appelée Zone A) était réservée aux noms de divisions, de sections, de paragraphes et à certains mots-clés. Tout le reste devait être écrit dans la partie comprise entre la colonne 12 et la colonne 72 (cette partie étant appelée Zone B). Les programmeurs de l'époque remplissaient soigneusement des bordereaux de saisie similaires à celui cidessous : NB : cette image est extraite du site Internet Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 7 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 8 / 95
5 Le paquet de cartes vierges placé dans le sabot situé sur le dessus de la machine, à droite, le bordereau de saisie à portée des yeux, il suffisait de sélectionner une carte (i.e. de la faire descendre) et de taper le texte au clavier. Au fur et à mesure, colonne après colonne, la carte avançait vers la gauche. Lorsque la saisie de la ligne était terminée, la carte remontait dans le sabot de gauche. Le programme créé, les cartes toutes perforées, il fallait alors prendre le paquet dans le sabot de gauche, y ajouter un élastique et porter le tout dans la salle machine. La compilation pouvait commencer. Les cartes perforées ayant disparu, les supports magnétiques ayant remplacé le support cartonné, ces règles se sont un peu assouplies. A ce jour, on trouve des compilateurs qui acceptent des instructions COBOL démarrant en colonne 1. Aucun, toutefois, ne sait lire au delà de la colonne 72. Tout ce qui est écrit en 73 et après cette limite est simplement ignoré... ce qui peut (!) provoquer des erreurs de compilation. Nous conseillons, malgré la tolérance de la plupart des compilateurs, de continuer à respecter le colonnage (voir la partie de ce module consacrée aux normes de programmation). 1.3 Un peu de (petite) histoire Le langage COBOL (son nom est l'acronyme de COmmon Business Oriented Language, langage commun orienté gestion) est né en 1958, à la demande du département américain de la défense (le DoD, Department of Defense). Celui-ci souhaite disposer d'un langage standardisé pour ses applications de gestion. Il réunit un groupe de travail, le CODASYL (COnference on DAta SYstems Languages), qui comprend plusieurs constructeurs (IBM, Burroughs Corp., RCA, Sperry...) et des représentants du gouvernement américain (le Dod, le National Bureau of Standards...). L'équipe est dirigée par une femme, Grace B. HOPPER (ce qui fera dire, quarante ans plus tard, à l'auteur d'un article... féministe??... paru sur le site (et que nous avons copié sans vergogne) "c'est un langage efficace, car c'est une femme qui l'a inventé"). Mathématicienne (maîtrise de maths, doctorat de maths... à Yale), elle travaille dans la Marine, en Elle est à l'origine de A0, le premier compilateur connu. On lui doit aussi B0, FLOWMATIC 1, tous deux développés pour Univac. 1.4 Restrictions sur le cours Nous avons volontairement restreint le langage COBOL présenté dans ce module, essentiellement pour des raisons pédagogiques. De très nombreuses clauses sont, en effet, inutiles (à tout le moins très très peu souvent utilisées) et il n'est pas nécessaire de les maîtriser pour programmer dans ce langage. Nous souhaitons en outre ne pas cantonner ce module au simple exercice d'apprentissage d'un langage et tenons à armer nos étudiants d'outils algorithmiques puissants leur permettant d'écrire des programmes impliquant un nombre quelconque de fichiers. Le fait d'ajouter ici nous pousse inévitablement, le temps nous étant compté, à enlever ailleurs. Mini-COBOL, donc. Le fait de ne pas tout traiter ne doit cependant pas pénaliser l'apprenant... et de fait cela ne le pénalise pas. Imaginons, par exemple, qu'au gré d'une opération de rétroconception, un de nos anciens étudiants, uniquement formé à ce mini-cobol, tombe sur une instruction inconnue. Nous faisons le pari qu'elle ne le restera pas longtemps. Deux raisons à cela : tous les compilateurs que nous avons pratiqués sont dotés d'aides en ligne complètes. L'ordre inconnu y trouvera sans aucun doute une explication. Il ne faut pas oublier, enfin, que le langage est basé sur l'usage de mots anglais. Il sera donc facile de décoder notre inconnu et de savoir que SUBTRACT, par exemple, correspond à une soustraction. Pour faire définitivement taire les dernières critiques, nous avons prévu en fin du chapitre 2, consacré au langage lui-même, une série de compléments abordant des "choses" non nécessaires. 16/10/12 Sa principale contribution porte sur l'utilisation du langage naturel dans les langages de programmation. Elle est donc très certainement à l'origine de l'adoption dans COBOL de verbes anglais pour exprimer les opérateurs arithmétiques (ADD, DIVIDE...). Elle terminera sa carrière comme contre-amirale de la Marine des États-Unis en 1986, travaillera jusqu'à la fin de sa vie comme consultante, chez Control Data. Elle décèdera en 1992, le 1 janvier. Pour revenir à COBOL, les premières spécifications sont produites en janvier Les premiers compilateurs sortent en décembre L'histoire du langage est ensuite marquée par les événements suivants : 1968 : première normalisation par l'american National Standards Institute, le COBOL ANSI : deuxième normalisation, le COBOL ANSI : troisième normalisation, le COBOL ANSI85 En plus de quarante années, ce langage a réussi à faire son chemin dans les services informatiques des entreprises, et ce dans le monde entier. Les estimations, sur ce point, divergent. La part de COBOL s'échelonne, en effet, selon les auteurs de 30 à 60 % du nombre total de lignes de programmes existant à ce jour! Certains historiens n'hésitent pas à chiffrer à 7 milliards le nombre de lignes COBOL actuellement en usage. Dans un cours donnée à l'université de Montréal, il est même fait mention du langage le plus utilisé, avec 95 % des plus grandes entreprises du Canada qui ont des programmes rédigés dans ce langage. Quels que soient les chiffres, il est certain que les programmes COBOL "pullulent". De très nombreuses tentatives ont en outre été faites depuis pour moderniser ce "vieillard", comme : des versions COBOL objet (des ouvrages sont même disponibles), des traducteurs COBOL-SQL, un groupe de travail autour de TinyCobol, compilateur COBOL libre, une "connexion" avec le monde Web,... Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 9 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 10 / 95
6 COBOL, un langage de programmation 23/11/03 2. Identifier le programme Identifier un programme, c'est lui donner un nom (c'est le minimum) ; c'est aussi mentionner son (ou ses) auteur(s) et le localiser dans le temps en fournissant la date... de rédaction... ou de la naissance du chien de Marie-Jeanne, la date fournie n'étant prise que comme commentaire. La syntaxe de cette très courte division est la suivante : IDENTIFICATION DIVISION. PROGRAM-ID. Nom. [AUTHOR. Commentaire1]. [DATE-WRITTEN. Commentaire2]. Seul, le premier renseignement est obligatoire. Nous conseillons de fournir les deux autres, ne serait-ce que pour permettre de retrouver l'auteur d'un programme lors d'une mise-à-jour ultérieure. ATTENTION, le nom donné au programme joue un rôle capital (?). Il permet de faire le lien avec le nomsystème donné au fichier contenant le programme. Le contenu (ie. le programme) connait donc le nom de son contenant (ie. le fichier). Le programmeur n'a pas beaucoup de liberté dans le choix d'un nom. Le système de gestion de fichiers veille. Beaucoup de compilateurs imposent des noms de fichiers source avec une extension.cob (miseajour.cob, saisieclients.cob...), cette dernière ne devant PAS figurer dans le nom inscrit dans le programme. PROGRAM-ID. miseajour. PROGRAM-ID. saisieclients. Nous avons connu des compilateurs qui requéraient une mise entre guillemets de ce nom. PROGRAM-ID. "miseajour". Selon le système d'exploitation, en outre, le nombre de caractères de ce nom sera plus ou moins limité. A voir avec le responsable système de la machine sur laquelle le programme sera compilé puis exécuté. Les deux commentaires situés après les mots-clés AUTHOR et DATE-WRITTEN se terminent par un point. Ils ne doivent donc pas contenir eux-même de point! Certains compilateurs proposent d'autres paragraphes, comme : DATE-COMPILED, qui permet de récupérer la date de compilation du programme, date fournie par le compilateur lui-même. Une survivance du temps où les programmes étaient volumineux, où les temps de saisie n'étaient pas négligeables et où il pouvait s'écouler un ou deux JOURS (j'ai bien dit "jours") entre la rédaction et la compilation. SECURITY, qui était prévu pour permettre une mise en évidence des consignes de sécurité "pesant" sur le programme. INSTALLATION, qui définit le matériel sur lequel s'exécute le programme. Ces paragraphes seront avantageusement remplacés par des commentaires placés en début de programme. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 11 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 12 / 95
7 COBOL, un langage de programmation 3. Décrire l environnement du programme 3.1 Généralités L'environnement du programme comprend, pour l'essentiel, un ensemble de fichiers (séquentiel, indexé...). Deux sections (une seule obligatoire) composent cette division, la section de configuration (CONFIGURATION SECTION) et la section des entrées-sorties (INPUT-OUTPUT SECTION). Celles-ci sont respectivement constituées de trois et deux paragraphes. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. OBJECT-COMPUTER. SPECIAL-NAMES. Dans la section de configuration, on peut fournir le nom de l'ordinateur sur lequel est compilé le programme et le nom de celui sur lequel il sera exécuté. Dans les deux cas, ce nom est traité comme un commentaire. Le paragraphe SPECIAL-NAMES joue un rôle limité mais intéressant. Sa syntaxe est la suivante : SPECIAL-NAMES. [CURRENCY SIGN IS Caractère]. [DECIMAL-POINT IS COMMA]. On peut ainsi utiliser le symbole monétaire que l'on veut (franc, euro... tout est bon... dès l'instant où il y a un caractère disponible) -clause CURRENCY- et passer, par exemple, de la notation américaine 1, à la notation française 1.000,00 -clause DECIMAL POINT-. À défaut, les valeurs seront exprimées en dollars... américains et les virgules et points inversés... par rapport à nous. La section des entrées-sorties comprend un paragraphe consacré aux fichiers (FILE-CONTROL) et un paragraphe servant pour les optimisations (I-O-CONTROL). INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FICH1 ASSIGN TO fich1.dat ORGANIZATION INDEXED. SELECT FPRODUIT ASSIGN TO fich2.dat ORGANIZATION SEQUENTIAL. SELECT FCLIENT ASSIGN TO fich3.dat ORGANIZATION INDEXED. Ce programme utilise trois fichiers nommés, en interne, FICH1, FPRODUIT et FCLIENT. Ces fichiers correspondent aux fichiers fich1.dat, fich2.dat, fich3.dat. NB : certains compilateurs demandent que les noms externes des fichiers soient entre guillemets. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FICH1 ASSIGN TO "fich1.dat". La liaison nom interne (ex : FPRODUIT) - nom externe (ex : fich2.dat) est assurée par l'ordre SELECT. Étudions la plus en détail, organisation par organisation. Des exemples récapitulatifs clôtureront cette présentation Ordre SELECT pour un fichier en organisation séquentielle Nous supposons, c est du moins ce que nous avons dit dans l introduction de ce cours, que les notions d organisation de fichiers sont connues. Ceux de nos lecteurs qui ont ces pré-requis peuvent sauter le paragraphe qui suit. Pour les autres, nous commencerons par rappeler brièvement ce dont il s agit. A- À propos de l organisation séquentielle Un fichier en organisation séquentielle correspond à une file d attente gérée en FIFO (First In First Out) sans priorité ou, pour prendre un exemple plus concret, à une file d attente devant un cinéma, sans resquilleur. Tous les enregistrements ont la même longueur, c est du moins l hypothèse simplificatrice que nous prendrons ici. Ils sont rangés les uns derrière les autres, sans laisser de trou entre eux. Le fichier est doté, pour son exploitation, de deux dispositifs complémentaires, un curseur et une marque de fin de fichier. 3.2 Paragraphe FILE-CONTROL Ce paragraphe joue un rôle essentiel pour l'intégration du programme dans son environnement. C'est là que les fichiers utilisés sont mentionnés, avec, et c'est là le point important, leur organisation (voir le paragraphe consacré à cette notion si nécessaire). Pour chaque fichier, une clause SELECT : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 13 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 14 / 95
8 Le curseur désigne le prochain ; le prochain article à lire, le prochain emplacement pour écrire La marque de fin de fichier est un enregistrement sépcial matérialisant la fin du fichier. Cette marque fait partie du fichier. Une telle organisation est la moins efficace pour rechercher un enregistrement précis dans un ensemble. Le temps nécessaire pour ce faire est en moyenne égal à la moitié du temps nécessaire à la lecture de TOUT le fichier! C est, d un autre côté, la plus efficace pour lire tous les enregistrements d un fichier. La pire et la meilleure! C est pour cela que l agorithmique de fichiers séquentiels est un outillage nécessaire à tout bon programmeur et pour cela aussi que ce cours comprend, outre l apprentissage du langage COBOL, une partie traitant de cinématique de fichiers séquentiels (voir chapitre 3). B- Déclaration d un fichier séquentiel Un fichier en organisation séquentielle se "déclare" comme suit : SELECT Nom-interne-fichier ASSIGN TO Nom-externe-fichier [ORGANIZATION SEQUENTIAL] [ACCESS MODE IS SEQUENTIAL] [FILE STATUS IS Nom-donnée]. Seule la première ligne est obligatoire. Les autres permettent respectivement de préciser que l'organisation du fichier est le séquentiel (option par défaut), que le mode d'accès aux enregistrements est le mode séquentiel (option par défaut) et de définir une variable (il s'agit d'une variable de travail, à déclarer dans la section appropriée (WORKING-STORAGE SECTION)) qui servira à accueillir le status, c'est-à-dire le compte-rendu d'exécution de l'opération d'entrée-sortie. Nous conseillons l'utilisation de cette variable, surtout en phase de mise au point du programme. Sans cette option, s'il y a un problème dans la manipulation du fichier, le programme s'arrêtera (il "plantera"). Avec l'option, il ne s'arrêtera pas. Un code d'erreur sera inscrit dans la variable, celle-ci pouvant être affichée, aidant ainsi le programmeur dans la détection du problème. Les codes ne sont hélàs pas tous normalisés. Certains changent d'un compilateur à un autre. Quoiqu'il en soit, ils sont recensés dans la documentation remise par l'éditeur du logiciel. Voici, par exemple, quelques valeurs relatives à l'organisation séquentielle : Pour comprendre ce qu est un fichier organisé en séquentiel-indexé, il suffit de penser à un dictionnaire. Celui-ci comprend une liste de mots, présentés en ordre alphabétique. Il comprend aussi un index qui permet d accélérer la recherche d un mot précis. Un fichier en organisation séquentielle-indexée est constitué de deux parties, les enregsitrements et les index. Les enregsitrements sont rangés en respectant un ordre, les uns «derrière» les autres au sens de cet ordre. Ce dernier est porté par une rubrique qui est appelée clé principale. Sans clé, pas d organisation séquentielleindexée. Ce classement est parfait, sans doublon. Les index sont des tables constituées de deux attributs ; le premier correspond à une valeur de clé ; le second est un pointeur. La partie enregistrements du fichier est découpée en zones, de taille plus ou moins importantes selon les systèmes de gestion de fichiers, chaque zone étant référencée dans l index. A B C D E F Enregistrements Chaque entrée de l index comprend la valeur de la clé la plus haute (si le fichier est en ordre croissant) ou la plus basse (si le fichier est en ordre décroissant) et un pointeur sur le premier enregsitrement de la zone. Plus la zone sera petite, plus l index sera précis. Les index les plus performants ont autant d entrées que d enregistrements dans le fichier. zone A zone B zone C zone D zone E zone F Index 00 entrée-sortie réussie 04 lecture réalisée mais longueur d'enregistrement non conforme à la déclaration 05 tentative d'ouverture d'un fichier inexistant 11 fin de fichier Plus généralement, cette variable doit être déclarée dans la section des variables de travail (WORKING- STORAGE SECTION) comme une chaîne de deux caractères (elle y aura un format XX). Elle est à tester après chaque opération impliquant un fichier. Une valeur 00 correspond au succès de l'opération. Toute autre à une anomalie à corriger (soit en changeant les données, soit en agissant sur le programme lui-même) Ordre SELECT pour un fichier en organisation séquentielle-indexée Nous supposons, c est du moins ce que nous avons dit dans l introduction de ce cours, que les notions d organisation de fichiers sont connues. Ceux de nos lecteurs qui ont ces pré-requis peuvent sauter le paragraphe qui suit. Pour les autres, nous commencerons par rappeler brièvement ce dont il s agit. A- À propos de l organisation séquentielle-indexée Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 15 / 95 Les enregistrements ayant une clé inférieure ou égale à 10 sont dans la zone commençant à l adresse 1. Les enregistrements ayant une clé inférieure ou égale à 40 sont dans la zone commençant à l adresse 7. Les index sont gérés par le système de gestion de fichiers. Lorsque les zones du fichier sont composées de plusieurs enregistrements, ceux-ci sont liés les uns aux autres. L accès aux enregistrements d une zone se fait donc comme suit : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 16 / 95
9 on recherche dans la table d index la valeur immédiatement supérieure à celle recherchée ; on se positionne ensuite au début de la zone, en utilisant le pointeur ; on parcourt ensuite séquentiellement la zone contenant, si il existe, l enregistrement désiré. Cet index est construit sur les valeur de la clé primaire. Celle-ci est identifiante, c est-à-dire qu elle n a pas de doublons. Il est possible de construire plusieurs autres index : sur l index principal, pour accélérer le parcours de cet index. On a alors un index d index. sur des clés secondaires, celles-ci étant parfaites (elles n ont pas de doublons) ou non. Il y a alors autant de chaînages que d index. Une organisation séquentielle-indexée est idéale pour accèder directement à un enregistrement précis dont on connaît la valeur de la clé (primaire ou secondaire). C est sûrement la pire des façons de parcourir tous les enregistrements d un fichier. B- Déclaration d un fichier séquentiel-indexé Il y a, pour un fichier en organisation séquentielle-indexée autant de déclarations qu'il y a d'accès possibles. Il y a donc une clause SELECT pour un accès séquentiel, une clause SELECT pour un accès direct et une clause SELECT pour un accès dynamique. Dans tous les cas (ie. quelque soit le mode d'accès), il convient d'abord de préciser la clé principale (RECORD KEY) puis, le cas échéant, la (ou les) clé(s) secondaire(s) (ALTERNATE RECORD KEY) et, enfin, de signaler la présence éventuelle de doublons dans les liaisons relatives aux clés secondaires (WITH DUPLICATES). NB : s'il y a trois clés secondaires, il doit y avoir trois clauses ALTERNATE RECORD KEY. La variable permettant de récupérer le statut du fichier après exécution de l'opération peut prendre, comme précédemment, plusieurs valeurs et notamment : 05 tentative d'ouverture d'un fichier absent. Si le mode I-O est demandé, le fichier est créé. 22 problème de clé dupliquée 24 tentative d'écriture hors des limites du fichier Il y en a d'autres. Abordons maintenant les spécificités de cette clause dûes au mode d'accès employé Accès séquentiel Un fichier en organisation indexée auquel on accède en séquentiel se "déclare" comme suit : SELECT Nom-interne-fichier ASSIGN TO Nom-externe-fichier [ORGANIZATION INDEXED] [ACCESS MODE IS SEQUENTIAL] [RECORD KEY Nom-donnée1] [ALTERNATE RECORD KEY Nom-donnée2 [WITH DUPLICATES]] [FILE STATUS IS Nom-donnée3] Accès direct Un fichier en organisation indexée auquel on accède en direct se "déclare" comme suit : SELECT Nom-interne-fichier ASSIGN TO Nom-externe-fichier [ORGANIZATION INDEXED] [ACCESS MODE IS RANDOM] Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 17 / 95 [RECORD KEY Nom-donnée1] [ALTERNATE RECORD KEY Nom-donnée2 [WITH DUPLICATES]] [FILE STATUS IS Nom-donnée3] Accès dynamique Un fichier en organisation indexée auquel on accède en dynamique se "déclare" comme suit : SELECT Nom-interne-fichier ASSIGN TO Nom-externe-fichier [ORGANIZATION INDEXED] [ACCESS MODE IS DYNAMIC] [RECORD KEY Nom-donnée1] [ALTERNATE RECORD KEY Nom-donnée2 [WITH DUPLICATES]] [FILE STATUS IS Nom-donnée3] Ordre SELECT pour un fichier en organisation relative Un fichier en organisation relative (rappelons que nous supposons que les concepts sous-jacents à cette organisation sont connus ; si tel n'était pas le cas, il est conseillé d'acquérir ces notions avant de poursuivre) se "déclare" comme suit : SELECT Nom-interne-fichier ASSIGN TO Nom-externe-fichier [ORGANIZATION RELATIVE] [ACCESS MODE IS RANDOM] [RELATIVE KEY Nom-donnée1] [FILE STATUS IS Nom-donnée2]. Comme précédemment, nous recommandons l'usage de la variable récupérant le statut du fichier. Certaines erreurs ne sont, en effet, pas détectables autrement que par un test. C'est le cas, par exemple, des situations suivantes : Il y en a d'autres. 14 dimension de la clé dépassée 24 tentative d'écriture hors des limites du fichier Exemples récapitulatifs Soit le morceau de programme suivant : ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FETUD ASSIGN TO "fetud.dat" ORGANIZATION INDEXED ACCESS RANDOM RECORD KEY IS NOETUD. SELECT FMODULE ASSIGN TO "fmodule.dat" ORGANIZATION INDEXED ACCESS RANDOM Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 18 / 95
10 RECORD KEY IS CODMOD. SELECT FNOTES ASSIGN TO "fnotes.dat". SELECT FRESULT ASSIGN TO "fresult.dat". COBOL, un langage de programmation Quatre fichiers sont annoncés, FETUD, FMODULE, FNOTES et FRESULT. Les deux premiers sont en organisation indexée, les deux derniers en séquentielle. FETUD est utilisé en accès direct. Il a une clé principale, NUETUD mais pas de clé secondaire. FMODULE est également utilisé en accès direct. Il a une clé principale, CODMOD. Pas de clé secondaire pour ce fichier. Les deux derniers fichiers sont utilisés en accès séquentiel (c'est du reste la seule possibilité!). Soit le morceau de programme suivant : ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FREAL ASSIGN TO "freal.dat" ORGANIZATION INDEXED ACCESS DYNAMIC RECORD KEY IS CLEPRIM ALTERNATE RECORD KEY IS CODCOUR WITH DUPLICATES. Il n'y a qu'un seul fichier, FREAL. Il s'agit d'un fichier organisé en sequentiel-indexé, "travaillé" en accès dynamique. La clé principale est CLEPRIM. Il y a une clé secondaire, CODCOUR, celle-ci produisant des doublons. Pas de variable status. 3.3 Paragraphe I-O-CONTROL Ce paragraphe permet d'optimiser la place occupée par le programme qui s'exécute (une préoccupation d'un autre temps!), en associant la même zone tampon à plusieurs fichiers : I-O-CONTROL. SAME RECORD AREA TO Nom-fichier1... Nom-fichierN. les mêmes fichiers de travail pour trier plusieurs fichiers : I-O-CONTROL. SAME SORT AREA TO Nom-fichier1... Nom-fichierN. les mêmes fichiers de travail pour fusionner plusieurs fichiers : I-O-CONTROL. SAME SORT-MERGE AREA TO Nom-fichier1... Nom-fichierN. 4. Définir les données 4.1 Généralités Décrire les données, c'est l'affaire de la division de données, la DATA DIVISION. Celle-ci est découpée en un maximum de cinq sections ayant chacune un rôle à jouer. DATA DIVISION. FILE SECTION SECTION. WORKING-STORAGE SECTION. LINKAGE SECTION. REPORT SECTION. SCREEN SECTION. Ces sections sont toutes facultatives. Avec certains compilateurs, l'ordre d'écriture est imposé. Nous traiterons les deux premières (fichiers et variables de travail) dans cette partie du cours, les trois autres étant abordées dans la partie Extensions. Auparavant, nous évoquerons le format des données. 4.2 Format des données Pour décrire une donnée, il faut fournir plusieurs renseignements et notamment son niveau d'imbrication et son nom. Une valeur initiale, un format peuvent être ajoutés aux deux précédents. Il y en a encore d'autres, moins utilisés Niveaux d'imbrication A- Définitions Il est possible, en COBOL, de définir des structures de données elles-même constituées de sous-structures et de variables élémentaires. Cette imbrication s'exprime grâce à des niveaux, nombres constitués de deux chiffres respectant la contrainte suivante : Il ne sera pas développé davantage. 23/11/03 Des trois dernières valeurs (ie. 66, 77 et 88), nous ne parlerons que de celle du milieu : 77 est le niveau d'imbrication associé à une variable élementaire QUI N'APPARTIENT PAS À UNE STRUCTURE. NB : les variables de niveau 88 sont traitées dans la partie abordant la notion de conditionnelle. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 19 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 20 / 95
11 Les quarante-neuf premières valeurs sont associées aux variables structurées et aux variables élémentaires QUI APPARTIENNENT À UNE STRUCTURE, selon les principes suivants : À chaque élément est associé un nombre ; Plus le nombre est élevé, plus la variable est «à l intérieur» de la structure ; Tous les éléments de même niveau dans une structure ont le même nombre. B- Exemples Prenons des exemples : 1) Soit X une variable élémentaire. X aura pour niveau d'imbrication 77. 2) Soit la structure ADRESSE1 suivante : Struct ADRESSE1 NomRue NumeroRue CodePostal NomVille finstruct ADRESSE1 (si elle n'est pas elle-même élément d'une structure) aura pour niveau d'imbrication 01. NomRue, NumeroRue... auront un niveau d'imbrication supérieur, identique pour tous. Il peut y avoir plusieurs traductions : 01 ADRESSE1 02 NOMRUE 02 NUMERORUE 02 CODEPOSTAL 02 NOMVILLE 01 ADRESSE1 05 NOMRUE 05 NUMERORUE 05 CODEPOSTAL 05 NOMVILLE L'habitude (ce n'est qu'une habitude) veut que l'écart qui traduit une différence de niveau soit supérieur à 1. Ainsi, entre les deux solutions précédentes, celle de droite est préférée. Il serait en effet plus facile de regrouper les variables deux par deux dans le cas de droite, ce que semble confirmer les exemples ci-dessous : 01 ADRESSE1 02 RUE 03 NOMRUE 03 NUMERORUE 02 VILLE 03 CODEPOSTAL 03 NOMVILLE 01 ADRESSE1 02 RUE 05 NOMRUE 05 NUMERORUE 02 VILLE 05 CODEPOSTAL 05 NOMVILLE 2 lignes ajoutées 2 lignes ajoutées 4 lignes retouchées 0 ligne retouchée Ceci est une erreur, dans la mesure où il est également de tradition d'indenter les définitions des structures, de décaler de X (usuellement 4) caractères chaque niveau. La comparaison précédente devient alors ceci : 01 ADRESSE1 02 RUE 03 NOMRUE 01 ADRESSE1 02 RUE 05 NOMRUE Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 21 / NUMERORUE 02 VILLE 03 CODEPOSTAL 03 NOMVILLE 05 NUMERORUE 02 VILLE 05 CODEPOSTAL 05 NOMVILLE 2 lignes ajoutées 2 lignes ajoutées 4 lignes retouchées 4 lignes retouchées 3) Soit la structure EMPLOYE suivante et sa traduction : Struct EMPLOYE Struct PERSONNE NOMPERSONNE PRENOMPERSONNE DATENAISSANCE finstruct Struct ADRESSE1 NOMRUE NUMERORUE CODEPOSTAL NOMVILLE finstruct NUMEROEMPLOYE SALAIRE DATEARRIVEE finstruct Deux remarques pour finir : 01 EMPLOYE 02 PERSONNE 03 NOMPERSONNE 03 PRENOMPERSONNE 03 DATENAISSANCE 02 ADRESSE1 03 NOMRUE 03 NUMERORUE 03 CODEPOSTAL 03 NOMVILLE 02 NUMEROEMPLOYE 02 SALAIRE 02 DATEARRIVEE Seules les balises de fin de structure (finstruct) ne sont pas traduites. TOUTES les variables (qu elles soient élémentaires ou structurées) sont accessibles et manipulables. C- Présentation Ces niveaux sont régis par des règles de présentation strictes. La première dit que les niveaux 01 et 77 doivent obligatoirement être présentés en zone A. La deuxième dit que les autres niveaux doivent se trouver en zone B. La troisième indique qu'à chaque niveau correspond une nouvelle ligne. La quatrième impose le niveau 01 au nom correspondant au plus haut d'une structure. Une traduction COBOL correcte (mais PARTIELLE) du dernier exemple pourrait donc être celle présentée ciaprès : 01 EMPLOYE. 02 PERSONNE. 03 NOMPERSONNE 03 PRENOMPERSONNE 03 DATENAISSANCE 02 ADRESSE1. 03 NOMRUE 03 CODEPOSTAL 03 NOMVILLE Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 22 / 95
12 4.2.2 Noms des données 02 NUMEROEMPLOYE 02 SALAIRE 02 DATEARRIVEE Toutes les données utilisées dans un programme COBOL doivent avoir un nom. Ce nom doit, bien sûr, être différent des mots réservés du langage lui-même. En cas de doute, il suffit de consulter l'aide en ligne du compilateur. Il y a une précaution à prendre pour éviter de nommer une variable avec un mot COBOL, celle de ne pas employer de mot s'écrivant pareil en français et en anglais (il y en a plusieurs, comme CODE, DATE, SECTION...). En principe, chaque élément porte un nom unique. Si tel n'est pas le cas, l'élément doit appartenir à une structure qui a, elle même, un nom unique. Si tel n'est pas non plus le cas, la structure doit appartenir à une structure qui possède un nom unique. Si tel n'est pas le cas... (voir qualification des noms). A- Formation des noms Un nom acceptable est composé d'au plus 30 caractères. Ces caractères peuvent être des lettres (en majuscules ou en minuscules), des nombres ou des tirets. L'espace n'est pas admis. Un mot ne peut ni commencer, ni finir par un tiret. Il doit contenir au moins une lettre (sauf s'il s'agit d'un nom de paragraphe ou de section). NOMCLIENT, X33, 5P100, DATE-ARRIVEE sont des noms acceptables. Contrairement à d'autres langages, il est d'usage d'adopter des noms significatifs et de réserver des noms tels I, J, A, WTOT aux cas -rares- où leur sémantique est "évidente". B- FILLER, nom anonyme Il existe un nom passe-partout, anonyme, qui sert dans certains cas bien précis (et UNIQUEMENT dans la division des données) où le format de la donnée a plus d'importance que son nom. Ce nom est FILLER, ce que l'on peut traduire par JOINT (ou BOUCHE-TROU). Prenons l'exemple d'une ligne d'édition, dans laquelle il y a deux zones utiles espacées l'une de l'autre d'un trou, d'une zone vide. Cette ligne, appelons-la L1, sera décrite ainsi : 01 L1. 02 FILLER 02 L FILLER 02 L FILLER Bien entendu, du fait que ces zones sont nommées de façon anonyme, le programmeur qui les met en place s'interdit de les utiliser dans la partie procédure. Il ne pourra faire référence qu'à L1, L1-1 ou L1-2. C- Qualification des noms Pour rendre unique deux variables ayant le même nom, on utilise le principe de la qualification. Celle-ci consiste à définir la structure à laquelle appartient la variable que l'on veut désigner sans ambiguïté en associant les deux noms par OF ou IN (ces deux prépositions jouant le même rôle). Ainsi, dans l'exemple suivant : 01 ADRESS1. 02 RUE. 03 NOM 03 NUMERO 02 VILLE. 03 CODEPOSTAL 03 NOM devrons-nous parler de NOM OF RUE (ou de NOM IN RUE) ou de NOM OF VILLE (ou de NOM IN VILLE). Il n'est pas possible de qualifier un nom de structure associé au niveau 01, un nom de variable élémentaire (associé à 77), un nom de condition (88) ou un nom de variable redéfinissant une série de variables (66). Une telle pratique est à éviter. Elle alourdit les programmes et les rend plus difficiles à comprendre. Elle a un seul avantage, celui de permettre des mouvements groupés de données (voir l'ordre MOVE correspondant) Formats des données A- Généralités A chaque variable NON STRUCTUREE correspond un format. Celui-ci s'annonce par le mot COBOL PICTURE (que l'on abrège le plus souvent en PIC). 77 WTOTAL PICTURE Format 77 WTOTAL PIC Format sont donc deux déclarations équivalentes. 01 ADRESS1. 02 RUE. 03 NOM PIC 03 NUMERO PIC 02 VILLE. 03 CODEPOSTAL PIC 03 NOM PIC Seules les variables NOM OF RUE, NUMERO, CODEPOSTAL et NOM OF VILLE ont un format. Ce sont en effet les seules variables non structurées. Il y a plusieurs types de format ; nous en verrons trois dans cette partie. Pour les autres, voir dans la partie Extensions (et notamment le paragraphe consacré aux éditions). Les trois principaux formats correspondent à des variables numériques, alphabétiques et alphanumériques. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 23 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 24 / 95
13 B- Formats numériques Une variable numérique a le type 9. Ceci signifie qu'elle peut prendre une valeur absolue (ie. non signée) comprise entre 0 et un nombre fonction du nombre de chiffres réservés pour la variable. Ce nombre s'indique comme suit : PIC 9 PIC 9(1) PIC 999 PIC 9(3) PIC 9(12) 1 chiffre 1 chiffre 3 chiffres 3 chiffres 12 chiffres Le nombre maximum de chiffres pour une variable numérique est 18. Pour les nombres réels, deux symboles supplémentaires sont disponibles, le S (pour le signe) et le V (pour la virgule). Ils s'emploient comme ceci : A PIC S9 B PIC 9V9 C PIC S99V99 Signe et virgule sont VIRTUELS, c'est-à-dire qu'ils n'occupent pas de place en mémoire. Cela aussi pour conséquence qu'ils ne sont pas imprimables (du moins pas avec ce format). Reprenons les exemples précédents et voyons ce que signifient ces déclarations : A est un entier relatif d un chiffre, donc compris entre 9 et +9 ; B est un réel non signé ayant une seule décimale, compris entre 0,0 et 9,9 ; C est un réel signé ayant deux chiffres avant et deux chiffres après la virgule. A, s'il est affiché (par un ordre DISPLAY) ou écrit (par un ordre WRITE), occupera une seule position ; B en occupera deux et C quatre. Il existe d'autres signes. Voir la partie Extensions. C- Format alphabétique Une variable alphabétique a le format A. Ceci signifie qu'elle peut prendre pour valeur une lettre (de A à Z, en majuscule ou en minuscule) ou un espace. ATTENTION, ce format n'accepte ni les tirets, ni les apostrophes. Pas de nom composé donc, ni de noms bretons. "LE GOUALC'H" n'est pas une valeur alphabétique en COBOL. Ce format a tendance à être remplacé par le suivant, plus "large". D- Format alphanumérique Une variable acceptant comme valeur n'importe quel caractère a le format X. E- Exemple Si, maintenant, nous reprenons l'exemple précédent des employés, nous pouvons le complèter comme suit : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 25 / EMPLOYE. 02 PERSONNE. 03 NOMPERSONNE PIC X(20). 03 PRENOMPERSONNE PIC X(15). 03 DATENAISSANCE PIC 9(8). 02 ADRESSE1. 03 NOMRUE PIC X(30). 03 NUMERORUE PIC CODEPOSTAL PIC 9(5). 03 NOMVILLE PIC X(25). 02 NUMEROEMPLOYE PIC XXX. 02 SALAIRE 9(4)V DATEARRIVEE 9(8). Les deux variables DATENAISSANCE et DATEARRIVEE ne sont guère pratiques ; elles sont composées de huit chiffres sans distinction. Si l'on veut manipuler séparément jour, mois, année, il faudra déclarer ces dates comme une structure. Nous laissons le lecteur le faire (en cas de doute, voici la réponse) Valeurs initiales A- Déclaration La première chose à faire consiste à signaler au système que la variable a une valeur initiale, en utilisant le mot réservé VALUE (il n'y a pas d'abréviation, cette fois-ci). Dans l'exemple ci-après, WTOTAL a une valeur initiale, WI non. 77 WTOTAL PIC 9(4) VALUE WI PIC 9. Il faut ensuite fournir la valeur. Il y a trois façons d'affecter A LA DECLARATION cette valeur initiale à une variable de travail. NB : le faire pour les zones tampons associées aux fichiers n'a aucun sens, celles-ci étant initialisées par le système lors de l'exécution du premier ordre de lecture (ou par le programme lors de l'exécution du premier ordre d'écriture). B- Constantes La première est de fournir directement la valeur en clair, les nombres étant indiqués à l'américaine (sauf si, dans la division de l'environnement, il a été dit que l'on travaillait à l'européenne, grâce à la clause DECIMAL-POINT IS COMMA), les chaînes de caractères, les caractères alphabétiques étant fournis entre guillemets (certains compilateurs utilisant également l'apostrophe) : 77 WTOTAL PIC 9(4) VALUE WTOTAL PIC S9 VALUE WCHAINE PIC X(10) VALUE "BONJOUR". Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 26 / 95
14 Il n'y a aucune surprise à redouter au niveau du stockage de ces valeurs initiales. Les nombres sont cadrés à droite (une valeur de 8 dans une variable de format 9(4) sera complétée A GAUCHE par des zéros), les chaînes de caractères à gauche (une valeur alphabétique égale à "TO" dans une variable de format A(10) sera complétée A DROITE par des espaces). NB : il est possible de changer cela. Voir la partie Extensions et le paragraphe consacré aux éditions. Le seul "problème" réside dans la présence potentielle, dans la chaîne de caractères, d'un de ceux qui servent de balise (guillemet ou apostrophe). Si tel est le cas, il faudra les doubler, comme le montre l'exemple ci-après : 77 WCHAINE PIC X(25) VALUE "TOUR D ITALIE". C- Constantes figuratives La seconde ne sert que dans certains cas bien précis. Elle illustre magistralement le caractère littéraire du langage COBOL. Il existe, en effet, plusieurs constantes prédéfinies que l'on peut affecter aux variables. Parmi celles-ci, on peut citer : SPACE, SPACES ZERO, ZEROS, ZEROES HIGH-VALUE, HIGH-VALUES LOW-VALUE, LOW-VALUES NB : singulier ou pluriel, l'effet est le même. Ces constantes sont appelées constantes FIGURATIVES. espace, espaces zéro constante formée de 1 binaires "partout" constante formée de 0 binaires "partout" 01 WLIGNE. 02 FILER PIC X(30) VALUE SPACES. 02 WLIGNE-L1 PIC X(25). 02 FILLER PIC X(45) VALUE SPACES. L'exemple ci-dessus permet de définir une structure WLIGNE composée d'une zone appelée WLIGNE-L1 de cinq caractères alphanumériques non initialisée, encadrée par deux zones anonymes (FILLER) initialisées à blanc toutes les deux. D- Répétition de caractères Lorsque la chaîne de caractères à initialiser comporte un certain nombre de caractères identiques (différents de ceux "atteints" par les constantes figuratives), il est possible de préciser que la variable, la chaîne, est remplie de ce caractère en employant le mot ALL. 77 WLIGNE PIC X(80) VALUE ALL "-". Cette ligne WLIG-TIRETS est composée de 80 tirets. NB : on n'emploie pas ALL pour les zéros, les espaces... VALUE ALL ZERO est équivalent à VALUE ZEROS... et à VALUE ZERO, l'orthographe des mots n'ayant ICI aucune importance. 4.3 Définition des fichiers Un fichier peut être assimilé à un porte CD. Définir un porte CD, c'est définir le type de CD qui peut y être stocké (par hypothèse, pour un fichier, il n'y a qu'un seul type d'enregistrement) et également donner quelques éléments sur le porte CD lui-même (à qui il appartient...). La définition d'un fichier comprend donc deux parties, identifiables, désignées dans le programme par les symboles FD et 01, tous deux en colonne 8. FILE SECTION. FD FOUVR 01 FEMPLOYE Cette pseudo-description définit le fichier FOUVR et son tampon FEMPLOYE. Il doit y avoir concordance entre le nom du fichier (FOUVR dans l'exemple) et le nom désigné dans la clause SELECT dans la division de l'environnement. C'est le même nom Description du fichier lui-même La description a considérablement évolué depuis "notre" temps. Elle comprend au minimum le nom donné dans le programme au fichier et la désignation du tampon associé. Dans certains cas, elle peut être complétée par : une notion de bloc, un label, une indication de longueur variable. A- Nom interne donné au fichier Le nom interne du fichier, c'est celui qui est employé dans le programme (par opposition au nom externe, qui sert au système). Ce nom est régi par les règles s'appliquant aux noms créés par le programmeur (pas plus de 30 caractères alphabétiques). C'est le même que celui que l'on a utilisé dans la clause SELECT. B- Désignation du tampon Le tampon du fichier lui est associé grâce à la clause DATA RECORD. Sa syntaxe est la suivante : DATA RECORD IS Nom-TAMPON DATA RECORDS ARE Nom-TAMPON[[,] Nom-tampon2] NB : singulier ou pluriel, l'effet est le même. Ces tampons font l'objet, chacun, d'une description. Sauf indication contraire, ils ont tous la même longueur. S'il y a plusieurs tampons, il est important de noter qu'ils occuperont TOUS la MEME zone physique. Il s'agit donc, en fait, d'une simple redéfinition de zone mémoire et pas d'une duplication. C- Notion de bloc Certains fichiers sont structurés de façon telle que les enregistrements sont regroupés en blocs : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 27 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 28 / 95
15 4.4 Variables de travail Par variable de travail, nous entendons toute variable élémentaire ou toute structure qui n'est pas associée aux tampons des fichiers. Ces variables sont le plus souvent (ce n'est pas une obligation) initialisées. Nous employerons tous les éléments de description présentés dans le paragraphe précédent (cf Format des données) et notamment les notions de nombre-niveau, nom, format. Une valeur initiale peut en compléter la description. Voici, à titre d'exemple, deux extraits de deux programmes contenant plusieurs variables de travail. Le premier renferme, dans la WORKING-STORAGE SECTION, une description d'état avec quatre lignes-type. Le second correspond à un programme de manipulation de fichiers avec, dans la section appropriée, toutes les variables associées (qu'il s'agisse de tampons annexes, d'indicateurs de fin de fichier... ). Il y a deux avantages à ce regroupement. La place perdue est moindre (on gagne N-1 "trous" par bloc lors d'un groupage par N) et le temps de lecture est accéléré (le bloc est chargé tout entier en mémoire, puis dégroupé en mémoire centrale, ce qui va plus vite que de transférer les articles les uns après les autres). Si ce dispositif est en place pour le fichier à décrire, il faut l'annoncer. Ceci se fait en utilisant la clause suivante : BLOCK CONTAINS Nombre RECORDS Le mot RECORDS peut être omis! Attention, toutefois. Cela signifie qu'il n'y a qu'un enregistrement par bloc et qu'il a une taille de Nombre caractères. Nous ne développerons, dans ce cours, ni la clause LABEL, ni le cas des articles de longueur variable Description du tampon Le tampon correspond à la zone recevant chaque enregistrement lu et/ou chaque enregistrement à écrire. Il s'agit soit d'une variable structurée, soit d'une variable simple. Dans les DEUX cas, le nombre niveau du tampon est 01. On peut donc avoir : 01 FEMPLOYE PIC X(30). 01 FEMPLOYE. 02 FNOM PIC X(20). 02 FPRENOM PIC X(10). L'usage de ces deux tampons ne sera pas le même, ils n'en sont pas moins deux zones mémoires parfaitement définies d'un point de vue syntaxe. Ces zones tampons ne doivent pas être initialisées lors de leur déclaration, mais par programme, le plus souvent grâce à un ordre MOVE. Il est possible, mais peu fréquent, de définir deux tampons pour un seul fichier. Ils doivent alors avoir la même longueur. Ils peuvent, par contre, avoir des structures différentes (c'est même le seul intérêt!). Cette duplication est toutefois peu utilisée, dans la mesure où elle altère un peu la lisibilité du programme et où il est tout à fait possible de faire autrement. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 29 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 30 / 95
16 Exemples de programmes COBOL Avertissement Les exemples qui sont présentés dans cette partie de cours sont, dans la quasi-totalité des cas, des "oeuvres" d'étudiants. Ils correspondent à des programmes qui "tournent". Ils ont été rédigé dans un dialecte de COBOL, celui produit par la société Legacy et appellé Percobol. Les programmes ont été compilé avec succès. Ils ont également fait l'objet d'un test par un enseignant, dans un environnement Linux/Dec. Ils peuvent donc être considérés comme un exemple fiable, parfaitement transposable (à des variations près de compilateurs) dans un autre environnement. ===> Pour éviter une perte de place, nous avons éliminé de la présentation du code les six premiers caractères. Le bord gauche de l'écran correspond donc à la colonne 7. <=== Tous les programmes, qu'il s'agisse de simples extraits ou de programmes complets, sont numérotés (selon une numérotation séquentielle continue). Ces numéros serviront de référence pour identifier clairement l'exemple en cas de dialogue apprenant-professeur. Plutôt que de parler du programme qui édite un état des ventes, il faudra, par exemple, parler du programme P37. Exemple P01 Cet extrait de programme renferme, dans la WORKING-STORAGE SECTION, une description d'état avec quatre lignes. IDENTIFICATION DIVISION. PROGRAM-ID. CRSEQEMP. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FEMP ASSIGN TO "empseq.dat". SELECT FLIST ASSIGN TO "empseq.lst". DATA DIVISION. FILE SECTION. FD FEMP. O1 F-EMPRUNT. 02 F-NOID PIC F-NOM PIC X(20). 02 F-PRENOM PIC X(20). 02 F-ADRESSE PIC X(25). FD FLIST. O1 F-LIGNE PIC X(80). WORKING-STORAGE SECTION. O1 W-L1. 02 FILLER PIC X(20) VALUE SPACES. 02 FILLER PIC X(21) VALUE "LISTE DES EMPLOYE(E)S". 02 FILLER PIC X(39) VALUE SPACES. O1 W-L2. 02 FILLER PIC X(11) VALUE " NUM IDENT.". 02 FILLER PIC X(5) VALUE SPACES. 02 FILLER PIC X(3) VALUE "NOM". 02 FILLER PIC X(17) VALUE SPACES. 02 FILLER PIC X(6) VALUE "PRENOM". 02 FILLER PIC X(21) VALUE SPACES. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 31 / FILLER PIC X(7) VALUE "ADRESSE". 02 FILLER PIC X(10) VALUE SPACES. O1 W-L3. 02 FILLER PIC X(5) VALUE SPACES. 02 W-L3-IDENT PIC ZZ9. 02 FILLER PIC X(4) VALUE SPACES. 02 W-L3-NOM PIC X(20). 02 FILLER PIC X(1) VALUE SPACE. 02 W-L3-PRENOM PIC X(20). 02 FILLER PIC X(1) VALUE SPACES. 02 W-L3-ADRESSE PIC X(25). 02 FILLER PIC X(1) VALUE SPACE. O1 W-L4. 02 FILLER PIC X(80) VALUE ALL "-". 77 W-FIN PIC A. 77 W-VALID PIC A. 77 W-SUIV PIC A. Exemple P03 Cet extrait de programme correspond à un programme de manipulation de fichiers avec, dans la section appropriée, toutes les variables associées (qu'il s'agisse de tampons annexes, d'indicateur de fin de fichier...). IDENTIFICATION DIVISION. PROGRAM-ID. prog_p7. AUTHOR. Bastien et Johan. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FETUD ASSIGN TO "fetud.dat". SELECT FETUD-IND-CRE ASSIGN TO "fetudindcre.dat" ORGANIZATION INDEXED RECORD KEY NUM-IND-CRE ALTERNATE RECORD KEY NOM-IND-CRE WITH DUPLICATES ALTERNATE RECORD KEY ANAISS-IND-CRE WITH DUPLICATES. SELECT FETUD-IND ASSIGN TO "fetudind.dat" ORGANIZATION INDEXED ACCESS IS DYNAMIC RECORD KEY NUM-IND ALTERNATE RECORD KEY NOM-IND WITH DUPLICATES ALTERNATE RECORD KEY ANAISS-IND WITH DUPLICATES. DATA DIVISION. FILE SECTION. FD FETUD. O1 ETUDIANT. 02 NUM PIC NOM PIC X(20). 02 PRENOM PIC X(20). 02 ADRESSE PIC X(40). 02 ANAISS PIC 9(4). FD FETUD-IND-CRE. O1 ETUDIANT-IND-CRE. 02 NUM-IND-CRE PIC NOM-IND-CRE PIC X(20). 02 PRENOM-IND-CRE PIC X(20). 02 ADRESSE-IND-CRE PIC X(40). 02 ANAISS-IND-CRE PIC 9(4). FD FETUD-IND. O1 ETUDIANT-IND. 02 NUM-IND PIC 999. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 32 / 95
17 02 NOM-IND PIC X(20). 02 PRENOM-IND PIC X(20). 02 ADRESSE-IND PIC X(40). 02 ANAISS-IND PIC 9(4). WORKING-STORAGE SECTION. O1 ETUDIANTW. 02 NUMW PIC NOMW PIC X(20). 02 PRENOMW PIC X(20). 02 ADRW PIC X(40). 02 ANAISSW PIC 9(4). 77 NOM-CLE PIC X(20). 77 NUM-CLE PIC CHOIXMENU PIC X. 88 QUITTE VALUE "Q" "q". 88 CHOIX-OK VALUE "Q" "q". 77 FINFIC PIC A. 88 FINFIC VALUE "O". 88 PASFINFIC VALUE "N". 77 SUIVANT PIC A. 88 SUIVANT VALUE "S" "s". 88 QUITTER VALUE "Q" "q". 77 AUTRECLE PIC A. 88 AUTRECLE VALUE "O" "o". 88 PASAUTRECLE VALUE "N" "n". 77 EXISTE PIC A. 88 EXISTE VALUE "O". 88 NONEXISTE VALUE "N". NB : les noms de variables ne satisfont aux critères de qualité que nous présentons dans le chapitre consacré aux liens entre COBOL et le génie logiciel. Une version améliorée de cet exemple est repris dans ce dernier chapitre (voir normes de programmation). COBOL, un langage de programmation 5. Coder l'algorithme Les diverses instructions COBOL que nous avons choisi de présenter sont décrites dans cette partie. Elles sont rangées en cinq paquets, chacun ayant une fonction précise. On trouve ainsi des instructions permettant : de contrôler la structure du programme (IF, EVALUATE, PERFORM), de calculer (COMPUTE, ADD, SUBTRACT, MULTIPLY, DIVIDE), de manipuler des variables (MOVE), de dialoguer (ACCEPT, DISPLAY), d effectuer des entrées-sorties (OPEN, CLOSE, READ, WRITE, REWRITE, DELETE, START). 5.1 Instructions de contrôle Généralités Dans ce premier paquet, nous avons placé trois instructions conditionnelles parmi les plus utilisées, à savoir l'alternative (IF), la structure de choix (EVALUATE) et l'appel de module (PERFORM). Plus généralement, il existe une vingtaine d'instructions dites conditionnelles. Ce sont des instructions qui ont comme caractéristiques : de contenir au moins une condition, de devoir être délimitées, soit par un délimiteur (END-xxx), soit par un point. La logique qui prévaut pour ces conditionnelles est traditionnelle, dans le sens où : 15/12/05 la condition est testée ; - si elle est vraie, l'instruction (ou le paquet d'instructions) est (sont) exécutée(s). L'instruction suivante est ensuite exécutée. - si elle est fausse, il y a exécution de l instruction suivant la conditionnelle A propos de conditions Il y a des conditions simples et des conditions composées. Les conditions composées sont obtenues par combinaison de conditions simples à l'aide des opérateurs logiques AND, OR, NOT. En cas de formules complexes, il est utile de recourir au parenthèsage. Une condition simple permet de comparer des variables entre elles ou par rapport à des constantes (>, =, <, >=, <=, <>), de tester le format d'une variable (ALPHABETIC, NUMERIC), de tester le signe d'une variable unique (POSITIVE, NEGATIVE, ZERO) et de tester une valeur particulière en utilisant les variables définies en 88 : 01 WPERSONNE. 02 WETATCIVIL PIC "X". 88 MARIE VALUE "M". 88 CELIBATAIRE VALUE "C". 88 AUTRE VALUE "D" "P". Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 33 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 34 / 95
18 . On pourra ainsi utiliser IF MARIE au lieu de IF WETATCIVIL = "M". Il est possible de nommer une plage de valeurs (prises par des variables qui peuvent évoluer de façon continue). Ainsi pourra-t-on classer les personnes en fonction de leur âge, comme suit : 01 WPERSONNE. 02 WAGE PIC ENFANT VALUE 0 THRU ADO VALUE 6 THRU ADULTE VALUE 18 THRU SENIOR VALUE 80 THRU ANOMALIE VALUE 110 THRU 999. Il existe, enfin, d'autres conditions, de type événementiel, qui sont associées à chaque instruction conditionnelle (AT END pour l'ordre de lecture dans un fichier, ON SIZE ERROR pour un ordre de calcul...). Elles sont vues avec ces instructions Ordre IF L'ordre IF a la syntaxe suivante : IF Condition THEN Instructions1 [ELSE Instructions2] END-IF La condition peut être simple ou composée, parenthèsée ou non. La série d'instructions 1, comme la série 2, est constituée d'instructions non délimitées par un point. Elles peuvent contenir des instructions conditionnelles, dès l'instant où celles-ci sont terminées par les délimiteurs appropriés (END-xxx) et pas par des points. Ceux-ci jouent, en effet, le rôle de super-delimiteur, un seul suffisant à "fermer" (souvent mal!) toute une série de conditionnelles imbriquées les unes dans les autres Ordre EVALUATE L'instruction EVALUATE a plusieurs syntaxes possibles. Voici la plus courante : EVALUATE Nom-variable WHEN Constante1 Instructions1 [WHEN Constante2 Instructions2] [WHEN OTHER InstructionsN] END-EVALUATE Son comportement est le suivant : le contenu de la variable est évalué. S'il est égal à la valeur Constante1, la série d'instructions 1 est exécutée ; s'il est égal à la constante 2, c'est la série d'instructions 2 qui est exécutée... S'il n'est égal à aucune des valeurs mentionnées, la série d'instructions N est exécutée. Dans tous les cas, une fois le "bon" paquet exécuté, il y a saut à l'instruction qui suit EVALUATE. EVALUATE WCHOIX WHEN "A" PERFORM PAR-A WHEN "B" PERFORM PAR-B WHEN "Q" DISPLAY "AU REVOIR" WHEN OTHER DISPLAY "ERREUR" END-EVALUATE. Il est toujours possible (mais non souhaitable) de remplacer un EVALUATE par une série de IF imbriqués : ou, sans les décalages : IF WCHOIX = "A" THEN PERFORM PAR-A ELSE IF WCHOIX = "B" THEN PERFORM PAR-B ELSE IF WCHOIX = "Q" THEN DISPLAY "AU REVOIR" ELSE DISPLAY "ERREUR" END-IF END-IF END-IF. IF WCHOIX = "A" THEN PERFORM PAR-A ELSE IF WCHOIX = "B" THEN PERFORM PAR-B ELSE IF WCHOIX = "Q" THEN DISPLAY "AU REVOIR" ELSE DISPLAY "ERREUR" END-IF Ordre PERFORM L'ordre PERFORM est un des ordres les plus utilisés en COBOL pour produire des programmes structurés. Il permet d'exprimer plusieurs ruptures de séquence : une boucle Tantque, avec le PERFORM UNTIL, une boucle Pour, avec le PERFORM VARYING, une boucle Répéter, avec le PERFORM WITH TEST AFTER, une sorte d appel de sous-programme interne, avec ce que nous appelons le PERFORM «simple». NB : il ne s'agit pas d'un vrai appel de sous-programme, celui-ci s'effectuant via l'instruction CALL (vue dans la partie Extensions, paragraphe Sous-programmes). Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 35 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 36 / 95
19 Avant de passer en revue ces diverses options, "deux" mots sur la notion de paragraphe. A- À propos de paragraphes Un paragraphe, dans un programme COBOL, c'est une série d'instructions qui : a un nom, déclaré en zone A, se termine soit par la fin du programme, soit par le début du paragraphe suivant. PROCEDURE DIVISION. DEBUT. Instruction A Instruction B Instruction C. BOUCLE. Instruction D Instruction E. FIN. Instruction F Instruction G. Dans ce programme, il y a trois paragraphes, DEBUT, BOUCLE et FIN. DEBUT a trois instructions, A, B et C. BOUCLE en a deux, D et E. Le dernier, FIN, comprend les instructions F et G. Pour rendre encore plus claire la portée d'un paragraphe XXX, certains programmeurs adoptent la pratique qui consiste à ajouter des paragraphes "vides", ne contenant que l'instruction EXIT (elle ne fait rien...) et ayant pour nom FIN-XXX : PROCEDURE DIVISION. DEBUT. Instruction A Instruction B Instruction C. FIN-DEBUT. EXIT. BOUCLE. Instruction D Instruction E. FIN-BOUCLE. EXIT. FIN. Instruction F Instruction G. FIN-FIN. EXIT. B- Le PERFORM "simple" L'ordre PERFORM "simple" a la syntaxe suivante : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 37 / 95 PERFORM Nom-paragraphe1 [THRU Nom-paragraphe2] L'effet de cet ordre est d'exécuter toutes les instructions comprises dans le paragraphe 1, ainsi que celles qui sont comprises dans les paragraphes suivants jusqu'à la fin du paragraphe 2 si la clause THRU est présente. PERFORM BOUCLE PERFORM BOUCLE THRU FIN-BOUCLE PERFORM DEBUT THRU BOUCLE Il y a une deuxième forme possible pour ce PERFORM "simple" : PERFORM Instructions END-PERFORM D, E D, E, EXIT soit D, E A, B, C, EXIT, D, E soit A, B, C, D, E Les instructions contenues entre les mots PERFORM et END-PERFORM ne doivent pas être délimitées par des points. PERFORM PARA THRU PARB. PARA. Instruction A. PARB. Instruction B. PERFORM Instruction A Instruction B END-PERFORM. Ces deux schémas de traduction sont équivalents. C- Le PERFORM comme un Tantque Si l'on ajoute au PERFORM "simple" la clause UNTIL condition, on a une boucle Tantque. La syntaxe de ce PERFORM est la suivante : PERFORM Nom-paragraphe1 [THRU Nom-paragraphe2] UNTIL Condition Il s'agit réellement d'une boucle Tantque : la condition est testée AVANT exécution du (ou des) paragraphe(s). Si elle est vérifiée, il y a exécution. Sinon, la série d'instruction est sautée. Comme pour le PERFORM "simple", on peut regrouper les instructions et les insérer entre PERFORM et END- PERFORM : PERFORM UNITL WFIN = "V" Instruction A Instruction B Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 38 / 95
20 END-PERFORM. Les programmeurs confirmés et les étudiants ayant un minimum de connaissances en algorithmique le savent, une boucle Tantque est une structure de contrôle qui permet d effectuer une suite d opérations tant qu une condition, dite condition de fin, est vérifiée. On peut la paraphraser en disant «tant que la condition est vraie, faire» et la représenter ainsi : NB : la forme avec END-PERFORM est également autorisée. Voici comment, par exemple, on peut exécuter 52 fois un paragraphe AFFICHAGE : PERFORM AFFICHAGE VARYING WI FROM 1 BY 1 UNTIL WI > 52. WI étant une variable déclarée avec le format 99. COBOL utilise l instruction de contrôle PERFORM UNTIL pour exprimer cette itération. Une traduction litérale de ces deux termes donne «faire jusqu à». Le titre de notre paragraphe (le PERFORM comme un Tantque) est donc un peu exagéré. Nous aurions sans aucun doute dû dire «Le PERFORM comme un DOWHILE». D- Le PERFORM comme un Répéter Si l'on rajoute au PERFORM précédent (celui qui correspond à une boucle Tantque) la clause WITH TEST AFTER, la boucle Tantque se transforme en une boucle Répéter. La syntaxe du PERFORM modélisant un Répéter est donc : PERFORM Nom-paragraphe1 [THRU Nom-paragraphe2] WITH TEST AFTER UNTIL Condition ou encore : PERFORM WITH TEST AFTER UNTIL Condition Instructions END-PERFORM Si le précédent PERFORM exprime un DO WHILE et celui-ci un REPEAT, quelle est donc la différence entre les deux? Elle est simple et fondamentale : dans le premier cas (le DO WHILE, le Tantque), le test est effectué AVANT d entrer dans la boucle ; dans le second (le REPEAT, le Répéter), le test est effectué APRÈS être entré dans la boucle ; dans le premier cas, le test porte sur la NON-condition ; dans le second, le test porte sur la condition. E- Le PERFORM comme un Pour Il est possible de représenter une boucle Pour avec un PERFORM, en utilisant l'option VARYING. Celle-ci s'écrit comme suit : VARYING Nom-variable1 FROM Nom-variable2 BY Nom-variable3 syntaxe dans laquelle Nom-variable2 et Nom-variable3 (PAS 1) peut être une variable ou une constante. Le PERFORM boucle Pour s'écrit donc : PERFORM Nom-paragraphe1 [THRU Nom-paragraphe2] VARYING Nom-variable1 FROM Nom-variable2 BY Nom-variable3 UNTIL Condition Voici, enfin, comment parcourir A L'ENVERS un tableau (pour plus de précisions sur ces tableaux, voir la partie Extensions, paragraphe Tableaux) : PERFORM VARYING WI FROM 15 BY 1 UNTIL WI = 0 Instructions avec TAB (WI) END-PERFORM. NB : il existe une forme encore plus complexe de PERFORM, permettant de manipuler des tableaux à 2 ou 3 dimensions. Elle est décrite dans le paragraphe Tableaux de la partie Extensions. F- A propos d'imbrications de PERFORM Il est possible d'imbriquer ces PERFORM à la condition qu'il s'agisse vraiment d'imbrication. Dès l'instant où les paragraphes imbriqués ont une intersection non nulle, l'imbrication devient impossible. Pour prendre une image, les poupées russes OUI, les anneaux olympiques NON. Lorsque l instruction PERFORM est imbriquée dans une autre instruction PERFORM, il est parfois possible d omettre le END-PERFORM «intérieur» : Figure n Instructions de calcul Généralités Il y a cinq instructions dans ce paquet, quatre spécifiques et une généraliste. Les instructions spécifiques permettent de mettre en oeuvre les quatre opérations, addition, soustraction, multiplication et division. La dernière, COMPUTE, peut servir pour tout type d'opération. Dans tous les cas, deux clauses permettent de prendre en compte les exceptions, qu'il s'agisse d'arrondi (clause ROUNDED) ou de dépassement de capacité (clause ON SIZE ERROR). Leur syntaxe est la suivante : ROUNDED ON SIZE ERROR InstructionsN Le dépassement de capacité survient lorsque le résultat du calcul ne peut être stocké dans la variable prévue pour "accueillir" le résultat (overflow), lors d'une division par zéro... Si tel est le cas, la séquence d'instruction InstructionN est exécutée. La variable résultat ne reçoit pas la valeur erronée... ce qui évite le dépassement de capacité. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 39 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 40 / 95
21 Dans la mesure où l'utilisation de cette option ON SIZE ERROR transforme l'instruction en une conditionnelle, il est nécessaire de recourir aux délimiteurs (END-ADD pour l'addition, END-MULTIPLY pour la multiplication...). Il est alors inutile (et même interdit) de mettre des points après les diverses instructions du bloc InstructionsN. Entre un ordre spécifique (ADD, par exemple) et l'ordre COMPUTE, lequel choisir? Le général -ie. COMPUTE- est forcément plus lent que le spécifique -ie. le ADD-. C'est la raison pour laquelle, au début du moins, cet ordre n'était que rarement utilisé dans les programmes. Les progrès de la technique ont balayé cet argument. La seule raison valable, à notre avis, pour privilégier le COMPUTE sur les autres ordres de calcul, est double : seul le COMPUTE permet d'exprimer en une seule instruction des expressions arithmétiques complexes ; l'utilisation d'un seul ordre de calcul (COMPUTE en l'occurrence) augmente la lisibilité du programme et, par là, facilite sa maintenance par les autres programmeurs Ordre COMPUTE La syntaxe de cet ordre est la suivante : COMPUTE Nom-variable = expression arithmétique Les expressions arithmétiques comprennent des variables élémentaires, des constantes, des opérateurs... tout ce que l'on peut trouver dans une telle expression. L'ordre d'évaluation est, par défaut, de gauche à droite. Les priorités entre opérateurs sont les suivantes : 1) parenthèses, 2) puissance (**), 3) multiplcation et division (* et /), 4) addition et soustraction (+ et -). En cas de doute, nous conseillons le recours au parenthèsage. La variable résultat (elle est située à gauche du signe =) et celles impliquées dans l'expression doivent être déclarées avec un format numérique (simple ou édité). Quelques exemples pour "finir" : Ordre ADD Une addition se définit comme suit : COMPUTE WA = WA + 1. COMPUTE WTOTAL = (A + B) / C. ADD Opérande1, Opérande2 TO Variable K, Variable J Tous les opérandes situés avant le mot TO sont additionnés, le résultat étant AJOUTÉ au contenu des variables mentionnées après. ADD 1 to WLIGNE. WLIGNE = WLIGNE + 1 ADD WA, WB TO WC. WC = WC + WA + WB Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 41 / Ordre SUBTRACT La syntaxe de cet ordre est la suivante : SUBTRACT Opérande1, FROM Variable K, Variable J ATTENTION, il n'y a pas de S dans l'ordre SUBTRACT! Tous les opérandes situés avant le mot FROM sont additionnés et le résultat est enlevé du contenu des variables situées après le mot FROM. SUBTRACT WA, 2 FROM WTOTAL. WTOTAL = WTOTAL - (WA + 2) WI = WI - 1 SUBTRACT 1 FROM WI, WJ. WJ = WJ - 1 Il y a une autre syntaxe possible : SUBTRACT Opérande1, Opérande2 FROM VariableN -- GIVING Nom-variableK, Nom-variableJ Les opérandes situés avant le mot FROM sont additionnés ; le résultat est retranché du contenu de la variable N et stocké dans les variables situées après le mot GIVING Ordre MULTIPLY La multiplication s'exprime par MULTIPLY, ayant pour syntaxe : MULTIPLY Opérande1 BY Variable K, Variable J Les contenus des variables situées après le mot BY sont multipliés par la valeur de l'opérande 1 ; le résultat est remis dans les variables. MULTIPLY 2 BY WI, WJ. WI = WI * 2 WJ = WJ * 2 Il est, là aussi, possible de définir la variable qui récupère le résultat en ajoutant GIVING Nom VariableN : MULTIPLY 2 BY WI GIVING WTOTAL. WTOTAL = WI * Ordre DIVIDE La division, en COBOL, c'est l'ordre DIVIDE, dont la syntaxe correspond à ceci : DIVIDE Opérande1 INTO Variable K, Variable J Les variables K, J... sont divisées par le contenu de l'opérande 1 : DIVIDE WA INTO WB, WC. WB = WB / WA WC = WC / WA Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 42 / 95
22 L'option GIVING permet de stocker le résultat de la division sans altérer la valeur du dividende : Numérique édité NON OUI OUI OUI OUI DIVIDE WA INTO WB GIVING WTOTAL. WTOTAL = WB / WA (1) le champ doit contenir des lettres et/ou des espaces. 5.3 Instructions de manipulation de données L'instruction MOVE est une des pierres angulaires d'un programme COBOL. Il en existe deux formes, une simple et une "complexe" qui permet de déplacer plusieurs zones à la fois. Avant de les détailler, nous expliquons pourquoi il faut effectuer ces mouvements de variables et recensons les déplacements autorisés et ceux qui ne le sont pas Généralités On peut se demander pourquoi manipuler des variables. La première des raisons tient à ce qui correspond à l'essence même des programmes COBOL. Ceux-ci, dans une très large majorité, reçoivent des données de l'extérieur (ie. d'un utilisateur), les transforment puis, soit les retournent à l'extérieur, soit les stockent sur un fichier, soit les deux. En première approximation, on peut donc voir un programme COBOL comme une manipulation de données. Celles-ci sont d'abord dans une zone de saisie ; elles sont ensuite traitées, manipulées, transformées... dans une zone de travail. Elles vont ensuite "partir" dans un fichier ou sur un écran et donc être déposées dans une zone d'écriture (le tampon associé au fichier) ou une zone d'affichage. On pourrait donc dire en caricaturant qu'il n'y a pas de donnée qui ne soit manipulée. La deuxième raison est que ce mouvement peut permettre un changement de format. Les exemples de ceci abondent. Nous n'en citerons qu'un seul : lors de la saisie d'une zone, il est fréquent que l'on stocke provisoirement la donnée recueillie dans une zone de format alphanumérique (ce format acceptant n'importe quel caractère, il n'y aura aucun incident de saisie), puis, après vérification, que l'on transfère la donnée correcte dans une zone plus appropriée avec un "meilleur" format Mouvements autorisés / interdits Le déplacement (du contenu) d'une variable dans une autre peut être l'occasion d'un changement de format. Les mouvements se font en respectant des règles de cadrage. Les données numériques se "calent" sur la virgule s'il y en a une ou sur la position la plus à droite s'il n'y en a pas. Les différences de taille se soldent par une troncature (zone de réception plus petite que la zone d'émission) ou par un remplissage avec des zéros (zone de réception plus grande que la zone d'émission). Les données alphabétiques ou alphanumériques se "calent" sur la gauche (sauf si le contraire est demandé). Les différences de taille se soldent par une troncature ou par un remplissage par des espaces. Tous les types de déplacements ne sont pas autorisés. Le tableau ci-après donne les mouvements autorisés, le sens de lecture de celui-ci étant gauche-droite. Alphabétique Alphanumérique Alphanumérique Numérique Numérique édité édité Alphabétique, SPACE OUI OUI OUI NON NON Alphanumérique, constantes non OUI (1) OUI OUI NON OUI (2) numériques Alphanumérique édité OUI (1) OUI OUI NON NON Numérique, ZERO, NON OUI (3) OUI (3) OUI OUI constantes numériques Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 43 / 95 (2) le champ alphanumérique doit contenir un entier non signé. (3) la constante doit être un nombre entier. Ce tableau indique, par exemple, que le déplacement d'une variable de format numérique ne peut pas se faire si la variable réceptrice a un format alphabétique. Il dit aussi que l'inverse (d'une variable alphabétique vers une variable numérique) est interdit Ordre MOVE "simple" L'instruction MOVE a la syntaxe suivante : MOVE Opérande1 TO Variable2, Variable3 L'opérande 1 peut être une variable ou une constante. Le contenu des variables situées après le mot TO est remplacé par celui de l'opérande 1. Si cet opérande 1 est une structure, son contenu est transféré EN BLOC, avec un cadrage à gauche et ce quelque soit le format des variables élémentaires qui composent la structure Ordre MOVE "complexe", simultané Il existe une autre forme pour cette instruction MOVE : MOVE CORRESPONDING Structure1 TO Structure2, Structure3 Toutes les variables doivent nécessairement être des structures et avoir au moins une variable élémentaire en commun (ie. ayant le même nom). Ce MOVE "complexe" fonctionne comme ceci : toutes les variables élémentaires de Structure1 qui sont également dans Structure2 sont déplacées (leur contenu est stocké dans les variables élémentaires de même nom de Structure2). Toutes les variables élémentaires de Structure1 qui sont également dans Structure3 sont déplacées dans Structure3... Prenons un exemple pour mieux illustrer l'effet de cette instruction. Soient les deux structures suivantes : 02 ZONEA. 03 PIECE PIC. 03 QUANTITE PIC. 03 STOCK PIC. 03 DISPONIBLE PIC X. 01 ZONEB. 02 STOCK PIC. 02 PIECE PIC. 02 PRIX PIC. NB : nous avons à dessein pris des structures différentes (tant par leur niveau que par leur contenu). L'instruction MOVE CORRESPONDING ZONEA TO ZONEB aura pour effet de réaliser l'algorithme suivant : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 44 / 95
23 ZONEB.PIECE := ZONEA.PIECE ZONEB.STOCK := ZONEA.STOCK ZONEB.PRIX := ZONEB.PRIX On touche ici les dividendes du partage de noms pour des variables. Le prix à payer pour ce partage est la qualification. Le gain est le mouvement simultané. 5.4 Instructions de dialogue Le dialogue avec l'utilisateur se fait grâce à deux instructions permettant l'affichage sur écran (ordre DISPLAY) et la saisie de données frappées au clavier (ordre ACCEPT). Cette dernière instruction permet également de "dialoguer" avec le système et de récupérer dans le programme la date. Toutes les variables que nous allons associer à ces deux ordres doivent être décrites soit dans la section des fichiers dans un des tampons associés à ceux-ci, soit comme une variable de travail en WORKING-STORAGE SECTION. Nous ne montrons pas ici de mécanismes sophistiqués de manipulation d'écrans de saisie, ceci étant abordé dans les extensions, dans la partie consacrée aux écrans Ordre ACCEPT A- Dialogue avec l'utilisateur L'ordre ACCEPT respecte la syntaxe suivante : ACCEPT Nom-donnée L'exécution de cet ordre provoque la mise en attente du programme jusqu'à ce que l'utilisateur presse la touche ENTREE du clavier. Il y a alors transfert de ce qui a été saisi dans la variable de nom Nom-donnée, sans contrôle du contenu. Ceci signifie que, si la zone de réception (ie. Nom-donnée) est numérique et si des caractères alphabétiques sont saisis, une erreur peut survenir (cela dépend des compilateurs et des ordinateurs). Il est donc prudent de récupérer ces informations saisies dans une zone alphanumérique, puis d'en tester le type (par un IF) et, enfin, si le résultat est conforme à ce qui est attendu, d'en transférer le contenu dans une zone déclarée avec le "bon" format. 77 WZONE PIC XXX. 77 WZONE-OK PIC 99. ACCEPT WZONE. IF WZONE NUMERIC THEN MOVE WZONE TO WZONE-OK ELSE END-IF. La variable servant de réceptable doit être déclarée comme une variable élémentaire ou comme une structure. Dans ce dernier cas, les variables composant la structure doivent être saisies les unes après les autres, sans séparateurs entre elles. Si, par exemple, cette structure comprend une zone de 15 caractères suivie d'une zone de 2 chiffres, l'utilisateur devra effectivement taper les quinze caractères (TOUS) avant de fournir les chiffres. Il y a une procédure plus ergonomique, présentée dans les extensions. Tel qu'il est, cet ordre place le curseur indiquant qu'une saisie est attendue sur la ligne courante et la colonne courante. S'il s'agit du premier accès à l'écran, la position correspondra à la ligne 1 et à la colonne 1. Si l'ordre vient après un ordre d'affichage, la ligne courante est celle sur laquelle l'affichage a eu lieu, la colonne courante étant celle qui suit le dernier caractère affiché. Il est possible de modifier ce comportement en précisant le numéro de la ligne et/ou le numéro de la colonne sur lesquelles le curseur doit se positionner. Ceci se fait en employant la clause AT : ACCEPT Nom-donnée [AT [LINE NUMBER Numéro-ligne1] [COL NUMBER Numéro-colonne1]] Numéros de ligne et de colonne peuvent être des constantes ou bien des variables de travail (déclarées en PIC 99). Il existe une forme contractée : ACCEPT Nom-donnée [AT Numéro-variable] la variable Nom-variable étant une structure composée de deux variables, une pour la ligne, une pour la colonne, définies comme suit : 01 WPOSITION. 02 WLIG PIC WCOL PIC 99. ou bien comme ceci : 77 WPOSITION PIC 9(4). Il est, enfin, possible d'écrire directement les valeurs : ACCEPT WZONE AT cet ordre positionnant le curseur ligne 15, colonne 28. B- Dialogue avec le système Le dialogue avec le système se résume en une récupération de la date et/ou de l'heure, obtenue(s) grâce à la syntaxe suivante : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 45 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 46 / 95
24 ACCEPT Nom-donnée FROM DATE permet d'obtenir la date sous la forme AAMMJJ. La variable Nom-donnée doit être déclarée en 9(6) -elle sera alors déplacée dans une structure- ou directement dans une structure. ACCEPT Nom-donnée FROM DAY permet d'obtenir la date sous la forme AAJJJ. La variable Nom-donnée doit être déclarée en 9(5) -elle sera alors déplacée dans une structure- ou directement dans une structure. ACCEPT Nom-donnée FROM TIME permet d'obtenir la date sous la forme HHMMSSSS. La variable Nom-donnée doit être déclarée en 9(8) -elle sera alors déplacée dans une structure- ou directement dans une structure. ACCEPT Nom-donnée FROM DAY-OF-WEEK permet d'obtenir le jour de la semaine. La variable Nom-donnée doit être déclarée en PIC 9, le lundi étant associé à la valeur 1 et le dimanche à la valeur WLADATE. 02 WANNEE PIC WMOIS PIC WJOUR PIC Ordre DISPLAY ACCEPT WLADATE FROM DATE. L'affichage sur l'écran est commandé par l'instruction DISPLAY, sa syntaxe étant l'une de suivantes : DISPLAY Nom-donnée DISPLAY Constante DISPLAY Nom-donnée[, Constante ] Le contenu de la ou des données sera affiché à partir de la dernière position atteinte par le curseur, contenu après contenu SANS ESPACE de séparation. Comme pour l'ordre de saisie, il est possible d'agir sur la position du curseur, en utilisant la clause AT. DISPLAY WZONE. DISPLAY WZONE AT DISPLAY WZONE LINE 15 COL 28. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 47 / 95 DISPLAY "NOM CLIENT : ", WNOM LINE 10 COL 5. De nombreuses options (affichage inversé, sonnerie, clignotement...) sont disponibles. Elles sont recensées dans la partie Extensions. Nous n'en présentons qu'une seule ici, celle qui permet d'effacer l'écran ou la ligne AVANT l'affichage : DISPLAY WZONE. affiche le contenu de WZONE sans effacement préalable. DISPLAY WZONE WITH BLANK LINE. efface la ligne PUIS affiche le contenu de WZONE. DISPLAY WZONE WITH BLANK SCREEN. efface l'écran PUIS affiche le contenu de WZONE. Pour les autres options, se reporter à la partie Extensions. 5.5 Instructions d'entrées-sorties Le but premier d'un programme COBOL, outre la manipulation de données, étant la lecture et l'écriture de fichiers, le nombre d'instructions relatives à ce qu'il est convenu d'appeler les entrées-sorties est plus important que celui de tout autre paquet. Nous en avons retenu sept, que nous avons regroupées en fonction du type de traitement mis en oeuvre : les ordres d'ouverture et de fermeture (OPEN et CLOSE), les ordres de lecture et d'écriture (READ, WRITE) que nous développons aussi bien pour des accès séquentiels que pour les autres, les ordres de récriture et de suppression (REWRITE, DELETE) qui ne servent que dans le cas de fichiers en accès non séquentiel, enfin, l'ordre START qui ne s'employe que dans le cas, particulier, de fichiers en organisation séquentielle-indexée avec clés secondaires. Comme nous l'avons fait dans la présentation des autres groupes d'instructions, nous commençons celle-ci par des généralités (sur la notion d'enregistrement, sur l'ouverture et la fermeture des fichiers et sur le fonctionnement global standard des instructions d'entrées-sorties) Généralités Ce qui gêne le plus le programmeur débutant lorsqu'il "attaque" un programme COBOL, c'est la notion même d'enregistrement. Savoir qu'en une seule manipulation on peut récupérer toute une structure ne lui est pas familier. Nous consacrons donc la première partie de ce paragraphe à un (bref) rappel de cette notion d'enregistrement. Fermer, ouvrir un fichier est une opération évidente en COBOL. Il arrive même qu'on le fasse plusieurs fois. Nous traitons de ces actions dans la deuxième partie. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 48 / 95
25 Nous terminons ces généralités en expliquant le fonctionnement global de ces instructions d'entrées-sorties, basé sur la notion de fourniture et de compte-rendu. A- À propos d'enregistrement Il est important de se rappeler que l'unité de traitement d'un fichier est l'enregistrement. En une seule opération de lecture, la totalité du contenu de cet enregistrement est transférée du fichier en mémoire. Si cet enregistrement est structuré en sept parties, il est inutile de procéder à sept lectures ; une seule suffit. Le découpage s'effectue plus tard, grâce à la définition du tampon et aux mouvements de données (par des MOVE, notamment). À l'inverse, lors d'une écriture, il faut transférer tous les champs composant l'enregistrement en un seul ordre d'écriture. Le tampon a donc été AU PRÉALABLE rempli autant de fois que nécessaire, là encore par des MOVE, des ACCEPT ou toute autre instruction adéquate. Tous les fichiers que nous manipulons dans ce cours ayant des enregistrements de longueur fixe correspondant à la même structure, il est nécessaire que la description du tampon soit le reflet exact, AU CARACTÈRE PRÈS, de la structure de l'enregistrement du fichier. B- Ouverture et fermeture Un fichier fermé est un fichier en sécurité. À l'inverse, un fichier ouvert est un fichier sur lequel on peut opérer des transformations. Le mode d'ouverture du fichier conditionne le travail qui peut être effectué sur ses enregistrements. De ces quelques éléments, il faut retenir ceci : un programme commencera toujours par ouvrir les fichiers ; il se terminera nécessairement par leur fermeture ; lorsqu'un fichier doit subir plusieurs interventions nécessitant plusieurs ouvertures, il sera nécessaire de fermer le fichier avant de le rouvrir. On pourra donc avoir des programmes dans lesquels on trouvera, par exemple, une ouverture en lecture, une fermeture, une ouverture en extension, puis, enfin, une fermeture. Ce type de programme est typique d'un ajout d'éléments à la fin d'une séquence, avec reprise de numéros. C- Comportement global Toutes les instructions de manipulation de fichiers (READ, WRITE, REWRITE, DELETE, START) sont construits sur le même modèle, celui du fournisseur et du compte-rendu. En tant que fournisseur, l'instruction remplit un rôle (fournir un enregistrement du fichier et le déposer dans un endroit convenu à l'avance, prendre le contenu du tampon à un endroit convenu et le ranger dans le fichier...). S'il ne peut le faire, il rend compte. Dans ce dernier cas, le tampon n'est pas concerné. Cette impossibilité de remplir le contrat se gère dans le programme grâce à la variable status (celle qui est déclarée par la clause FILE-STATUS) et grâce à la conditionnelle qui est associée à chaque ordre d'entrée-sortie. Il appartient au programmeur de vérifier, après l'exécution de l'instruction, si l'entrée-sortie s'est bien passée Ouvrir et fermer un fichier A- Ordre OPEN Il y a quatre modes d'ouverture d'un fichier : lecture, écriture, mise-à-jour et extension. Dans ce dernier cas, le curseur se positionne à la fin du fichier, ce qui permet d'ajouter des éléments dans le fichier (séquentiel) tout en conservant ceux qui sont avant. La position du curseur change selon le mode d'organisation du fichier. S'il s'agit d'un fichier organisé en séquentiel, les trois premiers modes d'ouverture voient le curseur placé sur le premier enregistrement, le dernier correspondant au placement à la fin. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 49 / 95 S'il s'agit d'un fichier en organisation séquentielle-indexée, le curseur se positionne sur le premier enregistrement de la table d'index. Dans le cas d'une organisation relative, la fonction de calcul est initialisée, le curseur contenant alors l'adresse du premier enregistrement potentiel du fichier. La syntaxe de l'ordre OPEN est la suivante : OPEN Mode1 Nom-fichier1, Nom-fichier2 [Mode2 Nom-fichierK, Nom-fichierJ ] Mode1 et Mode2 peuvent prendre une des quatre valeurs ci-après : lecture écriture mise-à-jour extension INPUT OUTPUT INPUT-OUTPUT EXTEND Cette dernière valeur n'est possible que pour des fichiers organisés en séquentiel. NB : certains compilateurs acceptent une format contractée pour le mode d'ouverture, I-O (à la place de INPUT- OUTPUT). OPEN INPUT FETUD, FLIVRE OUTPUT FRETARD INPUT-OUTPUT FPRET. Dans l'exemple précédent, les fichiers FETUD et FLIVRE sont ouverts en lecture, FRETARD en écriture et FPRET en mise-à-jour. ATTENTION, dans le cas d'un fichier organisé en séquentiel, une ouverture en écriture d'un fichier existant déjà a pour effet d'écraser TOUS les anciens enregistrements. B- Ordre CLOSE La fermeture d'un ou de plusieurs fichiers est réalisée grâce à l'instruction CLOSE, dont la syntaxe est la suivante : CLOSE Nom-fichier1, Nom-fichier Lire et écrire dans un fichier Il y a trois façons de lire dans un fichier : la lecture séquentielle des enregistrements (READ AT END), la lecture directe (READ INVALID KEY), la lecture séquentielle via les clés secondaires (READ NEXT), et deux d'y écrire : l'écriture séquentielle (WRITE), l'écriture directe (WRITE INVALID KEY). Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 50 / 95
26 Dans tous les cas, les instructions (sauf la dernière) peuvent être transformées en conditionnelles, qu'il faut délimiter. Ceci se fait soit par un point à la fin de la dernière instruction de la séquence à exécuter si la condition est vraie, soit par les deux mots END-READ ou END-WRITE. Dans ce dernier cas, il ne doit pas y avoir de point après les instructions. Chaque instruction READ propose une clause conditionnelle et son contraire : READ AT END NOT AT END READ INVALID KEY NOT INVALID KEY A- Ordre READ AT END La syntaxe de l'ordre READ AT END est la suivante : READ Nom-fichier [INTO Nom-variable] [AT END Instructions1] [NOT AT END Instructions2] [Délimiteur] L'effet de l'exécution de cette instruction est le suivant : Si le curseur du fichier est positionné sur un enregistrement, celui-ci est placé dans le tampon du fichier (cette zone est définie dans la section des fichiers) et le curseur est décalé d'une position vers la fin ; la variable status, si elle existe, contient le compte-rendu de l'opération. Les instructions mentionnées après la clause NOT AT END, si elle existe, sont exécutées. Si le curseur du fichier est positionné sur la fin du fichier, le tampon n'est pas touché, les instructions situées après la clause AT END sont exécutées. Le curseur ne bouge pas. La variable status est modifiée et reçoit le contenu de l'opération. C'est l'ordre OPEN, rappelons-le, qui positionne initialement le curseur. Si la clause INTO Nom-variable est présente, l'enregistrement est placé dans le tampon et dans la variable. READ INTO correspond donc à un READ suivi d'un MOVE. L'ordre READ doit être précédé d'une instruction OPEN, en lecture (INPUT) ou en mise-à-jour (INPUT- OUTPUT). Le délimiteur peut être un point ou les deux mots END-READ. Dans les deux cas, sauf indication contraire, l'instruction suivant le READ sera exécuté. B- Ordre READ INVALID KEY La syntaxe de l'ordre READ INVALID KEY est la suivante : READ Nom-fichier [INTO Nom-variable] [INVALID KEY Instructions1] [NOT INVALID KEY Instructions2] [Délimiteur] L'effet de l'exécution de cette instruction est le suivant : Si la clé "pointe" sur un enregistrement existant, celui-ci est placé dans le tampon du fichier (cette zone est définie dans la section des fichiers) ; la variable status, si elle existe, contient le compte-rendu de l'opération. Les instructions mentionnées après la clause NOT INVALID KEY, si elle existe, sont exécutées. Si la clé ne "pointe" pas sur un enregistrement existant, le tampon n'est pas touché, les instructions situées après la clause INVALID KEY sont exécutées. Le curseur ne bouge pas. La variable status est modifiée et reçoit le contenu de l'opération. Si la clause INTO Nom-variable est présente, l'enregistrement est placé dans le tampon et dans la variable. READ INTO correspond donc à un READ suivi d'un MOVE. L'ordre READ doit être précédé d'une instruction d'ouverture OPEN, en lecture (INPUT) ou en mise-à-jour (INPUT-OUTPUT). Le délimiteur peut être un point ou les deux mots END-READ. Dans les deux cas, sauf indication contraire, l'instruction suivant le READ sera exécutée. C- Ordre READ NEXT La syntaxe de l'ordre READ NEXT, qui ne sert QUE pour "balayer" la chaîne des enregistrements ayant une même valeur de clé secondaire, est la suivante : READ Nom-fichier NEXT [INTO Nom-variable] [AT END Instructions1] [NOT AT END Instructions2] [Délimiteur] L'effet de l'exécution de cette instruction est le suivant : Si le curseur du fichier est positionné sur un enregistrement, celui-ci est placé dans le tampon du fichier (cette zone est définie dans la section des fichiers) et le curseur est décalé d'une position vers la fin ; la variable status, si elle existe, contient le compte-rendu de l'opération. Les instructions mentionnées après la clause NOT AT END, si elle existe, sont exécutées. Si le curseur du fichier est positionné sur la fin de la séquence, le tampon n'est pas touché, les instructions situées après la clause AT END sont exécutées. Le curseur ne bouge pas. La variable status est modifiée et reçoit le contenu de l'opération. Si la clause INTO Nom-variable est présente, l'enregistrement est placé dans le tampon et dans la variable. READ NEXT INTO correspond donc à un READ NEXT suivi d'un MOVE. L'ordre READ doit être précédé d'une instruction OPEN, en lecture (INPUT) ou en mise-à-jour (INPUT- OUTPUT). Cet ordre doit être précédé d'un START sur le même fichier, celui-ci étant chargé de positionner le curseur sur une séquence d'enregistrements. D- Ordre WRITE La syntaxe de l'ordre WRITE "simple" est la suivante : WRITE Nom-enregistrement [FROM Nom-variable] Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 51 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 52 / 95
27 L'effet de l'exécution de cette instruction est le suivant : le contenu du tampon est enregistré sur le fichier, à l'emplacement désigné par le curseur. Celui-ci est déplacé d'un cran. La variable status, si elle existe, contient le compte-rendu de l'opération. L'écriture échoue s'il n'y a plus de place. Si la clause FROM Nom-variable est présente, l'enregistrement dans la variable est transféré dans le tampon, puis sur le fichier. WRITE FROM correspond donc à un MOVE suivi d'un WRITE. Il y a une "variante" qui sert pour l'écriture sur imprimante. Celle-ci permet le positionnement avant ou après écriture, selon la syntaxe suivante : WRITE Nom-enregistrement [FROM Nom-variable] Sens ADVANCING Saut Sens prend la valeur BEFORE ou la valeur AFTER. WRITE BEFORE effectue le saut APRES l'écriture ; WRITE AFTER effectue le saut AVANT. Le saut est celui d'une page (Saut prend alors la valeur PAGE) ou d'un ou de plusieurs lignes. Il y a alors un nombre ou une variable contenant un nombre puis le mot LINE. Prenons quelques exemples : WRITE LIGNE. écrit le contenu de la variable WLIGNE à l'emplacement courant. WRITE LIGNE AFTER PAGE. saute à la page suivante et écrit le contenu de la variable WLIGNE à l'emplacement courant. WRITE LIGNE BEFORE 3. écrit le contenu de la variable WLIGNE à l'emplacement courant puis saute 3 lignes. WRITE LIGNE BEFORE WI. écrit le contenu de la variable WLIGNE à l'emplacement courant puis saute n lignes, n étant le contenu de la variable WI. L'ordre WRITE doit être précédé d'une instruction d'ouverture OPEN, en écriture (OUTPUT), en extension (EXTEND) ou en mise-à-jour (INPUT-OUTPUT). E- Ordre WRITE INVALID KEY La syntaxe de l'ordre WRITE INVALID KEY est la suivante : WRITE Nom-enregistrement [FROM Nom-variable] [INVALID KEY Instructions1] [NOT INVALID KEY Instructions2] [Délimiteur] Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 53 / 95 L'effet de l'exécution de cette instruction est le suivant : Si l'emplacement désigné par la clé est "libre", il y a transfert de cet enregistrement dans le fichier. La variable status, si elle existe, contient le compte-rendu de l'opération. Les instructions mentionnées après la clause NOT INVALID KEY, si elle existe, sont exécutées. Si l'emplacement désigné par la clé n'est pas libre, le transfert ne se fait pas, les instructions situées après la clause INVALID KEY sont exécutées. Le curseur ne bouge pas. La variable status est modifiée et reçoit le contenu de l'opération. L'emplacement ne sera pas libre si la clé est déjà attribuée (il y a déjà un enregistrement du fichier qui possède cette clé) ou s'il n'y a plus de place -la zone réservée pour le fichier est pleine-. Cet ordre WRITE doit être précédé d'un ordre OPEN en mise-à-jour ou en écriture. Si la clause FROM Nom-variable est présente, l'enregistrement contenu dans la variable sera transféré dans le tampon puis sur le fichier. WRITE FROM correspond donc à un MOVE suivi d'un WRITE. Le délimiteur peut être un point ou les deux mots END-WRITE. Dans les deux cas, sauf indication contraire, l'instruction suivant le WRITE sera exécutée Modifier et supprimer dans un fichier A- Ordre REWRITE Récrire un enregistrement permet de prendre en compte les modifications qui y ont été apportées. Rappelons que : ceci ne peut se faire sans lecture préalable (il y a donc un ordre READ quelque part avant l'ordre REWRITE) ; ceci ne concerne pas les modifications des clés (modifier la valeur d'une clé, qu'il s'agisse d'une clé primaire ou d'une clé secondaire, se fait en supprimant l'enregistrement correspondant à l'ancienne valeur -ordre DELETE- puis en créant l'enregistrement correspondant à la nouvelle valeur -par un WRITE) ; le fichier doit être ouvert en mise-à-jour (OPEN INPUT-OUTPUT ou OPEN I-O, selon les compilateurs). La syntaxe de l'ordre REWRITE est la suivante : REWRITE Nom-enregistrement [FROM Nom-variable] [INVALID KEY Instructions1] [NOT INVALID KEY Instructions2] [Délimiteur] L'effet de cette instruction est le suivant : le contenu du tampon est récrit au même endroit dans le fichier. S'il y a la clause FROM, un MOVE est exécuté préalablement à la récriture. les clauses INVALID KEY et NOT INVALID KEY ne servent que dans le cas de fichiers non séquentiels. Elles permettent de définir une série d'instructions qui seront exécutées si la récriture se passe mal (c'est-à-dire si l'enregistrement modifié n'existe pas -INVALID KEY-) ou au contraire si elle se passe bien -NOT INVALID KEY-. La présence de ces clauses conditionnelles impose de recourir à un délimiteur, point ou END-REWRITE. Celuici sera placé après la dernière instruction associée à INVALID KEY, s'il n'y a pas de clause NOT INVALID KEY, après la dernière instruction associée à NOT INVALID KEY, si... Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 54 / 95
28 Prenons quelques exemples pour illustrer ceci : REWRITE FENREG. REWRITE FENREG NOT INVALID KEY PERFORM OK. REWRITE FENREG INVALID KEY PERFORM NOT-OK. REWRITE FENREG INVALID KEY PERFOMR NOT-OK NOT INVALID KEY PERDORM OK. REWRITE FENREG NOT INVALID KEY PERFOMR OK INVALID KEY PERFORM NOT-OK. NB : dans ces exemples, les délimiteurs sont tous des points. Nous aurions pu développer d'autres exemples, avec END-REWRITE. B- Ordre DELETE La suppression (il s'agit en fait d'une suppression logique, par marquage) d'un enregistrement préalablement lu (par un ordre READ) est réalisée par l'instruction DELETE, dont la syntaxe est la suivante : DELETE Nom-fichier RECORD [INVALID KEY Instructions1] [NOT INVALID KEY Instructions2] [Délimiteur] Cet ordre n'est possible que si le fichier a été ouvert en INPUT-OUTPUT (I-O pour certains compilateurs). Le fichier peut être en organisation séquentielle ou indexée. S'il s'agit d'un fichier utilisé en séquentiel, la clause INVALID KEY ne s'emploie pas. Dans le cas d'un fichier utilisé en accès direct ou dynamique, la clé doit contenir la valeur de la clé de l'enregistrement à supprimer. Si cet enregistrement existe, il est "détruit" et les instructions situées après la clause NOT INVALID KEY, si elle existe, sont exécutées. S'il n'existe pas, les instructions situées après la clause INVALID KEY, si elle existe, sont exécutées. Dans les deux cas, une fois l'ordre exécuté, il y a saut à l'instruction qui suit le DELETE. INVALID KEY et NOT INVALID KEY transformant l'instruction DELETE en une instruction conditionnelle, elle doit être délimitée, par un point ou par END-DELETE Se positionner sur une clé secondaire (ordre START) Cet ordre sert à se positionner, dans un fichier organisé en séquentiel indexé, sur le premier enregistrement répondant à un critère de recherche. Il s'agit bien de positionnement et non pas de lecture. L'ordre START doit donc toujours être suivi d'un READ NEXT. Le fichier doit être accèdé en dynamique et ouvert soit en lecture (INPUT) soit en mise-à-jour (I-O ou INPUT-OUTPUT, selon les compilateurs). Sa syntaxe est la suivante : START Nom-fichier [Condition] [INVALID KEY Instructions1] Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 55 / 95 [NOT INVALID KEY Instructions2] [Délimiteur] Si la condition n'est pas présente, le curseur sera positionné sur l'enregistrement ayant une clé égale au contenu de la variable définie (dans le SELECT) comme clé. La condition permet de préciser le critère de "sélection". Elle est constituée des éléments suivants : KEY IS Opérateur Nom-variable] L'opérateur peut prendre une des valeurs suivantes : =, EQUAL, EQUAL TO, >, GREATER, GREATER THAN, NOT <, NOT LESS, NOT LESS THAN, GREATER OR EQUAL, GREATER THAN OR EQUAL, GREATER OR EQUAL TO, GREATER THAN OR EQUAL TO, >=! Les symboles mathématiques, on peut le comprendre aisément, sont le plus souvent employés. La variable désigne la clé sur laquelle va porter la recherche. Elle doit être initialisée (par un MOVE pour tout autre verbe ayant le même effet). Le START parcourt la table d'index correspondante et recherche dans cette table si la valeur s'y trouve (cas d'égalité), s'il y a une valeur plus petite (cas >), plus grande (cas <)... Si la condition est vérifiée, le curseur est positionné avant le START sur le premier enregistrement la satisfaisant. 14/12/03 COBOL, un langage de programmation 6. Pour aller plus loin Cette partie contient les éléments permettant de traiter : les tableaux ; les sous-programmes ; les tris-fusions de fichiers ; les éditions ; les écrans. 6.1 Tableaux Il est possible de manipuler en COBOL des tableaux. Le nombre maximum de dimensions varie selon les compilateurs (7, 18...). Nous développons ici jusqu'à trois dimensions, en indiquant comment les déclarer, comment les initialiser, comment les utiliser et comment les parcourir (par une boucle Pour) Déclaration des tableaux Un tableau se définit par le nombre de dimensions et, pour chacune, par le nombre d'éléments. Ceci se fait via la clause OCCURS, dont la syntaxe est la suivante : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 56 / 95
29 OCCURS Entier TIMES L'entier donne le nombre d'éléments dans la dimension. Il doit, bien entendu, être strictement positif. Voici quelques exemples de déclarations : 01 WTABLEAU1. 02 ELEMENT OCCURS 15 PIC X(5). définit un vecteur WTABLEAU1 de quinze éléments, chacun correspondant à une chaîne de cinq caractères. 01 WTABLEAU2. 02 LIGNE OCCURS COLONNE OCCURS 20 PIC X(5). définit une matrice WTABLEAU2 de dix lignes et 20 colonnes, chaque élément correspondant à une chaîne de cinq caractères. Cette matrice comprend donc 200 éléments. 01 WTABLEAU3. 02 LIGNE OCCURS COLONNE OCCURS NOM PIC X(20). 03 PRENOM PIC X(10). définit une matrice WTABLEAU3 de dix lignes et 5 colonnes, chaque élément étant constitué d'un nom (chaîne de 20 caractères) et d'un prénom (chaîne de 10 caractères). La clause OCCURS ne peut pas être au niveau Initialisation des tableaux L'initialisation d'un tableau a posé des problèmes à des générations de programmeurs débutants, dans la mesure où la clause OCCURS est incompatible avec la clause VALUE. Cette incompatibilité est contournée grâce à la redéfinition de variables (clause REDEFINES). Le processus d'initialisation est donc le suivant : initialiser une variable correspondant au tableau, redéfinir cette variable comme un tableau. A- Clause REDEFINES La clause REDEFINES permet à une variable, structurée ou non, de redéfinir une autre variable, structurée ou non. Sa syntaxe est la suivante : Nombre-niveau Nom-variable1 REDEFINES Nom-variable2 Les variables 1 et 2 occupent le même espace mémoire. La variable 2 doit avoir été définie AVANT la variable 1. Les deux doivent être décrites l'une derrière l'autre (consécutivement) ; elles doivent avoir la même longueur et être associées au même nombre niveau. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 57 / EXEMPLE1. 02 VARIABLE1 PIC 9(4). 02 VARIABLE2 REDEFINES VARIABLE1 PIC X(4). 01 EXEMPLE2. 02 STRUCTURE. 03 A PIC X(20). 03 B PIC 9(4). 02 BLOC REDEFINES STRUCTURE PIC X(24). 01 EXEMPLE3. 02 VALEURS. 03 FILLER PIC X(8) VALUE "LUNDI". 03 FILLER PIC X(8) VALUE "MARDI" TABLEAU REDEFINES VALEURS. 03 JOUR OCCURS 7 PIC X(8). B- Initialisation d'un tableau L'exemple précédent illustre l'initialisation d'un tableau de sept jours. Prenons un dernier exemple, correspondant à l'initialisation d'une matrice. Soit la matrice suivante : Les lignes suivantes permettent sa déclaration : MATRICE. 02 VALEURS. 03 FILLER PIC X(4) VALUE "1025". 03 FILLER PIC X(4) VALUE "7034". 03 FILLER PIC X(4) VALUE "0981". 02 TABLEAU REDEFINES VALEURS. 03 L OCCURS CASE OCCURS 4 PIC Utilisation des tableaux Un tableau est une variable structurée. On peut donc appliquer les règles standard de manipulation et "prendre" tout le tableau, une seule ligne, une case... Soit la matrice suivante : 01 MATRICE. 02 LIGNE OCCURS CASE OCCURS 5 PIC X(10). Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 58 / 95
30 On pourra tout afficher : DISPLAY MATRICE afficher une seule ligne : DISPLAY LIGNE (3) ou afficher une case : DISPLAY CASE (I, J) Dans ce dernier cas, le premier indice correspond à la ligne, le second à la colonne. Dans la plupart des cas (des compilateurs), il doit y avoir : un espace avant la parenthèse ouvrante, un espace après la virgule, un espace après la parenthèse fermante. L'affichage de toute une ligne se fait "brutalement", sans mise en page particulière. Toute la structure est manipulée en une seule fois. C'est ainsi qu'il est possible d'initialiser un tableau en exécutant l'instruction suivante : MOVE SPACES TO MATRICE toutes les cases de ce tableau étant initialisées à la même valeur SPACE. Si le tableau comprend des éléments structurés, comme ceux du tableau WTABLEAU3 (décrit dans la partie consacrée à la déclaration des tableaux), on pourra les manipuler séparément par NOM (I, J), PRENOM (I, J), globalement par COLONNE (I, J) ou par LIGNE (I) Parcours des tableaux Le parcours d'un tableau peut se programmer en utilisant une boucle Pour, un PERFORM. Voici la syntaxe de cet ordre, étendu au parcours d'une hyper-matrice (un tableau à trois dimensions) : PERFORM Nom-paragraphe1 [THRU Nom-paragraphe2] VARYING Nom-variable1 FROM Nom-variable2 BY Nom-variable3 UNTIL Condition1 AFTER Nom-variable4 FROM Nom-variable5 BY Nom-variable6 UNTIL Condition2 AFTER Nom-variable7 FROM Nom-variable8 BY Nom-variable9 UNTIL Condition3 L'ordre de variation (VARYING --I-- AFTER --J-- AFTER --K--) correspond à l'ordre de déclaration (02 --I-- OCCURS 03 --J-- OCCURS 04 --K-- OCCURS ). 24/12/03 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 59 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 60 / 95
31 COBOL, un langage de programmation 6.2 Sous-programmes Il est tout à fait possible, dans un programme qu'on nommera le plus souvent programme principal, d'appeler des sous-programmes externes. Ces derniers peuvent être rédigés dans un autre langage que le COBOL. Toutefois, nous ne décrivons ici que des sous-programmes COBOL, appelés par des programmes COBOL. Un exemple termine cette présentation. Auparavant, abordons le problèmes des paramètres Passage des paramètres Le passage de paramètres se fait en fonction de l'ordre dans lequel les différentes variables sont définies. Si, donc, le sous-programme a trois paramètres, l'appel dans le programme principal en aura également trois : SP (A, B, C) dans le PP, appel SP (X, Y, Z) La correspondance s'établit en fonction de l'ordre (X -> A, Y -> B, Z -> C). Il est donc important de respecter ce classement. Les modules étant indépendants, toutes ces variables peuvent avoir des noms différents, mais doivent être décrites de la même façon (ie. avec le même format). Si, donc, A est un nombre (défini, par exemple, en PIC 99), X devra lui aussi être un nombre défini en PIC 99. Il n'est pas possible de passer des fichiers en paramètres. Si le sous-programme doit rendre une valeur en fin d'exécution, celle-ci sera mémorisée dans un paramètre que le programme principal pourra prendre en compte Manipulation des sous-programmes, côté programme principal Du côté du programme principal, il y a une seule clause à définir, l'ordre CALL qui permet l'appel du sousprogramme. Cette instruction a la syntaxe suivante : CALL Nom-sous programme [USING Nom-variable1, Nom-variable2 ] Le nom du sous-programme est un nom système, c'est-à-dire qu'il respecte les consignes imposées par le système d'exploitation. Les différents paramètres sont présentés après le mot USING À propos des sous-programmes COBOL Trois adaptations pour un sous-programme : la fin de l'exécution et, partant de là, le retour au programme principal, se matérialise par l'instruction : EXIT PROGRAM Celle-ci (elle est toute seule dans son paragraphe) a pour effet d'arrêter l'exécution du sous-programme et de provoquer le retour au programme appelant. la définition des paramètres se fait en deux endroits, dans la procédure (PROCEDURE USING ) et dans la partie Données (LINKAGE SECTION). Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 61 / 95 A- Annonce des paramètres Les paramètres sont annoncés au niveau de la procédure, par la clause USING qui vient compléter le code existant. Cette clause a la syntaxe suivante : PROCEDURE DIVISION USING [Nom-paramètre1, Nom-paramètre2 ] B- Définition des paramètres Tous les paramètres sont définis dans une section spéciale, la LINKAGE SECTION de la DATA DIVISION. Tous les paramètres sont définis dans cette section, sans exception. Aucun d'eux n'est initialisé. Les nombres niveaux associés ne sont pas forcément identiques à ceux des variables correspondantes dans les différents modules (un 01 pour un 77, un 02 pour un 03...). Il s'agit d'une déclaration fictive dans la mesure où les variables de cette section ne sont que des liens (LINKAGE) vers les "vrais" variables. Il n'y a donc aucune place mémoire réservée pour ces paramètres dans les différents modules Exemple récapitulatif Voici, pour terminer cette partie, un exemple extrait d'une réponse à un TP, produite par un étudiant et correspondant à une situation dans laquelle un programme principal gère le dialogue avec un utilisateur, chaque fonction / service demandé par lui étant codé sous forme de sous-programme : Avertissement Les exemples qui sont présentés dans cette partie de cours sont, dans la quasi-totalité des cas, des "oeuvres" d'étudiants. Ils correspondent à des programmes qui "tournent". Ils ont été rédigé dans un dialecte de COBOL, celui produit par la société Legacy et appellé Percobol. Les programmes ont été compilé avec succès. Ils ont également fait l'objet d'un test par un enseignant, dans un environnement Linux/Dec. Ils peuvent donc être considérés comme un exemple fiable, parfaitement transposable (à des variations près de compilateurs) dans un autre environnement. ===> Pour éviter une perte de place, nous avons éliminé de la présentation du code les six premiers caractères. Le bord gauche de l'écran correspond donc à la colonne 7. <=== Tous les programmes, qu'il s'agisse de simples extraits ou de programmes complets, sont numérotés (selon une numérotation séquentielle continue). Ces numéros serviront de référence pour identifier clairement l'exemple en cas de dialogue apprenant-professeur. Plutôt que de parler du programme qui édite un état des ventes, il faudra, par exemple, parler du programme P37. Exemple P02 Ce programme est extrait d'une réponse à un TP, produite par un étudiant et correspondant à une situation dans laquelle un programme principal gère le dialogue avec un utilisateur, chaque fonction / service demandé par lui étant codé sous forme de sous-programme. ******************************************************* * PROGRAMME P8 TP COBOL * AUTEUR : CORINNE-GRP1B * utilisation des sous-programmes ******************************************************* IDENTIFICATION DIVISION. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 62 / 95
32 PROGRAM-ID. P8. DATA DIVISION. WORKING-STORAGE SECTION. ************************** 77 W-CHOIX PIC X. 88 W-CHOIXQUITTER VALUE "Q" "q". 88 W-CHOIXMENUOK VALUE "1" "2" "3" "4". PROCEDURE DIVISION. ********************* AFFMENU. DISPLAY "Menu Principal" LINE 10 COL 26 WITH BLANK SCREEN DISPLAY "Liste (Un par page) -> choix 1" LINE 12 COL 16 DISPLAY "Liste (Par paquet) -> choix 2" LINE 13 COL 16 DISPLAY "Recherche par nom -> choix 3" LINE 14 COL 16 DISPLAY "Recherche par numero -> choix 4" LINE 15 COL 16 DISPLAY "Quitter -> choix Q" LINE 17 COL 16 DISPLAY "Votre choix : " LINE 23 COL 16. FIN-AFFMENU. EXIT. SUITE. PERFORM CHOIX-MENU UNTIL W-CHOIXQUITTER. STOP RUN. *************************************************************** *Procedure : CHOIX-MENU * *Verification du choix et appel de la procedure correspondante* *************************************************************** CHOIX-MENU. ACCEPT W-CHOIX LINE 23 COL 29. IF W-CHOIXMENUOK OR W-CHOIXQUITTER THEN EVALUATE W-CHOIX WHEN "1" CALL "P2" WHEN "2" CALL "P3" WHEN "3" CALL "A1" WHEN "4" CALL "A2" END-EVALUATE MOVE "" TO W-CHOIX PERFORM AFFMENU ELSE DISPLAY "Choix non valide!" LINE 24 COL 5 END-IF 15/12/05 COBOL, un langage de programmation 6.3 Tris-fusions de fichiers Introduction Il peut être nécessaire, pour améliorer les performances d'un programme, ou plus simplement pour permettre son exécution à moindre coup temporel, de ranger les fichiers impliqués dans le traitement selon les mêmes critères. Trier les fichiers, car c'est de cela qu'il s'agit, peut se faire "à la main", en écrivant un algorithme de tri. C'est toutefois assez rare. Beaucoup plus souvent, la procédure standard est choisie. Elle requiert au minimum la définition d'un fichier de travail et des instructions spéciales. "des" avons-nous écrit, car il y a plusieurs tris : le premier, et le plus simple, consiste à prendre un fichier et à classer son contenu autrement. il existe un autre tri, sans lequel une préparation et/ou un traitement post-tri est nécessaire. Le tri est en quelque sorte encadré. il est également possible de trier non pas un fichier mais plusieurs, le résultat final étant une fusion des fichiers triés. comme pour le tri, il est possible, une fois la fusion accomplie, de lancer un traitement spécifique. Nous parlons, dans la suite de ce cours, de tri simple, de tri complexe, de fusion simple et de fusion complexe, et consacrons un paragraphe à chacun. Auparavant, abordons le problèmes des fichiers (d'entrée, de sortie, de travail) Description des fichiers De tous les fichiers impliqués par un tri-fusion, seul LE (il est unique) fichier de travail est spécifique. Il se définit, comme tous les autres fichiers, dans la section des entrées-sorties (INPUT-OUTPUT SECTION), par une clause SELECT. Il se décrit dans la section des fichiers (FILE SECTION), exactement comme un autre fichier A L'EXCEPTION du code FD qui est remplacé par le code SD. Voici comment, à titre d'illustration, le fichier FTRI est défini : SELECT FTRI ASSIGN TO "fictri.dat". SD FTRI. 01 ENR. 02 FNUM PIC FNOM PIC X(25). 02 FILLER PIC X(44). Les critères de tri (ie. les rubriques qui vont servir au rangement) doivent obligatoirement être précisées dans la déclaration du tampon associé au fichier de tri. FTRI sera trié, par exemple, selon les valeurs croissantes de Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 63 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 64 / 95
33 FNOM, en majeur (ie. en premier), et de FNUM, en mineur (ie. en dernier). FNUM et FNOM doivent apparaîtrent dans le tampon associé à FTRI. Tous les types de fichiers (séquentiels, séquentiels-indexés, relatifs) peuvent être triés. Compte-tenu, toutefois, de leur organisation, le tri de fichiers non séquentiels n'a de sens que si le résultat est enregistré dans un fichier séquentiel. Il n'est pas possible de trier les tables d'index en utilisant la procédure standard de tri Tris de fichiers Il existe deux sortes de tri, avons-nous dit dans l'introduction. La première se contente de produire un fichier rangé différemment de celui d'origine. La seconde associe au tri lui-même une procédure servant à préparer les enregistrements et/ou une autre permettant de traiter les enregistrements après le tri. Les différences majeures entre les deux sont résumées dans le tableau suivant : Fichiers entrée sortie travail A- Tri simple L'ordre de tri, SORT, a la syntaxe suivante : simple SORT Ces 3 fichiers sont pris en charge (y compris OPEN et CLOSE) par le système. SORT Fichier-tri ON Critères-tri USING Fichier-entrée GIVING Fichier-sortie encadré SORT, RELEASE, RETURN Ces 3 fichiers sont pris en charge (y compris OPEN et CLOSE) par le programmeur. Les critères de tri reposent sur des variables (qui font obligatoirement partie des enregistrements des fichiers) décrites dans la section des fichiers et associées au fichier de tri. Ces variables sont souvent appelées les clés du tri. L'ordre selon lequel les enregistrements sont classés est fourni comme ceci : ASCENDING KEY Nom-clé [, Nom-clé2 ] ou bien comme cela : DESCENDING KEY Nom-clé [, Nom-clé2 ] Il peut y avoir tri en ordre croissant ou en ordre décroissant des clés, certaines pouvant être traitées en ordre croissant, d'autres en ordre décroissant, comme le montrent les exemples suivants : ASCENDING KEY A, B Le tri s'effectue sur A, en majeur, puis sur B, en mineur, les deux en ordre croissant. DESCENDING KEY B, A Le tri s'effectue sur B, en majeur, puis sur A, en mineur, les deux en ordre décroissant. ASCENDING KEY A DESCENDING KEY B ASCENDING KEY C Le tri s'effectue sur A, en majeur, en ordre croissant, puis sur B, ensuite, en décroissant et enfin sur C, en ordre croissant. Avec ce tri simple, les fichiers de tri, d'entrée et de sortie sont ouverts et fermés par le système. Il ne faut donc surtout pas les ouvrir avant le tri ni les fermer après. B- Tri encadré La syntaxe de l'instruction SORT varie selon la nature de l'encadrement : a) procédure avant le tri, rien après : SORT Fichier-tri ON Critères-tri INPUT PROCEDURE Nom-section1 GIVING Fichier-sortie b) rien avant le tri, procédure après : SORT Fichier-tri ON Critères-tri USING Fichier-entrée OUTPUT PROCEDURE Nom-section2 c) procédure avant le tri, procédure après : SORT Fichier-tri ON Critères-tri INPUT PROCEDURE Nom-section1 OUTPUT PROCEDURE Nom-section2 Les procédures exécutées avant et/ou après sont des SECTIONS. Compte-tenu de la structuration des programmes COBOL en divisions, sections... le programme devra être découpé en deux ou trois sections, la première correspondant à la procédure principale. PROCEDURE DIVISION. PRINCIPALE SECTION. SORT USING OUTPUT PROCEDURE FINITION. STOP RUN. FINITION SECTION. Ici est décrit le traitement post-tri C'est le programmeur qui gère les fichiers dans ces procédures. Il dispose pour cela d'instructions particulières pour lire et écrire dans le fichier de travail : - Procédure avant tri Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 65 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 66 / 95
34 ouverture lecture écriture fermeture fichier entrée OPEN INPUT READ CLOSE fichier tri RELEASE NB : c'est le système qui se charge du fichier de sortie. L'instruction RELEASE permet d'écrire dans le fichier de tri. Sa syntaxe est analogue à celle d'un WRITE : RELEASE Nom-fichier1 [FROM Nom-variable1] Le contenu de l'enregistrement (après un éventuel chargement à partir de la variable Nom-variable1, le FROM correspondant à un MOVE) est écrit dans le fichier de tri, à l'emplacement désigné par le curseur. Celui-ci est augmenté d'une unité après l'écriture. - Procédure après tri ouverture lecture écriture fermeture fichier tri RETURN fichier sortie OPEN OUTPUT WRITE CLOSE MERGE Fichier-tri ON Critères-tri USING Fichier-entrée1 [Fichier-entrée2 ] GIVING Fichier-sortie Les critères de fusion sont définis de la même façon que pour un ordre SORT. B- Fusion complexe L'ordre MERGE, qui réalise cette fusion encadrée, ressemble beaucoup à l'ordre SORT avec, toutefois une nuance : il n'est pas possible d'avoir un pré-traitement des fichiers. Pas d'input PROCEDURE dans un MERGE, donc. La fusion encadrée contient uniquement une procédure de post-traitement. Sa syntaxe est la suivante : MERGE Fichier-tri ON Critères-tri USING Fichier-entrée1 [Fichier-entrée2 ] OUTPUT PROCEDURE Nom-section1 La procédure de post-traitement est analogue à celle du tri encadré. NB : c'est le système qui se charge du fichier d'entrée. C'est l'instruction RETURN qui permet de lire dans le fichier de tri. Sa syntaxe est analogue à celle d'un READ. RETURN Nom-fichier1 [INTO Nom-variable1] AT END Instructions [NOT AT END Instructions] Délimiteur 24/12/03 Contrairement, toutefois, à un READ, la clause AT END est obligatoire, ce qui rend également obligatoire le délimiteur (un point ou les mots END-RETURN). L'effet de cette instruction est le suivant : il y a d'abord test de la position du curseur. S'il pointe sur la fin du fichier de tri, les instructions situées après la clause AT END sont exécutées, le tampon du fichier n'est pas modifié, le curseur ne bouge pas. Si le curseur pointe sur un enregistrement, celui-ci est transféré dans le tampon (puis, le cas échéant dans la variable Nom-variable1 si la clause INTO est présente), le curseur est augmenté d'une position vers la fin du fichier ; les instructions suivant la clause NOT AT END, si elle existe, sont exécutées. Dans l'un et l'autre cas, fin de fichier ou pas, l'instruction placée après le délimiteur est exécutée... sauf avis contraire Fusions de fichiers La fusion permet de regrouper plusieurs fichiers ayant la MEME structure, après les avoir trié. Le résultat est placé dans un fichier, soit directement (cas de la fusion simple), soit après un traitement post-tri (cas de la fusion encadrée). Comme pour le tri de fichiers, il est nécessaire d'avoir un fichier de travail que l'on va associer au code SD et qui contient les clés du tri-fusion. A- Fusion simple La fusion simple se commande comme ceci : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 67 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 68 / 95
35 COBOL, un langage de programmation 6.4 Editions Dans cette partie consacrée aux éditions sur papier, nous traitons de deux "choses" : la première partie est consacrée aux nombreux formats d'édition, qu'il s'agisse de numérique édité ou d'alphabétique édité. la seconde partie présente la section intitulée REPORT SECTION, qui permet de définir "proprement" un état de sortie, avec entête d'état, entête de page Formats d'édition Il y a quatorze formats d'édition (PICTURE d'édition). Ils sont dans la quasi-totalité des cas associés à des variables destinées à recueillir les valeurs des variables de calcul (par des MOVE) pour mettre en évidence certaines de leurs caractéristiques. Ces variables avec format d'édition sont réservées à l'édition, aucun calcul ne pouvant avoir lieu avec elles. Les quatorze formats sont les suivants : P 9 V Z 0 B $ - +,. CR DB * Ces variables éditées sont considérées comme étant de type alphanumérique. Chaque format est présenté l'un après l'autre. Les règles s'appliquant à la clause PICTURE sont enfin rappelées. A- 9, P et V Le caractère 9 représente un chiffre. Chaque caractère 9 de l'élément édité sera remplacé par le chiffre occupant la position correspondante dans l'élément à éditer. Le caractère P indique une position de décalage par rapport au point décimal sous-entendu (le V). Il n'entre jamais dans la dimension d'un nombre (ie. il n'occupe pas de place en mémoire). L'élément est traité comme si un zéro était substitué à chaque P et comme si le point décimal était placé à l'extérieur du P, à droite si les zéros sont sur la droite, à gauche si les zéros sont sur la gauche. Par exemple, un élément composé des caractères 194 sera traité par une instruction arithmétique comme si son format est 999PP. Le caractère V peut être présent ou omis. S'il est présent, V doit apparaître dans la position du point décimal sous-entendu, c'est-à-dire à gauche ou à droite du ou des caractères P qui ont été spécifiés. Le caractère Z ne doit jamais être précédé d'un 9, d'un B ou d'un 0. C- Insertion de caractères Les caractères d'insertion sont ceux qui sont placés dans le format (dans la clause PICTURE) et qui seront ajoutés aux caractères contenus dans la variable d'origine. Il s'agit des caractères suivants : 0 B $ - +,. CR DB C1- Caractère 0 Le caractère 0 (zéro) entraîne l'insertion d'un zéro dans la position indiquée. Par exemple, si un élément d'origine 123 est transféré vers un élément édité ayant un format 99900, l'élément apparaîtra sous la forme C2- Caractère B Le caractère B spécifie qu'un espace doit être inséré dans la position indiquée. Par exemple, si un élément d'origine 123 est transféré vers un élément édité ayant un format 9B9B9, l'élément apparaîtra sous la forme C3- Caractère $ Le signe $ (dollar) SEUL, placé dans la position d'extrème gauche d'un format, spécifie qu'un caractère dollar doit être placé dans cette position lors de l'édition de la donnée. Le caractère V indique la position d'un point décimal supposé. Ce caractère n'apparaît jamais dans la donnée éditée, mais il permet le cadrage par rapport au point décimal réel ou supposé de la donnée d'origine avec la position où il est inséré dans le format d'édition. B- Suppression des zéros Le caractère Z spécifie la "suppression de zéros" des caractères indiqués. Cette suppression correspond au remplacement des zéros non significatifs de gauche par des espaces. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 69 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 70 / 95
36 Il est possible de transformer ce signe + en un plus flottant (voir le paragraphe que nous lui consacrons). C6- Caractère, Dans l'exemple ci-dessus, la clause PICTURE de l'élément édité spécifie 4 positions, mais un maximum de 3 caractères est déplacé de l'élément d'origine vers l'élément édité. Le caractère $, dans cette acceptation, est un caractère d'insertion. S'il y en a plusieurs, il s'agit alors d'un caractère flottant (voir le paragraphe que nous consacrons à ce $ flottant). Lorsque la virgule est utilisée, elle est insérée dans la position indiquée dans la donnée éditée. La virgule ellemême est supprimée si la suppression des zéros (caractère Z) a provoqué l'élimination de tous les chiffres de gauche. Le signe placé entre parenthèses fournit, si il existe, le signe de la variable d'origine. C4- Caractère - Le signe - (moins), SEUL, peut être spécifié comme premier ou comme dernier caractère d'une clause PICTURE. Lorsque la valeur de l'élément à éditer est négative, un signe moins est inséré dans la position indiquée. Si la valeur est positive ou nulle, un espace sera inséré à la place du signe. Le signe placé entre parenthèses fournit, si il existe, le signe de la variable d'origine. C7- Caractère. Quand le point décimal est utilisé dans un format d'édition, la donnée à éditer est alignée sur le point décimal et un point décimal apparaîtra dans la position indiquée. Un point décimal ne peut pas apparaître dans la position située à l'extrème droite d'un format d'édition. Une clause PICTURE ne peut jamais contenir plus d'un point décimal. Les caractères placés dans les positions situées à droite du point doivent être d'un seul type (uniquement *, ou uniquement Z, ou uniquement $, ou uniquement + ou uniquement -). Il est possible de transformer ce signe - en un moins flottant (voir le paragraphe que nous lui consacrons). C5- Caractère + Le signe + (plus), tout SEUL, peut être spécifié soit comme premier, soit comme dernier caractère du format. Si la valeur de l'élément d'origine est négative, un signe - est inséré dans la position indiquée. Si la valeur est positive, un signe + est inséré. Si l'élément n'est pas signé, il est supposé positif. Le signe placé entre parenthèses fournit, si il existe, le signe de la variable d'origine. C8- Caractères CR et DB Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 71 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 72 / 95
37 CR et DB sont appelés symboles de crédit (CR) et de débit (DB). Ils ne peuvent apparaître qu'à l'extrème droite d'un format d'édition. Ces symboles occupent deux positions et indiquent que le symbole spécifié doit apparaître dans les positions correspondantes si la valeur de l'élément d'origine est négative. Si la valeur est positive, ces positions contiendront des espaces. Le signe placé entre parenthèses fournit, si il existe, le signe de la variable d'origine. D- Remplacement Lorsque, dans un élément d'origine, des positions contiennent des zéros non significatifs, ceux-ci peuvent être remplacés, lors de l'exécution du programme, par les caractères placés dans les positions correspondantes du format d'édition. D2- Caractère flottant $ Le signe dollar flottant ($) provoque la suppression des zéros de gauche non significatifs. Un signe dollar est placé dans la position immédiatement à gauche du premier chiffre significatif. Ces caractères de remplacement sont les suivants : * $ - + On dit qu'un caractère est flottant lorsque ce caractère est le caractère d'extrème gauche d'un format d'édition et que ce même caractère est répété plusieurs fois, en une série continue ou interrompue seulement par un ou plusieurs caractères d'insertion (zéro (0), espace ( ), virgule (,) et point décimal (.)). Les caractères flottants suivent certaines règles : Un jeu de caractères flottants contenant une répétition de n+1 caractères $ (ou + ou -) définit n positions de caractères. Lors du mouvement d'une valeur numérique sur un élément édité, le caractère approprié "flotte" de la gauche vers la droite de telle manière que l'élément édité comporte un caractère $ ou - ou + immédiatement à la gauche du premier chiffre significatif. Des blancs sont insérés dans toutes les positions des caractères situés à gauche d'un caractère $ (ou + ou -). La présence d'un point décimal dans un jeu de caractères flottants est traitée comme si toutes les positions des caractères à la droite du point étaient spécifiées par le caractère 9. Si la valeur de l'élément est nulle, l'élément édité sera composé uniquement d'espaces. D1- Caractère flottant * D3- Caractère flottant - Le signe moins flottant (-) provoque le remplacement d'un zéro non significatif par un espace, dans la position qu'il occupe dans le format d'édition. De plus : si la valeur de l'élément est négative, un signe est placé dans la position immédiatement à gauche du premier chiffre significatif. Ce premier chiffre peut être un zéro si le format comporte dans cette position un 9. si la valeur de l'élément est posityive, aucune signe n'apparaît. L'astérisque (*) est utilisée pour indiquer la "protection" à gauche, c'est-à-dire la suppression de chaque zéro non significatif de gauche et son remplacement par un astérisque. Un astérisque ne peut être précédé que par un signe dollar, un signe plus, un signe moins, un point décimal ou une virgule. Un astérisque ne peut pas apparaître à la droite d'un 9. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 73 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 74 / 95
38 * ou Z avec les caractères fixes + ou - à gauche * ou Z avec les caractères fixes + ou - à droite REPORT SECTION COBOL étant un langage plus spécialisé en manipulation d'entrées-sorties, le support papier et la production d'états de "masse" étant une des caractéristiques des applications d'il y a une trentaine d'années (au moins...), il n'est pas surprenant qu'il offre une assistance pour produire aisément de tels états. Nous passons en revue, successivement, les points suivants : D4- Caractère flottant + Le signe plus flottant (+) répond aux mêmes règles que le signe moins, sauf dans le cas où la valeur de l'élément est positive. Dans ce cas, un signe + est placé dans la position immédiatement à gauche du premier chiffre significatif. Le signe placé entre parenthèses, lorsqu'il est présent, fournit le signe de la variable. les concepts sous-jacents à la notion d'état de masse, qu'il s'agisse des dimensions, des zones de contrôle, des entêtes et des "pieds", la définition d'un état dans la division des données, la génération d'un tel état, avec les différentes instructions d'initialisation, de génération... de la PROCEDURE DIVISION. Un exemple sert de fil conducteur à cette présentation. A- Concepts sous-jacents Les états dont il est question ici sont "massifs" dans le sens où ils peuvent peser plusieurs kilogrammes, faire cinq cents pages et nécessiter une dizaine de minutes pour être imprimés. De tels états requièrent, de par leur masse même, la mise en oeuvre de techniques comme l'identification de l'état, la pagination, le report de valeurs d'une page à l'autre. Il est, bien entendu, parfaitement possible de programmer tout ceci. C'est toutefois plus facile de laisser faire la machine, en utilisant une procédure paramétrée prévue à cet effet. La REPORT SECTION et ses "outils" annexes ne sont, en effet, ni plus ni moins que cela. Voyons comment cela fonctionne : A1- Les différentes parties d'un état Un état peut être coupé en six parties, d'importances diverses : La première est l'entête de l'état (REPORT HEADING). Elle correspond aux informations imprimées une seule fois au début de l'état. On y trouve, en général, le nom de l'état, la date d'impression et d'autres renseignements similaires. E- Règles s'appliquant à la clause PICTURE La présence d'un type de caractère flottant exclut la présence d'un autre type de caractère flottant. À gauche d'un point décimal réel, le caractère Z ne peut suivre * ou 9 ou un jeu de caractères flottants. Dans tous les cas, * ne peut suivre 9 ou Z ou un jeu de caractères flottants. À droite d'un point décimal réel, à l'exclusion des caractères d'insertion fixes +, -, CR, DB, un seul type de caractère doit apparaître : soit *, soit Z, soit 9, soit les caractères flottants +, -, $ Un jeu de caractères flottants commence toujours par au moins deux caractères + ou - ou $ consécutifs. Le caractère 9 ne peut jamais apparaître à gauche d'un caractère flottant ou d'un caractère de remplacement. Les caractères de remplacement ou flottants ne peuvent pas être mêlés dans un format. Ils peuvent apparaître avec des caractères fixes comme indiqué ci-dessous : * ou Z avec le caractère fixe $ $ (fixe ou flottant) ave cles caractères fixes + ou - à droite Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 75 / 95 La dernière partie est le pendant de la précédente. Le pied de l'état (REPORT FOOTING), puisqu'il s'agit de cela, regroupe les informations imprimées en fin d'état. On y trouvera le plus souvent des statistiques. Cette partie est aussi appelée bas d'état, fin d'état (plus rarement). Chaque page comprend trois parties "fixes" et une partie variable. Il y a tout d'abord l'entête de page (PAGE HEADING) dans laquelle on trouve les informations imprimées en haut de chaque page (numéro, titres des différentes colonnes, report page précédente...). Il y a ensuite le bas de page (PAGE FOOTING) qui correspond aux informations que l'on imprime avant de changer de page. Entre les deux, on va trouver les lignes de détail (DETAIL) qui sont imprimées aussi souvent que nécessaire et qui sont le plus souvent extraites d'un fichier. Ces informations que l'on extrait d'un fichier, il y en a quelques-unes qui jouent un rôle particulier. Leurs changements de valeurs provoquent des traitements particuliers (des calculs notamment) et des impressions de lignes particulières. Ces lignes spéciales sont appelées des lignes de contrôle (CONTROL). Un changement de valeur d'une rubrique particulière provoquera l'impression d'une ligne de contrôle puis d'une ligne de détail (cas des contrôles appelés avant -CONTROL HEADING-) ou l'inverse (cas des contrôles appelés après -CONTROL FOOTING-), le tout pouvant s'accompagner de réinitialisation de variables, de saut de pages... A2- Les dimensions à définir Un état, c'est d'abord un certain nombre d'informations quantitatives à fournir, comme le nombre de lignes par page, le nombre de lignes de l'entête de page... Il faut préciser : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 76 / 95
39 le nombre maximum de lignes imprimables par page, le numéro de la ligne sur laquelle la première ligne de l'entête de page peut être imprimée, le numéro de la dernière ligne sur laquelle une ligne de détail peut être imprimée, le nuémro de la dernière ligne sur laquelle une ligne de contrôle peut être imprimée. Bien entendu, ces différentes données doivent être cohérentes les unes par rapport aux autres, des vérifications étant effectuées. Certaines valeurs par défaut peuvent également être mises en place. A3- Les zones de contrôle Les zones de contrôle, nous l'avons déjà dit, sont des variables dont les changements de valeurs provoquent traitements spécifiques et/ou impressions particulières, EN PLUS des impressions standard. Il peut y avoir cascade de contrôles, et donc traitements spécifiques en cascades. D'où la nécessité de préciser l'ordre dans lequel ceux-ci devront être effectués. Normalement, un "contrôle" à un niveau entraîne également des "contrôles " aux niveaux inférieurs. Ce fichier est organisé en séquentiel ; il est exploité en accès séquentiel. Il est sans erreur. Il contient les ventes de plusieurs vendeuses, pour plusieurs années. Il est trié selon les critères suivants : en majeur sur les codes des vendeuses, en ordre croissant, ensuite sur les années, en ordre croissant, puis sur les saisons, en ordre croissant, puis sur les trimestres, en ordre croissant, puis sur les mois en ordre croissant, puis sur les semaines, toujours en ordre croissant, et, enfin, en mineur, sur les numéros de ventes, en ordre croissant. L'état à produire comprendra : un entête d'état dans lequel on trouvera le nom de l'état (ÉTAT RECAPITULATIF DES VENTES), le code de la vendeuse (cette information sera saisie au début de programme), l'année de référence (saisie, elle aussi, en début de programme), la date d'édition de l'état. un entête de page contenant, outre le numéro de la page, les éléments suivants : Les impressions standard peuvent se faire après (on parle alors de contrôle avant -CONTROL HEADING-) ou après (on parle alors de contrôle après -CONTROL FOOTING-) les impressions spécifiques. Le premier cas est beaucoup plus fréquent que le second. A4- Exemple L'exemple que nous avons choisi de traiter concerne la gestion d'une équipe de vendeuses à domicile. Il est développé en trois parties : la première (voir ci-après) décrit les spécifications de l'état à produire ; la deuxième correspond à ce qui doit être écrit dans la division des données (la DATA DIVISION) ; la troisième et dernière est constituée du code. La partie décrite ici concerne les spécifications. Nous voulons imprimer un état récapitulatif des ventes effectuées par une vendeuse à domicile indépendante et produire les statistiques suivantes : total des ventes et total des commissions gagnées par la vendeuse, et ce pour chaque semaine, chaque "mois", chaque "trimestre", chaque saisons et chaque année. Le "mois" correspond à une période de quatre semaines consécutives, le "trimestre" à douze et la saison à deux trimestres consécutifs. Nous disposons d'un fichier VENTES ayant la structure suivante (elle est exprimée, pour plus d'efficacité, directement en COBOL) : 01 VENTE. 02 VENDEUSE PIC X(6). 02 NUMERO-VENTE PIC 9(5). 02 DATES-VENTE. 03 SEMAINE PIC MOIS PIC TRIMESTRE PIC SAISON PIC ANNEE PIC HOTESSE PIC X(20). 02 CA-REALISE PIC 9(5). 02 COMMISSION PIC 9(5). Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 77 / 95 un bas de page vide, une ligne de détail présentant toutes les informations décrivant une vente de la vendeuse en question, un pied d'état contenant le nombre total de ventes effectuées durant l'année, une ligne de contrôle par unité de temps (semaine, mois, trimestre, saison) avec, pour chacune, les informations suivantes : o un titre rappelant la période d'observation, o le nombre de ventes dans l'unité, o le chiffre d'affaires réalisé, o le montant des commissions correspondantes. Les contrôles seront agencés comme suit (du plus important au moins important) : ANNEE, SAISON, TRIMESTRE, MOIS, SEMAINE. Un changement de mois concïncidera avec un changement de semaine. Les statistiques hebdomadaires seront imprimées AVANT les mensuelles. Après discussion avec l'utilisateur, les dimensions suivantes ont été retenues : 60 lignes au plus par page, un entête de page séparé de 2 lignes de la première ligne de détail. On trouvera la suite (description des données, code) de cet exemple plus loin dans le cours. B- Définition d'un état Tout ceci se décrit en COBOL dans la division de l'environnement (ENVIRONMENT DIVISION), où il faut choisir un fichier lié à une imprimante, et dans la division des données (DATA DIVISION) où il faut associer ce fichier à la description de l'état. Cette dernière se fait en deux temps, fixation des paramètres de l'état d'abord, description de toutes ses parties ensuite. Cette partie se termine par la poursuite de l'exemple extrait de la gestion des vendeuses à domicile et dont les spécifications ont été fournies dans le paragraphe précédent. B1- Choix du fichier (SELECT) Choisir un fichier se programme par une clause SELECT. Le fichier doit obligatoirement être associé à l'imprimante et être en organisation séquentielle. Nous devons donc avoir quelque chose comme : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 78 / 95
40 1 7 A La clause CONTROL définit les différentes variables dont les changements de valeur provoquent des éditions spécifiques. Elle a la syntaxe suivante : B --SELECT ETAT ASSIGN TO PRINTER. CONTROL [FINAL] Nom-variable1 [, Nom-variable2 ] B2- Description du fichier (FD) Le fichier choisi étant associé à l'imprimante, il faut le définir. Ceci se fait dans la division des données, dans la section des fichiers, en utilisant la même technique que pour les autres. Une différence de taille, toutefois : il n'y a pas d'enregistrement-tampon, mais un ou plusieurs états-types. La définition du fichier correspond donc à ceci : Cette clause est obligatoire s'il y a, dans la section des états, une partie ayant pour type CONTROL (HEADING ou FOOTING). Les variables sont présentées dans l'ordre d'importance, de gauche (la plus importante) à droite (la moins importante). Les différentes variables sont obligatoirement définies dans la partie correspondant à l'enregistrement-tampon du fichier à imprimer. Ce sont des variables qui ont servi au tri du fichier (le fichier doit être trié sur ces variables). Les autres clauses correspondent, respectivement, aux informations suivantes : FD Nom-fichier REPORT Nom-état1 [, Nom-état2 ]. Nous aurons, par exemple, les lignes suivantes : 1 7 A FD B ETAT REPORT IS LISTE-VENTES. 1 S'il n'y a qu'un seul modèle d'état, il n'y aura qu'un seul nom après REPORT. S'il y en a plusieurs, ils seront tous nommés. Les puristes (!!) de la langue anglaise pourront, en outre, utiliser une des formes suivantes : REPORT IS Nom-état1. REPORT IS Nom-état1, Nom-état2. REPORTS ARE Nom-état1, Nom-état2. REPORTS ARE Nom-état1. nombre maximum de lignes par page, numéro de la ligne sur laquelle est imprimée la première ligne de l'entête de page, numéro de la ligne sur laquelle est imprimée la première ligne de détail, numéro de la ligne sur laquelle est imprimée la dernière ligne de détail, numéro de la ligne sur laquelle est imprimée la première ligne du pied de page. 7 A RD B LISTE-VENTES PAGE 65 LINES HEADING 5 FIRST DETAIL 10 LAST DETAIL 58 FOOTING 60. Ceci fait, il faut décrire les différentes parties de l'état. Chacune est associée à un nombre niveau 01, dans une clause TYPE ayant la structure suivante : syntaxiquement différentes mais "cobolistiquement" identiques. Chacun des états désignés doit faire l'objet d'une description dans la section des états, la REPORT SECTION. B3- Définition des paramètres et des différentes parties (REPORT SECTION) Définir un état se fait en deux étapes. La première chose à faire est de fournir les paramètres : RD Nom-état1 [clause CONTROL] [PAGE Entier1 LINES] [HEADING Entier2] [FIRST DETAIL Entier3] [LAST DETAIL Entier4] [FOOTING Entier5] Les différents entiers respectent les contraintes suivantes : Si Entier1 n'est pas présent, la valeur par défaut est 66. Si Entier2 n'est pas présent, la valeur par défaut est 1. Si Entier3 n'est pas présent, sa valeur par défaut est celle d'entier2. Si Entier4 n'est pas présent, sa valeur par défaut est celle d'entier5 s'il est présent et d'entier1 sinon. Si Entier5 n'est pas présent, sa valeur par défaut est celle d'entier4 s'il est spécifié et d'entier1 sinon. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 79 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 80 / 95
41 NB : cette figure est provisoire. Les différentes parties d'un état sont décrites par une structure associée au niveau 01 comprenant, outre son nom (facultatif), trois clauses optionnelles : la clause LINE, qui permet de préciser la première ligne sur laquelle s'imprime la partie, la clause NEXT GROUP, qui positionne la prochaine partie, la clause TYPE qui précise le type de la partie en cours de description. *) La clause LINE précise la ligne sur laquelle est imprimée la première ligne de la partie. Elle a plusieurs formes (exclusives les unes des autres) : LINE NUMBER IS Entier1 [ON NEXT PAGE] LINE NUMBER IS PLUS Entier2 LINE NUMBER IS NEXT PAGE Les sauts de lignes (PLUS) ou de page (NEXT PAGE) ont lieu AVANT l'impression. Il peut y avoir surimpression si Entier2 prend la valeur 0. *) La clause NEXT GROUP prend une des formes suivantes : NEXT GROUP IS Entier1 NEXT GROUP IS PLUS Entier2 NEXT GROUP IS NEXT PAGE Elle positionne la prochaine partie sur une ligne bien précise, ou sur une ligne située Entier2 plus loin, ou sur la page suivante. *) La clause TYPE peut prendre une des formes suivantes : TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE IS IS IS IS IS IS IS IS IS REPORT HEADING PAGE HEADING CONTROL HEADING CONTROL HEADING DETAIL CONTROL FOOTING CONTROL FOOTING PAGE FOOTING REPORT FOOTING Nom-variable1 FINAL Nom-variable2 FINAL NB : cette figure est provisoire. Ces différentes variables sont, comme les autres, définies avec un nom (facultatif), un format, une valeur initiale (facultative elle aussi)... En plus, quelques éléments spécifiques de la REPORT SECTION et notamment : Des formes abrégées existent pour chacun (RH, PH, CH...). Cette structure est composée de variables (exactement comme les autres structures COBOL), ayant la structure suivante : la clause LINE, pour fixer la ligne sur laquelle est imprimée la variable, la clause COLUMN, pour déterminer la colonne, la clause SOURCE, qui permet de préciser d'où vient la valeur imprimée, la clause SUM, qui sert pour un compteur, la clause GROUP INDICATE, qui évite les répétitions de valeurs identiques. *) La clause LINE a la même signification et joue le même rôle que dans la définition du niveau 01. *) La clause COLUMN fixe, quant à elle, la colonne à partir de laquelle la variable est imprimée. Sa syntaxe est : COLUMN [NUMBER] [IS] Entier *) La clause SOURCE permet de préciser la variable d'où provient la valeur à imprimer : Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 81 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 82 / 95
42 SOURCE [IS] Nom-variable Cette clause est à rapprocher de l'instruction MOVE. Elle est exclusive des clauses SUM et SOURCE. Il y a deux variables système que l'on peut également utiliser comme source : PAGE-COUNTER (qui correspond au compteur de pages) et LINE-COUNTER (qui correspond au compteur de lignes, ayant le même format que le précédent). S'il y a plusieurs rapports, il faut qualifier ces variables système en ajoutant le nom de l'état : SOURCE PAGE-COUNTER OF ETAT1 *) La clause SUM correspond à un compteur. Sa syntaxe est la suivante : SUM Nom-variable [clause RESET] Le contenu de Nom-variable est ajouté au compteur. Il y a cumul jusqu'à ce qu'il y ait un changement de contrôle. Une fois imprimé, le compteur est automatiquement remis à zéro. Si l'on veut modifier cette dernière règle, on doit utiliser la clause RESET : SUM Nom-variable1 RESET ON FINAL SUM Nom-variable1 RESET ON Nom-variable2 La première définition crée un compteur qui ne sera remis à zéro qu'à la fin de l'édition. La seconde définit un compteur qui sera remis à zéro à chaque changement de valeur de Nom-variable2. Ces compteurs peuvent être nommés et réutilisés dans une autre définition : 03 TOT-MOIS SUM TOT-SEM. 03 SUM TOT-MOIS. TOT-MOIS cumule les totaux de semaine ; le second compteur (non nommé) additionne les totaux par mois. Cette clause SUM est obligatoirement (et uniquement) définie dans une structure de type CONTROL- FOOTING. Elle est exclusive des clauses VALUE et SOURCE. *) La clause GROUP INDICATE a une syntaxe simple : GROUP INDICATE Elle permet l'impression d'une valeur une fois et son remplacement par des espaces si elle se répète, de façon concommittante seulement : B4- Exemple (suite) Voici ce que l'on peut trouver dans la DATA DIVISION pour décrire le fichier des ventes et l'état demandé. L'exemple développé ici est tiré d'une application de gestion d'une équipe de vendeuses. L'état des ventes souhaité (il a fait l'objet d'une spécification présentée dans un chapitre précédent) comprend les parties suivantes : un entête d'état, un entête de page, une ligne détail, cinq lignes de contrôle, un pied d'état. Nous devons donc retrouver ces différents constituants de l'état dans la déclaration : REPORT SECTION. RD LISTE-VENTES CONTROL FANNEE FSAISON FTRIMESTRE FMOIS FSEMAINE PAGE 65 LINES HEADING 5 FIRST DETAIL 11 LAST DETAIL 58 FOOTING TYPE REPORT HEADING. 02 LINE 5 COLUMN 25 PIC X(29) VALUE "ETAT RECAPITULATIF DES VENTES". 02 LINE 8 COLUMN 30 PIC X(15) VALUE "CODE VENDEUSE :". 02 LINE 8 COLUMN 46 PIC X(6) USING FVENDEUSE. 02 LINE 10 COLUMN 29 PIC X(20) VALUE "ANNEE DE REFERENCE :". 02 LINE 10 COLUMN 50 PIC 9(4) USING WDATREF. 02 LINE 12 COLUMN 29 PIC X(14) VALUE "DATE EDITION :". 02 LINE 12 COLUMN 45 PIC X(10) USING WDATJOUR. 01 TYPE PAGE HEADING. 02 LINE 5 COLUMN 2 PIC X(77) VALUE ALL "-". 02 LINE 6. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 83 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 84 / 95
43 03 COLUMN 2 PIC X(11) VALUE "I NUMEROS I". 03 COLUMN 17 PIC X(16) VALUE "DATES DES VENTES". 03 COLUMN 37 PIC X VALUE "I". 03 COLUMN 60 PIC X VALUE "I". 03 COLUMN 65 PIC XX VALUE "CA". 03 COLUMN 70 PIC X VALUE "I". 03 COLUMN 78 PIC X VALUE "I". 02 LINE COLUMN 2 PIC X VALUE "I". 03 COLUMN 12 PIC X(26) VALUE ALL "-". 03 COLUMN 41 PIC X(16) VALUE "NOM DE L HOTESSE". 03 COLUMN 60 PIC X VALUE "I". 03 COLUMN 70 PIC X(10) VALUE "I COMMIS.I". 02 LINE COLUMN 2 PIC X(9) VALUE "I VENTES". 03 COLUMN 12 PIC X(26) VALUE "I SE I MM I T I S I AN I". 03 COLUMN 60 PIC X(11) VALUE "I REALISE I". 03 COLUMN 78 PIC X VALUE "I". 02 LINE 9 COLUMN 2 PIC X(77) VALUE ALL "-". 01 UNE-VENTE TYPE DETAIL LINE PLUS COLUMN 2 PIC X(77) VALUE ALL "I". 02 COLUMN 4 PIC Z(5)9 SOURCE FNUMERO-VENTE. 02 COLUMN 12 PIC X VALUE "I". 02 COLUMN 14 PIC 99 SOURCE FSEMAINE. 02 COLUMN 17 PIC X VALUE "I". 02 COLUMN 19 PIC 99 SOURCE FMOIS. 02 COLUMN 22 PIC X VALUE "I". 02 COLUMN 24 PIC 9 SOURCE FTRIMESTRE. 02 COLUMN 26 PIC X VALUE "I". 02 COLUMN 28 PIC 9 SOURCE FSAISON. 02 COLUMN 30 PIC X VALUE "I". 02 COLUMN 32 PIC 9(4) SOURCE FANNEE. 02 COLUMN 37 PIC X VALUE "I". 02 COLUMN 39 PIC X(20) SOURCE FHOTESSE. 02 COLUMN 60 PIC X VALUE "I". 02 COLUMN 63 PIC 9(5) SOURCE FCA-REALISE. 02 COLUMN 70 PIC X VALUE "I". 02 COLUMN 72 PIC 9(5) SOURCE FCOMMISSION. 02 COLUMN 78 PIC X VALUE "I". 01 TYPE CONTROL FOOTING FSEMAINE LINE PLUS COLUMN 38 PIC X(18) VALUE "CUMULS PAR SEMAINE". 02 TOTCASE COLUMN 61 PIC Z(6)9 SUM FCA-REALISE. 02 TOTCOSE COLUMN 70 PIC Z(6)9 SUM FCOMMISSION. 01 TYPE CONTROL FOOTING FMOIS LINE PLUS COLUMN 38 PIC X(15) VALUE "CUMULS PAR MOIS". 02 TOTCAMO COLUMN 61 PIC Z(6)9 SUM TOTCASE. 02 TOTCOMO COLUMN 70 PIC Z(6)9 SUM TOTCOSE. 01 TYPE CONTROL FOOTING FTRIMESTRE LINE PLUS COLUMN 38 PIC X(20) VALUE "CUMULS PAR TRIMESTRE". 02 TOTCATR COLUMN 61 PIC Z(6)9 SUM TOTCAMO. 02 TOTCOTR COLUMN 70 PIC Z(6)9 SUM TOTCOMO. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 85 / TYPE CONTROL FOOTING FSAISON LINE PLUS COLUMN 38 PIC X(17) VALUE "CUMULS PAR SAISON". 02 TOTCASA COLUMN 61 PIC Z(6)9 SUM TOTCATR. 02 TOTCOSA COLUMN 70 PIC Z(6)9 SUM TOTCOTR. 01 TYPE CONTROL FOOTING FANNEE LINE PLUS COLUMN 38 PIC X(16) VALUE "CUMULS PAR ANNEE". 02 COLUMN 61 PIC Z(6)9 SUM TOTCASA. 02 COLUMN 70 PIC Z(6)9 SUM TOTCOSA. 01 TYPE REPORT FOOTING. 02 LINE 15 COLUMN 31 PIC X(12) VALUE "STATISTIQUES". 02 LINE 17 COLUMN 20 PIC X(26) VALUE "NB TOTAL VENTES DE L'ANNEE". 02 LINE 17 COLUMN 57 PIC Z(6)9 SOURCE WTOTVENTES. Rappelons que l'on peut également consulter les spécifications de ce "cas", ainsi que le code. C- Génération d'un état Il n'y a que trois instructions pour "produire" un état : INITIATE, pour démarrer, GENERATE, pour imprimer chaque ligne, TERMINATE, pour finir. Leurs rôles et syntaxes sont les suivantes : C1- Instruction INITIATE Sa syntaxe est la suivante : INITIATE Nom-état Cette instruction met tous les compteurs à zéro. Elle ne réalise PAS l'ouverture des fichiers. C2- Instruction GENERATE Cette instruction s'écrit soit : soit : GENERATE Nom-état GENERATE Nom-variable Dans ce dernier cas, la variable est celle qui est associée à la ligne de détail (celle qui a le type DETAIL). Son rôle est différent selon qu'il s'agisse de la première exécution ou des autres : le premier GENERATE imprime l'entête de l'état (REPORT HEADING), l'entête de page (PAGE HEADING), toutes les parties de type CONTROL HEADING et la première ligne de détail. chaque autres GENERATE imprime une ligne de détail, surveille les changements de valeurs des variables associées à des contrôles, imprime les totaux et entêtes de contrôle, met à jour les compteurs et effectue les cumuls. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 86 / 95
44 C3- Instruction TERMINATE Sa syntaxe est la même que celle servant à initialiser l'impression : TERMINATE Nom-état Elle produit les dernières impressions de type CONTROL FOOTING, bas de page (PAGE FOOTING) et pied d'état (REPORT FOOTING). Elle ne ferme PAS les fichiers. C4- Exemple (fin) OR FANNEE NOT = WDATREF ELSE DISPLAY "PAS DE VENTE CETTE ANNEE-LA" END-IF. ECRIRE. COMPUTE WTOTVENTES = WTOTVENTES + 1. GENERATE UNE-VENTE. PERFORM OBTENIR. Les différentes variables utilisées dans ce programme ont été définies dans un paragraphe précédent. L'état des ventes demandé (sa spécification est fournie en début de chapitre) est produit en exécutant le code suivant. En première approximation, le programme ressemblera à ceci : PROCEDURE DIVISION. OPEN INPUT VENTES. OPEN OUTPUT ETAT. MOVE LOW-VALUE TO FVENDEUSE, FANNEE. DISPLAY "CODE VENDEUSE?". ACCEPT WCODVEND. PERFORM OBTENIR UNTIL FVENDEUSE NOT < WCODVEND. IF FVENDEUSE = WCODVEND THEN DISPLAY "ANNEE DE REFERENCE?" ACCEPT WDATREF ACCEPT WDATJOUR FROM DATE INITIATE LISTE-VENTES PERFORM TRAITER-VENDEUSE TERMINATE LISTE-VENTES ELSE DISPLAY "VENDEUSE INCONNUE" END-IF. CLOSE ETAT, VENTES. STOP RUN. OBTENIR. OPEN INPUT VENTES. READ VENTES AT END MOVE HIGH-VALUE TO FVENDEUSE, FANNEE. 04/01/04 Le traitement de toutes les ventes de la vendeuse (la procédure TRAITER-VENDEUSE) comprend deux parties, une qui permet de se positionner sur le premier enregistrement de la vendeuse concernant l'année de référence, une seconde qui regarde si il y a eu vente cette année-là et qui traite, si elles existent, toutes les ventes de l'année de cette vendeuse : TRAITER-VENDEUSE. PERFORM OBTENIR UNTIL FVENDEUSE = WCODVEND AND FANNEE NOT < WDATREF. IF FVENDEUSE = WCODVEND AND FANNEE = WDATREF THEN PERFORM ECRIRE UNTIL FVENDEUSE NOT = WCODVEND Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 87 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 88 / 95
45 COBOL, un langage de programmation SCREEN SECTION La SCREEN SECTION contient les descriptions de(s) écran(s). Il y a autant de niveaux 01 qu'il y a de descriptions. En général, on associe une description à un type d'écran. Il peut, toutefois, y avoir des découpages autres. Le principe est le même que pour un enregistrement de fichier. Le niveau 01 pour le niveau le plus haut, les niveaux 02, pour les autres. La syntaxe de ces descriptions est la suivante : 6.5 Écrans de saisie La manipulation des écrans est assez sommaire dans la plupart des programmes COBOL ou, plutôt, elle a été assez sommaire pendant de nombreuses années. Cela a entrainé les développeurs à associer au compilateur COBOL un outil de définition et de manipulation d'écrans. La norme ANS-85 (c'est la dernière norme COBOL en vigueur) ne comprend aucune instruction, aucune description efficace de ce qui est, de nos jours, un medium de communication très largement utilisé. Ce handicap devrait toutefois être supprimé dans la prochaine norme. Il existe, en effet, des spécifications dites X/Open, relatives aux écrans de saisie qui offrent de réelles améliorations. Il est possible, par exemple, de décrire un écran de façon complète, dans une section nommée SCREEN SECTION. Les instructions ACCEPT et DISPLAY ont également été modifiées pour prendre en compte cette nouvelle section. Nous présentons ces spécifications ici, tout en sachant qu'il est possible qu'elles ne soient pas disponibles sur tous les compilateurs ou qu'elles le soient sous une forme différente sur certains compilateurs. Nous abordons en premier les principes qui régissent ces dispositions. Nous passons ensuite successivement en revue la SCREEN SECTION, puis les ordres ACCEPT et DISPLAY modifiés. Nous invitons nos lecteurs à davantage se concentrer sur l'esprit (plutôt que sur la lettre, la forme, qui peut changer d'une machine à une autre, d'un éditeur à un autre). Nous complètons cette étude par un exemple Principes L'idée essentielle qui se cache "derrière" ces spécifications est que l'écran représente un tout et que l'on peut modéliser ce tout comme une structure (la SCREEN SECTION) que l'on affiche en une seule opération (un DISPLAY) et que l'utilisateur manipule, utilise à sa guise, puis envoie en une seule pression de la touche Entrée, toutes les informations saisies étant transférées en une seule opération (le ACCEPT). Un algorithme-type de saisie de données à partir d'un écran ressemble donc à celui ci-après : Afficher-écran correspond à un DISPLAY, Saisir-écran à un ACCEPT. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 NB : ces images sont provisoires. Page 89 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 90 / 95
46 Les règles suivantes sont respectées : Le nom de l'écran est obligatoire lorsqu'il s'agit d'une structure. Il est facultatif autrement. C'est ce nom qui sera "manipulé" par ACCEPT et DISPLAY. Une variable élémentaire doit comprendre une des clauses BELL, BLANK LINE, BLANK SCREEN, COLUMN, LINE, PICTURE, VALUE. L'ordre de description des différentes variables n'est pas important. Nous recommandons toutefois de coller au mieux à la forme réelle, visible, de l'écran. Certaines clauses peuvent s'appliquer à une structure. Elles s'appliquent alors à tous les éléments de la structure. Il s'agit des clauses suivantes : AUTO (AUTO-SKIP), BACKGROUND-COLOR, BLINK, FOREGROUND- COLOR, FULL (LENGTH-CHECK), HIGHLIGHT, LOWLIGHT, OCCURS, PROMPT, REQUIRED (EMPTY-CHECK), REVERSE-VIDEO, SECURE (NO-ECHO). Les autres sont "résevées" aux variables élémentaires. La plupart de ces clauses sont des options des instructions ACCEPT et DISPLAY. Elles sont décrites dans un paragraphe qui leur est consacré. Les clauses LINE et COLUMN permettent de localiser les variables dans l'écran. Leur syntaxe est la suivante : LINE [NUMBER IS Différence Quantité] COLUMN [NUMBER IS Différence Quantité] Si la clause NUMBER est omise, la position correspond à la ligne courante PLUS 1 et à la colonne courante PLUS 1. Voici quelques exemples de ces clauses LINE et COLUMN. COL + 1 colonne suivante COL 10 colonne 10 LINE I ligne I LINE - J ligne courante - J Si la ligne est précisée et la colonne omise, le positionnement se fera à partir de la colonne 1. Si la quantité mentionnée (elle est comprise entre 1 et 256) dépasse la largeur d'une ligne à l'écran, il y a passage à la ligne suivante et poursuite sur cette ligne. Attardons-nous sur la clause PICTURE. Elle précise le format de la variable. Elle précise également son type, c'est-à-dire qu'elle indique s'il s'agit d'une variable de saisie ou d'affichage : 02 PIC Z9 TO WZONE1. permet de saisir le contenu de WZONE1. 02 PIC Z9 FROM WZONE2. permet d'afficher le contenu de WZONE2. 02 PIC Z9 USING WZONE3. affiche le contenu de WZONE3, permet à l'utilisateur de procéder à des changements et saisit le contenu de WZONE3 modifié. 02 PIC Z9 FROM "01" TO WZONE4. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 91 / 95 affiche 01 dans WZONE4, permet à l'utilisateur de modifier son contenu et saisit WZONE4 modifié. En résumé, une variable saisie doit être "associée" à TO ou à USING. Une variable affichée est associée à FROM ou à USING. Les autres clauses (VALUE, OCCURS, SIGN...) sont standards ACCEPT et DISPLAY Ces deux instructions ont déjà été présentées dans un précédent paragraphe (voir 5.4 Instructions de dialogue), dans une forme simplifiée du moins. Nous présentons ici la forme complète. A- Instruction ACCEPT La forme générale d'un ordre ACCEPT est la suivante : ACCEPT Nom-écran [Liste-options] [ON EXCEPTION Instructions1] [NOT ON EXCEPTION Instructions2] [END-ACCEPT] La liste des options Liste-options varie énormément d'un compilateur à l'autre. Nous développons quelques possibilités dans un des paragraphes suivants. Les instructions mentionnées dans la clause ON EXCEPTION seront exécutées s'il y a un problème lors de la saisie, celui-ci pouvant, par exemple, correspondre à un dépassement de temps d'attente maximum pour effectuer la saisie. Si la saisie ne connait pas d'incident, d'exception, les instructions Instructions2 seront exécutées. Dans les deux cas, l'instruction qui suit le END-ACCEPT sera exécutée ensuite. L'effet de l'instruction ACCEPT est de transférer le contenu des variables chargées de stocker les informations saisies par l'utilisateur, après que celui-ci ait pressé la touche Entrée. Tant que cette touche Entrée n'est pas pressée, l'utilisateur peut se "promener" dans l'écran en utilisant les touches de déplacement. Certains compilateurs autorisent la définition d'autres touches que Entrée, pour clôre la saisie. B- Instruction DISPLAY La forme générale d'un ordre DISPLAY est analogue à celle de ACCEPT : DISPLAY Nom-écran [Liste-options] [ON EXCEPTION Instructions1] [NOT ON EXCEPTION Instructions2] [END-DISPLAY] Mis à part le fait que DISPLAY sert à l'affichage et ACCEPT à la saisie, les comportements globaux de ces deux instructions sont similaires. Si l'affichage se passe mal, les instructions Instructions1 sont exécutées ; dans le cas contraire, ce sont Instructions2 qui le sont. Dans les deux cas, le contrôle est ensuite donné à l'instruction suivant DISPLAY. C- Différentes options possibles Il existe plus de quinze options utilisables. Certaines sont spécifiques soit de la saisie, soit de l'affichage. D'autres sont utilisables dans les deux. Nous en donnons ici une liste restreinte composée des options les plus employées. Pour les autres, consulter la documentation technique de l'éditeur du compilateur. Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 92 / 95
47 AUTO, AUTO-SKIP BELL, BEEP BLINK FULL, LENGTH-CHECK UNDERLINE REVERSE, REVERSE-VIDEO REQUIRED, EMPTY-CHECK SECURE, NO-ECHO FOREGROUND-COLOR BACKGROUND-COLOR termine la saisie d'un champ dès que le dernier caractère a été saisi, sans qu'il soit nécessaire d'appuyer sur une touche produit l'émission d'un son fait clignoter le champ oblige l'utilisateur à taper tous les caractères prévus, sans anticiper la fin de la saisie souligne le champ reéalise un affichage inversé force l'utilisateur à saisir un champ masque les caractères tapés spécifie la couleur du texte spécifie la couleur du fond Toutes ces options (il y en a d'autres) se présentent comme suit : ACCEPT WITH Option1, Option2 [WITH OptionJ, OptionK ] Les options permettant de changer de couleur s'écrivent comme suit : FOREGROUND-COLOR Couleur BACKGROUND-COLOR Couleur la couleur étant codée par un entier et prenant une des valeurs suivantes : 0 noir 1 bleu 2 vert 3 bleu pale 4 rouge 5 mauve 6 brun ou jaune 7 blanc D'une façon générale, nous recommandons la plus grande prudence dans l'usage de ces options. Les effets vidéo qu'ils mettent en oeuvre sont en effet parfois fort jolis... deux minutes. Ils peuvent se révêler fort désagréables à la longue Exemple À titre d'exemple, nous allons décrire les instructions COBOL nécessaires pour afficher l'écran suivant : Cette grille se définit ainsi : SCREEN SECTION. 01 ECRANSTANDARD BLANK SCREEN. 02 LINE 3 COL 5 PIC 99 FROM WJOUR. 02 LINE 3 COL 7 VALUE "/". 02 LINE 3 COL 8 PIC 99 FROM WMOIS. 02 LINE 3 COL 10 VALUE "/". 02 LINE 3 COL 11 PIC 99 FROM WANNEE. 02 LINE 3 COL 30 VALUE "Menu Suppression". 02 LINE 3 COL 50 PIC X(25) FROM WNOMFONCTION. 02 LINE 6 PIC X(80) FROM WSOULIGNE. 02 LINE 19 PIC X(80) FROM WSOULIGNE. 02 LINE 20 PIC X(50) FROM WMESS. 02 LINE 21 PIC X(50) FROM WINVITE. 02 LINE 22 COL 5 VALUE "Il vous reste ". 02 LINE 22 COL 19 FROM WCPT. 02 LINE 22 COL 21 VALUE " essai(s).". 02 LINE 23 VALUE "CHOIX :". 02 LINE 23 COL 10 PIC X USING WCHOIX. La date (elle est au format JJ/MM/AA) est affichée en haut et à gauche de l'écran. La variable WNOMFONCTION contient le nom de la fonction à exécuter, WSOULIGNE correspond à un trait horizontal sur toute la largeur de l'écran. Le contenu de la variable WCHOIX est affiché. Il peut être modifié. L'affichage de cette grille se fait par les instructions COBOL ci-après : WORKING-STORAGE SECTION. 77 WNOMFONCTION PIC X(25). 77 WMESS PIC X(50). 77 WINVITE PIC X(50). 77 WSOULIGNE PIC X(80) VALUE ALL "-". Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 93 / 95 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 94 / 95
48 77 WCPT PIC WDATE. 02 WJOUR PIC WMOIS PIC WANNEE PIC 99. SCREEN SECTION. - - voir déclarations ci-dessus - PROCEDURE DIVISION ACCEPT WDATE FROM DATE. MOVE "Suppression" TO WNOMFONCTION. DISPLAY SECRANSTANDARD D'autres exemples peuvent être trouvés dans le chapitre consacré à la pratique (voir notamment l'exercice 2 et l'exercice 4 de la fiche 9). 22/06/04 Document rédigé par Alain VAILLY, le 16/10/12 à 15:10 Page 95 / 95
Traitement de texte : Quelques rappels de quelques notions de base
Traitement de texte : Quelques rappels de quelques notions de base 1 Quelques rappels sur le fonctionnement du clavier Voici quelques rappels, ou quelques appels (selon un de mes profs, quelque chose qui
Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions
Cours d introduction à l informatique Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions Qu est-ce qu un Une recette de cuisine algorithme? Protocole expérimental
Chapitre 2 Devine mon nombre!
Python 3 : objectif jeux Chapitre 2 Chapitre 2 Devine mon nombre! 2.1. Thèmes abordés dans ce chapitre commentaires modules externes, import variables boucle while condition : if... elif... else la fonction
Créer une base de données
Access Créer une base de données SOMMAIRE Généralités sur les bases de données... 3 Création de la base de données... 4 A) Lancement d'access... 4 B) Enregistrement de la base de données vide... 4 Création
CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE
CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE 2 ème partie : REQUÊTES Sommaire 1. Les REQUÊTES...2 1.1 Créer une requête simple...2 1.1.1 Requête de création de listage ouvrages...2 1.1.2 Procédure de
1/ Présentation de SQL Server :
Chapitre II I Vue d ensemble de Microsoft SQL Server Chapitre I : Vue d ensemble de Microsoft SQL Server Module: SQL server Semestre 3 Année: 2010/2011 Sommaire 1/ Présentation de SQL Server 2/ Architerture
IFT3902 : (Gestion de projet pour le) développement, (et la) maintenance des logiciels
IFT3902 : (Gestion de projet pour le) développement, (et la) maintenance des logiciels Yann-Gaël Guéhéneuc Professeur adjoint [email protected], local 2345 Département d informatique et de recherche
GUIDE Excel (version débutante) Version 2013
Table des matières GUIDE Excel (version débutante) Version 2013 1. Créer un nouveau document Excel... 3 2. Modifier un document Excel... 3 3. La fenêtre Excel... 4 4. Les rubans... 4 5. Saisir du texte
1. Qu'est-ce que SQL?... 2. 2. La maintenance des bases de données... 2. 3. Les manipulations des bases de données... 5
1. Qu'est-ce que SQL?... 2 2. La maintenance des bases de données... 2 2.1 La commande CREATE TABLE... 3 2.2 La commande ALTER TABLE... 4 2.3 La commande CREATE INDEX... 4 3. Les manipulations des bases
MODE OPERATOIRE OPENOFFICE BASE
MODE OPERATOIRE OPENOFFICE BASE Openoffice Base est un SGBDR : Système de Gestion de Base de Données Relationnelle. L un des principaux atouts de ce logiciel est de pouvoir gérer de façon efficace et rapide
1. LA GESTION DES BASES DE DONNEES RELATIONNELLES
Dossier G11 - Interroger une base de données La base de données Facturation contient tout un ensemble d'informations concernant la facturation de la SAFPB (société anonyme de fabrication de produits de
Initiation à la programmation en Python
I-Conventions Initiation à la programmation en Python Nom : Prénom : Une commande Python sera écrite en caractère gras. Exemples : print 'Bonjour' max=input("nombre maximum autorisé :") Le résultat de
1. Introduction...2. 2. Création d'une requête...2
1. Introduction...2 2. Création d'une requête...2 3. Définition des critères de sélection...5 3.1 Opérateurs...5 3.2 Les Fonctions...6 3.3 Plusieurs critères portant sur des champs différents...7 3.4 Requête
Importer les fichiers élèves - professeurs du secrétariat
Importer les fichiers élèves - professeurs du secrétariat Fiche technique PMB n 3.1. Objectif : Récupérer la base de données élèves (et professeurs) du secrétariat avec le numéro de code Aplon (établi
SOMMAIRE. Travailler avec les requêtes... 3
Access Les requêtes SOMMAIRE Travailler avec les requêtes... 3 A) Créer une requête sélection en mode QBE... 3 B) Exécuter une requête à partir du mode Modifier (QBE)... 3 C) Passer du mode Feuille de
Débuter avec OOo Base
Open Office.org Cyril Beaussier Débuter avec OOo Base Version 1.0.7 Novembre 2005 COPYRIGHT ET DROIT DE REPRODUCTION Ce support est libre de droit pour une utilisation dans un cadre privé ou non commercial.
INITIATION AU LANGAGE C SUR PIC DE MICROSHIP
COURS PROGRAMMATION INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC page 1 / 7 INITIATION AU LANGAGE C SUR PIC DE MICROSHIP I. Historique du langage C 1972 : naissance du C dans les laboratoires BELL par
Publipostage avec Calc
Auto-formation sur OpenOffice.org 2.0 par Cyril Beaussier Version 1.0.2 - Avril 2006 Publipostage avec Calc Sommaire Introduction... 2 Présentation... 3 Notions... 4 Les données... 5 Lettre type... 7 Création
V- Manipulations de nombres en binaire
1 V- Manipulations de nombres en binaire L ordinateur est constitué de milliards de transistors qui travaillent comme des interrupteurs électriques, soit ouverts soit fermés. Soit la ligne est activée,
Instructions et spécifications pour la transmission en format XML de déclarations par lots. 30 mai 2015 MODULE 1
Instructions et spécifications pour la transmission en format XML de déclarations par lots 30 mai 2015 MODULE 1 Table des matières Modifications apportées dans la présente... 3 1 Renseignements généraux...
MEDIAplus elearning. version 6.6
MEDIAplus elearning version 6.6 L'interface d administration MEDIAplus Sommaire 1. L'interface d administration MEDIAplus... 5 2. Principes de l administration MEDIAplus... 8 2.1. Organisations et administrateurs...
Comment Utiliser les Versions, les Modification, les Comparaisons, Dans les Documents
Comment Utiliser les Versions, les Modification, les Comparaisons, Dans les Documents Diffusé par Le Projet Documentation OpenOffice.org Table des Matières 1. Les Versions...3 2. Les Modifications...5
Installation et Réinstallation de Windows XP
Installation et Réinstallation de Windows XP Vous trouvez que votre PC n'est plus très stable ou n'est plus aussi rapide qu'avant? Un virus a tellement mis la pagaille dans votre système d'exploitation
Chapitre 1 I:\ Soyez courageux!
Chapitre 1 I:\ Soyez courageux! Pour ne rien vous cacher, le langage d'assembleur (souvent désigné sous le terme "Assembleur", bien que ce soit un abus de langage, puisque "Assembleur" désigne le logiciel
Les structures. Chapitre 3
Chapitre 3 Les structures Nous continuons notre étude des structures de données qui sont prédéfinies dans la plupart des langages informatiques. La structure de tableau permet de regrouper un certain nombre
1. Introduction... 2. 2. Création d'une macro autonome... 2. 3. Exécuter la macro pas à pas... 5. 4. Modifier une macro... 5
1. Introduction... 2 2. Création d'une macro autonome... 2 3. Exécuter la macro pas à pas... 5 4. Modifier une macro... 5 5. Création d'une macro associée à un formulaire... 6 6. Exécuter des actions en
Arithmétique binaire. Chapitre. 5.1 Notions. 5.1.1 Bit. 5.1.2 Mot
Chapitre 5 Arithmétique binaire L es codes sont manipulés au quotidien sans qu on s en rende compte, et leur compréhension est quasi instinctive. Le seul fait de lire fait appel au codage alphabétique,
UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.
UEO11 COURS/TD 1 Contenu du semestre Cours et TDs sont intégrés L objectif de ce cours équivalent a 6h de cours, 10h de TD et 8h de TP est le suivant : - initiation à l algorithmique - notions de bases
Le publipostage avec Open Office
Le publipostage avec Open Office Distribué par Le projet OpenOffice.org Les informations contenues dans ce document peuvent faire l objet de modifications sans préavis. Les noms et les données utilisés
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface
L informatique en BCPST
L informatique en BCPST Présentation générale Sylvain Pelletier Septembre 2014 Sylvain Pelletier L informatique en BCPST Septembre 2014 1 / 20 Informatique, algorithmique, programmation Utiliser la rapidité
Mémo d'utilisation de BD Dico1.6
Mémo d'utilisation de BD Dico1.6 L'application BDDico a été développée par la Section Cadastre et Géomatique de la RCJU. Son utilisation demeure réservée aux personnes autorisées. Les demandes d'utilisation
Apprendre à manipuler le clavier Médiathèque de Bussy Saint-Georges APPRENDRE A MANIPULER LE CLAVIER
APPRENDRE A MANIPULER LE CLAVIER Apprendre à manipuler le clavier SOMMAIRE : I APPRENDRE A TAPER AU CLAVIER... PAGES 3-11 1.1 - Positionnement des touches d'un clavier... Page 3 1.2 - Les touches importantes
EXCEL PERFECTIONNEMENT CALCULS AVANCES
TABLE DES MATIÈRES FORMATS... 2 Formats personnalisés... 2 ADRESSAGE DE CELLULES... 3 relatif & absolu Rappel... 3 Adressage par nom... 4 Valider avec la touche Entrée... 4 FONCTIONS SI-ET-OU... 6 LA FONCTION
Annexe : La Programmation Informatique
GLOSSAIRE Table des matières La Programmation...2 Les langages de programmation...2 Java...2 La programmation orientée objet...2 Classe et Objet...3 API et Bibliothèque Logicielle...3 Environnement de
Manuel d'utilisation d'apimail V3
Manuel d'utilisation d'apimail V3 I Préambule Page 3 II Présentation Page 4 III Mise en route Configuration Page 5 Messagerie Serveur smtp Serveur pop Compte pop Mot de passe Adresse mail Laisser les messages
Recherche dans un tableau
Chapitre 3 Recherche dans un tableau 3.1 Introduction 3.1.1 Tranche On appelle tranche de tableau, la donnée d'un tableau t et de deux indices a et b. On note cette tranche t.(a..b). Exemple 3.1 : 3 6
Les bases de données Page 1 / 8
Les bases de données Page 1 / 8 Sommaire 1 Définitions... 1 2 Historique... 2 2.1 L'organisation en fichier... 2 2.2 L'apparition des SGBD... 2 2.3 Les SGBD relationnels... 3 2.4 Les bases de données objet...
Présentation de GnuCash
Par Jean-Marc St-Hilaire De JMS Informatique Enr. Jean-Marc St-Hilaire a une formation en programmation et en comptabilité (H.E.C.) Cette présentation est disponible à www.jmsinformatique.com/ateliers
Algorithme. Table des matières
1 Algorithme Table des matières 1 Codage 2 1.1 Système binaire.............................. 2 1.2 La numérotation de position en base décimale............ 2 1.3 La numérotation de position en base binaire..............
Créer le schéma relationnel d une base de données ACCESS
Utilisation du SGBD ACCESS Polycopié réalisé par Chihab Hanachi et Jean-Marc Thévenin Créer le schéma relationnel d une base de données ACCESS GENERALITES SUR ACCESS... 1 A PROPOS DE L UTILISATION D ACCESS...
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère
L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la
Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons
Guide d'utilisation OpenOffice Calc AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons 1 Table des matières Fiche 1 : Présentation de l'interface...3 Fiche 2 : Créer un nouveau classeur...4
Le chiffre est le signe, le nombre est la valeur.
Extrait de cours de maths de 6e Chapitre 1 : Les nombres et les opérations I) Chiffre et nombre 1.1 La numération décimale En mathématique, un chiffre est un signe utilisé pour l'écriture des nombres.
COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2
SQL Sommaire : COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2 COMMANDES DE MANIPULATION DE DONNEES... 2 COMMANDES DE CONTROLE TRANSACTIONNEL... 2 COMMANDES DE REQUETE DE DONNEES... 2 COMMANDES
Algorithmique et Programmation, IMA
Algorithmique et Programmation, IMA Cours 2 : C Premier Niveau / Algorithmique Université Lille 1 - Polytech Lille Notations, identificateurs Variables et Types de base Expressions Constantes Instructions
INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX
TABLE DES MATIERES Livret Utilisateur Excel 2007 Niveau 2 INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX... 4 Les tableaux croisés dynamiques... 4 Création d un tableau croisé... 5 Comparer des
Manuel d utilisation 26 juin 2011. 1 Tâche à effectuer : écrire un algorithme 2
éducalgo Manuel d utilisation 26 juin 2011 Table des matières 1 Tâche à effectuer : écrire un algorithme 2 2 Comment écrire un algorithme? 3 2.1 Avec quoi écrit-on? Avec les boutons d écriture........
Rapidolect Les Productions de la Columelle (1998-2006) Page 1
Page 1 Page 2 Logiciel Rapidolect RATIONNEL DU JEU Un bon lecteur possède dans sa tête des images précises des mots écrits qu'il connaît. Lorsqu'il parcourt un texte, ses yeux se déplacent par saccades
Licence ST Université Claude Bernard Lyon I LIF1 : Algorithmique et Programmation C Bases du langage C 1 Conclusion de la dernière fois Introduction de l algorithmique générale pour permettre de traiter
PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES
Leçon 11 PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES Dans cette leçon, nous retrouvons le problème d ordonnancement déjà vu mais en ajoutant la prise en compte de contraintes portant sur les ressources.
A.-M. Cubat PMB - Import de notices à partir d un tableur Page 1 Source : http://amcubat.be/docpmb/import-de-notices
A.-M. Cubat PMB - Import de notices à partir d un tableur Page 1 Comme beaucoup de personnes, j'ai voulu récupérer les notices de mon ancien logiciel de gestion de bibliothèque. Vu qu'il ne prévoyait pas
Interface PC Vivago Ultra. Pro. Guide d'utilisation
Interface PC Vivago Ultra Pro Guide d'utilisation Version 1.03 Configuration de l'interface PC Vivago Ultra Configuration requise Avant d'installer Vivago Ultra sur votre ordinateur assurez-vous que celui-ci
Comment mettre en page votre livre
GUIDE - ImprimermonLivre.com Comment mettre en page votre livre www.imprimermonlivre.com 1 V. 20131125 Conseils pour la mise en page de votre ouvrage L objectif de ce guide est de vous aider à réaliser
Date M.P Libellé Catégorie S.Catégorie Crédit Débit Solde S.B
Excel : Réalisation d un classeur Compta Saisir les étiquettes Renommer la première feuille Compta Laisser la première ligne vide et sur la deuxième ligne saisir les étiquettes Se placer sur A2 et saisir
COPIER, COUPER, COLLER, SELECTIONNER, ENREGISTRER.
COPIER, COUPER, COLLER, SELECTIONNER, ENREGISTRER. 1. Comment déplacer ou copier un fichier sur Windows Vous aurez régulièrement besoin de déplacer ou dupliquer des fichiers sur votre ordinateur. Par exemple
CREG : http://www.creg.ac- versailles.fr/spip.php?article803
OUTILS NUMERIQUES Édu-Sondage : concevoir une enquête en ligne Rédacteur : Olivier Mondet Bla. 1 Présentation Parmi les pépites que contient l Édu-Portail, l application Édu-Sondage est l une des plus
Introduction : Cadkey
Introduction Cadkey Cadkey est un logiciel de dessin assisté par ordinateur. La fenêtre du logiciel devrait ressembler à quelque chose comme suit: Le menu supérieur: Redraw Autoscale Efface Modifier les
VOS PREMIERS PAS AVEC TRACENPOCHE
Vos premiers pas avec TracenPoche page 1/16 VOS PREMIERS PAS AVEC TRACENPOCHE Un coup d'oeil sur l'interface de TracenPoche : La zone de travail comporte un script, une figure, un énoncé, une zone d analyse,
LibreOffice Calc : introduction aux tableaux croisés dynamiques
Fiche logiciel LibreOffice Calc 3.x Tableur Niveau LibreOffice Calc : introduction aux tableaux croisés dynamiques Un tableau croisé dynamique (appelé Pilote de données dans LibreOffice) est un tableau
Cours Informatique 1. Monsieur SADOUNI Salheddine
Cours Informatique 1 Chapitre 2 les Systèmes Informatique Monsieur SADOUNI Salheddine Un Système Informatique lesystème Informatique est composé de deux parties : -le Matériel : constitué de l unité centrale
Parcours FOAD Formation EXCEL 2010
Parcours FOAD Formation EXCEL 2010 PLATE-FORME E-LEARNING DELTA ANNEE SCOLAIRE 2013/2014 Pôle national de compétences FOAD Formation Ouverte et A Distance https://foad.orion.education.fr Livret de formation
Chapitre 1 : Introduction aux bases de données
Chapitre 1 : Introduction aux bases de données Les Bases de Données occupent aujourd'hui une place de plus en plus importante dans les systèmes informatiques. Les Systèmes de Gestion de Bases de Données
Excel avancé. Frédéric Gava (MCF) [email protected]
Excel avancé Frédéric Gava (MCF) [email protected] LACL, bâtiment P2 du CMC, bureau 221 Université de Paris XII Val-de-Marne 61 avenue du Général de Gaulle 94010 Créteil cedex Rappels et compléments
Base de données relationnelle et requêtes SQL
Base de données relationnelle et requêtes SQL 1e partie Anne-Marie Cubat Une question pour commencer : que voyez-vous? Cela reste flou Les plans de «Prison Break»? Non, cherchons ailleurs! Et de plus près,
Titres de créances NégOciables Refonte Informatique et organisationnelle
Titres de créances NégOciables Refonte Informatique et organisationnelle S P E C I F I C A T I O N S D E S FLUX D E R A C H A T S P O R T A G E E N V O Y E S P A R LES D O M I C I L I A T A I R E S VERSION
Bases de programmation. Cours 5. Structurer les données
Bases de programmation. Cours 5. Structurer les données Pierre Boudes 1 er décembre 2014 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. Types char et
Manuel de mise en page de l intérieur de votre ouvrage
Manuel de mise en page de l intérieur de votre ouvrage Merci de suivre strictement les recommandations de ce manuel qui a pour but de vous aider à préparer un livre dont la qualité de mise en page est
RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/2011. 1.1 Présentation. 1.2 Ressources
Master Maths Finances 2010/2011 Data Mining janvier 2011 RapidMiner 1 Introduction 1.1 Présentation RapidMiner est un logiciel open source et gratuit dédié au data mining. Il contient de nombreux outils
I. Introduction aux fonctions : les fonctions standards
Chapitre 3 : Les fonctions en C++ I. Introduction aux fonctions : les fonctions standards A. Notion de Fonction Imaginons que dans un programme, vous ayez besoin de calculer une racine carrée. Rappelons
http://cri.univ-lille1.fr Virtualisation de Windows dans Ubuntu Linux
http://cri.univ-lille1.fr Virtualisation de Windows dans Ubuntu Linux Version 1.0 Septembre 2011 SOMMAIRE 1. Introduction 3 2. Installation du logiciel de virtualisation VirtualBox 4 3. Création d'une
EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version 1.0 30/11/05
EXCEL PERFECTIONNEMENT Version 1.0 30/11/05 SERVICE INFORMATIQUE TABLE DES MATIERES 1RAPPELS...3 1.1RACCOURCIS CLAVIER & SOURIS... 3 1.2NAVIGUER DANS UNE FEUILLE ET UN CLASSEUR... 3 1.3PERSONNALISER LA
Access 2007 FF Access FR FR Base
ACCESS Basic Albertlaan 88 Avenue Albert Brussel B-1190 Bruxelles T +32 2 340 05 70 F +32 2 340 05 75 E-mail [email protected] Website www.keyjob-training.com BTW TVA BE 0425 439 228 Access 2007
La mémoire. Un ordinateur. L'octet. Le bit
Introduction à l informatique et à la programmation Un ordinateur Un ordinateur est une machine à calculer composée de : un processeur (ou unité centrale) qui effectue les calculs une mémoire qui conserve
RECOPLUS LOGICIEL DE GESTION DES RECOMMANDES NOTICE D UTILISATION DE RECOPLUS RESEAU. N de série
RECOPLUS LOGICIEL DE GESTION DES RECOMMANDES NOTICE D UTILISATION DE RECOPLUS RESEAU N de série Siège social 107, rue Henri Barbusse BP305-92111 CLICHY Cedex 1 Sommaire Description 1. Installation 2. Mise
Initiation à la Programmation en Logique avec SISCtus Prolog
Initiation à la Programmation en Logique avec SISCtus Prolog Identificateurs Ils sont représentés par une suite de caractères alphanumériques commençant par une lettre minuscule (les lettres accentuées
l'ordinateur les bases
l'ordinateur les bases Démarrage de l'ordinateur - Le bureau, mon espace de travail - J'utilise la souris - Ouvertes ou fermées, les fenêtres - Dans l'ordinateur, tout est fichier - Le clavier : écrire,
Documentation utilisateur. [EIP] TransLSF
Documentation utilisateur [EIP] TransLSF Henri HARDILLIER - Thomas MOREL - Florian JOUSSEAU Alexis MONNIER - Keo KHEMARA - Leo MARTIN Stéphane RICARDO Résumé Ce document présente la documentation destinée
MDI Chèque de Allégroupe Réclamation
Introduction MDI Chèque de Allégroupe Réclamation MDIChèques est une suite logique d' Allégroupe Réclamation. Une fois que l'adjudicateur a pris la décision de payer le lot, il fait une Requête de paiement
Tutorial Ophcrack. I) Ophcrack en API. (ou comment utiliser Ophcrack pour recouvrir un mot de passe sous Windows XP et Windows Vista)
Tutorial Ophcrack (ou comment utiliser Ophcrack pour recouvrir un mot de passe sous Windows XP et Windows Vista) Ophcrack est un utilitaire gratuit permettant de cracker les mots de passe des sessions
MODE D'EMPLOI DU CONTRIBUTEUR WEB UAPV "CONTRIBUER DANS UNE RUBRIQUE DU SITE WEB"
MODE D'EMPLOI DU CONTRIBUTEUR WEB UAPV "CONTRIBUER DANS UNE RUBRIQUE DU SITE WEB" Quelques conseils pour bien contribuer 1 Paramétrer votre navigateur web 2 Accéder au module de gestion des pages web 2
TRAVAILLER SUR LES ORDINATEURS DU LYCEE
TRAVAILLER SUR LES ORDINATEURS DU LYCEE TRAVAILLER SUR LES ORDINATEURS DU LYCEE Ouvrir et fermer une session, éteindre le poste...3 Ouvrir une session...3 Fermer une session...4 Eteindre le poste...5 L'environnement
SAP BusinessObjects Web Intelligence (WebI) BI 4
Présentation de la Business Intelligence 1. Outils de Business Intelligence 15 2. Historique des logiciels décisionnels 16 3. La suite de logiciels SAP BusinessObjects Business Intelligence Platform 18
EXCEL TUTORIEL 2012/2013
EXCEL TUTORIEL 2012/2013 Excel est un tableur, c est-à-dire un logiciel de gestion de tableaux. Il permet de réaliser des calculs avec des valeurs numériques, mais aussi avec des dates et des textes. Ainsi
Escalade durant l'e.p.s. à l'école primaire
Escalade durant l'e.p.s. à l'école primaire Fabrice Paget B.E.E.S Escalade Tél : +336 88 31 14 72 [email protected] 1 Glossaire Effectifs Durée des séances Atelier escalade sans être encordée Traversées
IV- Comment fonctionne un ordinateur?
1 IV- Comment fonctionne un ordinateur? L ordinateur est une alliance du hardware (le matériel) et du software (les logiciels). Jusqu à présent, nous avons surtout vu l aspect «matériel», avec les interactions
Le Langage De Description De Données(LDD)
Base de données Le Langage De Description De Données(LDD) Créer des tables Décrire les différents types de données utilisables pour les définitions de colonne Modifier la définition des tables Supprimer,
Algorithmique avec Algobox
Algorithmique avec Algobox 1. Algorithme: Un algorithme est une suite d instructions qui, une fois exécutée correctement, conduit à un résultat donné Un algorithme doit contenir uniquement des instructions
Conventions d écriture et outils de mise au point
Logiciel de base Première année par alternance Responsable : Christophe Rippert [email protected] Introduction Conventions d écriture et outils de mise au point On va utiliser dans cette
Manuel de SQUIRRELMAIL à l'usage des étudiants.
Manuel de SQUIRRELMAIL à l'usage des étudiants. SQUIRRELMAIL 1 est une interface Web (Webmail) utilisée pour traiter le courrier électronique à travers le réseau Internet. Un avantage d'une telle méthode
v7.1 SP2 Guide des Nouveautés
v7.1 SP2 Guide des Nouveautés Copyright 2012 Sage Technologies Limited, éditeur de ce produit. Tous droits réservés. Il est interdit de copier, photocopier, reproduire, traduire, copier sur microfilm,
1 è r e étape : créer sa base de d o n n é e s
Le publipostage (ou mailing) permet à un document (le document principal créé avec Open Office Writer) de profiter des informations se trouvant dans un autre document (la source de données créée avec Open
CATALOGUE DES FORMATIONS
CATALOGUE DES FORMATIONS COURS THEMATIQUES MIGRATION À WINDOWS 10... 1 WORD: LES TABLEAUX... 2 WORD: MODÈLES ET FORMULAIRES... 3 WORD: PUBLIPOSTAGE... 4 WORD: LES LONGS DOCUMENTS... 5 WORD: PUBLICATION...
http://cri.univ-lille1.fr Sauvegarde et restauration d'un système d'exploitation Clonezilla
http://cri.univ-lille1.fr Sauvegarde et restauration d'un système d'exploitation Clonezilla Version 1.0 Septembre 2011 SOMMAIRE 1. Introduction 3 2. Définitions 3 3. Principes généraux 3 4. Clonezilla
Comment créer un diagramme de Gantt avec OpenOffice.org
Comment créer un diagramme de Gantt avec OpenOffice.org Version 1.9 du 05.05.2005 Réalisé avec : OOo 2.0 Plate-forme / Os : Toutes Distribué par le projet Sommaire 1 Une rapide introduction : Diagramme
Cycle III Brevet Informatique & Internet Niveau 1. "Je pense être capable
Cycle III Brevet Informatique & Internet Niveau 1 A.J. - 11/01 Elève : Date de naissance : 1 Maîtriser les premières bases de la technologie informatique 1-1 désigner avec précision les éléments constitutifs
