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 :

[AS/400] Lecture double fichier


Sujet :

Cobol

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [AS/400] Lecture double fichier
    Bonjour

    actuellement en formation sur le cobol, je m'exerce chez moi sur des sujets vu et essai de comprendre les points non vu.
    Je sollicite votre aide pour une lecture de fichier en random dans mon programme cobol.

    Voiçi tous d'abord la structure de mes deux fichiers :
    1 / IDCOM...NOMCOM...IDDEP...VOTANTS

    2 / IDDEP...NOMDEP...IDREG

    Lors de mon programme, je fais une lecture séquentiel du fichier principal (1) et une lecture random du fichier secondaire (2)

    Lors du traitement, je dois récupérer en fait la variable NOMDEP du fichier (2) grace à la variable IDDEP commune au deux fichiers.

    Déclaration de mes fichiers :

    FILE-CONTROL. SELECT COMMUNE
    ASSIGN TO DATABASE-COML1
    ORGANIZATION IS INDEXED
    ACCESS MODE IS SEQUENTIAL
    RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
    WITH DUPLICATES.
    SELECT DEPARTEMENT
    ASSIGN TO DATABASE-DEPL1
    ORGANIZATION IS INDEXED
    ACCESS MODE IS RANDOM
    RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
    WITH DUPLICATES.
    Traitement :

    TRT-COMMUNE.
    PERFORM UNTIL FFC = 1 OR L >= 60
    READ DEPARTEMENT INVALID KEY MOVE 1 TO FFC
    NOT INVALID KEY MOVE 0 TO FFC
    END-READ
    MOVE NOMDEP OF DEPARTEMENT TO ED-NOMDEP
    MOVE NOMCOM TO ED-NOMCOM
    MOVE VOTANT TO ED-VOTANTS
    WRITE LIGNE FROM LIGNE-COMMUNE
    AFTER ADVANCING 1 LINE
    END-WRITE
    ADD VOTANT TO TVOTANTS
    ADD 1 TO L
    READ COMMUNE AT END MOVE 1 TO FFC
    NOT AT END MOVE 0 TO FFC
    END-READ
    END-PERFORM.
    Lors de la compilation, je n'ai aucune erreur.
    Lors de l'execution du programme, celui se lance bien mais si je regarde le spool, j'ai comme résultat :

    Le nom des commune Votants

    Le nom des département qui se trouve dans le fichier secondaire n'apparait pas.
    Je dois donc faire une erreur dans la lecture de ce fichier mais après avoir tout essayé, je ne vois rien.

    Pour info la structure de mon fichier logique departement est :

    R ENRDEP
    K IDDEP

    D'avance merci à celui qui pourra m'aider.

  2. #2
    Membre éclairé Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Points : 801
    Points
    801
    Par défaut
    Peux-tu nous donner le file description des fichiers en entrée et en sortie ainsi que la working storage section ?

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour, même si celà fait un peu long, je me permet de te mettre tous le code ainsi que la structure des deux DDS logique et des deux DDS physiques que j'ai fais.

    J'espère que celà sera suffisant pour trouver mon erreur ?
    Merci à toi en tout cas

    Code cobol :
    IDENTIFICATION DIVISION.
    PROGRAM-ID. ELECTION15.
    ENVIRONMENT DIVISION.
    CONFIGURATION SECTION.
    SOURCE-COMPUTER. IBM-AS400.
    OBJECT-COMPUTER. IBM-AS400.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
    SELECT COMMUNE
    ASSIGN TO DATABASE-COML1
    ORGANIZATION IS INDEXED
    ACCESS MODE IS SEQUENTIAL
    RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
    WITH DUPLICATES.
    SELECT DEPARTEMENT
    ASSIGN TO DATABASE-DEPL1
    ORGANIZATION IS INDEXED
    ACCESS MODE IS RANDOM
    RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
    WITH DUPLICATES.
    SELECT ETAT
    ASSIGN TO PRINTER-QSYSPRT.
    DATA DIVISION.
    FILE SECTION.
    FD COMMUNE.
    01 ENR-COM.
    COPY DDS-ENRCOM OF COML1.
    FD DEPARTEMENT.
    01 ENR-DEP.
    COPY DDS-ENRDEP OF DEPL1.
    FD ETAT.
    01 LIGNE PIC X(100).
    WORKING-STORAGE SECTION.
    77 L PIC 9(2).
    77 P PIC 9(5).
    77 FFC PIC 9.
    77 TVOTANTS PIC 9(5).
    *-------LIGNES IMPRESSION--------------*
    01 ENTETE-PAGE.
    02 F PIC X(30) VALUE "LISTE DES COMMUNES DE FRANCE".
    01 ENTETE-COLONNES.
    02 F PIC X(30) VALUE "COMMUNE".
    02 F PIC X(5) VALUE SPACES.
    02 F PIC X(30) VALUE "DEPARTEMENT".
    02 F PIC X(5) VALUE SPACES.
    02 F PIC X(30) VALUE "VOTANTS".
    01 LIGNE-COMMUNE.
    02 ED-NOMCOM PIC X(30).
    02 F PIC X(5) VALUE SPACES.
    02 ED-NOMDEP PIC X(30).
    02 F PIC X(5) VALUE SPACES.
    02 ED-VOTANTS PIC 9(5).
    01 ENTETE-TOTAL.
    02 F PIC X(35) VALUE "TOTAL DES VOTANTS INSCRITS : ".
    02 F PIC X(5) VALUE SPACES.
    02 ED-TVOTANTS PIC 9(5).
    01 PIED-PAGE.
    02 F PIC X(20) VALUE SPACES.
    02 F PIC X(7) VALUE "PAGE : ".
    02 ED-P PIC Z(4)9.
    01 ENTETE-TSVP.
    02 F PIC X(30) VALUE "TOURNEZ SVP".
    PROCEDURE DIVISION.
    OUVERTURE-FICHIERS.
    OPEN INPUT COMMUNE
    OPEN INPUT DEPARTEMENT
    OPEN OUTPUT ETAT.
    DEBUT.
    MOVE 0 TO L
    MOVE 0 TO P
    MOVE 0 TO TVOTANTS
    READ COMMUNE AT END MOVE 1 TO FFC
    NOT AT END MOVE 0 TO FFC
    END-READ
    IF FFC = 0
    THEN PERFORM TRT-PAGE
    ELSE DISPLAY "PAS DE COMMUNES DANS LE FICHIER"
    END-IF
    CLOSE DEPARTEMENT
    CLOSE COMMUNE
    CLOSE ETAT
    STOP RUN.
    TRT-PAGE.
    PERFORM UNTIL FFC = 1
    WRITE LIGNE FROM ENTETE-PAGE
    AFTER ADVANCING PAGE
    END-WRITE
    WRITE LIGNE FROM ENTETE-COLONNES
    AFTER ADVANCING 2 LINE
    END-WRITE
    MOVE 0 TO L
    PERFORM TRT-COMMUNE
    IF FFC = 1
    THEN MOVE TVOTANTS TO ED-TVOTANTS
    WRITE LIGNE FROM ENTETE-TOTAL
    AFTER ADVANCING 2 LINES
    END-WRITE
    ELSE WRITE LIGNE FROM ENTETE-TSVP
    AFTER ADVANCING 2 LINES
    END-WRITE
    END-IF
    ADD 1 TO P
    MOVE P TO ED-P
    WRITE LIGNE FROM PIED-PAGE
    AFTER ADVANCING 3 LINES
    END-WRITE
    END-PERFORM.
    TRT-COMMUNE.
    PERFORM UNTIL FFC = 1 OR L >= 60
    READ DEPARTEMENT INVALID KEY MOVE 1 TO FFC
    NOT INVALID KEY MOVE 0 TO FFC
    END-READ
    MOVE NOMDEP OF DEPARTEMENT TO ED-NOMDEP
    MOVE NOMCOM TO ED-NOMCOM
    MOVE VOTANT TO ED-VOTANTS
    WRITE LIGNE FROM LIGNE-COMMUNE AFTER ADVANCING 1 LINE
    END-WRITE
    ADD VOTANT TO TVOTANTS
    ADD 1 TO L
    READ COMMUNE AT END MOVE 1 TO FFC
    NOT AT END MOVE 0 TO FFC
    END-READ
    END-PERFORM.
    Logique COML1 :
    A R ENRCOM PFILE(COMMUNES)
    A K NOMCOM
    Logique DEPL1 :
    A R ENRDEP PFILE(DEPART)
    A K IDDEP
    Physique COMMUNES :
    A UNIQUE
    A R ENRCOM
    A IDCOM 5 0 COLHDG('CODE')
    A NOMCOM 30 COLHDG('NOM')
    A IDDEP 3 0 COLHDG('IDENT DEP')
    A VOTANT 7 0 COLHDG('VOTANT')
    A K IDCOM
    Physique DEPART :
    A UNIQUE
    A R ENRDEP
    A IDDEP 3 0 COLHDG('CODE')
    A NOMDEP 30 COLHDG('COM')
    A IDREG 2 0 COLHDG('IDENT REGION')
    A K IDDEP

  4. #4
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Bonjour,
    J'ai relevé au moins trois erreurs de logique dans ce programme. Toutes dans le % TRT-COMMUNE.
    Lecture verticale, peut-être d'autres, l'absense de colonnage du source fourni n'en facilite pas la lecture.
    1) l'indicateur FFC est utisé pour indication de fin de lecture du fichier COMMUNE ET comme indicateur non trouvé du fichier DEPARTEMENT.
    De sorte que l'on ira en fin de traitement au premier cas de DEPARTEMENT non trouvé.
    nb. Ce cerait déjè plus lisible avec des niveaux 88 pour ces indicateurs.
    2) Dans TRT-COMMUNE, alimentation des données sans tenir compte de L'INVALID KEY.
    3) Egalement dans TRT-COMMUNE, lecture COMMUNE en fin de paragraphe dans tous les cas.
    - INVALID KEY, assez logique, sauf que l'on est peut-être en fin du fichier ? NOT INVALID KEY et/ou L >= 60 ce qui fait qu'on fait une lecture de trop dans ces cas.

    En conclusion, refaire un organigramme de la logique de traitement me semble indispensable et surtout un indicateur distinct pour fin de fichier COMMUNE et DEPARTEMENT non trouvé.
    La logique de la gestion des sauts de page devrait être être tranférée dans un sous programme d'impression commun. La lecture et les tests en seront grandement simplifiés.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/11/2012, 09h17
  2. Réponses: 3
    Dernier message: 18/06/2011, 11h43
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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