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
Index du tour guidé
Navigation rapide
Utilisez ces boutons si vous voulez accéder directement à une page, sans parcourir les cartes.
1 2 3 4 5 6 7 8 9 10

Leçon 9 : traiter un fichier en batch (premier niveau)

Objectif : lire un fichier séquentiel ligne par ligne, détecter la fin de fichier, compter les enregistrements et produire un résultat sans interface graphique, comme dans un vrai traitement batch.

Débutant Batch Fichiers
📄
Idée clé
Un traitement batch lit des données, applique une règle, et produit un résultat de manière répétable. Il n’a pas besoin d’interface graphique : sa force est la stabilité et la capacité à traiter de très gros volumes avec une logique simple et robuste.
🧠

Conceptualiser

OPEN/READ/CLOSE

Pour lire un fichier, Cobol suit un scénario très régulier. C’est une “recette” que vous réutilisez partout.

🗂️
Déclarer le fichier
Dans  FILE-CONTROL  (nom logique + fichier réel), puis dans  FILE  SECTION  (structure de la ligne).
🔓
 OPEN 
Ouvre le fichier dans le mode voulu : ici  INPUT  (lecture).
📥
 READ  + fin de fichier
Lire une ligne, ou détecter la fin avec  AT  END . La fin de fichier est un événement normal, qu’on gère explicitement.
🔒
 CLOSE 
Ferme le fichier. En batch, la discipline  OPEN / CLOSE  évite beaucoup de problèmes.
⚠️
Deux points à comprendre dès le départ
1) Le nom logique (ex.  F-IN ) n’est pas le nom du fichier sur disque. 2) L’organisation  LINE  SEQUENTIAL  convient aux fichiers texte “une ligne = un enregistrement”.
🧪

Opérer

Lire un fichier séquentiel

Exemple : le programme lit noms.txt, affiche chaque ligne et compte le nombre total de lignes lues.

🧾Fichier : demo-file.cbl
Cobol (format libre)

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

 ENVIRONMENT DIVISION.
 INPUT-OUTPUT SECTION.
 FILE-CONTROL.
    SELECT F-IN ASSIGN TO "noms.txt"
        ORGANIZATION IS LINE SEQUENTIAL.

 DATA DIVISION.
 FILE SECTION.
 FD  F-IN.
 01  F-IN-REC PIC X(80).

 WORKING-STORAGE SECTION.
 01 WS-EOF   PIC X VALUE "N".
 01 WS-COUNT PIC 9(5) VALUE 0.

 PROCEDURE DIVISION.
    OPEN INPUT F-IN
    PERFORM UNTIL WS-EOF = "Y"
        READ F-IN
            AT END
                MOVE "Y" TO WS-EOF
            NOT AT END
                ADD 1 TO WS-COUNT
                DISPLAY "Lu : " F-IN-REC
        END-READ
    END-PERFORM
    CLOSE F-IN

    DISPLAY "Total lignes : " WS-COUNT
    STOP RUN.
📌 Exemple de fichier noms.txt
Une ligne par nom (vous pouvez créer ce fichier à côté de l’exécutable).
DURAND
MARTIN
BERNARD
▶️ Compilation (exemple)
cobc -x -free demo-file.cbl
Placez noms.txt dans le même dossier d’exécution (ou adaptez le chemin).
✅ Ce que vous validez
  • Lecture ligne par ligne
  • Fin de fichier gérée
  • Compteur batch
🧯

Déboguer

Erreurs typiques

Les erreurs de fichiers sont très souvent des erreurs de chemin, de mode d’organisation, ou de discipline d’ouverture/fermeture.

  • Chemin incorrect : le programme ne trouve pas noms.txt.
  • Mauvais mode d’organisation :  LINE  SEQUENTIAL  n’est pas équivalent à un fichier “fixe”.
  • Oublier  OPEN  ou  CLOSE  : comportement imprévisible selon l’environnement.
🔎 Astuce

Si le fichier n’est pas trouvé, affichez d’abord un message “début programme”, puis un message après  OPEN . Si rien ne s’affiche après, vous savez où ça bloque.

🧭

Expliquer et explorer

Exercices

La simplicité de ce modèle est sa force : des millions de lignes peuvent être traitées de façon stable. Les traitements batch sont fréquents en consolidation, facturation, rapprochement et édition.

📌 Conseil
Gardez votre boucle de lecture minimaliste : lire, tester la fin, traiter, puis recommencer. Toute “complexité” doit être dans un paragraphe séparé (traitement d’une ligne).

🧩 Exercices (à faire tout de suite)

  1. Comptez seulement les lignes non vides.
  2. Comptez combien de lignes contiennent une lettre donnée (ex. “A”).
💡 Ici, on considère “vide” = une ligne composée uniquement d’espaces.

    NOT AT END
        IF FUNCTION TRIM(F-IN-REC) = ""
            CONTINUE
        ELSE
            ADD 1 TO WS-COUNT
            DISPLAY "Lu : " F-IN-REC
        END-IF
💡 Variante simple : on cherche un caractère via  INSPECT  et on teste si au moins une occurrence est trouvée.

 WORKING-STORAGE SECTION.
 01 WS-LETTER  PIC X VALUE "A".
 01 WS-TALLY   PIC 9(5) VALUE 0.
 01 WS-LINE-HIT PIC 9(5) VALUE 0.

 ...

    NOT AT END
        MOVE 0 TO WS-TALLY
        INSPECT F-IN-REC TALLYING WS-TALLY FOR ALL WS-LETTER
        IF WS-TALLY > 0
            ADD 1 TO WS-LINE-HIT
        END-IF
⚠️ Si vous voulez ignorer la casse (a/A), il faudra normaliser les lignes ou prévoir deux lettres.

↑ Haut