Bienvenue dans la formation COBOL

Apprenez les bases du COBOL et développez vos compétences en programmation legacy avec une approche moderne.

Info : Ce module vous permet d’accéder rapidement aux contenus essentiels de la formation COBOL.
Retour au plan général

Cas pratique : construction et analyse d’une chaîne à partir d’un tableau

Ce cas pratique relie deux sujets fondamentaux : les tableaux (déclarés avec  OCCURS ) et la manipulation de texte (avec  STRING ,  UNSTRING  et éventuellement  INSPECT ). L’objectif est simple et très “métier” : construire une ligne texte à partir d’un tableau (par exemple une liste de produits), puis relire cette ligne et l’analyser pour reconstituer des champs et contrôler le format.

Tableaux Chaînes Cas métier

Conceptualiser

Objectif

Dans beaucoup de traitements batch, vous avez un tableau en mémoire (ex. des libellés, des codes, des montants), et vous devez produire une sortie compacte : une ligne, un message, une “trace”, ou un enregistrement. L’idée du cas pratique est de faire deux passes :

1) Construire
Vous assemblez les éléments du tableau en une chaîne, avec un séparateur clair (ex. |). Vous obtenez une ligne du type : ALPHA|BETA|GAMMA.
2) Analyser
Vous relisez la chaîne et vous la découpez en champs, puis vous contrôlez : combien d’éléments, présence du séparateur, champs vides, etc.
Pourquoi c’est utile
Cela vous force à gérer la taille des champs, les espaces, et la robustesse. C’est une mini version d’un vrai flux “entrée → transformation → contrôle → sortie”.
Point de vigilance
La destination de la chaîne doit être assez grande, sinon vous tronquez et vous perdez la fin. Pendant l’apprentissage, affichez toujours la chaîne encadrée : [...].

Opérer

Exemple exécutable

Le programme suivant : remplit un tableau de trois éléments, construit une ligne à partir de ce tableau (séparateur |), puis découpe la ligne dans un second tableau et compte le nombre de séparateurs avec  INSPECT .

Fichier : demo-cas-chaine-tableau.cbl
Cobol (format libre)

 >>SOURCE FORMAT FREE
 IDENTIFICATION DIVISION.
 PROGRAM-ID. DEMO-CTC.

 DATA DIVISION.
 WORKING-STORAGE SECTION.

 01 WS-I            PIC 9(2) VALUE 0.

 01 WS-SRC-TABLE.
    05 WS-SRC-ITEM OCCURS 3 TIMES.
        10 WS-SRC-TXT PIC X(12) VALUE SPACES.

 01 WS-LIGNE      PIC X(80) VALUE SPACES.
 01 WS-TMP       PIC X(12) VALUE SPACES.

 01 WS-NB-SEPAR   PIC 9(2) VALUE 0.

 01 WS-DST-TABLE.
    05 WS-DST-ITEM OCCURS 3 TIMES.
        10 WS-DST-TXT PIC X(12) VALUE SPACES.

 PROCEDURE DIVISION.
    PERFORM INIT-SRC
    PERFORM CONSTRUIRE-LIGNE
    PERFORM ANALYSER-LIGNE
    STOP RUN.

 INIT-SRC.
    MOVE "ALPHA" TO WS-SRC-TXT(1)
    MOVE "BETA"  TO WS-SRC-TXT(2)
    MOVE "GAMMA" TO WS-SRC-TXT(3)
    DISPLAY "--- Tableau source ---"
    PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
        DISPLAY "[" WS-I "] = [" WS-SRC-TXT(WS-I) "]"
    END-PERFORM.

 CONSTRUIRE-LIGNE.
    MOVE SPACES TO WS-LIGNE
    STRING
        FUNCTION TRIM(WS-SRC-TXT(1)) DELIMITED BY SIZE
        "|" DELIMITED BY SIZE
        FUNCTION TRIM(WS-SRC-TXT(2)) DELIMITED BY SIZE
        "|" DELIMITED BY SIZE
        FUNCTION TRIM(WS-SRC-TXT(3)) DELIMITED BY SIZE
        INTO WS-LIGNE
    END-STRING
    DISPLAY "--- Ligne construite ---"
    DISPLAY "Ligne = [" WS-LIGNE "]".

 ANALYSER-LIGNE.
    MOVE SPACES TO WS-DST-TABLE
    MOVE 0 TO WS-NB-SEPAR

    INSPECT WS-LIGNE
        TALLYING WS-NB-SEPAR FOR ALL "|"
    END-INSPECT
    DISPLAY "Separateurs trouves = " WS-NB-SEPAR

    UNSTRING WS-LIGNE
        DELIMITED BY "|"
        INTO WS-DST-TXT(1) WS-DST-TXT(2) WS-DST-TXT(3)
    END-UNSTRING

    DISPLAY "--- Tableau reconstitue ---"
    PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
        DISPLAY "[" WS-I "] = [" WS-DST-TXT(WS-I) "]"
    END-PERFORM

    IF WS-NB-SEPAR NOT = 2
        DISPLAY "Attention : format inattendu (attendu 2 separateurs)"
    END-IF.
Construire une ligne à partir d’un tableau

Vous assemblez trois valeurs avec un séparateur |. Le nettoyage via  FUNCTION  TRIM  évite d’injecter les espaces de fin (car les champs du tableau sont fixes).


 STRING
    FUNCTION TRIM(WS-SRC-TXT(1)) DELIMITED BY SIZE
    "|" DELIMITED BY SIZE
    FUNCTION TRIM(WS-SRC-TXT(2)) DELIMITED BY SIZE
    "|" DELIMITED BY SIZE
    FUNCTION TRIM(WS-SRC-TXT(3)) DELIMITED BY SIZE
    INTO WS-LIGNE
 END-STRING
Pourquoi un séparateur visible ?
Le séparateur rend le format stable. Ensuite,  UNSTRING  peut reconstituer les champs sans ambiguïté.
Analyser : contrôle + découpe
1) Contrôle par comptage
Si vous attendez 3 éléments, vous attendez 2 séparateurs. Ce contrôle est simple, mais très efficace pour détecter un format incorrect.

 MOVE 0 TO WS-NB-SEPAR
 INSPECT WS-LIGNE
    TALLYING WS-NB-SEPAR FOR ALL "|"
 END-INSPECT
2) Découpe en champs
Une fois le format plausible, vous découpez la ligne et vous remplissez un tableau destination.

 UNSTRING WS-LIGNE
    DELIMITED BY "|"
    INTO WS-DST-TXT(1) WS-DST-TXT(2) WS-DST-TXT(3)
 END-UNSTRING
Remarque
Si la ligne contient plus de séparateurs, l’excédent n’ira pas dans vos 3 champs. Dans un vrai programme, vous prévoyez une gestion d’erreur ou un champ “reste”.

Chaîne tronquée
Si  WS-LIGNE  est trop petit, la fin disparaît. Solution : augmentez la taille, ou limitez la longueur des éléments.
Espaces parasites
Si vous concaténez des champs non nettoyés, les espaces se propagent. Solution :  FUNCTION  TRIM  sur chaque élément.
Format inattendu
Si le séparateur n’est pas celui attendu (ex. ; au lieu de |), votre découpe ne remplit pas correctement. Solution : contrôler la présence et le nombre de séparateurs avant  UNSTRING .
Expliquer
Vous venez de faire un mini flux complet : données structurées en tableau → construction d’un format texte stable → contrôle du format → reconstitution des champs. C’est une logique très proche de ce qui se passe en batch et en échange de fichiers.
Explorer : exercices
1) Passez de 3 à 5 éléments : adaptez la chaîne et le tableau destination.
2) Utilisez ; comme séparateur et comparez.
3) Ajoutez une règle : refuser si un élément contient le séparateur (ex. “A|B”).
4) Après découpe, reconstruisez une seconde chaîne “normalisée” avec  STRING .

↑ Haut