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 :

COBOL - Flat to Indexed : transformation d'un fichier séquentiel en fichier séquentiel indexé


Sujet :

Cobol

  1. #1
    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 COBOL - Flat to Indexed : transformation d'un fichier séquentiel en fichier séquentiel indexé
    Ce sujet a été généré automatiquement...
    Il est lié aux nouvelles sections de codes sources mis à disposition :
    http://www.developpez.com/telecharger/Codes-Sources
    Il est maintenant possible d'uploader du COBOL et du JCL ! (Le REXX viendra peut être plus tard)
    Les topics associés seront automatiquement générés dans les forums alloués.

    Bonjour,

    Je vous propose un nouvel élément à utiliser : Flat to Indexed : transformation d'un fichier séquentiel en fichier séquentiel indexé

    Deux sources sont mises à disposition :

    - L'une avec seulement la transformation "normal" vers "indexé"

    - L'autre avec un tri interne COBOL



    Pour que l'indexation soit réellement efficace il est conseillé de trier, mais sur certains systèmes des programmes plus optimisés sont disponibles (DFSORT sur z/OS par exemple).

    L'indexation d'un fichier peut "aussi" être naturelle via le format d'enregistrement : toujours sur z/OS, des VSAM de type KSDS (Key Sequenced DataSet) permettent d'indexer à l'écriture et COBOL sera en mesure d'utiliser ces index.



    L'intérêt de ce programme se situe surtout dans le fait que les systèmes d'exploitations moins spécialisés ne proposent pas ces options, et qu'il devient donc nécessaire de laisser COBOL (et surtout son compilateur) générer un fichier indexé avec le format adapté à celui-ci.





    Attention aux niveaux des variables en WORKING-STORAGE SECTION !

    Mes 2 compilateurs (OpenCOBOL 1.1 et TinyCOBOL) obligent à utiliser des niveaux 01, 66 ou 77 pour les structures ou variables simples.

    Si vous aviez l'habitude d'utiliser d'autres niveaux avec d'autres compilateurs : n'hésitez pas à modifier mon code.





    Merci à Hédhili Jaïdane, el_slapper, Pico----- et Luc Orient pour leurs conseils.

    Qu'en pensez-vous ?
    --
    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

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Je découvre tardivement ce post, si ce petit programme est sans doute utile pour les développeurs linux ou Windows, il est dommage que le source ne respectent pas les préconisations suivantes :

    - Ne pas décrire les fichiers en FD mais seulement un filler + la clef qui est obligatoire si fichier indexé.
    Cette habitude, une fois prise, évite que lors de maintenances, le développeur utilise ses zones dédiées à l'OS et qui sont source d'abend
    en cas d'utilisation avant ou après ouverture des fichiers. Sans compter que le contenu des zones FD est inaccessible des outils de debugging,
    et qu'il n'est pas formaté en cas de fichier de format variable

    - Faire un read into c'est très bien, mais la zone réceptrice doit être en working storage
    je doute qu'en l'état, le compilateur accepte, mais si ca passait à la compil, on perd tout intérêt d'un read into !

    - Utiliser des file status, c'est très bien, mais alors pourquoi gérer une fin de fichier manuellement par un "AT END" autant aller jusqu'au bout de la démarche
    et utiliser la valeur FS="10" qui est alimentée automatiquement par l'OS alors qu'on peut oublier le move manuel lors du AT END

    - Initialiser la zone réceptrice d'un read into avant lecture ne sert à rien, le read into s'en chargera

    - c'est dommage, en cas d'erreur grave, de faire un stop run plutôt qu'un cancel, de même, si clef en double, il est judicieux d'afficher non seulement
    la valeur de cette clef, comme c'est le cas, mais aussi le rang de l'enregistrement, ce qui évite de chercher dans un fichier parfois très volumineux.

    - tant qu'à faire de donner des noms parlants aux paragraphes, ce qui est très bien, il faut que ça corresponde au contenu, or, le paragraphe 200-OPEN-RATE
    fait non seulement les open, mais aussi l'appel à la procédure principale, puis les close...

    - il ne faut pas considérer tout statut différent de zéro comme une erreur lors d'un open : les valeur "97" (VSAM) et "41" sont acceptables à l'open
    le plus simple est d'afficher un message + le FS si différent de zéro lors de l'open sans planter, puis de planter lors du read ou write si KO
    (en affichant a nouveau un message et le file status)

    - des balises de début et fin de working sont toujours les bienvenues en cas de plantage (01 filler pic x(nn) value 'deb working monprog")

    - enfin, mais la je chipote, c'est dommage de déclarer des variables locales d'un ou deux octets sur des lvl 01 qui s'alignent sur 16, on charge inutilement la WSS
    autant regrouper sous un 01 filler.


    Je me doute que ce petit programme a été écrit rapidement pour rendre service, mes remarques ne sont donc pas une attaque en règle envers celui qui fait l'effort de proposer cet outil, mais plutôt des conseils à destination des développeurs peu expérimentés.

  3. #3
    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 escartefigue Voir le message
    ...
    - Ne pas décrire les fichiers en FD mais seulement un filler + la clef qui est obligatoire si fichier indexé.
    Cette habitude, une fois prise, évite que lors de maintenances, le développeur utilise ses zones dédiées à l'OS et qui sont source d'abend
    en cas d'utilisation avant ou après ouverture des fichiers. Sans compter que le contenu des zones FD est inaccessible des outils de debugging,
    et qu'il n'est pas formaté en cas de fichier de format variable

    - Faire un read into c'est très bien, mais la zone réceptrice doit être en working storage
    je doute qu'en l'état, le compilateur accepte, mais si ca passait à la compil, on perd tout intérêt d'un read into !
    En rien convaincu par cette affirmation ( la première surtout ) qui gagnerait a être étayé par quelques références techniques ...

    Je ne vois pas en quoi ça serait mieux de faire des READ INTO plutôt que des READ simples ... Mais je ne demande qu'à changer d'avis ...

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

    Les avantages sont multiples :
    - en cas d'utilisation d'un debugger, les données lues sont accessibles, alors que la FD ne l'est pas
    - si l'on utilise des fichiers de format variable, les données sont automatiquement formatées correctement
    - la zone WSS est accessible quelque soit la phase d'exécution du programme, alors que si l'on utilise une zone FD avant ou après open, le cancel est garanti
    - si l'on fait un read simple, puis un move, on réinvente ce que fait très bien COBOL grace au read into, on ajoute inutilement une instruction, mais surtout il faut s'assurer que le move est immédiat, pour etre sur de rendre dispo les données lues aux outils de debugging
    - en cas de dump, c'est plus facile de retrouver ses petits

    Faire un read sans utiliser into est donc une erreur

    Il en va de même pour le write : write from est recommandé, pour les mêmes raisons

  5. #5
    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 escartefigue Voir le message
    bonjour,

    Les avantages sont multiples :
    - en cas d'utilisation d'un debugger, les données lues sont accessibles, alors que la FD ne l'est pas
    tu as une référence technique à nous donner ?

    - si l'on utilise des fichiers de format variable, les données sont automatiquement formatées correctement
    je ne comprends pas l'argument ... dans tous les cas les données sont formatées comme la description du fichier ... bien sûr si celle ci est fausse ... mais c'est un autre débat ...

    - la zone WSS est accessible quelque soit la phase d'exécution du programme, alors que si l'on utilise une zone FD avant ou après open, le cancel est garanti
    la zone de FD est accessible après un READ, exécuté sans erreur bien sûr, et le reste jusqu'au READ suivant ... je ne vois que du très logique là ...

    - si l'on fait un read simple, puis un move, on réinvente ce que fait très bien COBOL grace au read into, on ajoute inutilement une instruction, mais surtout il faut s'assurer que le move est immédiat, pour etre sur de rendre dispo les données lues aux outils de debugging - en cas de dump, c'est plus facile de retrouver ses petits
    effectivement ... si je ne fais pas de READ INTO ce n'est pas pour faire un MOVE après ...


    Faire un read sans utiliser into est donc une erreur
    hélas toujours pas convaincu ...

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Luc Orient Voir le message
    tu as une référence technique à nous donner ?
    La référence technique n'est pas la question, il suffit de lancer un outil de débug (intertest, xpeditor, trace master, ou autre) et de chercher à visualiser l'enregistrement lu
    Si read into, la WSS contient le record, sinon, tu as les yeux pour pleurer


    Citation Envoyé par Luc Orient Voir le message
    je ne comprends pas l'argument ... dans tous les cas les données sont formatées comme la description du fichier ... bien sûr si celle ci est fausse ... mais c'est un autre débat ...
    Non, pas si la taille des enregistrements varie, la FD ne délimite pas les enregistrements car il s'agit d'un adressage des données du buffer I/O de Z/OS et pas d'un stockage dans la zone programme, on peut avoir dans la FD plusieurs records contigus, si on utilise la FD, on peut avoir donc un débord de l'enregistrement suivant
    Il suffit de faire un read, puis un display de la FD pour s'en rendre compte

    Citation Envoyé par Luc Orient Voir le message
    la zone de FD est accessible après un READ, exécuté sans erreur bien sûr, et le reste jusqu'au READ suivant ... je ne vois que du très logique là ...
    Je n'ai pas parlé du READ, mais de l'OPEN et du CLOSE, les zones de FD, puisqu'elles sont externes au programmes ne sont ni accessibles avant open, ni après close

    Citation Envoyé par Luc Orient Voir le message
    effectivement ... si je ne fais pas de READ INTO ce n'est pas pour faire un MOVE après ...
    Et ce faisant, tu crées des difficultés en cas de besoin de debugging (via outil ou dans un dump), puisque tu ne permets pas au développeur de retrouver facilement le contenu de l'enregistrement traité

  7. #7
    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 escartefigue Voir le message
    La référence technique n'est pas la question ...
    Comme je ne programme plus de manière intensive, je n'utilise pas ce genre d'outils. Sur notre site nous disposons de produit DEBUG TOOL d'IBM et j'ai eu beau parcourir la documentation et je n'ai retrouvé aucune information sur le sujet. Mais peut être ai je mal cherché ...


    Non, pas si la taille des enregistrements varie, la FD ne délimite pas les enregistrements car il s'agit d'un adressage des données du buffer I/O de Z/OS et pas d'un stockage dans la zone programme, on peut avoir dans la FD plusieurs records contigus, si on utilise la FD, on peut avoir donc un débord de l'enregistrement suivant
    Il suffit de faire un read, puis un display de la FD pour s'en rendre compte
    Je ne vois toujours pas où se situe le problème. Même si c'est un peu délicat en COBOL, il est toujours possible de récupérer la longueur effective de l'enregistrement en cours de lecture pour un fichier variable. Après ce n'est plus qu'une question de programmation correcte.


    Je n'ai pas parlé du READ, mais de l'OPEN et du CLOSE, les zones de FD, puisqu'elles sont externes au programmes ne sont ni accessibles avant open, ni après close
    Je ne vois pas l'intérêt de vouloir accéder à un enregistrement de fichier avant l'instruction OPEN.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Fais seulement le test suivant :

    - création d'un fichier variable avec quelques enregistrements, chacun d'une longueur différente
    - création d'un petit programme qui fait juste un read into jusqu'à fin de fichier
    - à chaque read, display de la zone WSS chargée par le into, et display de la zone FD
    - compare les 2 display
    - terminaison du programme par cancel

    tu verras que la zone FD ne contient non pas 1 mais plusieurs records
    tu verras que la zone WSS au contraire sera proprement découpée
    tu constateras que dans le dump, post cancel, on retrouve facilement l'enregistrement du plantage (en l'occurrence le dernier)
    tu constateras à l'inverse que la zone FD ne peut pas être retrouvée dans le dump, donc résolution d'incident impossible

    Imagine maintenant la difficulté à faire du débug si tu n'as pas utilisé le INTO
    (encore une fois on se contrefout de l'outil de débug utilisé, puisque ce n'est pas lié à l'outil)

    Enfin, il est effectivement peu probable qu'un développeur utilise une zone FD avant Open, par contre, post close c'est déjà beaucoup plus probable, quoi qu'il en soit les codes les plus surprenants sont légion, on est jamais à l'abri d'une mauvaise surprise (notamment sur les plates formes de développement off shore où les développeurs sont payés a coups de lance pierre)

    En résumé, on peut planter des clous avec un manche de pelle, mais c'est tellement plus facile avec un bon marteau

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    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 765
    Points : 10 748
    Points
    10 748
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Fais seulement le test suivant :

    - création d'un fichier variable avec quelques enregistrements, chacun d'une longueur différente
    - création d'un petit programme qui fait juste un read into jusqu'à fin de fichier
    - à chaque read, display de la zone WSS chargée par le into, et display de la zone FD
    - compare les 2 display
    - terminaison du programme par cancel

    tu verras que la zone FD ne contient non pas 1 mais plusieurs records
    tu verras que la zone WSS au contraire sera proprement découpée
    tu constateras que dans le dump, post cancel, on retrouve facilement l'enregistrement du plantage (en l'occurrence le dernier)
    tu constateras à l'inverse que la zone FD ne peut pas être retrouvée dans le dump, donc résolution d'incident impossible

    Imagine maintenant la difficulté à faire du débug si tu n'as pas utilisé le INTO
    (encore une fois on se contrefout de l'outil de débug utilisé, puisque ce n'est pas lié à l'outil)

    Enfin, il est effectivement peu probable qu'un développeur utilise une zone FD avant Open, par contre, post close c'est déjà beaucoup plus probable, quoi qu'il en soit les codes les plus surprenants sont légion, on est jamais à l'abri d'une mauvaise surprise (notamment sur les plates formes de développement off shore où les développeurs sont payés a coups de lance pierre)

    En résumé, on peut planter des clous avec un manche de pelle, mais c'est tellement plus facile avec un bon marteau
    J'ai pour ma part déjà rencontré des programmes mal codés avec la description en FD et une mauvaise utilisation du format VB occasionnant du "faux" VB avec les octets de définition de longueur toujours alimentés avec la valeur maximale du format VB. Et le problème que tu mentionnes avec la zone FD complétée avec plusieurs enregistrements.
    Après même sans READ into avec un depending on dans la FD et un MOVE dans une zone réceptrice en working on ne constate pas de soucis.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Darkzinus Voir le message
    J'ai pour ma part déjà rencontré des programmes mal codés avec la description en FD et une mauvaise utilisation du format VB occasionnant du "faux" VB avec les octets de définition de longueur toujours alimentés avec la valeur maximale du format VB. Et le problème que tu mentionnes avec la zone FD complétée avec plusieurs enregistrements.
    Après même sans READ into avec un depending on dans la FD et un MOVE dans une zone réceptrice en working on ne constate pas de soucis.
    Tout à fait d'accord, et le read into a l'avantage de forcer le move simultanément au read, ce qui évite les mauvaises surprises

    CQFD

  11. #11
    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
    Pour régler définitivement le point concernant la lecture d'un fichier variable par un READ simple (extrait du COBOL LANGUAGE REFERENCE IBM) :

    Multiple record processing

    If more than one record description entry is associated with file-name-1, those
    records automatically share the same storage area; that is, they are implicitly
    redefined. After a READ statement is executed, only those data items within the
    range of the current record are replaced; data items stored beyond that range are
    undefined.
    Donc, ce comportement est parfaitement décrit et connu et il suffit juste d'en tenir compte lors de la programmation.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Parfaitement décrit, certes
    Parfaitement connu certainement pas

    Il ne faut pas oublier la réalité du terrain, les développeurs sont de moins en moins formés, de plus en plus mis sous pression dans des plates formes de développement off-shore et ce pas uniquement dans le monde mainframe

    Du coup, tout ce qui peut sécuriser la maintenance et faciliter les interventions de nuits ou le WE en urgence est bon à prendre

    Dans ce contexte et pour toutes les multiples raisons que j'ai déjà indiquées plus haut le read into s'impose

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    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 765
    Points : 10 748
    Points
    10 748
    Par défaut
    Citation Envoyé par Luc Orient Voir le message
    Pour régler définitivement le point concernant la lecture d'un fichier variable par un READ simple (extrait du COBOL LANGUAGE REFERENCE IBM) :



    Donc, ce comportement est parfaitement décrit et connu et il suffit juste d'en tenir compte lors de la programmation.
    Franchement c'est quand même très souvent mal géré et non connu ... J'ai découvert des rustines datant de 10 ans pour by passer ça salement alors que le VBA était mal codé.

  14. #14
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Janvier 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 179
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Parfaitement décrit, certes
    Parfaitement connu certainement pas

    Il ne faut pas oublier la réalité du terrain, les développeurs sont de moins en moins formés, de plus en plus mis sous pression dans des plates formes de développement off-shore et ce pas uniquement dans le monde mainframe

    Du coup, tout ce qui peut sécuriser la maintenance et faciliter les interventions de nuits ou le WE en urgence est bon à prendre

    Dans ce contexte et pour toutes les multiples raisons que j'ai déjà indiquées plus haut le read into s'impose
    entierement d'accord, pour avoir eu comme principale occupation le support mainframe pendant plusieur années, les erreurs du à la nom utilisation du READ INTO et WRITE FROM sont très fréquentes.
    d'ailleurs c'est une norme aujourd'hui dnas les CookBook internes de ma boite. bon cela dit, Cookbook écrit par moi même, ça explique
    En plus du theme fichier variables évoqué ici, j'ai frequement rencontré des abends aléatoires suite à références dans le programme de champs décrit dnas une structures de la FD après un CLOSE du fichier. abend Alléatoire de plus selon l'état des buffers d'I/O.
    je sais bien qu'il y a des programmeurs "normaux" ou en tout cas avec suffisament d'expériences et de connaissances ne serait ce que des systèmes d'adressages pour comprendre et éviter de coder n'importe quoi, c'est malheureusement de moins en moins le cas .

  15. #15
    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 escartefigue Voir le message
    ... Dans ce contexte et pour toutes les multiples raisons que j'ai déjà indiquées plus haut le read into s'impose
    Ben non ... Il y a au moins un cas où le READ INTO est déconseillé, et ce n'est pas moi qui le dit, mais M. IBM lui même ...

    COBOL Performance Issue with READ INTO of Variable length record File

    Technote (troubleshooting)

    Problem(Abstract)

    The performance numbers will vary depending on the record size, variation and distribution.

    There may be slow performance using READ...INTO coding.

    The situation evaluated involved a Variable Blocked QSAM file where there was a large variation in the size of the records. RECFM=VB.
    In the case described, the variable file contained records varying from around 250 bytes to 30,000 bytes with the majority around 250 bytes.

    Symptom

    The test programs run did only a READ and no processing vs a READ .... INTO a 30,000 byte work area.

    The READ .... INTO version took 800%-1000% more CPU time with similar increases in clock time.

    Here is a sample of the READ ... INTO code involved:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FD  INPUT-FILE
        BLOCK CONTAINS 0 RECORDS 
        RECORD IS VARYING IN SIZE FROM 100 to 30000.
    01  INPUT-REC    PIC X(30000).
    01  INPUT-REC100 PIC X(100).
    01  INPUT-REC250 PIC X(250).
        (etc. or a PIC X OCCURS.... )
    WORKING-STORAGE SECTION.
    01  WS-AREA  PIC X(30000). 
                 .......
    PROCEDURE DIVISION.
                 .... 
        READ INPUT-FILE INFO WS-AREA AT END
    Cause

    If a 250 byte record is read, the length is captured and the READ....INTO moves 250 bytes from the file buffer to the work area. Then the remainder of the work area is padded with blanks, consuming CPU cycles.

    Resolving the problem

    Modify as follows:

    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
    FD  INPUT-FILE
        BLOCK CONTAINS 0 RECORDS 
        RECORD IS VARYING IN SIZE FROM 100 to 30000 
        DEPENDING ON REC-LEN.
    01  INPUT-REC    PIC X(30000).
    01  INPUT-REC100 PIC X(100).
    01  INPUT-REC250 PIC X(250).
        (etc. or a PIC X OCCURS.... )
    WORKING-STORAGE SECTION.
    01  WS-AREA  PIC X(30000). 
    01  REC-LEN  PIC 9(5) COMP.
                 .......
    PROCEDURE DIVISION.
                 .... 
        READ INPUT-FILE AT END .......
        MOVE INPUT-REC(1:REC-LEN) TO
               WS-AREA (1:REC-LEN).
    REC-LEN will be set to the length of each record when it is read.
    By using the length of the data read, then coding with the Reference Modification (1:REC-LEN) for both the MOVE from and to fields will restrict the number of bytes moved from the buffer to the correct record size and prevent the padding of the entire unused part of the work area.
    The READ....INTO took about 700-800% more CPU cycles than this method in the test environment..

    However, if the variable input file contains records that are all similar in size to the work area, then READ INTO would not experience the performance situation described above.
    La référence citée est disponible ici

    700 à 800 % de plus en coût CPU, je crois qu'il y a de quoi réfléchir ...

    CQFD.

  16. #16
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Effectivement on est la dans un cas où il y a de tels écarts entre les tailles mini et maxi, avec une très faible proportion d'enregistrements longs que la WSS consacrée au read into est majoritairement inutilisée, ce cas est vraiment très marginal (si l'un d'entre vous l'a déjà rencontré, je serai curieux de connaitre le contexte).

    Cela dit cet argument peut être retenu si :
    - la performance est critique pour le traitement considéré (délai contraint dans une fenetre d'exécution courte)
    - le traitement sera peu maintenu (ex : traitement one shot) donc peu de risques d'avoir à utiliser un outil de debug
    - les autres critères de performances ont été analysés et traités et c'est là que le bât blesse :
    - architecture traitement (parallélisme notamment)
    - déclaratives JCL (taille des blocks, type de support fichiers, alloc primaire/secondaire)
    - format des données COBOL (les montants en binaire ou en packé permettent de diviser jusqu'à 8 le temps CPU par rapport à l'étendu, on l'oublie trop souvent)
    - Les zones WSS inutilisées sont supprimées. Les autres données de la WSS ont aussi été optimisées (là aussi, la très forte majorité des développeurs ne déclare que des level "01", y compris pour des flags d'un octet, ce qui charge inutilement la WSS.
    - la procédure division est optimisée : pas de gestion manuelle du file statut (malheureusement courant), tests effectués dans l'ordre de probabilité de survenance, utilisation optimisée des paramètres des sous-programmes
    - etc...

  17. #17
    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 escartefigue Voir le message
    bonjour,

    Les avantages sont multiples :
    - en cas d'utilisation d'un debugger, les données lues sont accessibles, alors que la FD ne l'est pas

    ...
    Une collègue a fait l'essai pour moi.

    Avec DEBUG TOOL d'IBM, l'outil de DEBUGGING utilisé sur notre site de développement, les données en FD (donc lues par un READ simple) sont parfaitement accessibles.

  18. #18
    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
    Je viens de faire l'essai moi même. Avec DEBUG TOOL d'IBM, j'obtiens bien le contenu des enregistrements lus par READ simple.

    Donc à part consommer du CPU pour rien, le READ INTO ne présente qu'un intérêt marginal, voir aucun intérêt du tout ...

    CQFD.

Discussions similaires

  1. Réponses: 15
    Dernier message: 28/11/2008, 17h57
  2. [DOM] Transformer un fichier xml en fichier sql avec PHP
    Par takepaf dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 01/12/2007, 12h11
  3. transformer un fichier xls en fichier xml
    Par delphine_ps dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/11/2007, 15h55
  4. Réponses: 3
    Dernier message: 19/12/2005, 14h11
  5. Réponses: 4
    Dernier message: 23/11/2005, 14h25

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