Tous les articles par Mr COBOL

Identificateurs de phase du compilateur

Dans les messages, les deux caractères suivant IGYC sont des identificateurs de phase du compilateur, qui identifient la phase du compilateur qui a émis le message.

AS
Phase du module de contrôle de phase du générateur de code (IGYCASMB).
Cette phase charge et contrôle la phase de générateur de code IGYCCBE.

CB
Phase de génération et d’optimisation de code (IGYCCBE).
Cette phase (facultativement) optimise le programme, puis génère des instructions machine et alloue et gère l’utilisation des registres.
Cette phase place également la sortie LIST dans la liste et (éventuellement) génère des informations de débogage si la sous-option DWARF de TEST|NOTEST était en vigueur.

DI
Phase diagnostique (IGYCDIAG).
Cette phase traite le texte électronique et génère des diagnostics du compilateur pour les erreurs du programme source.

DM
Phase DMAP (IGYCDMAP).
Cette phase traite l’option MAP pour générer la mappe de stockage DATA DIVISION.
Il utilise les données contenues dans le dictionnaire pour produire la carte de stockage.

DS
Sous-phase de numérisation des données (IGYCDSCN).
Cette phase traduit les instructions de source d’entrée dans la  IDENTIFICATION DIVISION, ENVIRONMENT DIVISION et DATA DIVISION en texte interne du compilateur.
Il identifie et classe également les déclarations et effectue une analyse syntaxique des déclarations et des éléments de déclaration.
Une entrée est créée dans la table des symboles pour chaque nom d’utilisateur unique identifié dans cette analyse.

Cette phase crée des entrées de table d’attributs pour les éléments de définition de données (par exemple, des noms de données ou des noms de fichiers), traite les clauses d’entrée de description de données et vérifie la compatibilité des clauses dans une entrée.

Des entrées de table d’informations générales sont également créées pour les masques d’IMAGE édités et les séquences d’assemblage définies par l’utilisateur associées à un nom alphabétique.

FG
Phase de génération de fichiers (IGYCFGEN).
Cette phase est une phase conditionnelle exécutée uniquement si le programme COBOL contient un FD (fichier d’E/S) et/ou un SD (fichier de tri).

GR
Sous-phase de processus de groupe (IGYCGROU).
La sous-phase de traitement de groupe de la phase d’analyse traite les références aux noms de données dans la ENVIRONMENT DIVISION et DATA DIVISION.
Cette phase résout toutes les références de données directes rencontrées par DSCN (et pour lesquelles le texte I a été produit), en complétant les entrées de table d’attributs et de GIT pour ces références.
Cette phase est également responsable du traitement des littéraux de la clause VALUE et de la création du formulaire de procédure requis I-text (pour format-1 VALUE) ou des entrées GIT (pour format-2 VALUE) pour ces littéraux.

IN
Phase d’initialisation (IGYCINIT).
Cette phase exécute les fonctions de gestion interne requises pour préparer l’environnement d’exploitation pour le traitement des programmes sources.
Il est également invoqué à la fin de la compilation pour effectuer le ménage impliqué dans l’arrêt normal du programme.

Comme ces fonctions ne sont exécutées qu’une seule fois pour chaque compilation, le code est contenu dans la phase d’initialisation plutôt que dans la phase de contrôle résident.
Cette phase n’est pas résidente lors de la compilation.

LI
Phase de copie (IGYCLIBR).
Cette phase analyse la source COBOL de l’utilisateur à la recherche d’instructions COPY, BASIS et REPLACE.
Elle n’est invoquée que si l’option LIB a été spécifiée.
Les textes sources originaux et de la bibliothèque sont traités et une analyse lexicale et syntaxique des instructions COPY, BASIS et REPLACE est effectuée.
La phase met à jour le texte de la bibliothèque et crée un texte de forme C (COPY).

LS
Phase de listage (IGYCLSTR).
Cette phase gère la construction de la liste des sources du programme.
Cette phase traite le L-text (texte de liste) et, si les options appropriées du compilateur sont sélectionnées, intègre les messages de diagnostic, les informations cartographiques et les informations de référence croisée dans la liste source.
Il indique également les niveaux d’imbrication des instructions ou des programmes pour chaque ligne source.

OS
Phase d’analyse des options (IGYCOSCN).
Cette phase détermine quelles options de compilation doivent être actives en fusionnant les options et en résolvant les conflits parmi les éléments suivants :

  • Tableau des options par défaut
  • Relevés CBL
  • Instruction JCL PARM
  • Instruction JCL OPTION (VSE uniquement)

PA
Sous-phase d’analyse de la procédure (IGYCPANA).
Cette phase effectue une analyse sémantique des instructions source de PROCEDURE DIVISION, transforme le texte I en texte M et résout les références de nom de procédure.

PG
Phase de génération de procédure (IGYCPGEN).
Cette phase traite les verbes codés dans la PROCEDURE DIVISION du programme COBOL ou générés par la phase d’analyse de la procédure.

De plus, certaines informations sur le programme source nécessaires aux phases d’assemblage sont collectées dans cette phase.
Si l’option NOCOMPILE est active, cette phase n’est pas exécutée.

PS
Sous-phase de balayage de procédure (IGYCPSCN).
La sous-phase Procedure Scan de la phase Scan effectue une analyse syntaxique et une partie de l’analyse sémantique sur les instructions source PROCEDURE DIVISION.
Il traduit chaque nom de données apparaissant comme opérande dans une instruction en décalage de table d’attributs et collecte les informations d’attribut pour l’opérande.
Il valide également chaque opérande. Sur la base de la définition du langage, il diagnostique les opérandes invalides.

RC
Phase de contrôle résident (IGYCRCTL).
Cette phase établit l’environnement de compilation et contrôle le chargement et la suppression de toutes les phases du compilateur.
IGYCRCTL est chargé par le système d’exploitation hôte ou par la phase d’interface CMS, COBOL2, sous CMS.
Cette phase reste en mémoire tout au long du processus de compilation.

SC
Phase de balayage (IGYCSCAN).
Cette phase gère les sous-phases Data Scan (DS) , Group Process (GR), Procedure Scan (PS)  et Procedure Analysis (PA) .

SI
Phase d’interface système (IGYCSIMD).
Cette phase obtient et initialise le stockage dynamique pour le traitement du compilateur.
Il est appelé par toutes les phases via les macros de service communes pour exécuter des fonctions dépendantes du système.
Cette phase est toujours chargée dans les 16 premiers mégaoctets de stockage et réside dans le stockage tout au long de la compilation.
IGYCSIMD est chargé par IGYCRCTL, la phase de contrôle résidente.

XR
Phase de référence croisée (IGYCXREF).
Cette phase produit les renvois demandés par l’option XREF.

Limites du compilateur

COBOL a les limites du compilateur suivantes pour les programmes et les définitions de classe.

Bien que le compilateur COBOL prenne en charge l’adressage de plusieurs zones de mémoire au sein d’une unité de compilation jusqu’aux limites décrites dans cette annexe, une application complète, généralement composée de plusieurs unités de compilation, est toujours limitée par la quantité de stockage privé disponible dans l’espace d’adressage à laquelle il court.

En d’autres termes, une application peut manquer d’espace de stockage avant d’atteindre les limites décrites.

Limites du compilateur

Élément de langueLimite du compilateur
Longueur maximale des mots définis par l’utilisateur (par exemple, nom-données , nom-fichier , nom-classe )30 octets
Taille du programme999 999 lignes
Nombre de littéraux4 194 303 (Remarque 1)
Longueur totale des littéraux4 194 303 octets (Remarque 1)
Entrées de table de mots réservés1536
COPY REPLACING . . . BY . . . (éléments par déclaration COPY)Sans limites
Nombre de bibliothèques COPYSans limites
Taille de bloc de la bibliothèque COPY32 760 octets
IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
Configuration section
Paragraphe des noms spéciaux
nom-mnémonique IS18
UPSI- n … (commutateurs)0-7
nom-alphabet IS . . .Sans limites
Littéral THRU . . . ou ALSO. . .256
Input-Output section
File-control paragraphe
SELECT nom-fichier …Un maximum de 65 535 noms de fichiers peuvent être attribués à des noms externes
ASSIGN nom-système …Sans limites
ALTERNATE RECORD KEY nom-données …253
RECORD KEY LongueurAucune limite (Remarque 3)
RESERVE entier (buffers)255 (Remarque 4)
I-O-control paragraphe
RERUN ON nom-système …32 767
RERUN entier RECORDS16 777 215
SAME RECORD AREA255
SAME RECORD AREA FOR nom-fichier …255
SAME SORT/MERGE AREAAucune limite (Remarque 2)
MULTIPLE FILE nom-fichier …Aucune limite (Remarque 2)
DATA DIVISION
77 taille de l’élément de données999 999 999 octets
01-49 taille de l’élément de données999 999 999 octets
Total 01 + 77 (éléments de données)Sans limites
88 noms-condition . . .Sans limites
Clause VALUE de niveau 88 . . .Sans limites
66 RENAMES . . .Sans limites
Clause PICTURE, nombre de caractères dans chaîne-caractères50
Clause PICTURE, positions des chiffres des éléments numériquesAvec ARITH(COMPAT): 18
Avec ARITH(EXTEND): 31
Clause PICTURE, positions de caractères éditées numériquement249
Réplication du symbole d’image ( )999 999 999 octets
Réplication de symboles d’image (édition)32 767
Réplication de symbole d’image ( ), éléments DBCS de classe499 999 999 octets
Reproduction d’un symbole d’image ( ), classer les éléments nationaux499 999 999 octets
Taille de l’élément élémentaire134 217 727 octets
OCCURS entier999 999 999
Nombre total d’ODO4 194 303 (Remarque 1)
Taille du tableau999 999 999 octets
Taille des éléments du tableau999 999 999 octets
ASCENDING or DESCENDING KEY . . . (par clause OCCURS)12 CLÉS
Longueur totale des clés (par clause OCCURS)256 octets
INDEXED BY . . . (noms d’index par clause OCCURS)12
Nombre total d’index (noms d’index) par classe ou programme65 535
Taille de l’index relatif32 765
FILE SECTION
Saisie de la description de l’enregistrement FD1 048 575 octets
nom-fichier FD . . .65 535
LABEL nom-donnée . . . (si pas de clauses facultatives)255
Longueur d’enregistrement de l’étiquette80 octets
BLOCK CONTAINS entier2 147 483 647 (remarque 8)
RECORD CONTAINS entier1 048 575 (remarque 5)
Valeurs de la clause LINAGE99 999 999
nom-fichier SD . . .65 535
DATA RECORD nom-donnée . . .Aucune limite (Remarque 2)
LINKAGE SECTION
Taille totaleSans limites
LOCAL-STORAGE SECTION
Taille totale2 147 483 646 octets
WORKING-STORAGE SECTION
Taille totale des éléments sans l’attribut externe2 147 483 646 octets
Taille totale des éléments avec l’attribut externe2 147 483 646 octets
PROCEDURE DIVISION
Procédure et aire constante4 194 303 octets (Remarque 1)
PROCEDURE DIVISION USING identifiant . . .32 767
Procedure-names1 048 575 (Remarque 1)
Noms de données en indice par instruction32 767
Relevés par ligne (TEST)7
Instruction ACCEPT, longueur d’enregistrement sur le périphérique d’entrée32 760
ADD identifiant . . .Sans limites
ALTER nom-procédure-1 TO nom-procédure-2 . . .4 194 303 (Remarque 1)
CALL . . . BY CONTENT Identifiant2 147 483 647 octets
CALL identifiant ou littéral USING identifiant ou littéral . . .16 380
CALL littéral . . .4 194 303 (Remarque 1)
Programmes actifs dans une unité d’exécution32 767
Nombre de noms appelés (option DYN)Sans limites
CANCEL identifiant ou littéral . . .Sans limites
CLOSE nom-fichier . . .Sans limites
COMPUTE Identifiant  . . .Sans limites
DISPLAY identifiant ou littéral   . . .Sans limites
DIVIDE Identifiant  . . .Sans limites
ENTRY USING identifiant ou littéral . . .Sans limites
EVALUATE . . . sujets64
EVALUATE . . . WHEN  clause 256
GO nom_procédure . . . DEPENDING255
INSPECT TALLYING et REPLACING ClausesSans limites
MERGE nom-fichier ASC ou DES KEY . . .Sans limites
Longueur totale de la clé de fusion4 092 octets (Remarque 6)
MERGE USING nom-fichier . . .16 (Note 7)
MOVE Identifiant ou littéral TO identificateur . . .Sans limites
MULTIPLY Identifiant  . . .Sans limites
OPEN nom-fichier . . .Sans limites
PERFORM4 194 303
PERFORM . . . TIMES identifiant ou littéral999 999 999
SEARCH ALL . . . longueur de clé maximaleSans limites
SEARCH ALL . . . longueur totale des clésSans limites
SEARCH . . . WHEN . . .Sans limites
SET index ou identifiant . . . TOSans limites
SET indice . . . UP/DOWNSans limites
SORT nom-fichier ASC ou DES KEYSans limites
Longueur totale de la clé de tri4 092 octets (Remarque 6)
SORT USING nom-fichier . . .16 (Remarque 7)
STRING Identifiant  . . .Sans limites
STRING DELIMITED Identifiant ou littéral  . . .Sans limites
UNSTRING DELIMITED identifiant ou littéral   . . .Sans limites
UNSTRING INTO identifiant ou littéral . . .Sans limites
USE . . . ON nom-fichier . . .Sans limites
Instruction XML PARSE, taille maximale de identifiant999 999 999 octets

Remarques:

  1. Éléments inclus dans la limite de 4 194 303 octets pour la procédure plus la zone constante.
  2. Syntaxe vérifiée, mais n’a aucun effet sur l’exécution du programme ; il n’y a pas de limites.
  3. Pas de limite de compilateur, mais VSAM le limite à 255 octets.
  4. QSAM.
  5. Limite du compilateur affichée, mais QSAM la limite à 32 760 octets.
  6. Pour QSAM et VSAM, la limite est de 4088 octets si EQUALS est codé dans l’instruction de contrôle OPTION.
  7. Limite SORT pour QSAM et VSAM.
  8. Nécessite la prise en charge de l’interface LBI (Large Block Interface) fournie par OS/390® DFSMS Version 2 Release 10.0 ou ultérieure.
    Sur les systèmes OS/390 avec des versions antérieures de DFSMS, la limite est de 32 760 octets.

Exemple – MOVE COORESPONDING

Programme utilisant MOVE COORESPONDING :

IDENTIFICATION DIVISION.
PROGRAM-ID. MOVECORR.
AUTHOR.     LA COMMUNAUTE DU COBOL.

DATA DIVISION.
FILE SECTION.

WORKING-STORAGE SECTION.

01          WS-DATE-HEURE.
    05      WS-DATE.
            10  WS-ANNEE            PIC X(004).
            10  WS-MOIS             PIC X(002).
            10  WS-JOUR             PIC X(002).
    05      WS-HEURE.
            10  WS-HEURES           PIC X(002).
            10  WS-MINUTES          PIC X(002).
            10  WS-SECONDES         PIC X(002).
    
01          WS-DATE-HEURE-FORMAT.
    05      WS-DATE-FORMAT.
            10  WS-JOUR         PIC X(002).
            10                  PIC X(001) VALUE "/".
            10  WS-MOIS         PIC X(002).
            10                  PIC X(001) VALUE "/".
            10  WS-ANNEE        PIC X(004).
    05      WS-HEURE-FORMAT.
            10  WS-HEURES        PIC X(002).
            10  FILLER          PIC X(001) VALUE ":".
            10  WS-MINUTES      PIC X(002).
            10  FILLER          PIC X(001) VALUE ":".
            10  WS-SECONDES     PIC X(002).

PROCEDURE DIVISION.

    MOVE FUNCTION CURRENT-DATE TO WS-DATE-HEURE
    DISPLAY "WS-DATE-HEURE - " WS-DATE-HEURE
	
    MOVE CORRESPONDING WS-DATE  TO WS-DATE-FORMAT 
    MOVE CORRESPONDING WS-HEURE TO WS-HEURE-FORMAT 
	
    DISPLAY "WS-DATE-FORMAT  : " WS-DATE-FORMAT
    DISPLAY "WS-HEURE-FORMAT : " WS-HEURE-FORMAT

    STOP RUN.

Resultat:
WS-DATE-HEURE - 20230301020008
WS-DATE-FORMAT  : 01/03/2023
WS-HEURE-FORMAT : 02:00:08

8.8 LES INSTRUCTIONS CONDITIONNELLES

Il existe différents types de conditions en COBOL. Une condition peut-être :
– de relation
– de classe
– de signe

Une condition de relation a la structure suivante :

IF MONTANT IS EQUAL TO 25.00 ….
IF TOTAL > MONTANT ….
IF SALAIRE-BRUT NOT < LIMITE ….

Une condition de classe a la structure suivante :

IF CODE-PROV IS NOT ALPHABETIC ….
IF MONTANT IS NUMERIC ….

Une condition de signe a la structure suivante :

L ’item doit être numérique (PIC 9)

IF TOTAL-CREDITS IS NEGATIVE ….
IF MONTANT IS POSITIVE ….
IF MONTANT-EN-CAISSE - DEBOURSES IS NOT ZERO ….

Les conditions peuvent être combinées pour former des conditions complexes avec AND et OR .

IF MOYENNE = 0 AND NBR-ETUDIANT NOT EQUAL TO ZERO ….
IF A = B OR C > D ….

La structure de sélection est traduite en COBOL par l ’énoncé IF :

IF condition
THEN Instruction impérative ….
[ELSE Instruction impérative ….]
END-IF

Exemple :

IF HRES-TRAV > 40 THEN
    COMPUTE HRES-SUPP = HRES-TRAV - 40
    COMPUTE PAYE-SUPP = HRES-SUPP * TAUX-HOR
    MOVE 40 TO HRES-REG
ELSE
    MOVE ZERO TO PAYE-SUPP
    MOVE HRES-TRAV TO HRES-REG.
    COMPUTE PAYE-REG = HRES-REG * TAUX-HOR.
    COMPUTE PAYE-TOTALE = PAYE-REG + PAYE-SUPP
END-IF.

Il est possible de donner un nom à une condition et d ’utiliser celui-ci à sa place.
Un nom de condition est défini à l ’aide du niveau 88.

88 nom-condition VALUE const-1 [{THRU} const-2 ….]

La description de niveau 88 doit suivre immédiatement celle de l ’item élémentaire auquel on fait référence. La constante doit être du même type.

05 note PIC X.
88 echec VALUE ‘E’.

Quand le nom de condition est utilisé, la valeur de l ’item et la valeur indiquée dans la description de niveau 88 sont comparées.

IF echec THEN
    PERFORM traiter-echec

ELSE PERFORM traiter-reussite
END-IF.

EVALUATE

Il est utilisé pour représenter une structure de sélection de type ‘CASE’ :

EVALUATE CHOIX
    WHEN ‘A’ PERFORM TRAITER-AJOUT
    WHEN ‘M’ PERFORM TRA

8.7 L’INSTRUCTION UNSTRING

Le but de cette instruction (UNSTRING) est d’éclater une variable DISPLAY en plusieurs morceaux. La règle d’éclatement est donnée par DELIMITED BY.

Format :

Les mêmes règles que pour le STRING sont d’application. ALL est destiné à éliminer les redondances d’un caractère délimiteur. Par exemple ALL “AB” signifie que AB ou même ABABAB sont délimiteurs.

NOM-DE-POINTEUR , numérique DISPLAY, que le programmeur doit initialiser à 0 permet de compter le nombre de caractères examinés dans la zone nom-de-donnée-1.

NOM-DE-COMPTEUR, numérique DISPLAY, compte le nombre de zones réceptrices créées.

OVERFLOW, arrête le déroulement de l’instruction si le contenu du pointeur est négatif ou > à la taille de la zone nom-de-donnée-1, ou lorsque la zone nom-de-donnée-1 n’est pas entièrement examinée mais que l’instruction UNSTRING ne dispose plus de zones réceptrices i,j,…

Si un OVERFLOW est déclenché sans que l’option ne soit spécifiée, l’instruction UNSTRING est arrêtée et le programme passe à l’instruction suivante.

Les zones nom-de-donnée-i etc. sont les zones réceptrices.

DELIMITER IN spécifie la variable dans laquelle on désire transférer le délimiteur qui a été utilisé pour cet éclatement.

COUNT IN indique le nombre de caractères transférés par cet éclatement.

Exemple :
01 ZONE PIC X(12).
01 NOM PIC X(5).
01 AN PIC XXXX.
UNSTRING ZONE DELIMITED BY SPACE INTO NOM AN.
Si ZONE = "ANNEE 1999 "

alors le résultat est NOM = “ANNEE” et AN = “1999”.

UNSTRING A delimited by ‘.’ or ‘/’ ….

8.6 L’INSTRUCTION STRING

Voici la syntaxe de STRING :

Les zones de données émettrices et réceptrices doivent être alphanumériques et les transferts de données suivent les règles correspondantes. Si la zone réceptrice est plus grande il n’y a pas remplissage par des blancs à droite. De même nom-de-donnée-résultat n’est jamais réinitialisée à blanc, c’est le travail du programmeur.

DELIMITED BY permet de spécifier une limite de transfert de données, soit en fonction de la taille “SIZE”, soit en fonction du ou des caractères de nom-de-donée-3 ou litéral-3. Ces caractères là ne sont pas transmis.

POINTER permet de préciser la position de gauche du début du transfert dans la zone résultat. La variable nom-de-pointeur est un numérique. Normalement cette valeur est incrémentée de 1 par caractère transféré.
OVERFLOW en option avec POINTER indique l’ordre impératif à exécuter.

Exemple :

STRING "CECI EST LE TITRE " GROUPE BLANC "1999"
DELIMITED BY SIZE INTO L80.

STRING INFO DELIMITED BY SIZE INTO L80
WITH POINTER PT ON OVERFLOW
PERFORM PAR-ERREUR.

String A delimited by size B delimited by space C delimited by ‘*’ into …

8.5 L’INSTRUCTION INSPECT

Cette instruction (INSPECT) permet de compter le nombre de fois qu’une configuration particulière de caractères apparaît dans une zone de données et/ou de remplacer ces caractères par d’autres. Cette instruction ne s’applique pas aux variables avec index même à un niveau 01.

Format 1 :

Nom-de-donnée-1 est la zone que l’on désire inspecter. Elle doit être en USAGE DISPLAY.

TALLYING signifie que l’on désire compter le nombre de fois qu’une configuration de caractères désignée par nom-de-donnée-3 ou litéral-3 apparaît dans nom-de-donnée-1 et que le résultat du comptage soit placé dans nom-de-donnée-2.

ALL signifie que toutes les occurrences doivent être comptées. Les caractères déjà utilisés dans un comptage ne sont jamais réutilisés.
Exemple: INSPECT VARA TALLYING COMPTEUR FOR ALL "NN".
Si VARA contient “NNNNN+NNN” COMPTEUR contiendra après l’opération de comptage 3, car le 5ème et le 9ème N ne peuvent pas être regroupés avec ceux déjà utilisés.

LEADING signifie que seules les premières apparitions contiguës doivent être comptées.
Exemple: INSPECT VARB TALLYING COMPTEUR FOR LEADING "N".
Si VARB contient “NN+NNN+NNN” COMPTEUR contiendra 2 puisqu’il y a 2 N en tête.
L’opération VARE contiendra “00000000”.

CHARACTERS compte le nombre de caractères contenu dans nom-de-donnée-1.
Exemple: INSPECT VARC TALLYING COMPTEUR FOR CHARACTERS.
Si VARC contient “N&N+MOI+123” COMPTEUR contiendra 11.
Pour rendre l’usage de cette instruction plus partiel nous disposons des options BEFORE et AFTER.

BEFORE INITIAL : (nom-de-donnée-4 ou litéral-4) signifie que le comptage doit s’arrêter dès que la première apparition du ou des caractères désignés est rencontrée.
Exemple:
INSPECT VARD TALLYING COMPTEUR FOR CHARACTERS
BEFORE INITIAL "+".

Si VARD contient “N&N+MOI++123” COMPTEUR contiendra 3.

AFTER INITIAL est l’inverse du BEFORE, on compte les caractères qui se trouvent après nom-dedonnée-4 ou litéral-4.
Exemple:
INSPECT VARDAF TALLYING COMPTEUR FOR CHARACTERS
AFTER INITIAL "+".

Si VARD contient “N&N+MOI++123” COMPTEUR contiendra 8.

REPLACING : indique que nous voulons remplacer certains caractères par d’autres.

CHARACTERS, tous les caractères de nom-de-donnée-1 doivent être remplacés par le caractère désigné par nom-de-donnée-5 ou litéral-5.
Exemple: INSPECT VARE REPLACING CHARACTERS BY "0".
Si VARE contient “N&N+MOI3” après l’opération VARE contiendra “00000000”.

ALL indique que toutes les occurrences désignées par nom-de-donnée-7 ou litéral-7 doivent être remplacées par nom-de-donnée-8 ou litéral-8. Il n’y a jamais réutilisation de caractères déjà utilisés dans une occurrence préalable.
Exemple: INSPECT VARF REPLACING ALL "N" BY "0".
Si VARF contient “NN+NT23N” après l’opération VARF contiendra “00+0T230”.

LEADING indique que le remplacement s’arrêtera dés qu’un autre caractère que nom-de-donnée-7 est rencontré.

FIRST indique que le remplacement ne doit être effectué que pour la première apparition de nom-dedonnée-7.
Exemple: INSPECT VARG REPLACING FIRST "N" BY "0".
Si VARG contient “NN+NT23N” après l’opération VARG contiendra “0N+NT23N”.

Les options BEFORE et AFTER sont utilisées de la même manière que dans TALLYING.

Les clauses TALLYING et REPLACING peuvent être utilisées en même temps.
Exemple:
INSPECT VARTOT TALLYING COMPTE FOR CHARACTERS
BEFORE “+” REPLACING ALL “N” BY ““.
Si VARTOT contient “NN+NT23N” après l’opération VARTOT contiendra “+T23*” et COMPTE contiendra 2.

!!!!Le programmeur doit initialiser nom-de-donnée-2 à zéro car TALLYING additionne sans remettre à zéro.!!!!

Format 2:

Exemple:
INSPECT VAR11 CONVERTING "ABCD" TO "WXYZ"
AFTER QUOTE BEFORE "=".

Si VAR11 contient (AC”AEBDFBCD=AB”D) alors le résultat est (AC”WEXZFXYZ=AB”D)

INSPECT CHAINE CONVERTING MIN TO MAX
Avec MIN pic x(26) value ‘abc…yz’.
Et Max pic x(26) value ‘A Z’.

Remarque :
Inspect ZONE TALLYING CPT1 FOR ALL ‘A’
                                                         CPT2 FOR ALL ‘E’
                                                         CPT3 FOR ALL ‘I

8.4 L’INSTRUCTION INITIALIZE

Syntaxe de INITIALIZE:

Identifier-1 est la variable ou la structure qui reçoit l’initialisation. Elle peut être tout ou partie de table mais ne peut jamais contenir les options DEPENDING ON POUR UN OCCURS. Les index sont interdits.

Identifier-2 ou litéral-1 représente le contenu d’initialisation, par défaut les numériques et les numériques édités sont initialisés à 0 et les alphabétiques les alphanumériques et les alphanumériques édités à blancs.

Si REPLACING est utilisé, identifier-2 ou litéral-1 doivent être compatible avec la catégorie indiquée (en respectant les règles du MOVE).

Lorsqu’une catégorie est indiquée après un REPACING, alors seulement les variables appartenant à identifier-1 et reprisent dans cette catégorie sont initialisées.

Exemple :
INITIALIZE VAR1.
INITIALIZE STRUCTURE1.
INITIALIZE VAR2 BY "*".

8.3 LES MOUVEMENTS DE DONNEES – MOVE

Quels que soient les PICTURE et USAGE, il n’existe qu’un seul ordre de mouvement de données en mémoire centrale, l’ordre MOVE.

Format 1 :

     |nom-de-donnée-1|
MOVE | littéral               |   TO nom-de-donnée-2 nom-de-donnée-3

Exemple :
MOVE TVA TO TVAED. (TVAED = TVA)
MOVE "EXERCICE N° 1 " TO TITRE. ( TITRE = EXERCICE N° 1)
MOVE ZERO TO V1 V2 V3 V4 V5.
MOVE STRUCTURE1 TO STRUCTURE2.

Remarque : le fait d’avoir un seul verbe MOVE pour tous les types de données implique de veiller à ne pas mouvementer n’importe quel type de donnée sur n’importe quel type de zone de données.
Dans le cas des alphabétiques A : ne pourront être mouvementés que sur des zones élémentaires A ou X et sur des zones groupes ( les structures sont toujours considérées comme des PIC X).

Les alphanumériques X : ne pourront en principe être mouvementés que sur des zones PIC X ou sur des structures. Toutefois, le mouvement sur une zone numérique est autorisé, mais le programmeur doit être certain que la zone ne contient que des données numériques sans quoi il provoquera un arrêt du programme (MCH1202).

Les numériques, ne peuvent être mouvementés que vers des numériques ou des numériques d’édition. L’instruction MOVE convertit immédiatement n’importe quel usage en n’importe quel autre usage, pour passer d’un DISPLAY à un BINARY ou d’un PACKED-DECIMAL vers un DISPLAY aucune information ou instruction complémentaire n’est demandée au programmeur, la conversion est immédiate.

Principes de cadrage :

Les règles de cadrage sont toujours dictées par la zone réceptrice.

– Dans le cas des alphabétiques et alphanumériques :
La donnée est cadrée à gauche avec troncature à droite si la zone émettrice est trop grande ou complétée avec des caractères blancs à droite si la zone est plus courte.
MOVE " " TO L120 avec 01 L120 PIC X(120).
MOVE 120 blancs dans L120

– Dans le cas des numériques :
Les nombres sont alignés sur la partie décimale, si celle-ci est absente de la zone réceptrice elle est considérée comme étant à l’extrême droite.
Il a ensuite troncature éventuel ou complément de zéros à droite et à gauche si le nombre de chiffres désignés par la PIC de la zone réceptrice l’exige.
Si la zone réceptrice n’a pas de signe alors c’est la valeur absolue qui est transférée.
Si la zone émettrice n’est pas purement numérique le résultat est alors imprévisible.

Un INDEX est formellement interdit dans un MOVE.

Le contenu de la zone émettrice reste exactement le même après l’instruction MOVE.

MOVE et REDEFINES :

Dans le cas d’une redéfinition de zone
02 B……
02 C REDEFINES B…

Le fait d’exécuter un MOVE B TO C ou MOVE C TO B alors qu’il s’agit de la même zone mémoire entraîne un résultat inconnu!!

LE MOVE CORRESPONDING

Format :
MOVE CORR nom-de-groupe-1 TO nom-de-groupe-2

Le MOVE CORRESPONDING suit le même principe que l’option CORR des instructions arithmétiques. Les données de la zone groupe-1 sont mouvementées sur les zones de même nom de la zone groupe-2.

Toutefois, avec MOVE, il n’est pas exigé que les zones de même nom soient toutes deux élémentaires , mais qu’au moins l’une des deux zones le soit.

Mais, toute zone élémentaire décrite avec une clause OCCURS ou REDEFINES est ignorée.

Utilisation des constantes figuratives.

Les constantes figuratives SPACE(S) et ZERO(S) peuvent être utilisées dans un MOVE.

SPACE : pour mettre une zone PIC X ou PIC A à blanc, toute la zone est remplie de blancs, il peut également être question d’une structure.

Exemple :
MOVE SPACE TO VAR.
La variable VAR PIC XX ou PIC AA est remplie de blancs

MOVE SPACE TO STRUCTURE.
Ici toutes les variables contenues dans le groupe STRUCTURE sont mises à blancs. Il s’agit donc d’être très prudent, car si dans la description de structure nous avons une variable en PIC 9 son contenu sera un BLANC.

ZERO : permet de mettre n’importe quel variable PIC 9 usage…… à ZERO. Il en ira exactement de même avec un groupe et dans ce cas toutes les variables du groupe seront initialisées à 0.

Exemple :
MOVE ZERO TO VAR ——-> Dans ce cas VAR PIC 99.

MOVE ZERO TO STRUCTURE.
Et dans ce cas 01 STRUCTURE.
                                    02 A PIC 9999 BINARY.
                                    02 B PIC 9(5).

A et B sont mises à 0.

Remarque : l’usage d’un caractère de la chaîne est possible par l’option
MOVE CHAINE(i:j) TO A
Ou de l’hexadécimal : MOVE X"09" TO A

8.2 LES INSTRUCTIONS ARITHMETIQUES

Les instructions arithmétiques sont de 2 types:

  • les opérations simples :
    ADD
    SUBTRACT
    MULTIPLY
    DIVIDE
  • les opérations complexes :
    COMPUTE et ses opérateurs + – * / **

Ces instructions disposent d’options communes :

GIVING nom-de-donnée :
qui indique que le résultat de l’opération sera mémorisé dans nom-de-donnée.
ADD VAR1 VAR2 GIVING RESULTAT

ROUNDED :
après une opération le résultat tronque les décimales au-delà de ce qui
a été déclaré dans la PIC. Ainsi la quantité 234,478 sera de 234,4 si la
PIC de la variable résultat est de 999V9.
Avec ROUNDED, COBOL ajoute 5 au premier chiffre non significatif de droite pour réaliser l’arrondi à l’unité supérieure du chiffre le moins significatif si le premier chiffre non significatif de droite est >= 5.
Avec rounded notre exemple devient 234,5.

ON SIZE ERROR ordre impératif

Cette option permet de prévenir des incidents de calcul comme :
– la division par zéro
– les dépassements de capacité (pour rappel un numérique est limité à 18 chiffres)

exemple : DIVIDE A BY B ON SIZE ERROR MOVE ZERO TO B

!!!! Les calculs ne pourront se faire naturellement qu’avec des zones élémentaires numériques, il en ira de même pour les constantes. !!!!

L’ADDITION – ADD

Format n°1 :

    | nom-de-donnée-1      | | nom-de-donné-2       |
ADD |                                                         |     |                                                          |
    | littéral-numérique-1 | | littéral-numérique-2 |

    TO nom-de-donnée
[ ROUNDED].
     nom-de-donnée
-n [ ROUNDED].
   [ ON SIZE ERROR ordre-impératif
].

On ajoute nom-de-donnée-1 ou littéral-numérique-1 et nom-de-donnée-2 ou littéral-numérique-2 à la variable nom-de-donnée et le résultat peut être arrondi.

Exemple :

ADD 1000 QTE1 TO TOTAL ROUNDED ON SIZE ERROR MOVE 0 TO TOTAL

Ce qui signifie ajouter 1000 + QTE1 + TOTAL arrondir, transférer le résultat de l’opération dans TOTAL. En cas d’erreur mettre TOTAL à 0.

Format n° 2 :

    |nom-de-donnée-1| |nom-de-donné-2|     |nom-de-donné-n|
ADD |                                         |    |                                      | … |                                        |
    | littéral-1    | | littéral-2   |  | littéral-n   |

    GIVING nom-de-donnée
[ ROUNDED].
   [ ON SIZE ERROR ordre-impératif
].

Dans ce cas on ajoute nom-donnée-1 à nom-donnée-2 à….. nom-donnée-n le résultat est placé dans nom-de-donnée, éventuellement arrondi.

Exemple :
ADD TVA TOTHTVA GIVING TOTTVAC

Format n°3 :

ADD CORRESPONDING nom-de-groupe-1 TO nom-de-groupe2
[ ROUNDED ] [ ON SIZE ERROR ordre-imp. ]

Avec ce format, les zones élémentaires du groupe-1 sont additionnées aux données élémentaires du groupe-2 ayants des noms-données identiques, et les résultats sont placés dans les zones élémentaires du groupe-2.

L’abréviation COBOL de CORRESPONDING est CORR. Les clauses OCCURS et REDEFINES sont mal supportées.

Prenons par exemple un fichier paie mensuel d’enregistrement ENRMENS et le fichier ENRTOT.

De description :

01 ENRMENS.
   02 CODE-EMPLOYEE PIC 999.
   02 HEURE-P       PIC 999.
   02 SAL-BRUT      PIC 9(6).
01 ENRTOT.
   02 COD-EMPL      PIC 999.
   02 HEURE-P       PIC 999.
   02 SAL-BRUT      PIC 9(6).
   02 SAL-NET       PIC 9(6).

Le fait d’écrire ADD CORR ENRMENS TO ENRTOT, engendre les additions suivantes :

HEURE-P OF ENRTOT = HEURE-P OF ENRTOT + HEURE-P OF ENRMENS
SAL-BRUT OF ENRTOT = SAL-BRUT OF ENRTOT + SAL-BRUT OF ENRMENS

ADD identifier-1 TO identifier-2
         ROUNDED ON SIZE ERROR ordre-impératif-1
         NOT ON SIZE ERROR ordre impératif-2
END-ADD

ADD identifier-1 TO identifier-2
         GIVING identifier-3 ROUNDED
         ON SIZE ERROR ordre-impératif-1
         NOT ON SIZE ERROR ordre-impératif-2
END-ADD

Identifier-1 peut être une constante ou une variable numérique ou un ensemble des deux.
Les ordres impératifs 1 et 2 peuvent être constitués d’une ou de plusieurs instructions.
Avec l’option GIVING identifier-2 peut également être une constante numérique puisque le résultat est placé dans identifier-3.

LA SOUSTRACTION – SUBTRACT

Format 1 :

        |Identifier-1|
SUBTRACT|                                 |   FROM identifier-2 ROUNDED
        | littéral-1 |

        ON SIZE ERROR ordre-impératif-1

      NOT ON SIZE ERROR ordre-impératif-2

END-SUBTRACT

Format 2 :

        |Identifier-1|      |Identifier-2|
SUBTRACT|                                 |   FROM |            |
        | littéral-1 |      | littéral-2 |

      GIVING  identifier-3
 
    ROUNDED ON SIZE ERROR ordre-impératif-1

          NOT ON SIZE ERROR ordre-impératif-2

END-SUBTRACT

Format 3 :

SUBTRACT CORR identifier-1 FROM identifier-2 ROUNDED
ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre-impératif-2
END-SUBTRACT

Remarques:
identifier-1 peut être une série de variables ou de constantes numériques.
Les options ROUNDED et ON SIZE ERROR ne sont pas obligatoires.
END-SUBTRACT ne s’applique que si les options SIZE ERROR sont utilisées.

Exemple :
SUBTRACT V1 V2 12 FROM TOTAL. (TOTAL = TOTAL – (V1 + V2 + 12))
SUBTRACT V1 V2 12 FROM TOTAL GIVING SOUSTOT.
(SOUSTOT = TOTAL – (V1 + V2 + 12))

Dans le 1er cas TOTAL doit être un numérique de travail, dans le 2ème cas SOUSTOT peut être un numérique d’édition car il n’intervient pas dans le calcul.

LA MULTIPLICATION – MULTIPLY

Format 1 :

        |Identifier-1|
MULTIPLY|                                 |   BY identifier-2 ROUNDED
        | littéral-1 |

        ON SIZE ERROR ordre-impératif-1

        NOT ON SIZE ERROR ordre-impératif-2

END-MULTIPLY

Format 2 :

         |Identifier-1|     |Identifier-2|
MULTIPLY |                                 |    BY |            |
         | littéral-1 |     | littéral-2 |

      GIVING  identifier-3
 
    ROUNDED ON SIZE ERROR ordre-impératif-1

          NOT ON SIZE ERROR ordre-impératif-2

END-MULTIPLY

Exemple :
MULTIPLY 12 BY V1.           ( V1 = V1 * 12)
MULTIPLY V1 BY V2 GIVING V3. ( V3 = V1 * V2)

LA DIVISION – DIVIDE

Format 1 :

       |Identifier-1|
DIVIDE |                                 |   INTO identifier-2 ROUNDED
       | littéral-1 |

        ON SIZE ERROR ordre-impératif-1

        NOT ON SIZE ERROR ordre-impératif-2

END-DIVIDE

Format 2 :

         |Identifier-1| |INTO| |Identifier-2|
DIVIDE   |                                 | |    | |            |
         | littéral-1 | | BY | | littéral-2 |

      GIVING  identifier-3
 
    ROUNDED ON SIZE ERROR ordre-impératif-1

          NOT ON SIZE ERROR ordre-impératif-2

END-DIVIDE

Format 3 :

         |Identifier-1| |INTO| |Identifier-2|
DIVIDE   |                                 | |    | |            |
         | littéral-1 | | BY | | littéral-2 |

      GIVING  identifier-3
      ROUNDED
REMAINDER identifier-4
 
    ON SIZE ERROR ordre-impératif-1

      NOT ON SIZE ERROR ordre-impératif-2

END-DIVIDE

Exemple :
DIVIDE 10 INTO V1. (V1 = V1 / 10)
DIVIDE V1 BY V2 GIVING V3. ( V3 = V1 / V2)
DIVIDE V1 BY V2 GIVING V3 REMAINDER RESTE.
(V3 = V1 / V2) et RESTE = V1 – (V2 * V3)

le tout en entier sans quoi il n’y a pas de reste

L’INSTRUCTION – COMPUTE

                        |expression-arithmétique|
COMPUTE  nom-item-1 =   |constant             |   
                        |nom-item               |

Les symboles arithmétiques valides sont :

+ pour l’addition
– pour la soustraction
* pour la multiplication
/ pour la division
** pour l’exposant

Un symbole arithmétique doit être précédé et suivi par au moins un espace.

Format :
COMPUTE identifier-1 ROUNDED = expression
ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre-impératif-2
END-COMPUTE

L’expression : doit être composée de constantes et de variables numériques séparées par des opérateurs arithmétiques.

Les opérateurs sont : + – * / ** ( )

Avec + pour addition, – pour la soustraction, * pour la multiplication, le / pour la division et ** pour un exposant.

Exemple :
COMPUTE RESULTAT = A + (B – 3) * (G / 4) + ( E ** 2).

L’expression est analysée de la gauche vers la droite en tenant compte des priorités suivantes :
d’abord les exposants **, ensuite les * et / puis les + et -.
Il faut autant de ( gauches que de ) droites.