IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

création d'un échéancier de crédit en cobol


Sujet :

Contribuez

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : Mai 2022
    Messages : 13
    Points : 15
    Points
    15
    Par défaut création d'un échéancier de crédit en cobol
    Bonjour,
    Voici ma première contribution, bon je débute et je suis sûr qu'il y a pleins de trucs qui pourraient être améliorées.
    C'est l'occasion d'apprendre de nouvelles choses

    Ce programme crée un fichier d'échéancier de crédit très simple selon un montant à emprunter, une durée et un taux (concernant le taux par exemple pour 2% entrer 0.02).

    J'ai vérifié les données avec un vrai simulateur (j'ai fait une ou deux retouches depuis mais normalement c'est bon)
    Ce programme ne gère pas les assurances par contre.

    Voilà merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
           IDENTIFICATION DIVISION.
           PROGRAM-ID. EMPLOYEERAISE.
    
          *---------------------------------------------------------------*
          * Ce programme a pour but de créer un échéancier de crédit avec *
          * un calcul des mensualités,des intérêts et du capitl remboursé *
          *---------------------------------------------------------------*
    
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * creation d'un fichier de sortie pour afficher les données
    
               SELECT ECHEANCIER ASSIGN TO "ECHEANCES.DAT"
                  ORGANIZATION IS LINE SEQUENTIAL. 
           DATA DIVISION.
           FILE SECTION.
           FD ECHEANCIER.
              01 PRINT-LINE PIC X(100).
    
           WORKING-STORAGE SECTION.
    
          * les variables utilisées dans mon programme
              01 CREDIT-AREA.
               05 MONTANT           PIC 9(6) VALUE ZERO.
               05 TAUX              PIC 99V9999999 VALUE ZERO.
               05 DUREE             PIC 9(3) VALUE ZERO.
               05 NBECH             PIC 9(3) VALUE ZERO.
               05 CAPAREMB          PIC 9(6)V999999 COMP-3 VALUE ZERO.
               05 CAPREMB           PIC 9(6)V999999 COMP-3 VALUE ZERO.
               05 INTERETS          PIC 9(6)V999999 COMP-3 VALUE ZERO.
               05 MENSUALITES    PIC 9(6)V9(6) COMP-3 VALUE ZERO. 
          * compteur d'echeances 
               05 COUNTECH          PIC 999 VALUE ZERO.    
    
    
          * les heading permettent une petite mise en forme
           01  HEADING-LINE.
               05 FILLER              PIC X(4)  VALUE 'MOIS'.
               05 FILLER              PIC X(6)  VALUE SPACES.
               05 FILLER              PIC X(17) VALUE 'CAP A REMBOURSER'.
               05 FILLER              PIC X(6) VALUE SPACES.
               05 FILLER              PIC X(14)  VALUE 'CAP REMBOURSE'.
               05 FILLER              PIC X(4)  VALUE SPACES.
               05 FILLER              PIC X(8) VALUE 'INTERETS'.
               05 FILLER              PIC X(2)  VALUE SPACES.
               05 FILLER              PIC X(11)  VALUE 'MENSUALITES'.
               05 FILLER              PIC X(5)  VALUE SPACES.
    
           01 HEADING-LINE2.
               05 FILLER              PIC X(5)  VALUE '-----'.
               05 FILLER              PIC X(6)  VALUE SPACES.
               05 FILLER              PIC X(17) VALUE '-----------------'.
               05 FILLER              PIC X(6) VALUE SPACES.
               05 FILLER              PIC X(14)  VALUE '--------------'.
               05 FILLER              PIC X(4)  VALUE SPACES.
               05 FILLER              PIC X(8) VALUE '--------'.
               05 FILLER              PIC X(2)  VALUE SPACES.
               05 FILLER              PIC X(12)  VALUE '------------'.
               05 FILLER              PIC X(5)  VALUE SPACES.
    
          * affichage des données dans le fichier
           01 DETAIL-LINE.
               05 DET-DATEECH         PIC 9(4).
               05 FILLER              PIC X(6)  VALUE SPACES.
               05 DET-CAP-A-REMB      PIC 9(6).99.
               05 FILLER              PIC X(16) VALUE SPACES.
               05 DET-CAP-REMB       PIC 9(6).99.
               05 FILLER              PIC X(7)  VALUE SPACES.
               05 DET-INTERETS        PIC 9(6).99.
               05 FILLER              PIC X(3) VALUE SPACES.
               05 DET-MENSUALITES     PIC 9(6).99.  
    
    
           PROCEDURE DIVISION.
    
           0100-MAIN-PROCEDURE.
          * ouverture du fichier de sortie et process du programme   
               OPEN OUTPUT ECHEANCIER
               PERFORM 0130-ENTER-INFOS
               COMPUTE NBECH = DUREE * 12 
               PERFORM 0150-PROCESS-CALCULS UNTIL COUNTECH = NBECH 
               PERFORM 0900-STOP-PROGRAM
               .
    
           0130-ENTER-INFOS.
          * saisie des données par l'utilisateur et impression des heading
               DISPLAY "QUEL EST LE MONTANT A EMPRUNTER ?"
               ACCEPT MONTANT
               DISPLAY "QUEL EST LA DUREE DE REMBOURSEMENT EN ANNEES?"
               ACCEPT DUREE
               DISPLAY "QUEL EST LE TAUX DU CREDIT ?"
               ACCEPT TAUX
               MOVE MONTANT TO CAPAREMB
               WRITE PRINT-LINE FROM HEADING-LINE
                  AFTER ADVANCING 1 LINE 
               WRITE PRINt-LINE FROM HEADING-LINE2
                  AFTER ADVANCING 1 LINE
               .
    
           0150-PROCESS-CALCULS.
          * ici les calculs 
               ADD 1 TO COUNTECH
               COMPUTE CAPAREMB = CAPAREMB  - CAPREMB
               COMPUTE MENSUALITES = 
               (MONTANT*(TAUX/(12)))/(1 -(1/(1+(TAUX/12)))**(DUREE*12))
               COMPUTE INTERETS = 
               (CAPAREMB)*(TAUX/12) 
               COMPUTE CAPREMB = (MENSUALITES) - INTERETS
               PERFORM 0170-PRINT-ECHEANCIER
               .
    
           0170-PRINT-ECHEANCIER.
          * move et impression des données ligne par ligne     
               MOVE COUNTECH TO DET-DATEECH
               MOVE MENSUALITES TO DET-MENSUALITES
               MOVE INTERETS TO DET-INTERETS 
               MOVE CAPREMB TO DET-CAP-REMB
               MOVE CAPAREMB TO DET-CAP-A-REMB
               WRITE PRINT-LINE FROM DETAIL-LINE
                  AFTER ADVANCING 1 LINE
               .
               
               
           0900-STOP-PROGRAM.
               CLOSE ECHEANCIER
               STOP RUN
               .
    Fichiers attachés Fichiers attachés

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : Mai 2022
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    argh, je vois que j'ai laissé le nom du programme de l'ancien exo.

    Si vous voyez des trucs à améliorer, n'hésitez-pas :-)

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 338
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Quelques remarques d'ordre général :

    Tout d'abord, c'est une très bonne chose d'avoir mis des commentaires et notamment le petit cartouche explicatif en début de programme
    Je peste contre tout livrable non documenté, s'il n'en tenait qu'à moi, un programme ou un job sans quelques mots d'explications de ce genre n'irait jamais en production.

    Au niveau de la syntaxe :

    PROGRAM-ID :
    en environnement Z/OS, le nom ne doit pas excéder 8 caractères.

    Déclaration des variables en DATA DIVISION (FD et WSS) :
    seules les variables de niveau "01" et "77" devraient être déclarées en colonne 8, les autres ne doivent être déclarées qu'en colonne 12 et au delà. La plupart des compilateurs actuels ne font plus la différence, mais si vous voulez être tranquille, il est préférable de respecter cette norme historique

    Pour se faciliter la vie :
    on peut utiliser PIC 9(6)V9(6) plutôt que PIC 9(6)V999999.
    on peut utiliser VALUE ALL, par exemple VALUE ALL '-' plutôt que VALUE '-----------------', comme ça on est sûr d'avoir le bon nombre de caractères

    PROCEDURE DIVISION
    Pour un programme de test, alimenter des variables par display + accept est une bonne méthode, par contre, ce n'est pas du tout utilisable dans un contexte industriel où les paramètres d'exécution doivent être fournis soit par un fichier (souvent une SYSIN c'est à dire un fichier FB 80), soit par une table relationnelle (en général DB2 si on est sur mainframe).

    Ordres d'entrée-sortie : il faut systématiquement vérifier le FILE-STATUS (qu'il faut préalablement déclarer) après toute action sur un fichier (ouverture, fermeture, lecture, écriture, positionnement, réécriture...). En cas de valeur de FS erronée, on enverra un numéro et un message d'erreur avant d'appeler un paragraphe de gestion des anomalies graves qui lui-même appellera une routine de cancel.
    Attention (1): une valeur de FS erronée n'est pas toujours la même selon le contexte. Dans certains cas telle valeur de file status est acceptable, dans d'autres non (typiquement, avec un fichier indexé, une clef non trouvée ou une clef en double pourra provoquer un abend dans tel programme et être acceptée dans tel autre).
    Attention (2): après OPEN, plusieurs valeurs de file-status acceptables sont possibles, pas seulement '00'.
    Le plus simple est d'afficher la valeur du FS après open si différente de '00' mais de ne pas planter le traitement pour autant.
    Dès la première lecture ou écriture sur ce fichier, on contrôlera le file-status et si KO alors on prendra la décision qui va bien en fonction du contexte.
    cf. les valeurs de FS ici : https://www.ibm.com/docs/en/i/7.3?to...s-key-meanings


    Condition de fin de traitement et fin de traitement
    Attention : une condition de fin telle que "UNTIL COUNTECH = NBECH " risque de provoquer une boucle infinie
    Il est donc préférable d'utiliser le comparateur supérieur ou égal plutôt qu'égal : UNTIL COUNTECH >= NBECH

    En fin de traitement, il est préférable d'utiliser GOBACK plutôt que STOP RUN.
    GOBACK renvoie le contrôle au programme appelant, c'est à dire l'OS si c'est un programme principal ou le programme qui l'a appelé en cas de sous-programme. STOP RUN termine l'exécution et rend le contrôle à l'OS. Pour se simplifier la vie, on peut utiliser systématiquement GOBACK et oublier STOP RUN.

    Bon courage pour la suite

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    Quelques remarques d'ordre général :


    Ordres d'entrée-sortie : il faut systématiquement vérifier le FILE-STATUS (qu'il faut préalablement déclarer) après toute action sur un fichier (ouverture, fermeture, lecture, écriture, positionnement, réécriture...). En cas de valeur de FS erronée, on enverra un numéro et un message d'erreur avant d'appeler un paragraphe de gestion des anomalies graves qui lui-même appellera une routine de cancel.
    Attention (1): une valeur de FS erronée n'est pas toujours la même selon le contexte. Dans certains cas telle valeur de file status est acceptable, dans d'autres non (typiquement, avec un fichier indexé, une clef non trouvée ou une clef en double pourra provoquer un abend dans tel programme et être acceptée dans tel autre).
    Attention (2): après OPEN, plusieurs valeurs de file-status acceptables sont possibles, pas seulement '00'.
    Le plus simple est d'afficher la valeur du FS après open si différente de '00' mais de ne pas planter le traitement pour autant.
    Dès la première lecture ou écriture sur ce fichier, on contrôlera le file-status et si KO alors on prendra la décision qui va bien en fonction du contexte.
    cf. les valeurs de FS ici : https://www.ibm.com/docs/en/i/7.3?to...s-key-meanings
    Le sujet a fait l'objet de nombreux débats au sein du forum, mais pour moi l'utilisation systématique du FILE_STATUS est une fausse bonne idée.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 338
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    J'aurai du écrire : vérifier systématiquement la réussite ou non de l'entrée sortie, soit en contrôlant la valeur du file-status, soit en vérifiant la condition AT END. Mais, comme indiqué à plusieurs reprises dans d'autres fils de dicsussion, AT END n'a d'intérêt que sur la lecture séquentielle, elle ne permet pas de vérifier une erreur d'ouverture, d'écriture, de fermeture, d'accès direct avec clef... d'où l'intérêt du FS.

    Et, comme écrit ici, vérifier la valeur de FS ne veut pas forcément dire interrompre le traitement, par contre, ça veut dire tracer ce qui se passe quand la valeur n'est pas celle attendue (quel ordre d'entrée-sortie a produit quel résultat) pour pouvoir faire un diagnostic en cas de besoin.

  6. #6
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 805
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 805
    Points : 32 095
    Points
    32 095
    Par défaut
    Citation Envoyé par Luc Orient Voir le message
    Le sujet a fait l'objet de nombreux débats au sein du forum, mais pour moi l'utilisation systématique du FILE_STATUS est une fausse bonne idée.
    Je dirais que ça dépend surtout des exigences de l'exploitation. J'ai connu des maisons ou l'exploitation exigeait spécifiquement qu'on lui laisse le fichier se planter pour gérer ça elle-même. Et d'autres ou au contraire il fallait tout prévoir par soi-même.

    Si je fais un truc pour moi, je suis ma propre exploitation. Je gère systématiquement le File-Status. Quand je bosse en équipe, ben, je demande d'abord quelle est la norme locale. Cela étant, dans le cadre d'un exercice, c'est bien de savoir faire. Ca servira ou pas, mais si ça doit servir, mieux vaut l'avoir travaillé avant. A minima pour comprendre de quoi ça parle.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 776
    Points
    10 776
    Par défaut
    Il est toujours utile de trapper un code retour reste à réfléchir ensuite à ce qu'on en fait (et c'est parfois compliqué).

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 338
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Darkzinus Voir le message
    Il est toujours utile de trapper un code retour reste à réfléchir ensuite à ce qu'on en fait (et c'est parfois compliqué).
    C'est exactement ça, avancer à l'aveugle est dangereux, on risque de s'approcher du précipice

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 338
    Points : 39 738
    Points
    39 738
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par el_slapper Voir le message
    Je dirais que ça dépend surtout des exigences de l'exploitation. J'ai connu des maisons ou l'exploitation exigeait spécifiquement qu'on lui laisse le fichier se planter pour gérer ça elle-même. Et d'autres ou au contraire il fallait tout prévoir par soi-même.

    Si je fais un truc pour moi, je suis ma propre exploitation. Je gère systématiquement le File-Status. Quand je bosse en équipe, ben, je demande d'abord quelle est la norme locale. Cela étant, dans le cadre d'un exercice, c'est bien de savoir faire. Ca servira ou pas, mais si ça doit servir, mieux vaut l'avoir travaillé avant. A minima pour comprendre de quoi ça parle.
    Comme expliqué plus haut, intercepter et afficher les informations relatives aux exceptions (file-status ou autre) ne préjuge en rien de ce qu'on fait derrière, mais permet de laisser des traces.

    Si les règles d'exploitation disent qu'il faut continuer en séquence, très bien, on applique, mais au moins on a une log qui permet de retrouver des éléments facilement et pour pas cher (on ne fait pas des display ou de write dans la log à chaque fois que le FS est à "00" bien entendu )

    Donc quelques soient les règles locales, ça ne change rien à l'affaire.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : Mai 2022
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Coucou !

    Merci à tous pour vos réponses, il y a de la matière à progresser !

    Pour ma part, je suis entré en poste mardi chez le client (un groupe bancaire) et j'en suis à installer les outils (Microfocus, l'emulateur tso,etc ) mais avec un peu de temps ça va venir pour le code !

    En tous cas merci encore !

    Tchuss

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 776
    Points
    10 776
    Par défaut
    C'est top ! Tu vas vraiment mettre le pied à l'étrier ! Et si cette section est peu peuplée il y aura néanmoins presque toujours quelqu'un pour répondre à tes questions.

Discussions similaires

  1. [XL-2016] Aide pour la création d'un échéancier
    Par ybarketi dans le forum Excel
    Réponses: 0
    Dernier message: 15/01/2018, 10h20
  2. Réponses: 1
    Dernier message: 14/05/2015, 11h35
  3. Création échéancier en VBA (suite)
    Par landoltp dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/10/2007, 17h01
  4. Création échéancier en VBA
    Par landoltp dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 10/10/2007, 16h51
  5. Création d'un échéancier à partir de requêtes
    Par chicanne dans le forum Modélisation
    Réponses: 6
    Dernier message: 29/06/2007, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo