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 :

Problématique fichiers variables


Sujet :

Cobol

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problématique fichiers variables
    Bonjour,

    voici un exemple qui me pose problème.

    prenons un fichier variable de taille max = 32720


    exemple de fichier en entrée en hexa :

    0--------1---------2---------3
    COUCOU BENJAMIN 1998$
    CDECDE4CCDDCDCD4FFFF5
    36436402551149500998B

    il n'y a aucun caractère après le "1998$" (pas de low-value, pas de space, il n'y a rien), donc en hexa il n'y a rien non plus.


    voici le fichier en sortie du programme en hexa :

    0--------1---------2---------3
    COUCOU BENJAMIN 1998$
    CDECDE4CCDDCDCD4FFFF544444444
    36436402551149500998B00000000

    Mon programme fait des modifications que je n'ai pas représenté ici, mais lorsqu'il écrit, il m'ajoute des spaces à la fin de l'enregistrement.
    Je souhaiterais avoir la même chose qu'en entrée, c'est à dire du "rien". Je ne veux pas voir les spaces.
    Et sachant que c'est un fichier variable on ne connaît jamais la longueur de chaque enregistrement.


    Y'a-t-il un moyen de ne pas ajouter ces espaces en sortie ?
    pour info j'ai essayé le delimited by size et ça fonctionne pas

    Merci pour votre aide,
    Benj

    ps: désolé pour la mise en forme des exemples, j'ai pas pu changer la police de caractère pour que tout soit correctement aligné.

  2. #2
    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 futurbrigand Voir le message
    Bonjour,
    Bonjour,

    Et sachant que c'est un fichier variable on ne connaît jamais la longueur de chaque enregistrement.
    Bien sûr que le système connaît la longueur de chaque enregistrement. Le problème en COBOL est de la récupérer pour un fichier d'entrée et de l'indiquer pour un fichier de sortie.

    Comment as-tu décrit tes fichiers en entrée et en sortie ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    j'ai pas la structure en tête donc je sais plus trop et je bosse pas aujourd'hui, mais j'ai fais une déclaration classique du type :

    RECORD CONTAINS 32720 CHARACTERS
    RECORDING MODE IS V
    LABEL RECORD STANDARD
    DATA RECORD IS LIGN-FICH1.

    01 LIGN-FICH1 PIC X(32720).

    selon toi, je devais faire quoi ? il y a peut être une instruction que je connais pas du coup ...
    merci pour ton aide

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Tu travailles sous quel OS ?

    Je crois me souvenir que tu dois définir l'enregistrement en longueur variable dans la FD avec la clause
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OCCURS ... DEPENDING ON Compteur
    et, dans la variable Compteur, tu dois mettre la longueur exacte de l'enregistrement que tu veux écrire. En outre, selon l'OS, le compteur peut (doit ?) être inclus dans l'enregistrement et la longueur de ce dernier doit alors tenir compte de la longueur du compteur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FD ...
     01  ENREG PIC X OCCURS 1 TO 32720 DEPENDING ON COMPTEUR.
    
    Working-Storage Section :
    01  COMPTEUR PIC S9(5) BINARY.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    justement, j'ai pensé au depending on, et effectivement la longueur doit être stockée dans l'enreg (donc il faut la connaitre avant), et en plus dans mon cas ça prend jusqu'à 5 caractères.
    et les clients n'étant pas capable de me dire le nombre de caractères possible par enregistrement, je ne peux pas prendre le risque de prendre 5 caractères...

  6. #6
    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
    Une proposition :
    Un petit programme "vite fait" qui devrait correspondre à ton besoin .... A améliorer sans doute (certaines clauses sont peut être redondantes mais bon ... )

    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
           IDENTIFICATION DIVISION.
          * LECTURE / ECRITURE FICHIER LONGUEUR VARIABLE
           PROGRAM-ID. xxxxxxxx.
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
               SELECT DDIN ASSIGN DDIN.
               SELECT DDOUT ASSIGN DDOUT.
           DATA DIVISION.
           FILE SECTION.
           FD  DDIN BLOCK 0 LABEL RECORD STANDARD
               RECORD VARYING DEPENDING L-DDIN
               RECORDING V.
           1 DDIN-REC PIC X(32720).
          *
           FD  DDOUT BLOCK 0 LABEL RECORD STANDARD
               RECORD VARYING 1 TO 32720 DEPENDING L-DDOUT
               RECORDING V.
           1 DDOUT-REC PIC X(32720).
          *
           WORKING-STORAGE SECTION.
           1 N PIC S9(15) PACKED-DECIMAL.
           1 N-EDITE PIC -Z(14)9.
           1 L-DDIN  PIC 9(5) PACKED-DECIMAL.
           1 L-DDOUT PIC 9(5) PACKED-DECIMAL.
           PROCEDURE DIVISION.
               OPEN INPUT DDIN OUTPUT DDOUT
               MOVE ZERO TO N.
           LECT.
               READ DDIN
               END
                MOVE N TO N-EDITE
                DISPLAY 'NB : ' N-EDITE
                CLOSE DDIN DDOUT
                GOBACK
               END-READ
               ADD 1 TO N
               DISPLAY 'L-DDIN=' L-DDIN
               MOVE L-DDIN TO L-DDOUT
               STRING DDIN-REC (1:L-DDIN) DELIMITED SIZE
                      INTO DDOUT-REC
               DISPLAY 'L-DDOUT=' L-DDOUT
               WRITE DDOUT-REC
               GO LECT.
    Ah j'oubliais ... c'est du z/OS bien sûr ...

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    De nouveau, quel OS utilises-tu ?

    Citation Envoyé par futurbrigand
    justement, j'ai pensé au depending on, et effectivement la longueur doit être stockée dans l'enreg (donc il faut la connaitre avant), et en plus dans mon cas ça prend jusqu'à 5 caractères.
    et les clients n'étant pas capable de me dire le nombre de caractères possible par enregistrement, je ne peux pas prendre le risque de prendre 5 caractères...
    Je ne suis pas sûr de comprendre ce que tu dis-là. Pourquoi faut-il connaître la longueur de l'enregistrement avant [de l'écrire] ? En lisant le fichier, tu vas d'emblée récupérer la longueur de l'enregistrement puisqu'elle fait partie de celui-ci. Définis correctement l'enregistrement dans la FD et voilà.
    De mémoire, j'écrierais un truc dans ce goût-là :
    (la plupart du temps, le compteur est placé en tête de l'enregistrement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FD ...
    ...
    DATA RECORD IS LIGN-FICH1.
    01  LIGN-FICH1.
         05  COMPTEUR PIC S9(5). 
         05  DONNEES   PIC X OCCURS 1 TO 32720 DEPENDING ON COMPTEUR.
    ou bien je procéderais comme dans le programme de Luc ci-dessus si ton compilateur le supporte.
    Pour faire les modifs, je ferais un READ INTO dans une zone de travail définie en WSS, ferais ma modif dans la zone de travail puis récrierais l'enregistrement avec un WRITE FROM zone de travail.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/07/2006, 17h48
  2. Ouvrir fichier ( nom du fichier variable )
    Par kilian dans le forum C++
    Réponses: 2
    Dernier message: 24/05/2006, 11h21
  3. Réponses: 7
    Dernier message: 16/05/2006, 10h26
  4. Nom de fichier variable!
    Par melphit dans le forum C++
    Réponses: 1
    Dernier message: 16/04/2006, 10h37
  5. Nom de fichier variable.
    Par ::Fistons dans le forum Langage
    Réponses: 4
    Dernier message: 05/04/2006, 11h32

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