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.
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.
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 :
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.
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
Merci. Par rexx je connais.
C'est dommage qu'il n'y ait pas de pgm ibm.
Tanpis.
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?
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.
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.
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)
Pourrais tu diffuser ton rexx ou donner des liens stp
En cherchant dans la doc Library Management je suis tombé sur la solution REXX/ISPF :
DSINFO que j'avais un peu oublié :
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.
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
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/
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é?
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'
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"')"
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.
J'ai essayé sans les quotes, à chaque fois j'ai un RC -3.
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/
J'utilise en effet un batch, je vais essayer tout ca. Et mci bcp pour ton aide.
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.
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.
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.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager