Ce projet est une application bancaire complète développée en COBOL CICS avec une base de données DB2. Il permet de gérer les opérations bancaires d'un client (dépôts, retraits, virements) et d'afficher l'historique des transactions avec pagination.
L'application utilise l'architecture 3270 BMS (Basic Mapping Support) pour l'interface utilisateur et le modèle pseudo-conversationnel CICS pour optimiser les ressources système.
- Accueil avec navigation vers les différents modules
- Saisie de l'identifiant client
- Redirection vers :
- Retrait (R)
- Dépôt (D)
- Virement (V)
- Liste des opérations (L)
- Vérification du solde disponible
- Débit du compte
- Enregistrement de l'opération en base de données
- Affichage du nouveau solde
- Crédit du compte
- Enregistrement de l'opération
- Affichage du nouveau solde avec centimes
- Virement entre deux comptes
- Validation des montants (pas de valeurs négatives ou nulles)
- Vérification du solde suffisant
- Conversion automatique des montants saisis
- Mise à jour des deux comptes (débit et crédit)
- Enregistrement de deux opérations (départ et arrivée)
- Affichage paginé de l'historique des transactions
- Pagination dynamique :
- 10 opérations par page
- Navigation avec F7 (page précédente) et F8 (page suivante)
- Tri par ordre décroissant (opérations les plus récentes en premier)
- Affichage du nombre total d'opérations
- Détails affichés : ID opération, ID compte, montant, type, date
- Retour au menu avec F3
CREATE TABLE API8.CLIENT (
ID_CLIENT INTEGER NOT NULL PRIMARY KEY,
NOM_CLIENT VARCHAR(50),
PRENOM_CLIENT VARCHAR(50),
ADRESSE VARCHAR(100),
TELEPHONE VARCHAR(15)
);CREATE TABLE API8.COMPTE (
ID_COMPTE INTEGER NOT NULL PRIMARY KEY,
ID_CLIENT INTEGER NOT NULL,
SOLDE DECIMAL(10,2),
DATE_OUVERTURE DATE,
FOREIGN KEY (ID_CLIENT) REFERENCES API8.CLIENT(ID_CLIENT)
);CREATE TABLE API8.OPERATION (
ID_OPERATION INTEGER NOT NULL PRIMARY KEY,
ID_COMPTE INTEGER NOT NULL,
MONTANT_OP DECIMAL(10,2),
TYPE_OP CHAR(1), -- 'D' = Dépôt, 'R' = Retrait, 'V' = Virement
DATE_OP DATE,
FOREIGN KEY (ID_COMPTE) REFERENCES API8.COMPTE(ID_COMPTE)
);Projet-cobol/
│
├── BMS/ # Définitions des écrans BMS
│ ├── Accueil/
│ │ └── APNSE01.bms # Écran du menu principal
│ ├── Depot/
│ │ └── APNSE03.bms # Écran de dépôt
│ ├── retrait/
│ │ └── APNSE02.bms # Écran de retrait
│ ├── VIREMENT/
│ │ └── APNSE04.bms # Écran de virement
│ └── Liste/
│ └── APNSE05.bms # Écran de liste des opérations
│
├── PROGRAMME/ # Programmes COBOL
│ ├── API8BM1P.cbl # Menu principal (SN01)
│ ├── API8RET.cbl # Gestion des retraits (SN02)
│ ├── API8DEPO.cbl # Gestion des dépôts (SN03)
│ ├── API3VIR.cbl # Gestion des virements (SN04)
│ ├── API8LIST.cbl # Liste paginée des opérations (SN05)
│ └── API8FILDB.cbl # Utilitaire de remplissage de la base
│
├── CPY/ # Copybooks
│ ├── client # Structure CLIENT (générée par DB2)
│ ├── COMPTE # Structure COMPTE (générée par DB2)
│ └── OPE # Structure OPERATION (générée par DB2)
│
├── JCL/ # Jobs de compilation
│ ├── BINPLAN.jcl # Compilation des BMS
│ ├── JCLLIST # Compilation du programme liste
│ └── JCOMPDB2.jcl # Compilation avec précompilation DB2
│
├── sql/ # Scripts SQL
│ ├── PROJDB.sql # Création des tables
│ └── BIDON.sql # Données de test
│
└── README.md # Ce fichier
- Mainframe avec CICS Transaction Server
- DB2 pour z/OS
- JCL pour la compilation
- Émulateur 3270 (ex: x3270, PCOMM)
# Exécuter le script SQL de création des tables
db2 -tvf sql/PROJDB.sql
# Insérer les données de test
db2 -tvf sql/BIDON.sql# Compiler tous les écrans BMS
# Utiliser le JCL BINPLAN.jcl# Pour les programmes avec DB2, utiliser JCOMPDB2.jcl
# Exemple pour API8LIST :
# 1. Précompilation DB2
# 2. Compilation COBOL
# 3. Link-editCEDA DEFINE TRANSACTION(SN01) GROUP(PROJET) PROGRAM(API8BM1P)
CEDA DEFINE TRANSACTION(SN02) GROUP(PROJET) PROGRAM(API8RET)
CEDA DEFINE TRANSACTION(SN03) GROUP(PROJET) PROGRAM(API8DEPO)
CEDA DEFINE TRANSACTION(SN04) GROUP(PROJET) PROGRAM(API3VIR)
CEDA DEFINE TRANSACTION(SN05) GROUP(PROJET) PROGRAM(API8LIST)
CEDA INSTALL GROUP(PROJET)
CEDA DEFINE PROGRAM(API8BM1P) GROUP(PROJET) LANGUAGE(COBOL)
CEDA DEFINE PROGRAM(API8RET) GROUP(PROJET) LANGUAGE(COBOL)
CEDA DEFINE PROGRAM(API8DEPO) GROUP(PROJET) LANGUAGE(COBOL)
CEDA DEFINE PROGRAM(API3VIR) GROUP(PROJET) LANGUAGE(COBOL)
CEDA DEFINE PROGRAM(API8LIST) GROUP(PROJET) LANGUAGE(COBOL)
CEDA DEFINE MAPSET(APNSE01) GROUP(PROJET)
CEDA DEFINE MAPSET(APNSE02) GROUP(PROJET)
CEDA DEFINE MAPSET(APNSE03) GROUP(PROJET)
CEDA DEFINE MAPSET(APNSE04) GROUP(PROJET)
CEDA DEFINE MAPSET(APNSE05) GROUP(PROJET)
Depuis un terminal 3270, saisir : SN01
- Saisir l'ID client : Entrer un numéro de client existant (ex: 1, 2, 3)
- Choisir une opération :
R= RetraitD= DépôtV= VirementL= Liste des opérations
- F3 : Retour au menu principal
- F7 : Page précédente (dans la liste)
- F8 : Page suivante (dans la liste)
- ENTER : Valider une saisie
- CLEAR : Effacer l'écran
Le module de liste implémente une pagination efficace :
- Tri décroissant :
ORDER BY ID_OPERATION DESCpour afficher les opérations les plus récentes en premier - Calcul de l'offset :
WS-PAGE-OFFSET = (WS-PAGE-NUMBER - 1) × 10 - Saut de lignes : Le curseur SQL saute les pages précédentes avant d'afficher
- Comptage total : Continue la lecture après affichage pour compter toutes les opérations
- Sauvegarde d'état : Utilise la COMMAREA pour conserver le numéro de page entre transactions
Le module de virement inclut des validations robustes :
- Vérification des champs non vides
- Validation numérique stricte
- Conversion automatique des montants (
PIC X→PIC 9→PIC S9V99 COMP-3) - Vérification du solde suffisant
- Prévention des montants négatifs ou nuls
Tous les programmes utilisent RETURN TRANSID pour libérer les ressources CICS entre chaque interaction utilisateur, optimisant ainsi les performances du système.
- Cause : Boucle infinie ou erreur de logique
- Solution : Vérifier que
VALID-DATA-SWest réinitialisé correctement
- Cause : Exception de données (conversion numérique invalide)
- Solution : Valider les champs avant conversion, utiliser
IF NUMERIC
- Cause : Variables mal initialisées ou
SEND DATAONLYau lieu deSEND ERASE - Solution : Utiliser
SEND ERASEpour F7/F8, initialiserWS-PAGE-OFFSETcorrectement
- Cause : Mauvaise conversion entre types
PIC X,PIC 9, etCOMP-3 - Solution : Utiliser des variables intermédiaires et éviter
INSPECT REPLACING
- CICS Transaction Server : Gestion des transactions en ligne
- BMS (Basic Mapping Support) : Définition des écrans 3270
- DB2 Embedded SQL : Requêtes SQL dans COBOL
- Curseurs SQL :
DECLARE,OPEN,FETCH,CLOSE - COMMAREA : Communication entre transactions
- XCTL : Transfert de contrôle entre programmes
- RETURN TRANSID : Mode pseudo-conversationnel
- EIBAID : Détection des touches de fonction
- Packed Decimal (COMP-3) : Stockage efficace des montants
- 5 programmes COBOL (~1500 lignes de code)
- 5 écrans BMS
- 3 tables DB2
- 5 transactions CICS
- Support de la pagination dynamique
- Gestion complète des erreurs
Antoine Le Provost
Maxime L.
Ce projet est à usage éducatif.
Pour toute question ou problème, n'hésitez pas à nous contacter via :
⭐ Si ce projet vous a été utile, n'oubliez pas de lui donner une étoile !