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 :

Question TABLE & Fichiers Indexés + Recherche


Sujet :

Cobol

  1. #21
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Bonjour,

    Je ne comprends pas pourquoi tes variables 'CUR-TYPE-ACCT' et suivantes sont en niveau 88. Il ne s'agit pas de booleens. Du coup, pour le SEARCH je ne sais pas quelles en sont les conséquences.

  2. #22
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Exact...
    En passant les variables à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
           01  TABLE-RATE.
               07  TABLE-RATE-RECORD    OCCURS 9 TIMES
                                        ASCENDING KEY CUR-TYPE-ACCT
                                        INDEXED BY MY-INDEX.
                   10  CUR-TYPE-ACCT    PIC X(4).
                   10  CUR-RATE         PIC 999V99.
                   10  CUR-MAX-SAVING   PIC 9(5).
                   10  CUR-DESCRIPTION  PIC X(32).
    Ca me vire pleins d'erreurs...
    J'étais convaincu que les 88 étaient des "valeurs"... sans être spécialement booléennes.

    Il ne me reste que celle du WRITE qui devient plus simple du coup.

    EDIT : je me doutais que c'était soit le RECORD, soit le nom du FD pour la partie WRITE... mais j'utilise les erreurs à la compilation pour m'en rendre compte.
    Mes difficultés étaient fortement liées au compilateur même, et à l'utilisation du SEARCH.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #23
    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 Metalman Voir le message
    ...

    Il ne me reste que celle du WRITE qui devient plus simple du coup.
    Le WRITE doit porter sur le nom du format du fichier (son niveau 01) et non sur le nom du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WRITE ACCT-DATA-OUT-RECORD ....
    PS : Je met permets d'insister sur l'utilisation de la documentation

  4. #24
    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 Pico----- Voir le message
    ... Honnêtement, pendant mes premières années de cobol à chaque fois que j'ai demandé comment je mettais un search, on m'a répondu "touche pas à ça p'tit con !"
    Après quelques recherches j'ai compris pourquoi : l'instruction n'est que dans très rare cas "optimimum", et donc la plupart du temps ça te plombe considérablement les performances. La méthode utilisée en réel par l'instruction dépend du compilateur (n'ayant pas mis les mains dans le cambouis depuis plus de 5 ans, les compilo le gère peut-être mieux en fait... à vérifier). Je ne l'ai que très rarement utilisée (par contre j'ai fais multitude de fonction de rechercher à la mimine...) et donc là de tête, je ne sais plus du tout quels sont ses arguments et comment elle fonctionne...
    Encore une légende urbaine qui traîne chez les "vieux" programmeurs COBOL ...

    Le SEARCH "simple" correspond à une recherche séquentielle dans une table (au sens COBOL et pas au sens SGBDR) et le SEARCH ALL correspond à une recherche dichotomique dans une table triée (forcément ...).

    L'instruction est puissante et nécessite quelques précautions pour être utilisée correctement, mais une fois bien codée, elle donne un code machine très efficace généré par les compilateurs COBOL modernes.

  5. #25
    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 Luc Orient Voir le message
    Encore une légende urbaine qui traîne chez les "vieux" programmeurs COBOL ...

    ....
    Bonjour mon cher Luc Orient.

    Nous devons être des ruraux ou des montagnards alors parce qu'on utilisait bien le SEARCH binaire avec les bonnes perfs qu'il donnait. On l'utilisait aussi souvent que la taille maximale des tables dans le programme nous le permettait et à chaque fois que cela s'avérait nécessaire de charger une table en mémoire quitte à lui donner un petit coup de tri par la méthode des permutations quand la table est très sollicitée dans le programme. J'ai connu le SEARCH ALL dans tous les compilateurs qu'il m'a été donné d'utiliser.

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Citation Envoyé par Luc Orient Voir le message
    Le SEARCH "simple" correspond à une recherche séquentielle dans une table (au sens COBOL et pas au sens SGBDR).
    Je suis tout à fait d'accord, le SEARCH est bien pratique, et plus "élégant" qu'une boucle en perform varying.

  7. #27
    Membre à l'essai
    Profil pro
    Analyste, Analyste programmeur COBOL / JAVA
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Analyste, Analyste programmeur COBOL / JAVA
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Je me permets de faire revivre cette discussion car j'ai une question sur le même sujet.

    J'ai un tableau indexé défini en working.

    En gros voici la tête de mon tableau (dans le sous-programme appelé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    01 ...
    * DONNEES EN ENTREE DU SERVICE
      05 GEN-GRDONENT.                       
    [...]
    *-- TABLEAU DES INSTITUTIONS                            
         10 GIN-TBINS.                                      
            15 FILLER                      PIC 9(04).       
            15 GIN-NBINS                   PIC S9(4) COMP.  
            15 GIN-GRTABINS OCCURS 100 INDEXED BY GIN-IXINS.
               20 GIN-TBINS-TYINS           PIC X(001).     
               20 GIN-TBINS-NOINS           PIC X(004).     
               20 GIN-TBINS-TYINSGRO        PIC X(001).     
               20 GIN-TBINS-NOINSGRO        PIC X(004).
    Je vais y ajouter un ASCENDING KEY GIN-TBINS-TYINS GIN-TBINS-NOINS.

    Ci-dessous le chargement (qui se fait dans un programme appelant, ne vous étonnez donc pas que les préfixes des noms des champs du tableau ne soient pas les mêmes) :
    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
    *--  BOUCLE SUR LES LIENS INSTITUTION/GROUPE    
         PERFORM VARYING WOR-IX001 FROM 1 BY 1      
                 UNTIL CC1RAL07-NON-TROUVE          
                    OR CC1RAL07-FIN-CURSEUR         
                    OR WOR-IX001 > WOR-NBINSMAX     
                                                    
    *--     ALIMENTATION TABLEAU DES INSTITUTIONS   
            MOVE GOU-ING-TYINS     OF GEN-GRCC1RAL07
              TO TBINS-TYINS(WOR-IX001)             
            MOVE GOU-ING-NOINS     OF GEN-GRCC1RAL07
              TO TBINS-NOINS(WOR-IX001)             
            MOVE GOU-ING-TYINSGRO  OF GEN-GRCC1RAL07
              TO TBINS-TYINSGRO(WOR-IX001)          
            MOVE GOU-ING-NOINSGRO  OF GEN-GRCC1RAL07
              TO TBINS-NOINSGRO(WOR-IX001)          
                                                    
    *--     LECTURE SUIVANTE                        
            PERFORM 80000-APPELER-PC1RAL07          
                                                    
         END-PERFORM
    Dans le sous-programme, je veux chercher des postes de ce tableau avec la commande SEARCH ALL sur les 2 arguments alphanumériques :
    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
         SEARCH ALL GIN-GRTABINS                                      
            AT END                                                    
    *--          SI NON-TROUVEE : PAIEMENT DE NIVEAU GROUPE           
                 MOVE GIN-TYINS         OF GEN-GRCC17SV05             
                   TO WOR-GPE-TYINS                                   
                 MOVE GIN-NOINS         OF GEN-GRCC17SV05             
                   TO WOR-GPE-NOINS                                   
            WHEN GIN-IXINS > GIN-NBINS                                
    *--          SI NON-TROUVEE : PAIEMENT DE NIVEAU GROUPE           
                 MOVE GIN-TYINS         OF GEN-GRCC17SV05             
                   TO WOR-GPE-TYINS                                   
                 MOVE GIN-NOINS         OF GEN-GRCC17SV05             
                   TO WOR-GPE-NOINS                                   
            WHEN GIN-TBINS-TYINS = GIN-TYINS         OF GEN-GRCC17SV05
             AND GIN-TBINS-NOINS = GIN-NOINS         OF GEN-GRCC17SV05
                 MOVE GIN-TYINS         OF GEN-GRCC17SV05             
                   TO WOR-INS-TYINS                                   
                 MOVE GIN-NOINS         OF GEN-GRCC17SV05             
                   TO WOR-INS-NOINS                                   
                 MOVE GIN-TBINS-TYINSGRO                              
                   TO WOR-GPE-TYINS                                   
                 MOVE GIN-TBINS-NOINSGRO                              
                   TO WOR-GPE-NOINS                                   
         END-SEARCH
    Mais pour faire cela, j'ai lu qu'il fallait que le tableau soit préalablement trié.
    Sauf qu'au chargement, le tableau n'est clairement pas trié, à moins de faire en sorte que la requête utilisée pour chargée le tableau soit triée sur les 2 arguments en question.
    Bon en écrivant je viens de trouver une solution pour l'un de mes tableaux a priori.
    Mais j'ai 4 tableaux du même genre à charger, et je ne pense pas pouvoir changer les autres requêtes.

    Le fait de mettre ASCENDING KEY ne va pas non plus automatiquement trier le tableau après le chargement je suppose, si ? Je ne vois pas trop comment.

    Donc ce que j'aimerais savoir c'est comment fait-on pour trier un tableau déclaré trié ?
    Parce que si je dois le trier avec des PERFORM VARYING (ça je sais faire), je ne vois pas du tout l'intérêt de la clause ASCENDING KEY ??


    Et par la même occasion, j'en profite pour rectifier ceci :
    Le SEARCH "simple" correspond à une recherche séquentielle dans une table (au sens COBOL et pas au sens SGBDR) et le SEARCH ALL correspond à une recherche dichotomique dans une table triée (forcément ...).
    En vérité, que ce soit le SEARCH ou le SEARCH ALL, il s'agit dans les 2 cas d'une recherche dichotomique. Dans un cas il faut alimenter l'index principal avec un SET avant d'effectuer le SEARCH pour dire à partir de quel poste la recherche séquentielle dichotomique doit être effectuée, alors qu'avec un SEARCH ALL on fait la recherche dichotomique sur la table entière et donc inutile d'initialiser l'index principal au préalable. Bon je n'ai encore jamais utilisé ni l'un ni l'autre à l'exécution, mais c'est ce que j'ai lu dans une documentation qui m'a eu l'air très sérieuse.

    EDIT : le SEARCH effectue bien une recherche séquentielle, et le SEARCH ALL effectue une recherche dichotomique.

  8. #28
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par arsinoe77 Voir le message
    Le fait de mettre ASCENDING KEY ne va pas non plus automatiquement trier le tableau après le chargement je suppose, si ? Je ne vois pas trop comment.
    Non, en effet, c'est à vous de trier les données ASCENDING KEY ne permet que de définir la clef utilisée, pas d'organiser les données

    Citation Envoyé par arsinoe77 Voir le message
    Donc ce que j'aimerais savoir c'est comment fait-on pour trier un tableau déclaré trié ?
    Parce que si je dois le trier avec des PERFORM VARYING (ça je sais faire), je ne vois pas du tout l'intérêt de la clause ASCENDING KEY ??
    Le tableau est généralement trié en amont.
    Si toutefois vous faites un très grand nombre de recherches dans le tableau, investir dans un tri en début de traitement peut être rentable
    A vous de voir si le coût engendré par le tri de vos données en vaut la peine.

    Citation Envoyé par arsinoe77 Voir le message
    Et par la même occasion, j'en profite pour rectifier ceci :

    En vérité, que ce soit le SEARCH ou le SEARCH ALL, il s'agit dans les 2 cas d'une recherche dichotomique. .
    Absolument pas, la doc de référence en la matière est la doc officielle du COBOL de votre plate forme.
    Pour la version Z/OS (je doute que les autres divergent sur ce point), voici ce qu'on peut lire :

    "RELATED TASKS
    “Doing a serial search (SEARCH)”
    “Doing a binary search (SEARCH ALL)” on page 89

    Doing a serial search (SEARCH)
    Use the SEARCH statement to do a serial (sequential) search beginning at the current
    index setting. To modify the index setting, use the SET statement.
    [. . .]
    Doing a binary search (SEARCH ALL)
    If you use SEARCH ALL to do a binary search, you do not need to set the index
    before you begin. The index is always the one that is associated with the first
    index-name in the OCCURS clause. The index varies during execution to maximize
    the search efficiency.


    La documentation complète ici : http://publibfp.boulder.ibm.com/epubs/pdf/igy6pg10.pdf

  9. #29
    Membre à l'essai
    Profil pro
    Analyste, Analyste programmeur COBOL / JAVA
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Analyste, Analyste programmeur COBOL / JAVA
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Merci escartefigue.
    Je m'excuse, j'étais persuadée d'avoir bien lu, d'autant que je n'arrête pas de lire et relire cette doc depuis quelques jours.
    La doc que j'utilise est ici
    C'est bien écrit que le SEARCH fait une recherche séquentielle, vraiment désolée (si je peux, je vais essayer de ré-éditer mon post précédent).

    Donc si c'est une recherche séquentielle, c'est pareil que si je fait un PERFORM VARYING en fait, je suppose que je n'ai pas besoin de trier préalablement le tableau pour pouvoir utiliser le SEARCH ?
    C'est bien ça ?


    Et en relisant, je comprends que le SEARCH ALL ne peut se faire que si une clause ASCENDING (ou DESCENDING) KEY a été déclarée sur le tableau.

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

    Attention, pour vous éviter les ennuis, assurez vous que la doc que vous publiez peut l'être sans autorisation préalable de l'organisme émetteur, dans le doute, supprimez le lien dans votre post précédent ;-)

    Effectivement, en mode séquentiel, inutile de trier le tableau

  11. #31
    Membre à l'essai
    Profil pro
    Analyste, Analyste programmeur COBOL / JAVA
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Analyste, Analyste programmeur COBOL / JAVA
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Encore merci.

    (Je n'y ai pas pensé pour le droit de diffusion. C'était une doc que j'ai trouvée sur internet en cherchant sur google, c'est dommage, elle est pas mal faite, et en français).

    Comme ce n'est pas moi qui ai ouvert la discussion, je ne peux pas dire qu'elle est résolue, mais moi j'ai eu les réponses dont j'avais besoin, merci !

Discussions similaires

  1. Question sur les fichiers indexés
    Par Johnny P. dans le forum Cobol
    Réponses: 4
    Dernier message: 05/04/2012, 17h24
  2. Réponses: 5
    Dernier message: 29/04/2011, 16h00
  3. fichier index table SAS
    Par reznac dans le forum SAS Base
    Réponses: 3
    Dernier message: 27/04/2011, 21h53
  4. recherche des tables liées à des index clustered
    Par lazzeroni dans le forum Administration
    Réponses: 1
    Dernier message: 28/02/2011, 15h35
  5. Recherche impossible dans un fichier indexé
    Par Msysteme dans le forum Windows Vista
    Réponses: 3
    Dernier message: 02/03/2009, 13h40

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