Apprenez les bases du COBOL et développez vos compétences en programmation legacy avec une approche moderne.
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.
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 :
|).
Vous obtenez une ligne du type : ALPHA|BETA|GAMMA.
[...].
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 .
>>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.
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
UNSTRING peut
reconstituer les champs sans ambiguïté.
MOVE 0 TO WS-NB-SEPAR
INSPECT WS-LIGNE
TALLYING WS-NB-SEPAR FOR ALL "|"
END-INSPECT
UNSTRING WS-LIGNE
DELIMITED BY "|"
INTO WS-DST-TXT(1) WS-DST-TXT(2) WS-DST-TXT(3)
END-UNSTRING
WS-LIGNE est trop petit, la fin disparaît.
Solution : augmentez la taille, ou limitez la longueur des éléments.
FUNCTION TRIM sur chaque élément.
; au lieu de |),
votre découpe ne remplit pas correctement.
Solution : contrôler la présence et le nombre de séparateurs avant UNSTRING .
; comme séparateur et comparez. STRING .