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

z/OS Discussion :

connaître la taille d'un fichier


Sujet :

z/OS

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut connaître la taille d'un fichier
    existe-t-il un programme qui permet de connaître la taille d'un fichier ?

    exemple : si le fichier est trop volumineux, je n'exécute pas le step précédent.

  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
    En MVS les informations de taille d'un fichier ne sont même pas inscrites au catalogue. Elles sont contenues dans les DSCB de la VTOC qu'il faut donc lire. Ca ne laisse que deux possibilités : Un Assembleur ou un REXX via l'instruction LISTDSI. Un tel REXX ne peut en plus pas être appelé via un EXEC PGM=IRXJCL mais via IKJEFT01 (TSO).
    Exemple de REXX pour pour vérifier une bonne partie des variables accessibles via la fonction LISTDSI :
    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
    /* REXX - INFOS FICHIER */ 
    ARG DSNP .
    DIRIC = listdsi("'"DSNP"' DIRECTORY NORECALL")
    say "REASON CODE LISTDSI               :" SYSREASON
    say "DEVICE UNIT                       :" SYSUNIT
    say "VOLUME                            :" SYSVOLUME
    say "ORGANISATION                      :" SYSDSORG
    say "RECFM                             :" SYSRECFM
    say "LRECL                             :" SYSLRECL
    say "BLKSIZE                           :" SYSBLKSIZE
    say "EXTENTS                           :" SYSEXTENTS
    say "CREATION DATE                     :" SYSCREATE
    say "EXPIRATION DATE                   :" SYSEXDATE
    say "LAST REFERENCED DATE              :" SYSREFDATE
    say "DATE D'EXPIRATION                 :" SYSEXDATE
    say "UPDATE FLAG                       :" SYSUPDATED
    say "NOMBRE DE PAGES UTILISEES         :" SYSUSEDPAGES
    say "Fichier sequentiel BASIC/LARGE..  :" SYSSEQDSNTYPE
    say ' ' ; say 'Informations Allocation Fichier ...'
    say "UNITE D'ALLOCATION                :" SYSUNITS
    say "ALLOCATION PRIMAIRE               :" SYSPRIMARY
    say "ALLOCATION SECONDAIRE             :" SYSSECONDS
    say "ALLOCATION UTILISEE               :" SYSUSED
    say "ALLOCATION FICHIER TOTALE         :" SYSALLOC
    say "NOMBRE D'EXTENTS                  :" SYSEXTENTS
    say ' ' ; say 'Pour un PDS ou PDSE ...............'
    say "MEMBERS (NOMBRE)                  :" SYSMEMBERS
    say "DIRECTORY BLOCKS ALLOUES          :" SYSADIRBLK
    say "DIRECTORY BLOCKS UTILISES         :" SYSUDIRBLK
    exit
    nb. Il existe bien un programme en standard : Le DCOLLECT IDCAMS mais c'est plutôt fait pour faire des relevés fichiers globaux et de toutes façons il faudra un programme pour exploiter les informations du fichier résultant.

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Merci. Par rexx je connais.

    C'est dommage qu'il n'y ait pas de pgm ibm.

    Tanpis.

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Dans le cas de fichier multi-volumes, la procédure ne semble lire les infos que du premier volume.

    Peut-on me le confirmer?
    Y'a t il moyen de passer outre?

  5. #5
    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
    Exact, après vérification, LISTDSI renvoie un Reason Code 19 dans ce cas (SYSREASON).
    Pour autant, LISTDSI répond bien à la question d'origine : connaitre la taille d'un fichier. A ma connaissance, les allocations totale et utilisée (SYALLOC, SYSUSED) sont rendues correctement, même pour un fichier multi volumes.
    Si le fichier est multi volumes, on reçoit un message IKJ8419I explicite dans SYSMSGLVL1 et 2 et on ne récupère que le premier volume dans SYSVOLUME.
    On peut toujours dans ce cas passer un LISTCAT VOL pour récupérer la liste des volumes. Au niveau d'un fichier il faudrait essayer mais on devrait aussi retrouver l'info via Library Management. Au niveau gestion globale des fichiers, encore une fois c'est plutôt le DCOLLECT la bonne solution.

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Je vais te contredire mais SYALLOC, SYSUSED ne donne que l'alloc et le used du premier volume (en général ont a la meme valeur).
    Et le prob du DCOLLECT c'est que les info ne sont pas exploitable directement à moins que tu n'es qqchose pour exploiter le résultat.

  7. #7
    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
    Oups, je viens de vérifier, tu as raison et mes fichues idées reçues étaient fausses. En cas de fichier multi-volumes LISTDSI ne donne que le premier volume, donc SYSALLOC = SYSUSED au maximum d'extent pour l'allocation utilisée sur le premier volume.
    Pour le DCOLLECT j'utilise un REXX qui s'inspire du LISTVTOC proposé en modèle par Thierry Fallisard sur CBTTAPE (vraiment très bien construit ce sample) qui fusionne en fait les info du DCOLLECT et du catalogue via un programme d'appel IGGCSI.
    Voir aussi ARCETOOLS en SYS1.SAMPLIB : il y a tout ce qu'il faut.
    Sorti de là j'ai déjà dans des temps anciens géré ça en Assembleur (lecture CAMLST des DSCB VTOC) mais je n'ai pas d'autre idée sur le sujet dans l'immédiat et vais je explorer qques pistes par curiosité également (DFDSS par exemple, les autres programmes standards capables de lire les DSCB VTOC ne doivent pas être foules)

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Pourrais tu diffuser ton rexx ou donner des liens stp

  9. #9
    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
    En cherchant dans la doc Library Management je suis tombé sur la solution REXX/ISPF :
    DSINFO que j'avais un peu oublié :
    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
    /* REXX INFORMATIONS FICHIER DSINFO */               
    DSN = 'MON.FICHIER.A.VERIFIER'                       
    address ISPEXEC "DSINFO DATASET('"DSN"')"            
    say "ZDSVOL First or only volume       :" ZDSVOL     
    say "ZDS£VOLS Number of volumes        :" ZDS£VOLS   
    say "ZDSDEVT Device type               :" ZDSDEVT    
    say "ZDSORG Dataset organization       :" ZDSORG     
    say "ZDSRF Record format               :" ZDSRF      
    say "ZDSLREC Logical record length     :" ZDSLREC    
    say "ZDSBLK Blocksize                  :" ZDSBLK     
    say "ZDSSPC Primary space units        :" ZDSSPC     
    say "ZDS1EX Primary space allocation   :" ZDS1EX     
    say "ZDS2SPC Secondary space units     :" ZDS2SPC    
    say "ZDS2EX Secondary space allocation :" ZDS2EX     
    say "ZDSDSNT Dataset name type         :" ZDSDSNT    
    say "ZDSSEQ Compressible YES/NO        :" ZDSSEQ     
    say "ZDSCDATE Creation date            :" ZDSCDATE   
    say "ZDSXDATE Expiration date          :" ZDSXDATE   
    say "ZDSRDATE Reference ddate          :" ZDSRDATE   
    say "ZDSTOTA Allocated space units     :" ZDSTOTA    
    say "ZDSTOTU Used space units          :" ZDSTOTU    
    say "ZDSEXTA Allocated extents         :" ZDSEXTA    
    say "ZDSEXTU Used extents              :" ZDSEXTU    
    say "ZDSDIRA Allocated directory blks  :" ZDSDIRA    
    say "ZDSDIRU Used directory blocks     :" ZDSDIRU    
    say "ZDSDIR PDSE directory blocks      :" ZDSDIR     
    say "ZDS£MEM Number of members         :" ZDS£MEM    
    say "ZDSPAGU Pages used(PDSE)          :" ZDSPAGU  
    say "ZDSPERU Percent used(PDSE)        :" ZDSPERU  
    say "ZDSMC Management class            :" ZDSMC    
    say "ZDSSC Storage class               :" ZDSSC    
    say "ZDSDC Dataclass                   :" ZDSDC    
    say "ZDSCB1 Format1 datacontrol block  :" ZDSCB1   
    say "ZDSVTAB Volume table              :" ZDSVTAB  
    exit
    En z/OS 1.9 en tous cas, ZDSTOTA, ZDSTOTU, ZDSEXTA, ZDSEXTU donnent les bonnes informations pour un fichier multi-volumes. En prime ZDSVTAB donne la liste des volumes et cerise sur le gateau, je découvre que ZDSCB1 donne dans son intégralité le contenu du DSCB FORMAT 1 du fichier.

  10. #10
    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
    Pour le lien CBTTAPE et le mode d'emploi je j'avais déjà donné recemment sur ce forum :
    http://www.developpez.net/forums/d61...iste-fichiers/

  11. #11
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Nom code

    "EXECIO * DISKR LIST (FINIS STEM List."
    "FREE FI(LIST)"
    DO i=1 to List.0
    Fic="'"WORD(List.i,1)"'"
    /* SAY Fic */
    address ISPEXEC "DSINFO DATASET('"Fic"')"
    CALL _Info
    END

    _Info:
    say "ZDSVOL First or only volume :" ZDSVOL
    say "ZDS£VOLS Number of volumes :" ZDS£VOLS
    say "ZDSDEVT Device type :" ZDSDEVT
    .
    .
    .
    Return

    Le résultat
    ZDSVOL First or only volume : ZDSVOL
    ZDS£VOLS Number of volumes : ZDS£VOLS
    ZDSDEVT Device type : ZDSDEVT
    ...

    Qu'est ce que j'ai bien pu oublié?

  12. #12
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fic="'"WORD(List.i,1)"'" 
    /* SAY Fic */ 
    address ISPEXEC "DSINFO DATASET('"Fic"')"
    Tu as certainement un code retour après DSINFO. Ajouter un test du style : if RC > 0 then say 'RC='RC 'sur DSINFO' ou ajouter un ordre trace 'R'
    Je pense que l'erreur vient du fait que tu ajoutes une quote devant et après le DSN lors de l'affectation FIC= et une nouvelle fois dans le DSINFO qui ne devrait pas aimer ''Fic''.
    Nb. Si réellement tu dois gérer une liste de fichier et que celle-ci est assez conséquente, si tu n'as besoin que des infos catalogue (pas les allocations QSAM mais on a les alloc VSAM) tu trouveras éventuellement un intérêt à regarder le sample IGGCSIRX en SYS1.SAMPLIB. C'est une gestion moins évidente mais terriblement plus performante.

  13. #13
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    J'ai essayé sans les quotes, à chaque fois j'ai un RC -3.

  14. #14
    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
    Il faut entourer le DSN d'une appostrophe mais d'une seule.
    RC-3 : Tu n'essaierais pas de passer ça en Batch par hasard ? Sous TSO ISPF est lancé, en Batch il faut un JCL spécial. J'avais bien noté qu'il n'y a pas d'alloc avant l'execio mais j'avais mis ça sur le compte d'une copie partielle avec seulement la fin du REXX.
    Pour le Batch, si on a besoin de passer un ISPEXEC dans son REXX, il faut faire monter ISPF par un ISPSTART et indiquer une ISPPROF et toutes les ISPxLIB en particulier qui vont bien. J'ai déjà indiqué un JCL exemple sur ce forum :
    http://www.developpez.net/forums/d61...ebcopy-select/

  15. #15
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    J'utilise en effet un batch, je vais essayer tout ca. Et mci bcp pour ton aide.

  16. #16
    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
    Juste un point de détail, dans ton batch, entre l'acquisition de la liste des fichiers à traiter et la recup. des infos fichiers un par un, certains peuvent ne plus être accessibles (REXX est un langage très bien mais il ne brille pas en performances). Penser à réinitialiser les variables ou ajouter un truc tu genre IF RC > 0 then iterate apres le DSINFO dans la boucle, sinon ils ressortiraient avec les attributs du fichier précédent.

  17. #17
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Yep nikel c'est parfait.

    Aller je vais abuser de tes connaissances. A part

    "ALLOC DD(DDIN) dsn(" fic ") SHR REUSE"
    "EXECIO * DISKRU DDIN (FINIS STEM NBR."
    Count=NBR.0

    Aurais tu qqchose pour compter le nombre d'enregistrement dans un PDS sans avoir à l'ouvrir car pour les gros (tres gros fichiers) c'est tres lent voir çà plante.

  18. #18
    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
    Peux-tu préciser ? Un PDS ? De quel type Fixe ou indéfini (LOADLIB)
    Dans un PDS tu peux éventuellement t'appuyer sur les statistiques Directory à condition que celles-ci soient à jour (LMMFIND ou LMMSTATS).
    Si c'est un simple fichier QSAM, il n'y a pas le choix, il faudra le lire jusqu'au bout ou déduire grosso modo le nombre d'enregistrements d'après un ratio de sa taille / à son blksize. En clair le nombre d'enregistrement n'est ni au catalogue ni en VTOC à ma connaissance.
    Si on veut lire un gros fichier en REXX (mais pour des raisons des performances, je préfererai largement COBOL en particulier), il faudra éviter un EXECIO 0 DISKR qui risque de planter s'il n'a pas la place de tout charger en mémoire mais boucler sur un EXECIO 1 DISKR et réserver le paramètre FINIS sur un dernier appel EXECIO 0 DISKR ddname (FINIS.
    Point de détail, j'éviterai aussi le DISKRU qui fait un OPEN OUTPUT et va en plus provoquer un ENQ et donc dégrader les performances. Si le fichier doit être MAJ, en cas de plantage c'est en plus assez dangereux.

  19. #19
    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
    Juste une précision. Si tu veux compter le nombre total des enregistrements d'un PDS tu peux le mettre 'à plat' dans un fichier QSAM via l'utilitaire IEBPTPCH

Discussions similaires

  1. [GWTUpload]Connaître la taille d'un fichier durant upload
    Par Lionkid dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 13/06/2012, 12h01
  2. Réponses: 13
    Dernier message: 22/01/2008, 15h25
  3. Connaître la taille d'un fichier sur un server
    Par NicolasJolet dans le forum C#
    Réponses: 2
    Dernier message: 19/12/2007, 20h21
  4. [HTTP] Connaître la taille d'un fichier en ligne
    Par MiJack dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/09/2006, 00h35
  5. [WebForms]Comment connaître la taille d'un fichier à uploader ?
    Par WELCOMSMAIL dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 02/05/2006, 15h27

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