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 :

Runtime error: File not opened/Previous error Program:COMPAR line: 00163


Sujet :

Cobol

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Points : 14
    Points
    14
    Par défaut Runtime error: File not opened/Previous error Program:COMPAR line: 00163
    Bonjour,

    J'ai un program COBOL avec deux fichiers input en organization relative et un fichier output de sortie egalement en relative.

    les 2 fichiers input sont triés sur le nom

    Le programme compare le nom dans les 2 fichiers input et vérifie l'égalité pour dans ce cas remplir le fichier output avec les champs communs à chaque record

    si< ou si > on ajoute le record qui n'existe pas dans le fichier de sortie pour avoir un fichier complet, un genre de merge entre les 2 fichiers input.

    Le problème est très simple mais je ne vois pas l'erreur ---> le programme bloque d'entrée sur le 1er read d'un des deux fichiers appelé 'usergmail'

    Le read de l'autre fichier input 'csvinput' ne pose pas de problème.

    Il m'affiche le runtime error suivant :

    Runtime error: File not opened/Previous error Program:COMPAR line: 00163
    Pourtant tous les fichiers sont bien ouverts au début du programme :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       1-DEBUT-UNSTRING.
               open input csvinput.
               open input usergmail.
               open output csvoutput.
               open output file-status.
               read csvinput into buffer-in at end perform fin-fichier.    
               read usergmail into usergmail-buffer at end perform fin-fichier. <----- ça bloque ici et sur tous les read de ce fichier dans la proc. div.
               PERFORM 1-UNSTRING until eof=1.
               PERFORM 1-FIN-UNSTRING.
               STOP RUN.
    Je ne comprends pas pourquoi il dit que le fichier "usergmail" n'a pas été ouvert ?

    J'ai un vieux compilateur MS COBOL pour IBM PC version 2.10

    Les autres programmes tournent très bien.

    J'espère que vous pourrez me mettre sur la voie pour résoudre ce souci car je ne sais vérifier la logique si mon programme ne parvient pas à traiter les données en input.

    Bien à vous,

    Negob

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    COBOLISTE engagé
    Inscrit en
    Mai 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : COBOLISTE engagé

    Informations forums :
    Inscription : Mai 2019
    Messages : 6
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    Il n'y a pas de File-Status lié aux fichiers ?
    Il est possible que le fichier ne soit pas ouvert.
    En cobol MVS, un OPEN raté ne fait pas planter le programme, il faut analyser le File-Status pour vérifier le bon fonctionnement des commandes (OPEN READ CLOSE et.)

  3. #3
    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
    moi je vois qu'on ouvre en écriture un fichier de file-status.

    Pour moi c'est une erreur de conception, si ça plante, on ne retrouve le file-status nulle part. Il vaut mieux faire un gros display qui tache à chaque fois que le file-status n'est pas celui attendu (en gros, NOT EQUAL ZERO, dans la plupart des cas). Et une fois qu'on a le display de l'opération qui fait planter, (oui, il faut en mettre sur toutes les opérations sur des fichiers), on regarde les displays, et on voit ce qui cloche.

    Exemple de liste des flie-status en cobol :
    http://lwitkowski.free.fr/contenu%20...OL%20VSAM.html
    (il y en a d'autres, c'est la première que j'ai trouvé)
    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.

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Points : 14
    Points
    14
    Par défaut
    Bonsoir,

    Merci pour vos réponses.

    Effectivement le fichier file-status en output reste vide puisque le programme ne démarrait pas.

    J'ai résolu ce problème très simplement mais il fallait le savoir : le programme executable n'a pas aimé le nom du fichier "usergmail" il bloquait tout le temsp sur le read de ce programme.

    J'ai changé juste le nom dans la FD et dans la procédure division pour l'appeller tout simplement "gmail" et je n'ai plus eu de problème de ce coté là. C'est comme si ce nom était réservé en Cobol.

    Autre souci, mon programme lit et compare 2 fichiers plats csv en input pour écrire un fichier définitif en output après un unstring pour éclater la chaine de caracteres "nom prénom" sur deux champs différents en output

    mes données d'entrée de mon fichier principal ne rentrent pas correctement dans mon masque en FD et donc ne coorepondent pas à la structure de mon record.. j'ai fais des display sur le record en fd et je vois que tout est décalé. quand j'adpate en tatonnant la longueur de mes zones en 02 j'arrive à cadrer correctement les premiers record lus, mais ensuite tout se décalent car les données dans le record sont de longueur variables.

    quand je fais un display de tout le record en input les données s'allignent correctement, j'ai juste les champs vides entre les virgules qui rstent comme dans le fichier csv d'origine.

    quand je fais des display sur les zones de la structure tout est décalé.

    je dois avoir les bonnes données dans le champs salarié (nom prénom) et faire un unstring dessus pour diviser ce champ en deux champs ",nom,prenom," ce qui m'oblige à vréer une sous structure à mon record.

    Mon compilateur ne gère pas la clause recording mode is F ou V, je ne peux donc pas spécifier que les record ont des longueurs variables. Donc je me demande comment récupérer la structure initiale de mon fichier pour que mon fichier output respecte la strucrure du fichier input. Cobol ne prend pas en compte les délimitateurs de champs "," ou ";" comme dans Excel.même sie mets en Data Division des Pic x value ",".

    Si vous avez un tuyau ça serait bien venu

    Bien à vous,

    Negob

  5. #5
    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
    Pour le nom de programme, j'ai plutôt l'impression que tu as dépassé la limite de 8 caractères. En revenant en dessous, ça marche (pas sur, ça dépend des environnements, c'est juste une hypothèse).

    Pour le reste, je ne suis pas sur de comprendre.

    Dans les fichiers en entrée, les virgules (les séparateurs, je suppose) sont en position fixe, ou variable?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    KEVIN     ,STARK
    NICOLAS   ,STORK
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    KEVIN,STARK
    NICOLAS,STORK
    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.

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Mon fichier en output "csvoutput" fait aussi 9 caractères et Cobol ne bloque pas dessus pourtant au moment du "open".

    Je te remercie pour tes exemples et ton lien

    je fais aussi un test d'égalité sur le nom entre mes deux fichiers input avant de déplacer les données du record d'un fichhier à l'autre via un buffer en WS.

    Mais mon problème est en amont au niveau de la FD en Data division

    mon masque en input dans ma FD est celui-ci :


    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
    DATA DIVISION.
    FD csvinput
               label records standard
               value of file-id 'csvinput'
               data record repert-input.
           01 repert-input.
               03 societe pic x(19).
               03 filler pic x.
               03 departement pic x(20).
               03 filler pic x.
               03 salarie pic x(52).
               03 filler pic x.
               03 fonction pic x(38).
               03 filler pic x(8).
               03 telephone-prof-bureau pic x(12).
               03 filler pic x(8).
               03 telephone-prof-mobile pic x(13).  
               03 filler pic x.
               03 e-mail pic x(38).
          *     03 filler pic x.
    Le fichier csv est structuré comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    societe,departement,nom prenom,fonction,tele_bureau_ prof,tel_mobile_prof,e-mail
     
    19 car  20 car max   38 car max  38 car max      12 car          13 car               38 car maxi
    Quand je lis les record à partir de ce fichier, les données ne s'alignent pas sur les zones de la structure du record "repert-input" en niveau "03" dans ma FD.

    les séparateurs sont les virgules et devraient correspondrent à "pic x".

    j'ai déjà essayé en tatonnant avec le 1er record de données en diminuant la longueur de mes zones mais soit la zone est trop petite et j'ai une troncature, soit elle est trop grande et j'ai les données du champ suivant qui la remplit.

    En chipotant avec les longueur des zones, et en faisant des displays pour visualiser le contenu du masque en FD, j'arrive avec le 1er record d'aligner société - departement - salarie mais comme les données ont des longueurs variables, tout se décalent avec la lecture des records suivants.

    j'ai pensé de changer la FD en faisant une seule zone en 03 reprenant toute la structure du record et une instruction dans cobol qui me permettrait de lui dire d'aller dans la chaine du record compter les virgules séparateurs et prendre le premier champs entre les 2 premières virgules pour le transférer dans la zone "sociéte" d'une structure en Working storage session, ensuite prendre le champs suivant entre la 2eme et 3eme virgule et le transférer dans le champ "departement" de ma structure en WS et ainsi de suite jusqu' au dernier champ "e-mail" du record.

    ensuite quand le buffer en WS sera rempli correctement je pourrai travailler sur les données en éclatant la zone salarie avec un unstring pour en faire une zone "nom" et "prenom" séparées et remplir mon fichier de sortie avec les données communes au même record dans mes deux fichiers d'entrée.

    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
    WORKING-STORAGE SECTION.
          
           01 buffer-in.
               03 societe pic x(19).
               03 filler pic x.
               03 departement pic x(20).
               03 filler pic x.
               03 salarie pic x(52).
          *     03 filler pic x.
          *     03 nom pic x(27).
          *     03 filler pic x.
          *     03 prenom pic x(24)
          *     03 filler pic x.
               03 fonction pic x(38).
               03 filler pic x.
               03 telephone-prof-bureau pic x(12).
               03 filler pic x.
               03 telephone-prof-mobile pic x(13).  
               03 filler pic x.
               03 e-mail pic x(38).
          *     03 filler pic x.
    
    
           01 buffer-out.
               03 societe pic x(19).
               03 filler pic x. 
               03 departement pic x(20).
               03 filler pic x.
          *     03 salarie pic x(52).
               03 nom pic x(27). 
               03 filler pic x.
               03 prenom pic x(24).          
               03 filler pic x.
               03 fonction pic x(38).
               03 filler pic x.
               03 telephone-prof-bureau pic x(12).
               03 filler pic x.
               03 telephone-prof-mobile pic x(13).  
               03 filler pic x.
               03 e-mail pic x(38).
          *     03 filler pic x.

    j'ai cherché une instruction cobol me permettant d'aller prelever les champs dans le record-input en FD en en comptant les séparateurs virgules mais je trouve pas.

    j'ai regardé la fonction "inspect" et "unstring" de cobol mais si "unstring" conviendrait mieux il ne compte pas les virgules pour se repérer dans le record.

    peut-être je devrais utiliser une table avec "occurs" et un index?

    Le but est d'avoir les bonnes données dans les bonnes zones de ma structure en "working storage section"

    je sais pas si j'ai su me rendre clair dans mes explications, mais j'espère.

    Excellente journée,

    Negob

  7. #7
    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
    Tes longueurs ne sont pas fixes, donc en effet tu ne peux pas utiliser les découpages habituels position longueur. Tes zones de working, elles, doivent être taillés à la longueur MAXIMALE de la donnée. un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UNSTRING repert-input DELIMITED BY ',' INTO
             societe      OF buffer-in
             departement  OF buffer-in
             fonction     OF buffer-in
             (etc)
    END-UNSTRING
    .
    le OF est indispensable, parce que tu as le même nom de données dans buffer-in et buffer-out.

    Sinon, on peut travailler à l'ancienne avec des index, caractère par caractère. Ca a ses avantages et ses inconvénients. A ne faire que si tu n'y arrives pas avec UNSTRING.
    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.

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    J'ai essayé ta solution avec en FD un seul record "01 repert-input pic x(452)." J'ai pris la longueur du record le plus long de mon fichier input. Et en WS :

    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
    01 buffer-in.
               03 societe pic x(50).
          *     03 filler pic x.
               03 departement pic x(50).
          *     03 filler pic x.
               03 salarie pic x(50).
          *     03 filler pic x.
          *     03 nom pic x(50).
          *     03 filler pic x.
          *     03 prenom pic x(50)
          *     03 filler pic x.
               03 fonction pic x(50).
          *     03 filler pic x.
               03 telephone-prof-bureau pic x(50).
          *     03 filler pic x.
               03 telephone-prof-mobile pic x(50).  
          *     03 filler pic x.
               03 e-mail pic x(50)
    je fais :

    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
    unstring repert-input delimited by "," into
               societe of buffer-in
               departement of buffer-in
               salarie of buffer-in
               fonction of buffer-in
               telephone-prof-bureau of buffer-in
               telephone-prof-mobile of buffer-in
               e-mail of buffer-in.
    
    display "societe of buffer-in    = " societe of buffer-in.
               display "department of buffer-in = " departement of buffer-in.
               display "salarie of buffer-in  = " salarie of buffer-in.  
               display "fonction of buffer-in   = " fonction of buffer-in.
               display "telephone-prof-bureau of buffer-in =    "
                                         telephone-prof-bureau of buffer-in.
                                                            
               display "telephone-prof-mobile of buffer-in =    "
                                         telephone-prof-mobile of buffer-in.
                                         
               display "e-mail of buffer-in      = "    e-mail of buffer-in.

    Résultats 1er record:

    "societe" =   societe
    "departement" = departement
    "salarie" = nom prenom
    "fonction"= fonction
    "tel bureau" = tel bureu
    "tel mobile" = tel mobile
    "e-mail" = email
    le premier record est donc OK


    2eme record :

    "societe" =   d
    "departement" = 
    "salarie" = 
    "fonction"= 
    "tel bureau" = e-mail
    "tel mobile" = departement
    "e-mail" = nom prenom
    Pas OK

    3eme record :

    "societe" =   a Imad A
    "departement" = 
    "salarie" = 
    "fonction"= 
    "tel bureau" = e-mail
    "tel mobile" = departement
    "e-mail" =  nom prenom
    Pas OK

    4eme record :

    "societe" =   societe
    "departement" = departement
    "salarie" = nom prenom
    "fonction"= fonction
    "tel bureau" = tel bureu
    "tel mobile" = tel mobile
    "e-mail" = email
    C'est OK




    5eme record :

    "societe" =   societe
    "departement" = departement
    "salarie" = nom prenom
    "fonction"= fonction
    "tel bureau" = tel bureu
    "tel mobile" = tel mobile
    "e-mail" = email
    C'est OK


    6eme record :

    "societe" =   departement
    "departement" = nom prenom
    "salarie" = 
    "fonction"=
    "tel bureau" = 
    "tel mobile" = e-mail
    "e-mail" = departement
    pas OK


    7eme record :

    "societe" =   nom prenom
    "departement" = 
    "salarie" = 
    "fonction"=
    "tel bureau" = e-mail 
    "tel mobile" = departement
    "e-mail" = nom prenom
    8eme record :

    "societe" =   email d'1 autre record
    "departement" = departement   OK
    "salarie" = nom prenom            OK
    "fonction"=                       pas de données pour ce champs
    "tel bureau" =                   pas de données pour ce champs
    "tel mobile" =  l                 pas de données pour ce champs
    "e-mail" =    e-mail    OK
    OK à part 1er champs décalé

    9eme record :

    "societe" =   societe     Ok mais nom de société est coupé
    "departement" = departement
    "salarie" = nom prenom
    "fonction"= fonction
    "tel bureau" = tel bureu
    "tel mobile" = tel mobile
    "e-mail" = email

    10 eme record :

    "societe" =   societe
    "departement" = departement
    "salarie" = nom prenom
    "fonction"= fonction
    "tel bureau" = tel bureu
    "tel mobile" = tel mobile
    "e-mail" = email
    OK mais 1er champs société un petit peu coupé car manque 3 lettres séparé par un blanc du reste du mot.


    Donc ca décale encore sauf quelques fois les records sont plsu ou moins bons

    il y a des coupures au milieu des mots et les mots composés séparée par un blanc

    or mon ustring sépare les données délimitées par des ","

    je devrais peut etre essayer de faire les unstring vers des zones élémentaires déclarées en 77 ?

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    il y a bien longtemps que je n'ai plus codé de COBOL, mais certains fondamentaux n'ont probablement pas changé.

    A commencer par le fait qu'un fichier indexé ouvert en TP ne doit jamais être vide.
    Il faut, après le delete-define du cluster, créer un enregistrement "bidon" pour pouvoir l'utiliser. A prendre en compte si votre fichier concerne le TP

    Ensuite, un fichier indexé est susceptible de renvoyer d'autres codes-retour que OK et fin de fichier, c'est pourquoi l'usage de AT-END n'a que peu d'intérêt (pour ma part je ne l'ai jamais utilisé, y compris pour des séquentiels, puisque l'utilisation du file-status est beaucoup plus riche). A remplacer par un test du file-status.

    Enfin, toute entrée-sortie, que ce soit sur un fichier, une table relationnelle ou autre ressource, doit être suivie d'un test de bon fonctionnement.

    Une remarque : read into utilise une zone de working, appeler cette zone "buffer" porte à confusion, car le buffer c'est la FD.

    EDIT : pour éviter les erreurs, il est fortement recommandé de ne mettre qu'un seul point en fin de paragraphe plutôt qu'un point à chaque fin d'instruction.
    En effet, le point est une fin d'instruction implicite, c'est une source d'erreur de code fréquente. Il faut savoir qu'à l'origine de COBOL, les fins d'instructions explicites (END-IF notamment) n'existaient pas, c'est pour raison de compatibilité descendante que le point a été conservé comme fin d'instruction .

  10. #10
    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
    Bonjour,

    Sur quel environnement ce programme COBOL ?

  11. #11
    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
    Pour ajouter à la question de Luc (qui est essentielle, on aura pas mal de différences entre MVS et microfocus, sans parler de GNUCOBOL) : on peut voir le fichier en entrée de manière plus complète? Parce que j'essaye de faire des déductions, mais au final, j'ai quand même l'impression que c'est là qu'est l'os.
    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.

  12. #12
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Mon programme ne lit pas un fichier indexé mais séquentiel.

    mon bufffer est bien une zone mémoire dans la working storage section dans laquelle je peux faire des déplacements et des remplacements de données.

    Buffer n'est pas un mot réservé pour cobol ibm pc et donc ça ne pose aucun problème que je donne ce nom à ma structure en WS

    Dans la FD il s'agit d'un masque qui décrit la structure de mes enregistrements en lecture du fichier mais je ne peux pas initialiser cette zone ou y faire des "move"

    Mon environnement est avec MS COBOL 2.10 c'est du COBOL 74 sans les end-if

    Le fichier est un fichier plat avec des virgules comme séparateurs des champs reconnus par Excel et Gmail mais pas par Cobol

    COBOL considère tout le fichier comme une immense chaine de caractère sans se préoccuper de la valeur des données.

    Quand je fais un read into at end ou read tout seul ça change rien

    Il prend la chaine jusqu'à la limite de la zone que j'ai déclarée en FD . par exemple pic x (199) (la longueur de mon plus grand record)

    si le record est plus petit il continue avec le deuxième record et parfois le 3eme record jusque toute la zone soit remplie

    si je diminue la zone à pic x(100) par exemple, il prend qu'une partie du record et je perds ce qui déborde en overflow.


    donc j'ai pris la zone la plus grande et dans ma procédure division j'essaye de faire correspondre les champs entre les virgules avec les champs décrits dans mon buffer en WS.

    J'ai essayé avec une boucle Perform until inspection CPT = 7 et au paragraphe inspection je fais un inspect buffer-in tallying CPT for all ","until CPT= 7 parce que les champs d'un record entier sont séparés par 7 virgules

    quand le cpt = 7, il sort de la boucle et ensuite il va faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unstring  buffer-in delimited by ","  into  soc  dep  sal  fonct  tel-bur-pro  tel-mob-pro  email-pro

    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
    read csvinput into buffer-in at end perform fin-fichier.
    PERFORM 1-UNSTRING until eof=1.
               PERFORM 1-FIN-UNSTRING.
               STOP RUN.
    
    1-UNSTRING.
    
    move 0 to compteur.
               move all space to soc dep sal fonct tel-pro-bur tel-pro-mob email.
    
    perform inspection until compteur = 7.
             unstring buffer-in  delimited by "," into  soc dep sal fonct tel-bur-pro tel-mob-pro email-pro.
             read csvinput into buffer-in at end perform fin-fichier.
    
      
    
    inspection.
               inspect buffer-in tallying compteur for all ",".
    
    
    fin-fichier.
               move 1 to eof.
               go to sortie.
    
           sortie.
               exit. 
    
           1-FIN-UNSTRING.
               close csvinput.

    J'ai aussi essayé avec une table occurs pic x (199) qui redéfinit mon buffer-in en WS mais ça fait bugger le programme.

    Maintenant que j'écris ce mail je me demande si en développant l'instruction unstring et en y ajoutant tallying in CPT2 je devrais pouvoir traiter uniquement les 7 champs de mon record sans déborder sur le record suivant
    Car avec le unstring simple que j'ai fais il ne se limite pas à éclater les zones jusqu'à la 7ème virgule mais prend aussi les caractères suivants de la chaine

    Le but est de faire en sorte que mon programme ne traite que les 7 1ers champs du record et pas ceux qui suivent.

    Le problème vient du fait que mes record sont de longueurs variables

  13. #13
    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
    Tu écris :
    Mon compilateur ne gère pas la clause recording mode is F ou V,
    Alors, je ne vois pas comment tu peux travailler efficacement et confortablement ...
    Change de compilateur ...

  14. #14
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Points : 14
    Points
    14
    Par défaut
    Ca ne vient pas du compilateur

    Dans le livre Cobol Microsoft sur IBM PC et COBOL Microfocus de Christian Bonin, cette clause n'existe pas.

  15. #15
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Bonjour à tous.
    Citation Envoyé par negob Voir le message
    Dans la FD il s'agit d'un masque qui décrit la structure de mes enregistrements en lecture du fichier mais je ne peux pas initialiser cette zone ou y faire des "move"
    Si on peut, à l'exception qu'après un WRIRE/REWRITE, le contenu de ces zones n'est plus disponible.
    Le fichier est un fichier plat avec des virgules comme séparateurs des champs reconnus par Excel et Gmail mais pas par Cobol

    COBOL considère tout le fichier comme une immense chaine de caractère sans se préoccuper de la valeur des données.
    Pour éviter ce genre de problèmes, déclare ton fichier en "organization is line sequential" pour que les CR/LF/FF soient reconnus comme fin d'enregistrement/fin de fichier. Tu donnes à ton buffer la taille maximale à ce que tu t'attends et puis tu utilises les unstring avec les clauses qui conviennent.

  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 negob Voir le message
    Ca ne vient pas du compilateur
    Ben si ...

    Dans le livre Cobol Microsoft sur IBM PC et COBOL Microfocus de Christian Bonin, cette clause n'existe pas
    .
    Mais pourtant ça fait partie de la norme COBOL.

  17. #17
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonsoir negob

    Ceci
    Citation Envoyé par negob Voir le message
    Bonjour,

    J'ai un program COBOL avec deux fichiers input en organization relative et un fichier output de sortie egalement en relative.

    est incohérent avec ceci
    Citation Envoyé par negob Voir le message
    Mon programme ne lit pas un fichier indexé mais séquentiel.


    Au sujet de cette remarque :
    Citation Envoyé par negob Voir le message
    mon bufffer est bien une zone mémoire dans la working storage section dans laquelle je peux faire des déplacements et des remplacements de données.

    Buffer n'est pas un mot réservé pour cobol ibm pc et donc ça ne pose aucun problème que je donne ce nom à ma structure en WS
    Rien n'interdit de nommer une zone de working storage "BUFFER" si vous le souhaitez, mais il n'en reste pas moins que ça porte à confusion, le buffer du fichier c'est la FD, pas la working.

  18. #18
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 49
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Merci à Hédhili Jaïdane qui m'a mis sur la voie en me disant de déclarer mon fichier input en "organization is line sequential".

    Il suffisait effectivement de faire cela pour résoudre le problème de lecture des record de longueurs variables. Désormais à chaque lecture du fichier j'ai un seul record qui entre dans le buffer quelque soit sa longueur.

    J'avais déjà choisi cette close en créant mon programme au début en mettant "organization sequential". Mon compilateur n'a pas généré d'erreur mais lors de l'exécution, le programme bloquait sur le 1er "read" du fichier. C'est pourquoi j'ai du mettre "organization relative" et me casser la tête pour résoudre le problème de lecture de record de longueurs variables avec une boucle inspect dans une boucle unstring ou avec des tables "occurs" sans que ce soit concluant.

    je comprends maintenant que mon compilateur exige de mettre "organization is line sequential" ou "organization line sequential" sans le "line" le programme ne s'exécute pas, malgré que le compilateur ne bronche pas.

    Maintenant que mes records sont chargés correctement dans les structures en mémoire (je n'ose plus dire buffer), je vais pouvoir continuer et croiser mon fichier principal avec un autre fichier input pour le modifier avec les instructions cobol adéquates et sortir un fichier output avec tous les champs dont j'ai besoin que j'enverrai avec une autre routine vers un fichier définitif csv au format compatible avec Gmail, lequel sera injecté pour remplir d'un seul coup les fiches d'informations des contacts utilisateurs actifs .

    Je ne peux pas publier le fichier d'entrée car ce sont des données confidentielles identifiant des centaines d'utilisateurs avec leurs noms prénoms departement service, fonction téléphone bureau téléphone mobile et email.

    bien à vous,

    Negob

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/01/2013, 13h08
  2. [PPT 2007] Error:PowerPoint could not open the file en VBS
    Par M4st4h dans le forum VBA PowerPoint
    Réponses: 5
    Dernier message: 06/10/2008, 17h21
  3. [Turbo Pascal] Runtime error 105 - File not open for output
    Par infoz dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 03/06/2008, 15h48
  4. [Error] File not found: 'Unit1.DFM'
    Par aliwassem dans le forum Delphi
    Réponses: 1
    Dernier message: 08/04/2007, 07h13

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