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

Cobol Discussion :

COBOL problème manipulation FICHIERS


Sujet :

Cobol

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut COBOL problème manipulation FICHIERS
    Bonjour,

    aujourd'hui, je viens avec un autre problème j'ai pu avancer un petit peu avec cobol. maintenant j'essaye de me familiariser un petit peu avec les fichiers comment mettre le résultat d'un programme dans un fichier en sortie ... comment utiliser un fichier en entrée ... j'ai pu créer un programme qui ne fait que recopier les enregistrements dans un fichier en entrée nommée "FICHIER-ENTREE" et les mettre dans un fichier en sortie appelé "FICHIER-SORTIE"

    le problème c'est qu'il copie les enregistrements correctement sauf le dernier il le copie 2 fois.

    le programme est le suivant :

    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
           IDENTIFICATION DIVISION.
    
               PROGRAM-ID. EXEMPLE.
               AUTHOR. Fatima-Ezzahra.
               DATE-WRITTEN. 22/06/2010.
               DATE-COMPILED. 22/06/2010.
          **                                                               *
          ******************************************************************
          **     Ce programme Sert à Recopier les enregistrements          *
          **         de FICHIER-ENTREE à FICHIER-SORTIE                    *
          ******************************************************************
          **                                                               *
    
           ENVIRONMENT DIVISION.
    
               INPUT-OUTPUT SECTION.
    
               FILE-CONTROL.
    
                   SELECT FICHIER-ENTREE ASSIGN to "D:\FICHIER-ENTREE.dat"
                   FILE STATUS  IS WW-STATUT.
    
                   SELECT FICHIER-SORTIE ASSIGN to "D:\FICHIER-SORTIE.dat"
                   FILE STATUS  IS WW-STATUT.
    
    
               CONFIGURATION SECTION.
                    SPECIAL-NAMES.
                           DECIMAL-POINT IS COMMA.
    
           DATA DIVISION.
    
               FILE SECTION.
                  FD FICHIER-ENTREE
                  RECORDING MODE IS F
                  RECORD CONTAINS 7 CHARACTERS
                  LABEL  RECORD   IS  OMITTED
                  BLOCK  CONTAINS 0   RECORDS
                  DATA RECORD IS E-FICHIER.
    
                  01 E-FICHIER pic X(7).
    
                  FD FICHIER-SORTIE
                  RECORDING MODE IS F
                  RECORD CONTAINS 7 CHARACTERS
                  LABEL  RECORD   IS  OMITTED
                  BLOCK  CONTAINS 0   RECORDS
                  DATA RECORD IS S-FICHIER.
    
                  01 S-FICHIER pic X(7).
    
               WORKING-STORAGE SECTION.
                  01 I PIC 9 value 0.
                  01 WW-STATUT PIC XX value 'xx'.
    
           PROCEDURE DIVISION.
    
           DEB-PROG SECTION.
    
                   perform ouverture-fichiers thru FIN-ouverture-fichiers.
                   perform copie thru fin-copie.
                   perform fermeture-fichiers thru FIN-fermeture-fichiers.
    
              FIN-PROG.
    
                 STOP RUN.
    
             ouverture-fichiers.
                      open input FICHIER-ENTREE.
                      open output FICHIER-SORTIE.
             FIN-ouverture-fichiers.
             EXIT.
    
             copie.
                   perform until I = 1
          *        display E-fichier
                   perform lecture-fichier thru fin-lecture-fichier
                   write S-FICHIER from E-Fichier
                   end-perform.
             fin-copie.
             exit.
    
             lecture-fichier.
             READ FICHIER-ENTREE INTO E-fichier AT END
             MOVE 1 TO I
             END-READ.
             FIN-lecture-fichier.
             exit.
    
             fermeture-fichiers.
                      close FICHIER-SORTIE.
                      close FICHIER-ENTREE.
    
             FIN-fermeture-fichiers.
             EXIT.
    le FICHIER-ENTREE est :

    A,noire
    B,blanc
    C,blanc
    D,noire
    E,rouge
    F,rouge
    G,blanc
    H,noire
    I,rouge
    J,noire
    K,rouge
    L,blanc
    M,rouge
    N,noire
    O,jaune
    P,rouge
    q,blanc
    R,jaune
    S,noire
    T,jaune
    U,blanc
    V,rouge
    W,blanc
    X,blanc
    Y,noire
    Z,jaune
    Le FICHIER-SORTIE est :

    A,noire
    B,blanc
    C,blanc
    D,noire
    E,rouge
    F,rouge
    G,blanc
    H,noire
    I,rouge
    J,noire
    K,rouge
    L,blanc
    M,rouge
    N,noire
    O,jaune
    P,rouge
    q,blanc
    R,jaune
    S,noire
    T,jaune
    U,blanc
    V,rouge
    W,blanc
    X,blanc
    Y,noire
    Z,jauneZ,jauneZ,jaun


    et merci d'avance pour votre aide

  2. #2
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    erreur de logique dans le programme

    Au READ-AT-END, indicateur positionné à 1
    et ensuite, directement, écriture dans le fichier SORTIE.

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par bernard59139 Voir le message
    erreur de logique dans le programme

    Au READ-AT-END, indicateur positionné à 1
    et ensuite, directement, écriture dans le fichier SORTIE.
    j'ai pas bien compris

    j'ai mis l'indicateur à 1 à la fin du fichier càd quand il fait un read sur la première ligne il ne change rien l'indicateur reste à 0 mais une fois il lit la dernière ligne qui est Z,machin il fait un move 1 à l'indicateur et il ferme les deux fichiers.



    qu'est ce que je dois mettre ?

    j'ai mis un compteur pour compter combien de fois il entre dans la boucle
    j'ai trouver que c'est 35 :S

  4. #4
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Janvier 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 179
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    c'est cette partie ci qui a un soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    copie.
    perform until I = 1
    * display E-fichier
    perform lecture-fichier thru fin-lecture-fichier
    write S-FICHIER from E-Fichier
    end-perform.
    fin-copie.
    exit.
    personnellement je la ferai ainsi, sinon tu fais ton write meme si tu as eu une fin de fichier en lecture , le test d'arret de ta boucle ne se faisant qu'au moment du perform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    copie.
    perform lecture-fichier thru fin-lecture-fichier
    perform until I = 1
    * display E-fichier
    write S-FICHIER from E-Fichier
    perform lecture-fichier thru fin-lecture-fichier
    end-perform.
    fin-copie.
    exit.

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    bonjour xfanx

    j'ai mis votre solution et j'ai eu dans le FICHIER-SORTIE :

    A,noire
    B,blanc
    C,blanc
    D,noire
    E,rouge
    F,rouge
    G,blanc
    H,noire
    I,rouge
    J,noire
    K,rouge
    L,blanc
    M,rouge
    N,noire
    O,jaune
    P,rouge
    q,blanc
    R,jaune
    S,noire
    T,jaune
    U,blanc
    V,rouge
    W,blanc
    X,blanc
    Y,noire
    Z,jauneZ,jaun

  6. #6
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Janvier 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 179
    Points : 350
    Points
    350
    Par défaut
    alors, autre probleme , tu utilises les buffers d'I/O pour tes READ INTO et WRITE FROM (niveau 01 en FD) c'est dangereux puisque c'est le systeme qui gere ces valorisations..

    essaies ça

    en WORKING
    01 E-FICHIERW pic X(7).

    et replace tes READ et WRITE par

    READ E-FICHIER into E-FICHIERW at end .....etc

    et

    WRITE S-FICHIER from E-FICHIERW

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par xfanx Voir le message
    alors, autre probleme , tu utilises les buffers d'I/O pour tes READ INTO et WRITE FROM (niveau 01 en FD) c'est dangereux puisque c'est le systeme qui gere ces valorisations..

    essaies ça

    en WORKING
    01 E-FICHIERW pic X(7).

    et replace tes READ et WRITE par

    READ E-FICHIER into E-FICHIERW at end .....etc

    et

    WRITE S-FICHIER from E-FICHIERW
    j'ai des erreur


    * Micro Focus Net Express UE V5.1 revision 000 Compiler
    * Copyright (C) 1984-2008 Micro Focus (IP) Limited. URN AXCGG/AA0/00000
    COBCH0040S Missing or illegal file name : "C:\Documents and Settings\Bureau\COBOL\Programmes COBOL\EXEMPLE.cbl"(98,23)
    COBCH0564S A scope-delimiter did not have a matching verb and was discarded. : "C:\Documents and Settings\Bureau\COBOL\Programmes COBOL\EXEMPLE.cbl"(100,17)
    * Total Messages: 2
    * Unrecoverable : 0 Severe : 2
    * Errors : 0 Warnings: 0
    * Informational : 0 Flags : 0
    * Data: 1286 Code: 0

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    voici la dernière version elle marche tres bien

    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
    IDENTIFICATION DIVISION.
    
               PROGRAM-ID. EXEMPLE.
               AUTHOR. Fatima-Ezzahra.
               DATE-WRITTEN. 22/06/2010.
               DATE-COMPILED. 22/06/2010.
          **                                                               *
          ******************************************************************
          **     Ce programme Sert à Recopier les enregistrements          *
          **         de FICHIER-ENTREE à FICHIER-SORTIE                    *
          ******************************************************************
          **                                                               *
    
           ENVIRONMENT DIVISION.
    
               INPUT-OUTPUT SECTION.
    
               FILE-CONTROL.
    
                   SELECT FICHIER-ENTREE ASSIGN to "D:\FICHIER-ENTREE.dat"
                   organization line sequential
                   access sequential.
    
                   SELECT FICHIER-SORTIE ASSIGN to "D:\FICHIER-SORTIE.dat"
                   organization line sequential
                   access sequential.
    
               CONFIGURATION SECTION.
                    SPECIAL-NAMES.
                           DECIMAL-POINT IS COMMA.
    
           DATA DIVISION.
    
               FILE SECTION.
                  FD FICHIER-ENTREE
                  RECORDING MODE IS V
                  RECORD CONTAINS 7 CHARACTERS
                  LABEL  RECORD   IS  OMITTED
                  BLOCK  CONTAINS 0   RECORDS
                  DATA RECORD IS E-FICHIERW.
    
                  01 E-FICHIERW pic X(7).
    
                  FD FICHIER-SORTIE
                  RECORDING MODE IS V
                  RECORD CONTAINS 7 CHARACTERS
                  LABEL  RECORD   IS  OMITTED
                  BLOCK  CONTAINS 0   RECORDS
                  DATA RECORD IS S-FICHIER.
    
                  01 S-FICHIER pic X(7).
    
               WORKING-STORAGE SECTION.
                  01 I PIC 9 value 0.
    
                  01 compteur pic 99 value 0.
    
           PROCEDURE DIVISION.
    
           DEB-PROG SECTION.
    
               perform ouverture-fichiers thru FIN-ouverture-fichiers.
               perform copie thru fin-copie.
               perform fermeture-fichiers thru FIN-fermeture-fichiers.
    
               display compteur.
    
    
           FIN-PROG section.
    
                  STOP RUN.
    
    
    
             ouverture-fichiers.
                      open input FICHIER-ENTREE.
                      open output FICHIER-SORTIE.
    
             FIN-ouverture-fichiers.
             EXIT.
    
             copie.
    
             perform until I = 1
               write S-FICHIER from E-FICHIERW
             perform lecture-fichier thru fin-lecture-fichier
             end-perform.
    
             fin-copie.
             exit.
    
    
             lecture-fichier.
             READ FICHIER-ENTREE INTO E-FICHIERW AT END
             MOVE 1 TO I
             END-READ.
             add 1 to compteur.
             display compteur.
    
             FIN-lecture-fichier.
             exit.
    
             fermeture-fichiers.
                      close FICHIER-SORTIE.
                      close FICHIER-ENTREE.
    
             FIN-fermeture-fichiers.
             EXIT.

    Merciiiiiiiiiiiiiiiiiiiii à vous tous

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 92
    Points
    92
    Par défaut paragraphes
    ouaip

    en plus enlève tes "THRU" !
    et dans un paragraphe tu ne gardes QUE 2 "points"

    exemple :
    perform ouverture-fichiers <== bye-bye les THRU
    perform .. ..
    .. ..

    ouverture-fichiers. <== début paragraphe
    open input FICHIER-ENTREE
    open output FICHIER-SORTIE
    . <== fin paragraphe

    note-bien les 2 "points" !

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Citation Envoyé par duboisa Voir le message
    ouaip

    en plus enlève tes "THRU" !
    et dans un paragraphe tu ne gardes QUE 2 "points"

    exemple :
    perform ouverture-fichiers <== bye-bye les THRU
    perform .. ..
    .. ..

    ouverture-fichiers. <== début paragraphe
    open input FICHIER-ENTREE
    open output FICHIER-SORTIE
    . <== fin paragraphe

    note-bien les 2 "points" !

    +1 pour les points. Par contre, pas d'accord pour les THRU. J'ai connu des cas ou le compilateur partait à l'ouest, et ou le simple ajout du THRU(et du micro) a réglé le problème. Plein de gens ont tenté le coup, sans comprendre. Peut-être les compilateurs modernes n'ont-il plus le souci. Mais, depuis, je fais toujours comme Fatima : c'est lourd, mais ça marche. Par contre, je vois qu'il y a une section : soit on en met partout, soit on en met nulle part. Sinon, à la maintenance, ça va mal finir. (et si on a des sections partout, plus de problèmes de FALL THRU, même sans PERFORM THRU).

    Sinon, remarque supplémentaire : le mélange de minuscules et de majuscules, c'est atroce. Je suis un adepte du tout-majuscule(qui évite de se poser des questions), mais si on préfère les minuscules(c'est autorisé à certains endroits), alors merci de les mettre de manière cohérente. Mélanger FIN-lecture-fichier et FIN-PROG, c'est aaaaaaargh. Ca fait ressembler le programme à un patchwork de copier-coller(on s'en fout si c'est vrai), et c'est pas gentil pour celui qui passa après.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 92
    Points
    92
    Par défaut techniques cobolesques
    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
    IDENTIFICATION DIVISION.
    
               PROGRAM-ID. EXEMPLE.
               AUTHOR.XX.
               DATE-WRITTEN. 22/06/2010.
               DATE-COMPILED. 22/06/2010.
                                                                          
          ******************************************************************
          **     Ce programme ne sert à rien           
          ******************************************************************
    
           ENVIRONMENT DIVISION.
    
               INPUT-OUTPUT SECTION.
    
               FILE-CONTROL.
    
                   SELECT ENTREE ASSIGN to "D:\FICHIER-ENTREE.dat"
                   organization line sequential
                   access sequential.
    
                   SELECT SORTIE ASSIGN to "D:\FICHIER-SORTIE.dat"
                   organization line sequential
                   access sequential.
    
               CONFIGURATION SECTION.
                    SPECIAL-NAMES.
                           DECIMAL-POINT IS COMMA.
    
           DATA DIVISION.
    
               FILE SECTION.
                  FD ENTREE
                  RECORDING MODE IS V
                  RECORD CONTAINS 7 CHARACTERS
                  LABEL  RECORD   IS  OMITTED
                  BLOCK  CONTAINS 0   RECORDS.
    
                  01 INPUT-BUFFER pic X(7).
    
                  FD SORTIE
                  RECORDING MODE IS V
                  RECORD CONTAINS 7 CHARACTERS
                  LABEL  RECORD   IS  OMITTED
                  BLOCK  CONTAINS 0   RECORDS.
    
                  01 OUTPUT-BUFFER pic X(7).
    
               WORKING-STORAGE SECTION.
    
                  01 FIN PIC 9 value 1.
    
                  01 compteur pic s9(11) comp-3 value 0.
                       
    01 ZZ-input  PIC x(7).
    01 ZZ-output PIC x(7).
    on va considérer que les déclarations ci-dessus sont correctes (?)
    noter que INPUT-BUFFER et OUTPUT-BUFFER ne sont pas des zones de la
    WORKING ! ce sont des zones des FD (tout à fait différent !)

    En WORKING on a des zones prévues pour "recevoir" les données INPUT
    ou préparer les données "OUTPUT" à envoyer.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PROCEDURE DIVISION.
    
           DEBUT.
    
    perform opens
     
    perform copies
    perform closes
    
    display compteur
    
    
    GOBACK.
    le code n'a pas de SECTION (je pense que çà marche qq soit le compilateur)
    [pas vérifié]. Les points (comma) [.] sont très limités d'usage.
    Pas de "THRU" (interdit !)
    Pas de "THRU" (interdit !)
    Pas "d'EXIT " (interdit !)

    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
    opens.             nom de paragraphe : "un point"
                      open input  ENTREE
                      open output SORTIE
                    .         fin du paragraphe : "un point" c'est tout
    
    
             copies.          nom de paragraphe
            perform lecture
    
              perform until FIN = 1
    
                MOVE ZZ-INPUT  to ZZ-OUTPUT
                   write OUTPUT-BUFFER from zz-output
    
               perform lecture 
    
            end-perform   du "until"
            .
    notez bien, que personnellement "minuscules" ou "majuscules"
    celà ne me gêne en aucune manière, d'ailleurs j'aurais tendance
    à préférer les minuscules.


    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
    lecture.          nom de paragraphe
             READ ENTREE INTO zz-input 
            NOT AT END
             MOVE 0 TO FIN
             add 1 to compteur
             display compteur
     
        AT END
          move 1 to FIN 
           END-READ.
    
    
             closes.          nom de paragraphe
                      close SORTIE
                      close ENTREE
    .
    il y a des choses à redire : sur les OPEN on ne teste pas les "codes retour"
    d'ailleurs aucune déclarative ne prévoit de lire ces "codes retour" !
    Ceci est bien entendu source de "plantages".
    Sur les CLOSE, ces code-retours n'offrent aucun intérêt (çà marche toujours)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Citation Envoyé par duboisa Voir le message
    (.../...)
    Pas de "THRU" (interdit !)
    Pas "d'EXIT " (interdit !)(.../...)
    Encore une fois, d'accord sur le reste(je passe la très cosmétique histoire de minuscules-majuscules), mais le THRU + EXIT m'a sauvé plus d'une fois(bon, d'accord, toujours au même endroit). C'est plus légér sans, je préfère sans, mais l'interdire, ça me parait abérrant, dans la mesure ou il existe des cas ou sans, ça ne marche pas.

    Après, interdire un THRU plusieurs paragraphes, oui, là, je suis d'accord. C'est de la programmation aléatoire. Fatima n'en a pas fait, donc ça, ça me parait bon(même si un poil lourd).
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    "Pourquoi faire simple quand on peux faire compliqué ?"

    Plus un programme est court et bien écrit, plus vite il est lu et compris.

    Une simple recopie de fichier peut s'écrire avec les quelques lignes suivantes :

    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
      ID DIVISION.
      PROGRAM-ID. recopie.    
      INPUT-OUTPUT SECTION.
      FILE-CONTROL.
           select  f1 assign "D:\FICHIER-ENTREE.dat".  
           select  f2 assign "D:\FICHIER-SORTIE.dat". 
      DATA DIVISION.
      FILE SECTION.
    
      FD  f1    LABEL RECORD STANDARD.
      01  f1e   pic x(07).
    
      FD  f2    LABEL RECORD STANDARD.
      01  f2e    pic x(07).
    
      WORKING-STORAGE SECTION.
    
      77  n     pic  9(6)  value 0.      
    
      PROCEDURE DIVISION.
    
          open input f1 output f2.
    
          perform  1000000 times
    
              read  f1
                       end   display  'Nb : ' n 
                             close f1 f2 stop run
              end-read
    
              add 1 to n 
    
              write  f2e  from  f1e
    
          end-perform.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Bonjour

    Personnellement, je ne m'interdit pas le PERFORM THRU, bien au contraire.

    Je ne met jamais de perform sans son THRU et l'etiquette de fin avec son EXIT

    Pour la simple et bonne raison que je ne m'interdit pas non plus le GO TO
    Mais le GO TO pas dans n'importe quel condition. A condition qu'il renvoi a une etiquette située entre l'etiquette de debut de PERFORM et l'etiquette de fin de PERFORM THRU (Inclue)

    Quand on est dans un paragraphe de controle avec plein de condition qui font stopper les controles et on passe a la suite, rien de tel qu'un GO TO ETIQUETTE-FIN plutot que mettre en continu des series de IF juste pour se rappeler qu'on doit plus controler.

    Concernant les Points, je les mets a chaque bout de ligne d'instruction (saif entre les IF END-IF, PERFORM END-PERFORM)

  15. #15
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Janvier 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 179
    Points : 350
    Points
    350
    Par défaut
    Bonjour Jivaro,

    hum....sans vouloir polémiquer, je te site :
    "Plus un programme est court et bien écrit, plus vite il est lu et compris."
    bien écrit? Oo désolée mais le source que tu proposes est tout sauf bien écrit :

    - boucle de 1000000 quelque soit le nombre d'enregistrements en input
    - boucle et traitement qui continue même sur close des fichiers et at end


    je fais de la revu de code régulièrement dans mon entreprise, un programme tel que celui que tu présentes, c'est ... out direct et à refaire!

  16. #16
    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 xfanx Voir le message
    ...
    - boucle de 1000000 quelque soit le nombre d'enregistrements en input
    - boucle et traitement qui continue même sur close des fichiers et at end
    Je pense que son programme se termine avec le STOP RUN dans le AT END.

    Par contre, il est faux pour 1 000 001 d'enregistrements et au-delà ...

  17. #17
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Précisions
    Luc Orient qui a bien lu le programme a raison, celui-ci s'arrête bien grâce au end ... stop run

    En ce qui concerne le "perform 1000000 times" :

    Un perform de 1000000 times ne fera pas 1 time de plus, c'est évident !

    Celui-ci est parfaitement suffisant pour des petites "moulinettes" qui traitent généralement de tous petits fichiers.

    C'est le cas de ce petit programme à vocation "didactique", dont le fichier d'entrée ne comporte que 26 enregistrements.

    Rien n'empêche en cas de forte volumétrie de le remplacer par :

    ... perform 100000000000000000 times (pour dormir tranquille)
    ou perform 999999999999999999 times (le maximum pour les puristes)
    ou perform until 1 = 2 (pour les experts !)
    Ne pas oublier cependant de réajuster la variable n à "9(18)"

    (Pour info: le AT du AT END n'est pas obligatoire)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Je suis régulièrement amené à fare des moulinettes, et même pour une moulinette qui ne dépassera jamais le stade du dèv, je ne me permets pas ce genre d'approximations. D'abord parceque ça fait prendre de mauvaises habitudes, et ensuite et surtout parceque parfois les moulinettes dépassent leur utilité initiale. Dans ce cas, un code propre dès le départ, c'est un gain de temps important contre un cout initial faible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PERFORM UNTIL FALSE(ou 1 = 2)
    , c'est quand même archi sale. La condition de sortie est perdue au milieu du bazar, et le jour ou on doit ressortir la moulinette pour l'adapter, on se flingue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PERFORM UNTIL W-BOOL-FIN-FICHIER
    , même si ça prend 5 lignes de plus(3 lignes pour définir le booléen, une pour l'initialiser, une pour le changer), ça permet de réutiliser la moulinette sans se poser de questions.

    D'ailleurs, peut-être Luc Orient a-t-il bien lu le programme, mais un programme qui est si facile à mal comprendre, pour moi, c'est poubelle.

    Plus un programme est court et bien écrit, plus vite il est lu et compris.
    : la preuve que non, puisque xfanx a loupé une étape cruciale. Et moi aussi, à la première lecture(puis j'ai relu).
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  19. #19
    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
    Quitte à faire simple et vite fait / bien fait voilà ce que j'écrirais :

    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
    IDENTIFICATION DIVISION.
    PROGRAM-ID. xxxxxxxx.
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
        SELECT F1 ASSIGN F1.
        SELECT F2 ASSIGN F2.
    DATA DIVISION.
    FILE SECTION.
    FD  F1 LABEL RECORD STANDARD RECORDING F.
    1 F1E PIC X(7).
    
    FD  F2 LABEL RECORD STANDARD RECORDING F BLOCK 0.
    1 F2E PIC X(7).
    
    WORKING-STORAGE SECTION.
    1 N PIC S9(15) PACKED-DECIMAL.
    1 N-EDITE PIC -Z(14)9.
    PROCEDURE DIVISION.
        OPEN INPUT F1 OUTPUT F2
        MOVE ZERO TO N.
    LECT.
        READ F1
        END
         MOVE N TO N-EDITE
         DISPLAY 'NB : ' N-EDITE
         CLOSE F1 F2
         GOBACK
        END-READ
        ADD 1 TO N
        WRITE F2E FROM F1E
        GO LECT.
    Ecrit et testé sur Mainframe IBM - Enterprise COBOL V3

  20. #20
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    "Simplicité et concision dans l'écriture ne s'acquièrent pas du jour au lendemain."

    Pour el_slapper :
    J'ai "ressorti" cette moulinette générique des milliers de fois sans problèmes.
    Je n'ai jamais pris d'aspro pour l'adapter, il suffit d'insérer son traitement entre le end-read et le write.
    Ce programme n'est pas plus sale qu'un programme truffé de variables inutiles.

    Pour Luc Orient :
    Le programme n'est pas plus court.
    Il utilise l'infâme GOTO, l'ennemi des programmes "structurés".
    Il oublie de fermer les fichiers.

Discussions similaires

  1. [Delphi 3] Problème avec fichier ressource .RES
    Par delphim dans le forum EDI
    Réponses: 2
    Dernier message: 28/06/2005, 18h11
  2. [Servlet] Probléme écriture fichier
    Par hedgehog dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/05/2005, 15h17
  3. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36
  4. Problème ouverture fichier par double clic...
    Par sankookai dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2005, 09h13
  5. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17

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