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 :

[PC]Comment créer un fichier séquentiel indéxé


Sujet :

Cobol

  1. #1
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut [PC]Comment créer un fichier séquentiel indéxé
    Bonjour à tous ,
    je bosse sur un projet sur la vente aux enchères et je rencontre certaines difficultés sur Cobol
    d'abord , j'ai voulu créer un fichier test (indéxé) avec les structures suivantes :

    fench
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    numlot 9(4)
    numach 9(4)
    AEXP A(1)
    EtatO (1)
    Montant 9(4)
    datench X(8)
    d'abord le fichier a une clé primaire (numlot,numach) et je ne sais pas si dans le code on le déclare ainsi
    ayant 2 clés secondaires (numach)
    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
    000100 IDENTIFICATION DIVISION.
    000200 PROGRAM-ID. SaisieEnchere.
           ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
           
    
                SELECT FENCH ASSIGN TO "Fench.dat"
                 ORGANIZATION INDEXED
                 ACCESS MODE IS RANDOM
                 RECORD KEY FENCH-CLE
                 ALTERNATE RECORD KEY FENCH-NUMLOT WITH DUPLICATES
                 ALTERNATE RECORD KEY FENCH-NUMACH WITH DUPLICATES.
                             
            DATA DIVISION.
            FILE SECTION.
            FD FENCH.
            01 FENCH-TAMP.
              03 FENCH-CLE.
                 05 FENCH-NUMLOT pic 9(4).
                 05 FENCH-NUMACH pic 9(4).
                 
               03 FENCH-AEXP pic A(1).
               03 FENCH-ETATO pic A(1).
               03 FENCH-MONTANT pic 9(4).
               03 FENCH-DATEENCH pic X(8).
               
            WORKING-STORAGE SECTION.
             77 W-FIN PIC 9(1).
            77 W-CHOIX PIC X(1).
            77 W-AUTRE PIC X(1).
            
            PROCEDURE DIVISION.
            PRINCIPAL.
             OPEN OUTPUT FENCH.
                  PERFORM UNTIL W-AUTRE ="N" OR W-AUTRE ="n" 
                    PERFORM SAISIE
                    PERFORM VALIDATION
                    END-PERFORM
                    CLOSE FENCH
                 
                 
            STOP RUN.
            
            
            SAISIE.
            DISPLAY "Numerot lot(4):" LINE 8 COL 0 WITH BLANK LINE
            accept  FENCH-NUMLOT
            DISPLAY "Numerot acheteur(4):"LINE 10 COL 0 WITH BLANK LINE
            accept FENCH-NUMACH 
            DISPLAY "AEXP(O/N):" LINE 12 COL 0 WITH BLANK LINE
            accept FENCH-AEXP 
            DISPLAY " EtatO(4):" LINE 14 COL 0 WITH BLANK LINE
            accept FENCH-ETATO 
            DISPLAY "Montant(4)" LINE 16 COL 0 WITH BLANK LINE
            accept FENCH-MONTANT 
            DISPLAY "Date enchere:" LINE 18 COL 0 WITH BLANK LINE
            accept FENCH-DATEENCH 
            
            
             VALIDATION.
               DISPLAY "Valider creation (O/N):" LINE 22 COL 0  
                    ACCEPT W-CHOIX 
                    IF W-CHOIX = "O" OR W-CHOIX = "o"
                    PERFORM ENREGISTREMENT
                    END-IF 
                DISPLAY "Autre enchere (O/N):" LINE 23 COL 0 
                    ACCEPT W-AUTRE
                    DISPLAY " " WITH BLANK SCREEN
                    
             ENREGISTREMENT.
            WRITE FENCH-TAMP
    et en compilant ce code , il crée le fichier mais quand je voulais lire ce qui a dedans il affiche des données qui ne correspondent pas à ce que j'ai saisi
    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
    000100 IDENTIFICATION DIVISION.
    000200 PROGRAM-ID. LireFichier.
             ENVIRONMENT DIVISION.
           INPUT-OUTPUT SECTION.
                SELECT FENCH ASSIGN TO "Fench.dat"
                 ORGANIZATION INDEXED
                 ACCESS MODE IS RANDOM
                 RECORD KEY FENCH-CLE
                 ALTERNATE RECORD KEY FENCH-NUMLOT WITH DUPLICATES
                 ALTERNATE RECORD KEY FENCH-NUMACH WITH DUPLICATES.
           DATA DIVISION.
           FILE SECTION.
             FD FENCH.
            01 FENCH-TAMP.
              03 FENCH-CLE.
                 05 FENCH-NUMLOT pic 9(4).
                 05 FENCH-NUMACH pic 9(4).
                 
               03 FENCH-AEXP pic A(1).
               03 FENCH-ETATO pic A(1).
               03 FENCH-MONTANT pic 9(4).
               03 FENCH-DATEENCH pic X(8).
               
             WORKING-STORAGE SECTION.
            77 W-CHOIX PIC X(1).
            77 W-FIN PIC 9(1).
            
            
            
            PROCEDURE DIVISION.
            DEBUT.
            OPEN INPUT FENCH.
                MOVE "X" TO W-CHOIX
                  MOVE 0 TO W-FIN 
                    READ FENCH  AT END MOVE 1 TO W-FIN END-READ
          *on affiche tant que qu'on n'a pas taper Quitter
                PERFORM AFFICHENCHERE UNTIL W-CHOIX = "Q" OR W-CHOIX = "q"
                    CLOSE FENCH
                    DISPLAY " " WITH BLANK SCREEN
          *Pour revenir au menu principal
                    STOP RUN.
                    
          *affichage etudiant   
              AFFICHENCHERE.
                 MOVE "X" TO W-CHOIX
                  DISPLAY "NUMERO LOT:" LINE 5 COL 2 WITH BLANK SCREEN   
                   DISPLAY "Numero acheteur:" LINE 8 COL 2  
                    DISPLAY "AEXP(O/N):" LINE 10 COL 2 
                     DISPLAY "EtatO(4):" LINE 12 COL 2 
                      DISPLAY "Montant(4)" LINE 14 COL 2
                       DISPLAY "Date enchere:" LINE 16 COL 2
                      
                      
                       DISPLAY  FENCH-NUMLOT LINE 5 COL 16   
                        DISPLAY  FENCH-NUMACH LINE 8 COL 24    
                         DISPLAY  FENCH-AEXP LINE 10 COL 11 
                          DISPLAY  FENCH-ETATO 12 COL 12 
                           DISPLAY FENCH-MONTANT LINE 14 COL 20
                           DISPLAY FENCH-DATEENCH LINE 16 COL 20
                 READ FENCH  NEXT AT END MOVE 1 TO W-FIN END-READ
          *on verifie si c pas la fin du fichier          
                    IF W-FIN = 1 THEN 
                      DISPLAY "Q)UITTER " LINE 22 
                        ACCEPT W-CHOIX
                    ELSE
                      DISPLAY "Q)UITTER S)UIVANT" LINE 22 COL 3 
                       DISPLAY "VOTRE CHOIX (Q,q,S,s):" LINE 23 COL 3
                         ACCEPT W-CHOIX LINE 23 COL 39
                    END-IF
    ceci dit comment créer un fichier séquentiel indexé , j'ai aussi voulu créer un fichier séquentiel simple et çà marche , mais quand je voulais créer un qui est indéxé à partir de ce fichier çà ne marche pas
    est ce que vous croyez que c'est un problème de redondance
    car j'ai travaillé sur des données suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    numlot   numach AEXP EtatO montant Datench
    001       1           "o"   "G"      100        2000
    001       1           "n"   "P"        90        2001
    001       2           "n"    "G"      100        2004
    001       3           "o"   "G"       100        2005
    001       4           "o"    "P"       50         2007
    002      1            "n"    "G"      90          2007
    003      2            "n"    "G"      120         2008
    003       4           "o"    "P"      130          2009
    004      4            "o"   "G"       400          2007
    je pensais qu'un acheteur peut proposer plusieurs offres sur le même lot mais parès c'est le montant qui va déterminer qui sera gagnant (G) ou perdant (P)

  2. #2
    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.

    Tout d'abord quels sont ton OS et ton compilateur, mets les dans le titre du premier post comme indiqué dans cette discussion : Règle Tag [SystèmeExploitation-VersionCompilateur]

    - Pour les clés secondaires, c'est ainsi qu'on le fait si ton compilateur le permet et s'il en autorise plus d'un. Ces ALTERNATE KEY doivent être déclarées à la création du fichier et doivent par la suite être toujours déclarées.

    - Dans ton premier programme, il me semble qu'il te manque des END-PERFORM

    - Il faut gérer l'INVALID KEY dans le WRITE pour détecter les doublons

    Si tu veux créer un fichier séquentiel indexé à partir d'un fichier séquentiel, il suffit d'écrire un petit programme qui :
    - ouvre le fichier séquentiel en INPUT et le fichier indexé en OUTPUT (au moins la 1ère fois)
    - dans une boucle, lire le fichier en entrée
    - transférer les données d'un buffer à l'autre
    - écrire l'enregistrement du fichier en sortie en gérant l'INVALID (doubles)
    - et s'assurer de fermer les fichiers à la fin.

  3. #3
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut
    Salut ,
    oui j'ai remarqué qu'il manque un end-perform mais si je rajoute , il m'indique une erreur alors j'ai laissé ainsi

    en ce qui concerne le fichier indexé pr le biais d'un fichier séquentiel j'ai pensé à çà :
    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
    *  OPEN INPUT FETUDIANT.
            OPEN OUTPUT FENCH.
            OPEN INPUT FENCHSEQUENTIEL.
             READ FENCHSEQUENTIEL AT END MOVE 1 TO W-FIN 
              NOT AT END
                PERFORM UNTIL W-FIN = 1
          *        MOVE FETUDIANT-TAMP TO W-TAMP
                    WRITE FENCH-TAMP FROM FENCHSEQUENTIEL-TAMP
                    INVALID KEY
                     DISPLAY "PROBLEME"
                     END-WRITE
                     READ FENCHSEQUENTIEL AT END MOVE 1 TO W-FIN END-READ
               END-PERFORM
             END-READ
             
            CLOSE FENCH.
            CLOSE FENCHSEQUENTIEL.
            STOP RUN.
    ce code m'affiche Probleme
    en fait une question , quel est la différence entre les différentes méthodes d'accès : Sequential - Random - dynamic

  4. #4
    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
    Citation Envoyé par razily Voir le message
    Salut ...ce code m'affiche Probleme
    en fait une question , quel est la différence entre les différentes méthodes d'accès : Sequential - Random - dynamic
    Normal, tu as déjà deux synonymes dès le début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    numlot   numach AEXP EtatO montant Datench
    001       1           "o"   "G"      100        2000
    001       1           "n"   "P"        90        2001
    Accès :
    - SEQUENTIAL : lecture des enregistremets dans l'ordre des clés s'il y en a ou dans l'ordre d'arrivée (saisie/écriture) (toute organisation), test de AT END uniquement
    - RANDOM : lecture directe en lui fournissant la valeur de la clé (initialisée avant la lecture), si l'enregistrement existe, il est mis dans le buffer, sinon la condition INVALID est vraie. (uniquement organisation INDEXED ou RELATIVE)
    - DYNAMIC : combinaison des deux précédents, dans ce cas un READ fichier est un direct avec la condition INVALID, un READ fichier NEXT est un séquentiel avec la condition AT END

  5. #5
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par Hédhili Jaïdane Voir le message
    Normal, tu as déjà deux synonymes dès le début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    numlot   numach AEXP EtatO montant Datench
    001       1           "o"   "G"      100        2000
    001       1           "n"   "P"        90        2001
    Accès :
    mais n'est-il pas logique qu'un acheteur fasse des offres différentes sur le même lot dans le fichier enchère (brute)

  6. #6
    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.
    mais n'est-il pas logique qu'un acheteur fasse des offres différentes sur le même lot dans le fichier enchère (brute)
    Oui, c'est parfaitement logique si les règles de gestion le veulent ainsi.
    S'il en est ainsi, il faut changer l'organisation du fichier dans ce cas et tu as tu deux solutions, soit admettre les doublons (DUPLICATES) sur ta clé primaire (certains compilateurs l'admettent), soit ajouter un 3è champ dans la clé primaire qui fait distinguer les offres d'un même acheteur sur le même lot, par exemple un n° d'offre relatif ou l'heure de l'offre, etc...
    Pour la 2è possibilité, tu peux le faire au moment de créer l'indexé à partir du séquentiel en incrémentant un compteur de 1 par 1 tant que le couple (lot, acheteur) est le même, dans ce cas il faut ton fichier séquentiel soit trié sur les champs lot, acheteur et montant. Les montants ne peuvent aller qu'en augmentant (et différents). A propos ton 3è champ de clé peut très bien être le montant.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Conflit en accès Random
    Bonjour,

    A première vue et sans avoir poussé une étude approffondie...

    En lecture, ton fichier est déclaré en ACCESS RANDOM cad en accès direct ET/OU séquentiel.

    Le premier read effectué dans ton programme est un READ direct, (sans la clause next record), ton prog doit renvoyer un status NotFound que tu ne gères pas en anomalie et les READs NEXT suivant peuvent se mélanger les pinceaux.

    Vérifies, c'est peut-être ça.

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

Discussions similaires

  1. [PC] Comment créer un fichier séquentiel ?
    Par bcaro dans le forum Cobol
    Réponses: 6
    Dernier message: 06/03/2009, 16h55
  2. Réponses: 22
    Dernier message: 24/04/2005, 16h49
  3. [C#] [XML] Comment créer un fichier XML
    Par pc152 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 28/09/2004, 13h41
  4. Comment créer un fichier dummy de taille donnée ?
    Par Maitre Kanter dans le forum Langage
    Réponses: 3
    Dernier message: 13/12/2003, 23h46
  5. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30

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