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 :

High-values/low-values, besoin d'explications


Sujet :

Cobol

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut High-values/low-values, besoin d'explications
    Bonjour,

    je suis actuellement en stage et je découvre le langage Cobol, ce qui me change beaucoup du Java habituel !

    J'ai pas mal potassé différents documents, mais un forte incompréhension demeure quant aux mots clés High-values et Low-values...


    J'ai bien compris qu'ils correspondaient à la plus grande et plus basse valeur ('FF' et '00'), mais c'est leur utilisation que je ne comprend pas : l'exemple de la fusion de fichier est souvent cité mais je n'arrive pas à comprendre l'algorithme même s'il est sûrement bateau !


    C'est ce bout de code qui est souvent cité en exemple :
    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
    *in data division FILE SECTION
    FD FILE-1.
    01 RECORD-1.
    03 IN-NAME-1 PIC X(20).
    03 FILLER PIC X(50).
    24
    FD MERGE-FILE.
    01 RECORD-OUT PIC X(70).
    :
    :
    PERFORM WITH TEST AFTER EOF-FLAG-1 AND EOF-FLAG-2
    *loop until each file has been read to completion
    *read each file
    READ FILE-1
    AT END SET EOF-FLAG-1 TO TRUE
    MOVE HIGH-VALUES TO IN-NAME-1
    END-READ
    READ FILE-2
    AT END SET EOF-FLAG-2 TO TRUE
    MOVE HIGH-VALUES TO IN-NAME-2
    END-READ
    *sort the records (assuming no 2 names are the same)
    *on ascending surname
    IF IN-NAME-1 IS < IN-NAME-2 THEN
    WRITE RECORD-OUT FROM RECORD-1
    ELSE
    WRITE RECORD-OUT FROM RECORD-2
    END-IF
    END-PERFORM
    J'ai également en guise de commentaire :
    In this example, when IN-NAME-1 is less than IN-NAME-2 (based on their ASCII values e.g. A < B etc..)
    then the FILE-1 record (RECORD-1) is written to the merge file (RECORD-OUT). One of FILE-1 and FILE-2
    will come to an end before the other so the completed file has its IN-NAME-_ value set to constant that will
    ALWAYS be greater than the IN-NAME-_ value still being read, ensuring all remain files are written to the
    merge file. This is done with the lines: MOVE HIGH-VALUES TO IN-NAME-1 and MOVE HIGH-VALUES TO IN-NAME-2
    It is important to note that HIGH-VALUES and LOW-VALUES are ALPHANUMERIC in type, so you can't
    set numerically defined variables to this type (you would have to
    implicitly redefine the variable first). This is an annoying quirk of COBOL.
    Pourriez-vous m'indiquer un exemple plus concret ?? Je risque d'avoir à faire à de la comparaison de fichier durant ce stage alors autant être paré

    Merci d'avance

  2. #2
    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
    Low-value est usuellement utilisé pour Initialiser des données, indicateurs ou buffers.
    High-value est effectivement souvent utilisé dans des logiques de fusion de fichiers, préalablement triés sur un identifiant commun.
    Son utilisation en fin de fichier assure qu'aucun enregistrement ne sera oublié dans le programme construit depuis un organigramme de fusion assez classique pour un code COBOL extrapolé de ce type :
    (pour faire simple, il faut bien entendu gérer également les cas d'erreurs)
    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
    TRAITER.                                  
               Perform OUVERTURES             
               Perform LECTUREA               
               Perform LECTUREB               
               Perform UNTIL FINI             
                  Evaluate TRUE               
                     When CLEA < CLEB         
                          Perform TRAITERA    
                          Perform LECTUREA    
                     When CLEA > CLEB         
                          Perform TRAITERB    
                          Perform LECTUREB    
                     When OTHER               
                          If CLEA = HIGH-VALUE
                             SET FINI TO TRUE 
                          Else                
                             Perform TRAITERAB
                             Perform LECTUREA 
                             Perform LECTUREB 
                          End-If              
                  End-Evaluate                
               End-Perform                    
               Perform FERMETURES             
               Goback.                        
    OUVERTURES.                               
               Open INPUT FICHIERA            
               Open INPUT FICHIERB            
               OPEN OUTPUT BUFFER-OUT.        
    LECTUREA.                                     
               Read FICHIERA                      
                  At End Move High-Value to CLEA  
               End-Read.                          
    LECTUREB.                                     
               Read FICHIERB                      
                  At End Move High-Value to CLEB  
               End-Read.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    D'accord...

    La fusion se fait donc selon les étapes suivantes (simplifié) :
    - Ouvertures des 3 fichiers
    *boucle*
    - Enregistrement des valeurs les plus hautes de chacun des fichiers
    - Comparaison et écriture de la valeur la plus faible dans le fichier de fusion puis avancée dans le fichier source de la donnée copiée
    *fin boucle*
    - Femreture des fichiers


    Si je prend un exemple très simple à partir de deux fichiers contenant de simples listes d'entiers :

    Fichier 1 : 1000, 1, 40
    Fichier 2 : 27, 4, 3

    Ici on aurait donc l'enchaînement suivant :
    1- 1000 vs 27 ; 27 est enregistré dans le fichier de fusion, passage à la seconde valeur la plus haute dans le fichier 2, soit 4.
    2- 1000 vs 4 : idem, 4 est copié et on passe à la valeur 3.
    3- 1000 vs 3 : idem, mais on arrive à la fin du fichier 2, il ne reste plus qu'à copier les valeurs du fichier 1, ici en ordre décroissant .

    On arrive donc à un fichier de fusion contenant la séquence 27;4;3;1000;1;40

    Est-ce bien cela ?

  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
    Une tellle séquence serait fonctionnellement aberrante, c'est pourquoi j'avais noté que les fichiers doivent avoir fait l'objet d'un tri en amont, ce qui donnerait pour reprendre ton exemple :
    Fichier 1 : 1, 40, 1000
    Fichier 2 : 3, 4, 27
    Sortie : 1, 3, 4, 27, 40, 1000

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Oui bien sûr, mon exemple a été fait à la va-vite.

    Je te remercie, c'est bien plus clair pour moi désormais. Derniere précision, la fusion nécessite qu'il n'y ait pas de doublons entre les deux fichiers c'est bien ça ?

  6. #6
    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
    la fusion nécessite qu'il n'y ait pas de doublons entre les deux fichiers c'est bien ça ?
    Pas nécessairement, c'est juste du fonctionnel. En cas de doublon il faudra simplement choisir les données du fichier A ou B, ou faire un appareillage fonctionnel. (Perform TRAITERAB => MAJ, rejet ... ?).
    En général on raisonne avec un fichier maitre. Par exemple fichier des commandes = commandes en attentes + commandes du jour qui sont soit des nouvelles commandes, soit des mises à jour.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    D'accord d'accord, merci pour tout !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    Les valeurs high/low value peuvent aussi servir pour faire des requêtes DB2 ... pour faire de la recherche approximative par exemple

  9. #9
    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
    Sinon, les LOW-VALUE, en tous cas en MVS, c'est souvent un danger si les données ne sont pas bien initialisées, ou si leur provenance est douteuse(l'applet Java renvoie une chanie de caractères qui est rallongée avec des LOW-VALUE par un traducteur au rabais).

    A ce titre, l'INSPECT nomdechaine REPLACING ALL LOW-VALUE BY SPACE est souvent utile, surtout quand on charge des données datant de l'âge de pierre.....
    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.

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

Discussions similaires

  1. Test de LOW-VALUE sur une variable en COMP-x
    Par BernardBZH dans le forum Cobol
    Réponses: 5
    Dernier message: 12/08/2014, 13h15
  2. Réponses: 4
    Dernier message: 11/05/2012, 18h11
  3. high value et low value
    Par natachabc dans le forum Cobol
    Réponses: 7
    Dernier message: 19/01/2012, 19h07
  4. [z/OS] Inspect replacing low-value
    Par jip06 dans le forum Cobol
    Réponses: 15
    Dernier message: 01/04/2008, 10h03
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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