đ§Ÿ COBOL â Guide complet (Mainframe / Enterprise)
Syntaxe, Data Division, fichiers, subprograms, DB2, CICS, JCL, performance, migration et modernisation.
Vue dâensemble COBOL
OĂč vit COBOL, pourquoi ça tient encore, et les grands modes dâexĂ©cution.
HistoryEnterpriseBatch/OnlineStructure dâun programme
IDENTIFICATION, ENVIRONMENT, DATA, PROCEDURE. Sections, paragraphs, PERFORM.
DivisionsPERFORMFlowDATA DIVISION (fondations)
Level numbers, PIC, USAGE, REDEFINES, OCCURS, 88-level, COMP/COMP-3.
PICCOMP-3OCCURSPROCEDURE DIVISION
IF/EVALUATE, PERFORM, CALL, erreurs, gestion du contrÎle et lisibilité.
EVALUATECALLPERFORMFichiers & I/O
SELECT/FD, READ/WRITE/REWRITE/DELETE, file status, sequential vs indexed.
FDFile StatusI/OVSAM (concepts)
KSDS/ESDS/RRDS, clés, browse, accÚs aléatoire, patterns transactionnels.
VSAMKSDSBrowseCOPYBOOKS & standardisation
COPY, REPLACING, conventions, layouts, partage inter-programmes.
COPYREPLACINGLayoutSubprograms & LINKAGE
CALL, USING, LINKAGE SECTION, conventions dâappel, RETURN-CODE.
LINKAGECALLRCBatch & JCL (lecture pratique)
JOB/EXEC/DD, datasets, étapes, parameters, return codes, rerun safe.
JCLBatchDDDB2 & SQL embarqué
EXEC SQL, host variables, cursors, commits, -911/-913, performance.
DB2Embedded SQLCursorCICS (online)
Transactions, COMMAREA, channels/containers, BMS maps, syncpoints.
CICSCOMMAREABMSDebug & troubleshooting
ABEND, dumps, file status, SQLCODE, logs, diagnostics reproductibles.
ABENDSQLCODEStatusTests & qualité
Jeux de données, golden files, non-regression, contract tests batch/online.
NRTDataQualityPerformance & tuning
I/O patterns, sort/merge, DB2 access, buffer usage, design de record.
I/ODB2BatchSécurité & conformité
ContrĂŽles dâaccĂšs, sĂ©paration des environnements, audit, data masking.
AuditAccessMaskingModernisation COBOL
Strangler pattern, APIs, wrappers, refactoring safe, migration DB/files.
APIRefactorMigration0.x Carte mentale COBOL
Architecture globale : programme, fichiers, batch, DB2, CICS, monitoring.
MapBig PictureCheat-sheet
Mini-rappels : PIC, COMP-3, IF/EVALUATE, I/O, DB2, CICS, JCL patterns.
Quick RefSnippetsCOBOL en 2026 : oĂč on le rencontre
COBOL reste central dans de nombreux SI âcoreâ (compta, paiements, assurance, back-office), parce quâil gĂšre des volumes colossaux avec des schĂ©mas de donnĂ©es stables, et une chaĂźne outillĂ©e (batch, ordonnancement, I/O, DB2/CICS) industrialisĂ©e.
SchĂ©ma global â1 slideâ
Program (COBOL)
ââ Divisions
â ââ IDENTIFICATION
â ââ ENVIRONMENT (files, assign)
â ââ DATA (FD, WS, LK)
â ââ PROCEDURE (logic)
â
ââ Execution modes
â ââ Batch (JCL, scheduler)
â ââ Online (CICS transaction)
â
ââ Data sources
â ââ Files (SEQ, VSAM)
â ââ DB2 (embedded SQL)
â
ââ Ops
ââ Monitoring (return codes, abends)
ââ Change (copybooks, versioning, regression)
Batch (traitement différé)
- Exécution planifiée (ordonnanceur) : traitements de masse, clÎtures, calculs.
- ChaĂźne : JCL â step(s) â datasets â return codes â reruns contrĂŽlĂ©s.
- Points critiques : I/O, tri, accĂšs DB2, contention, volumes, reprise.
JOB
STEP1: extract
STEP2: sort/merge
STEP3: transform
STEP4: load/report
Online (transactionnel)
- Temps réel : CICS, transaction code, écrans BMS ou APIs internes.
- Unités de travail : syncpoints, rollback, locking.
- Patterns : COMMAREA, channels/containers, pseudo-conversation.
User action
â CICS transaction
â program
â DB2 read/update
â response screen/message
Flux de données typique
Batch:
Input file(s) â validate â enrich (DB2) â output file/report
Online:
Request â validate â DB2 update â commit/rollback â response
| Zone | SymptĂŽme | Reflexe | Action |
|---|---|---|---|
| Files | Unexpected EOF / wrong record | Check FD, record layout, status | Validate status codes, align copybook |
| DB2 | Slow cursor / lock wait | Access path, commit frequency | Index, predicates, reduce row-by-row |
| CICS | Abend / timeout | Transaction trace, syncpoint | Shorten UOW, handle errors |
Les points Ă connaĂźtre
- Data-centric : la structure de donnĂ©es (records) est souvent plus importante que lâalgorithme.
- LisibilitĂ© : style verbeux, sections/paragraphs explicites, âbusiness rulesâ proches du texte.
- ĂcosystĂšme : batch/JCL, fichiers (SEQ/VSAM), DB2, CICS.
- Maintenance : copybooks, conventions PIC, tests de non-régression.
Mini glossaire
| Terme | Idée |
|---|---|
| Copybook | Définition partagée (layout record) incluse via COPY. |
| COMP-3 | Decimal packed (stockage compact des décimaux). |
| FD | File Description : structure du record fichier. |
| 88-level | Conditions nommées (valeurs symboliques). |
| ABEND | Abnormal end : arrĂȘt avec diagnostic/dump. |
Pourquoi câest toujours lĂ ?
Parce que les chaĂźnes de traitement âcore businessâ sont stables, auditĂ©es, et coĂ»tent trĂšs cher Ă remplacer. Les modernisations gagnantes sont souvent progressives (wrappers, APIs, strangler pattern), pas des âbig bang rewritesâ.
Programme minimal
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLOCBL.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-ZOS.
OBJECT-COMPUTER. IBM-ZOS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-MSG PIC X(24) VALUE "HELLO FROM COBOL.".
PROCEDURE DIVISION.
MAIN-PARA.
DISPLAY WS-MSG
GOBACK.
Lecture guidée
- PROGRAM-ID : identité (et parfois conventions de build/packaging).
- DATA : structures (records), variables de travail, buffers, layouts.
- PROCEDURE : logique, appels, I/O, SQL, CICS, etc.
Sections & paragraphs
Un style courant : âcontrol paragraphsâ (INIT / PROCESS / FINALIZE) + paragraphs dĂ©diĂ©s (READ, VALIDATE, TRANSFORM, WRITE).
PROCEDURE DIVISION.
MAIN.
PERFORM INIT
PERFORM PROCESS UNTIL EOF-FLAG = "Y"
PERFORM FINALIZE
GOBACK.
INIT.
MOVE "N" TO EOF-FLAG
PERFORM OPEN-FILES.
PROCESS.
PERFORM READ-IN
IF EOF-FLAG = "N"
PERFORM VALIDATE-IN
PERFORM TRANSFORM-IN
PERFORM WRITE-OUT
END-IF.
PERFORM UNTIL
PERFORM READ-IN
PERFORM UNTIL EOF-FLAG = "Y"
PERFORM HANDLE-RECORD
PERFORM READ-IN
END-PERFORM
PERFORM VARYING
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
ADD 1 TO WS-COUNTER
END-PERFORM
Anti-patterns fréquents
| Anti-pattern | Pourquoi | Alternative |
|---|---|---|
| GO TO everywhere | Flow illisible | PERFORM + paragraphs petits |
| One giant paragraph | Debug pénible | INIT/PROCESS/FINALIZE |
| Hidden assumptions | Incidents prod | Explicit status checks |
Error handling : discipline
- Centraliser la gestion des erreurs : FILE STATUS, SQLCODE, CICS RESP/RESP2.
- Tracer les codes de retour (RETURN-CODE) et abends âowning teamâ.
- Prévoir la reprise (rerun) : idempotence, checkpoints, commits.
IF WS-FILE-STATUS NOT = "00"
DISPLAY "FILE ERROR STATUS=" WS-FILE-STATUS
MOVE 12 TO RETURN-CODE
GOBACK
END-IF
Variables courantes
01 WS-NAME PIC X(30).
01 WS-AGE PIC 9(03).
01 WS-AMOUNT PIC 9(07)V99.
01 WS-FLAG PIC X.
X pour alphanumĂ©rique, 9 pour numĂ©rique affichable, V pour âdecimal point impliedâ.
Group items (records)
01 WS-CUSTOMER-REC.
05 WS-CUST-ID PIC 9(10).
05 WS-CUST-NAME PIC X(30).
05 WS-CUST-ADDR.
10 WS-STREET PIC X(40).
10 WS-CITY PIC X(20).
10 WS-ZIP PIC 9(05).
Un group item nâa pas de PIC, il regroupe des sous-champs.
Binary (COMP)
01 WS-COUNT PIC 9(09) COMP.
01 WS-SMALL PIC 9(04) COMP.
Stockage binaire, performant pour compteurs/indices.
Packed decimal (COMP-3)
01 WS-PRICE PIC 9(07)V99 COMP-3.
01 WS-TAX PIC 9(03)V99 COMP-3.
Standard finance : compact, exact en décimal, trÚs utilisé en legacy.
| Usage | Quand | Attention |
|---|---|---|
| DISPLAY | Interfaces humaines / logs | Plus lent, plus volumineux |
| COMP | Comptage, indices, loops | Alignement/portabilité |
| COMP-3 | Montants, compta | Conversion en sortie |
OCCURS : tables et itérations
01 WS-ITEMS.
05 WS-ITEM OCCURS 10 TIMES.
10 WS-ITEM-ID PIC 9(05).
10 WS-ITEM-QTY PIC 9(03) COMP.
10 WS-ITEM-PRICE PIC 9(07)V99 COMP-3.
01 I PIC 9(02) COMP.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
ADD WS-ITEM-QTY(I) TO WS-TOTAL-QTY
END-PERFORM
REDEFINES : vue alternative
01 WS-BUFFER PIC X(10).
01 WS-BUFFER-NUM REDEFINES WS-BUFFER PIC 9(10).
MĂȘme zone mĂ©moire, interprĂ©tation diffĂ©rente. Puissant, mais dangereux si abusĂ©.
88-level : conditions nommées
01 WS-STATUS PIC X.
88 STATUS-OK VALUE "0".
88 STATUS-ERR VALUE "9".
IF STATUS-OK
CONTINUE
ELSE
MOVE 12 TO RETURN-CODE
END-IF
IF / ELSE
IF WS-AMOUNT > 0
ADD WS-AMOUNT TO WS-SUM
ELSE
SUBTRACT WS-AMOUNT FROM WS-SUM
END-IF
EVALUATE (switch)
EVALUATE WS-ACTION
WHEN "C" PERFORM CREATE-REC
WHEN "U" PERFORM UPDATE-REC
WHEN "D" PERFORM DELETE-REC
WHEN OTHER
MOVE 16 TO RETURN-CODE
END-EVALUATE
CALL : découper et contractualiser
CALL "SUBP001" USING LK-IN, LK-OUT
IF RETURN-CODE NOT = 0
DISPLAY "CALL FAILED RC=" RETURN-CODE
GOBACK
END-IF
Pattern âread loopâ robuste
PERFORM READ-IN
PERFORM UNTIL EOF-FLAG = "Y"
PERFORM PROCESS-REC
PERFORM READ-IN
END-PERFORM
ENVIRONMENT: SELECT
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN TO INFILE
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.
DATA: FD + record
DATA DIVISION.
FILE SECTION.
FD INFILE.
01 IN-REC.
05 IN-ID PIC 9(10).
05 IN-NAME PIC X(30).
WORKING-STORAGE SECTION.
01 WS-IN-STATUS PIC XX VALUE "00".
OPEN / READ / CLOSE
OPEN INPUT INFILE
PERFORM READ-IN
PERFORM UNTIL EOF-FLAG = "Y"
PERFORM PROCESS-REC
PERFORM READ-IN
END-PERFORM
CLOSE INFILE
READ-IN.
READ INFILE
AT END MOVE "Y" TO EOF-FLAG
END-READ.
WRITE (output)
OPEN OUTPUT OUTFILE
MOVE WS-OUT-REC TO OUT-REC
WRITE OUT-REC
CLOSE OUTFILE
File Status : réflexe #1
| Status | Idée | Action |
|---|---|---|
| 00 | OK | Continue |
| 10 | End of file (common) | Set EOF flag |
| 35 | File not found | Check dataset / DD / assign |
| 39 | Mismatch attributes | Check organization / record layout |
IF WS-IN-STATUS NOT = "00" AND WS-IN-STATUS NOT = "10"
DISPLAY "INFILE STATUS=" WS-IN-STATUS
MOVE 12 TO RETURN-CODE
GOBACK
END-IF
Patterns robustes I/O
- Valider le record layout via copybook unique.
- Centraliser READ-IN / WRITE-OUT.
- Tracer : status, key, record count, checkpoint.
01 WS-REC-COUNT PIC 9(09) COMP VALUE 0.
PROCESS-REC.
ADD 1 TO WS-REC-COUNT
IF WS-REC-COUNT > 1000000
DISPLAY "PROGRESS COUNT=" WS-REC-COUNT
END-IF
Les 3 familles
| Type | AccĂšs | Usage |
|---|---|---|
| KSDS | Keyed | Lookup par clé, browse |
| ESDS | Entry sequence | Append/read sequential |
| RRDS | Relative record | AccÚs par numéro |
Browse (idée générale)
START INVSAM KEY IS >= WS-KEY
READ INVSAM NEXT RECORD
...
READ INVSAM NEXT RECORD
END-READ
Les verbs et options exacts dépendent du dialecte et des conventions site.
Inclure un copybook
WORKING-STORAGE SECTION.
COPY CUSTOMER-REC.
REPLACING (variation contrÎlée)
COPY CUSTOMER-REC REPLACING ==:PREFIX:== BY ==WS==.
Bonnes pratiques
- Un copybook = un contrat (I/O ou interface CALL).
- Versionner (mĂȘme en legacy) : changelog, compatibilitĂ©, tests.
- Nommer les champs de façon stable (éviter renames fréquents).
Caller
CALL "RATECALC" USING WS-IN, WS-OUT
IF RETURN-CODE NOT = 0
DISPLAY "RATECALC FAILED RC=" RETURN-CODE
GOBACK
END-IF
Toujours documenter : âinput/output layoutâ, RCs, et rĂšgles dâerreur.
Callee (LINKAGE)
IDENTIFICATION DIVISION.
PROGRAM-ID. RATECALC.
DATA DIVISION.
LINKAGE SECTION.
01 LK-IN.
05 LK-AMOUNT PIC 9(07)V99 COMP-3.
01 LK-OUT.
05 LK-RATE PIC 9(03)V99 COMP-3.
PROCEDURE DIVISION USING LK-IN LK-OUT.
COMPUTE LK-RATE = LK-AMOUNT * 0.05
GOBACK.
Checklist interface
| Item | Pourquoi |
|---|---|
| Layout stable | Compatibilité inter-programmes |
| Return codes | Monitoring & rerun behavior |
| Error handling | Fail fast, no silent corruption |
| Idempotence | Batch rerun safe |
Structure minimaliste
//MYJOB JOB (ACCT),'BATCH RUN',CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//STEP01 EXEC PGM=MYPROG
//INFILE DD DSN=APP.INPUT.DATA,DISP=SHR
//OUTFILE DD DSN=APP.OUTPUT.DATA,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(10,5)),DCB=(RECFM=FB,LRECL=200,BLKSIZE=0)
//SYSOUT DD SYSOUT=*
DD: points qui cassent tout
- RECFM/LRECL : doit matcher FD/record layout.
- DISP : SHR vs NEW, CATLG, DELETE, volumes, espace.
- Naming conventions : environnements (DEV/QA/PROD).
//INFILE DD DSN=APP.INPUT.DATA,DISP=SHR
//SYSIN DD *
PARAM1=VALUE
/*
Return codes
Le RC est la base du pilotage (monitoring / ordonnancement). En COBOL, on influence souvent via RETURN-CODE.
MOVE 0 TO RETURN-CODE
IF FATAL-ERROR
MOVE 12 TO RETURN-CODE
END-IF
GOBACK
Rerun safe (reprise)
- Ăviter les doubles Ă©critures : checkpoints / datasets temporaires.
- Commit frequency maßtrisée (si DB2) + logs.
- Sortir des âcontrol totalsâ pour validation.
Strategy:
step writes to temp output
verify totals
rename/switch temp to final
Host variables : idée
EXEC SQL
SELECT COL1, COL2
INTO :HV-COL1, :HV-COL2
FROM MYTABLE
WHERE KEYCOL = :HV-KEY
END-EXEC
Les host variables sont souvent alignées avec la WORKING-STORAGE (ou copybooks dédiés).
Cursor : pattern de base
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT KEYCOL, AMOUNT
FROM MYTABLE
WHERE STATUS = :HV-STATUS
END-EXEC
EXEC SQL
OPEN C1
END-EXEC
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH C1 INTO :HV-KEY, :HV-AMOUNT
END-EXEC
IF SQLCODE = 0
PERFORM PROCESS-ROW
END-IF
END-PERFORM
EXEC SQL
CLOSE C1
END-EXEC
Commit frequency : batch reality
- Commit trop rare : locks longs, logs énormes, rollback coûteux.
- Commit trop fréquent : overhead, throughput baisse.
- Approche : commit par N enregistrements + checkpointing.
IF WS-REC-COUNT MOD 5000 = 0
EXEC SQL COMMIT END-EXEC
END-IF
SQLCODE / SQLSTATE
| Code | Idée | Réflexe |
|---|---|---|
| 0 | OK | Continue |
| 100 | No row found | Handle end / missing |
| -911 | Deadlock/timeout rollback | Retry strategy, shorten UOW |
| -913 | Timeout/lock | Commit frequency, access path |
IF SQLCODE NOT = 0 AND SQLCODE NOT = 100
DISPLAY "DB2 ERROR SQLCODE=" SQLCODE
EXEC SQL ROLLBACK END-EXEC
MOVE 12 TO RETURN-CODE
GOBACK
END-IF
Concepts clés
- Transaction code â programme
- COMMAREA ou channels/containers pour passer lâĂ©tat
- Unit of work : syncpoint / rollback
- Maps BMS pour UI legacy (ou intégrations gateway)
Pseudo-flow
RECEIVE request (COMMAREA)
validate
read/update DB2
if ok: syncpoint
else: rollback
SEND response (map/message)
Les verbes exacts (EXEC CICS ...) dĂ©pendent des conventions et du type dâĂ©cran.
Checklist incident (pragmatique)
| Signal | Cause probable | Action |
|---|---|---|
| ABEND | Data exception, I/O, memory | Dump + last record + RC |
| Bad totals | Layout mismatch, rounding | Compare copybooks, PIC/COMP-3 |
| Slow batch | I/O, cursor row-by-row | Reduce I/O, set-based SQL |
| Lock waits | Commit too rare | Commit strategy, indexes |
Instrumentation minimale (safe)
DISPLAY "START STEP"
DISPLAY "COUNT=" WS-REC-COUNT
DISPLAY "STATUS=" WS-IN-STATUS
DISPLAY "SQLCODE=" SQLCODE
Stratégie test batch
- Jeux dâentrĂ©e âsmall but representativeâ
- Golden output + compare
- Control totals : count/sum par clé
- Scénarios erreurs : bad record, missing key, EOF
Control totals:
input_count
output_count
sum_amount_in
sum_amount_out
Qualité data-centric
| Check | But |
|---|---|
| Field length | Prevent truncation/corruption |
| Numeric validity | Avoid data exception |
| Key uniqueness | Consistency |
| Totals invariants | Detect regressions |
Les âgros leviersâ
- I/O : réduire les passes sur fichiers, bufferiser, éviter REWRITE coûteux.
- DB2 : éviter row-by-row quand possible, indexer sur prédicats, cursor stable.
- Sort : external sort/merge optimisé, moins de transformations avant tri.
- Commit : fréquence adaptée au volume et à la contention.
Table âsymptĂŽme â actionâ
| SymptĂŽme | Diagnostic | Action |
|---|---|---|
| Batch x3 slower | I/O spike | Reduce reads, merge passes |
| DB2 CPU high | Bad access path | Index/predicate, stats |
| Lock waits | Long UOW | Commit strategy, shorten scope |
| High sort time | Large intermediate | Filter early, better keys |
Rule of thumb (batch)
Prefer:
read sequential once
transform in memory
write sequential once
Avoid:
random I/O loops
SQL inside tight loops without batching
Axes majeurs
- ContrĂŽles dâaccĂšs (principe du moindre privilĂšge).
- Séparation DEV/QA/PROD et gestion des datasets.
- Traçabilité : qui a exécuté quel job, quand, avec quel input.
- Protection données : masking, chiffrement, purge, retention.
Audit âbatchâ concret
Audit items:
job name
step name
input dataset
output dataset
record count
return code
timestamp
Les 4 approches classiques
| Approche | Avantage | Risque |
|---|---|---|
| Encapsulate | Rapide, low risk | Legacy remains |
| Refactor inside | Qualité long terme | Needs strong tests |
| Strangler pattern | Progressive replace | Complex routing |
| Big bang rewrite | Clean slate | High failure rate |
Wrapper / façade
Expose COBOL via service layer (batch trigger, message queue, API gateway interne).
Pattern:
API â translate request â COBOL program â translate response
Contract-first
Définir un contrat stable (schema), puis adapter la Data Division.
Contract:
request fields
response fields
error codes
idempotency keys
Safe refactor : méthode
- Capture behavior : golden outputs + totals.
- Isolate I/O : READ/WRITE paragraphs.
- Modularize : subprograms + copybooks.
- Introduce checks : status, SQLCODE, assertions.
- Rollout progressive : shadow runs, compare results.
Shadow run:
old job produces output A
new job produces output B
compare A vs B
only then switch
Migration data : piĂšges
- COMP-3 conversions and rounding rules
- Record layout versioning
- Key semantics and uniqueness
- Historical anomalies in files
Data quick ref
PIC X(10) alphanumeric
PIC 9(05) numeric display
PIC 9(07)V99 COMP-3 packed decimal
PIC 9(09) COMP binary
88 condition-name named condition
REDEFINES overlay
OCCURS n TIMES array/table
Control flow
IF ... END-IF
EVALUATE ... END-EVALUATE
PERFORM para
PERFORM UNTIL condition
PERFORM VARYING I FROM 1 BY 1 UNTIL ...
GOBACK
File & DB2 quick ref
OPEN INPUT/OUTPUT file
READ file AT END ...
WRITE record
CLOSE file
FILE STATUS IS WS-STATUS
EXEC SQL SELECT ... INTO :hostvars END-EXEC
EXEC SQL DECLARE cursor END-EXEC
EXEC SQL OPEN/FETCH/CLOSE END-EXEC
EXEC SQL COMMIT/ROLLBACK END-EXEC
Batch/JCL essentials
JOB / EXEC / DD
SYSOUT=*
DISP=SHR or DISP=(NEW,CATLG,DELETE)
RECFM/LRECL must match record layout
Return codes drive scheduling
Template program (compact)
IDENTIFICATION DIVISION.
PROGRAM-ID. TEMPLATE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN TO INFILE
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS WS-IN-STATUS.
DATA DIVISION.
FILE SECTION.
FD INFILE.
01 IN-REC PIC X(200).
WORKING-STORAGE SECTION.
01 EOF-FLAG PIC X VALUE "N".
01 WS-IN-STATUS PIC XX VALUE "00".
01 WS-REC-COUNT PIC 9(09) COMP VALUE 0.
PROCEDURE DIVISION.
MAIN.
OPEN INPUT INFILE
PERFORM READ-IN
PERFORM UNTIL EOF-FLAG = "Y"
ADD 1 TO WS-REC-COUNT
PERFORM PROCESS-REC
PERFORM READ-IN
END-PERFORM
CLOSE INFILE
MOVE 0 TO RETURN-CODE
GOBACK.
READ-IN.
READ INFILE
AT END MOVE "Y" TO EOF-FLAG
END-READ.
PROCESS-REC.
CONTINUE.
