Obtener numero de registros de un fichero

Manejo de almacenamiento tanto en discos como en medios magneticos, DFSMSxxx (todo lo relacionado con el SMS).
canalejas

Obtener numero de registros de un fichero

Mensaje por canalejas » 21 Ene 2008, 07:20

¿Alguien conoce alguna manera optima de conocer el numero de registros de un fichero "sin leerlo" aunque si alocandolo si hace falta? No me sirve un cálculo del espacio ocupado junto con su LRECL ya que algunos se almacenan Comprimidos.

me sirve cualquier macro ASM, funcion de C, Rexx, TSO, ... etc

Gracias por adelantado.

Avatar de Usuario
acevedo
Colaborador Senior
Colaborador Senior
Mensajes: 375
Registrado: 01 Abr 2005, 14:36
País: España
Ciudad: Malaga
Ocupación: Analista de desarrollo

Mensaje por acevedo » 21 Ene 2008, 07:54

básicamente, NO.

canalejas

Mensaje por canalejas » 21 Ene 2008, 08:30

acevedo escribió:básicamente, NO.
Agradeceria respuestas constructivas. Cuando no conozcas una respuesta para ayudar a alguien, mejor no contestes. Dudo mucho que estes en disposición de negar rotundamente que algo no se puede hacer. Espero que el administrador te conteste como es debido. :oops: :oops: :oops:

Avatar de Usuario
acevedo
Colaborador Senior
Colaborador Senior
Mensajes: 375
Registrado: 01 Abr 2005, 14:36
País: España
Ciudad: Malaga
Ocupación: Analista de desarrollo

Mensaje por acevedo » 21 Ene 2008, 09:01

Agradeceria respuestas constructivas.
Si realmente supieses de lo que estás hablando y además supieras leer entre líneas te hubieses dado cuenta de que en realidad sí que es constructiva, 'no pierdas el tiempo en esa solución porque la respuesta es NO'.

Cuando no conozcas una respuesta para ayudar a alguien, mejor no contestes.

Resulta que sí la conozco.


Dudo mucho que estes en disposición de negar rotundamente que algo no se puede hacer.

Sólo llevo trabajando en éste entorno casi 20 años, precisamente éste es el foro en el que menos colaboro, llevo participando en otros foros desde hace casi 10 años y he contribuido con utilidades en la CBT... créeme antes de dar una respuesta... me la pienso y es más, antes de preguntar BUSCO Y REQUETEBUSCO... recuerda: google is your friend!

Espero que el administrador te conteste como es debido.
Yo también.

canalejas

Mensaje por canalejas » 21 Ene 2008, 09:14

acevedo escribió:Agradeceria respuestas constructivas.
Si realmente supieses de lo que estás hablando y además supieras leer entre líneas te hubieses dado cuenta de que en realidad sí que es constructiva, 'no pierdas el tiempo en esa solución porque la respuesta es NO'.

Cuando no conozcas una respuesta para ayudar a alguien, mejor no contestes.

Resulta que sí la conozco.


Dudo mucho que estes en disposición de negar rotundamente que algo no se puede hacer.

Sólo llevo trabajando en éste entorno casi 20 años, precisamente éste es el foro en el que menos colaboro, llevo participando en otros foros desde hace casi 10 años y he contribuido con utilidades en la CBT... créeme antes de dar una respuesta... me la pienso y es más, antes de preguntar BUSCO Y REQUETEBUSCO... recuerda: google is your friend!

Espero que el administrador te conteste como es debido.
Yo también.
Mi educación me pide que me disculpe si no te ha gustado el tono de mi respuesta a la tuya, pero creo que no son maneras de contestar a una pregunta. Puedes tener mucha experiencia (10 años más que yo por lo que dices), pero sigo pensando que tu respuesta no es la adecuada. Google is my friend, si, pero para algo estan los foros, si no quieres enseñar a los que lo necesitamos, que yo sepa nadie te obliga, pero no hay nada como que una persona experimentada como tú, explique a los novatos con 10 años de experiencia como yo, algún truquillo o comentario, algo más que un NO como respuesta. Por favor, no contestes ya más este topic que estamos haciendo el ridículo.

NJB
Su anfitrion
Su anfitrion
Mensajes: 1116
Registrado: 12 Oct 2003, 16:27
País: Argentina
Ciudad: Capilla del Señor
Ocupación: System Programmer
Contactar:

Mensaje por NJB » 21 Ene 2008, 09:52

Gente, es la primera vez que en este foro hay una discusión que empienza a tornarse desagradable y tengo que actuar como moderador y no como tecnico.

Les pido a ambos, ya que no voy a tomar partido, que se llamen a la reflexion, piensen y recien luego contesten.

Las palabras a veces sobran y otra veces faltan pero tomenselo con calma.

Creo que el ambiente que hay en este espacio es muy profesional y no tiene sentido ofendernos aún cuando las discusiones se tornen acaloradas y no estemos de acuerdo con el otro.

La vida es demasiado linda como para amargarse por tan poca cosa.

Les envio un cordial saludo a ambos
Norberto Bocalandro

Avatar de Usuario
acevedo
Colaborador Senior
Colaborador Senior
Mensajes: 375
Registrado: 01 Abr 2005, 14:36
País: España
Ciudad: Malaga
Ocupación: Analista de desarrollo

Mensaje por acevedo » 21 Ene 2008, 09:55

Mi educación también me pide que me disculpe si no te gustó la respuesta.

Si le echas un vistazo al LISTDSI
verás que éstas son las variables que te proporciona...verás que entre ellas no está el número de registros.

Código: Seleccionar todo

________________________________________________________________________ 
   | Figure  4-4. Variables That LISTDSI Sets                               |
   |______________ _________________________________________________________|
   | Variable     | Contents                                                |
   |______________|_________________________________________________________|
   | SYSDSNAME    | Data set name                                           |
   |______________|_________________________________________________________|
   | SYSVOLUME    | Volume serial ID                                        |
   |______________|_________________________________________________________|
   | SYSUNIT      | Generic device type on which volume resides, for        |
   |              | example 3390.                                           |
   |______________|_________________________________________________________|
   | SYSDSORG     | Data set organization:                                  |
   |              |                                                         |
   |              | PS   - Physical sequential                              |
   |              | PSU  - Physical sequential unmovable                    |
   |              | DA   - Direct organization                              |
   |              | DAU  - Direct organization unmovable                    |
   |              | IS   - Indexed sequential                               |
   |              | ISU  - Indexed sequential unmovable                     |
   |              | PO   - Partitioned organization                         |
   |              | POU  - Partitioned organization unmovable               |
   |              | VS   - VSAM                                             |
   |              | ???  - Unknown                                          |
   |______________|_________________________________________________________|
   | SYSRECFM     | Record format; one to six character combination of the  |
   |              | following:                                              |
   |              |                                                         |
   |              | U  - Records of undefined length                        |
   |              | F  - Records of fixed length                            |
   |              | V  - Records of variable length                         |
   |              | T  - Records written with the track overflow feature of |
   |              |      the device (3375, 3380, and 3390 do not support    |
   |              |      track overflow)                                    |
   |              | B  - Records blocked                                    |
   |              | S  - Records written as standard or spanned             |
   |              |      variable-length blocks                             |
   |              | A  - Records contain ASCII control characters           |
   |              | M  - Records contain machine code control characters    |
   |              | ?????? - Unknown                                        |
   |______________|_________________________________________________________|
   | SYSLRECL     | Logical record length                                   |
   |______________|_________________________________________________________|
   | SYSBLKSIZE   | Block size                                              |
   |______________|_________________________________________________________|
   | SYSKEYLEN    | Key length                                              |
   |______________|_________________________________________________________|
   | SYSALLOC     | Allocation, in space units                              |
   |______________|_________________________________________________________|
   | SYSUSED      | Allocation used, in space units.  For a partitioned     |
   |              | data set extended (PDSE), 'N/A' will be returned; see   |
   |              | the description of the variable SYSUSEDPAGES for used   |
   |              | space of a PDSE.                                        |
   |______________|_________________________________________________________|
   | SYSUSEDPAGES(|1The used space of a partitioned data set extended       |
   |              | (PDSE) in 4K pages.  A value is returned only if the    |
   |              | SMSINFO keyword operand is provided with the LISTDSI    |
   |              | statement.                                              |
   |______________|_________________________________________________________|
   | SYSPRIMARY   | Primary allocation in space units                       |
   |______________|_________________________________________________________|
   | SYSSECONDS   | Secondary allocation in space units                     |
   |______________|_________________________________________________________|
   | SYSUNITS     | Space units:                                            |
   |              |                                                         |
   |              | CYLINDER  - Space units in cylinders                    |
   |              | TRACK     - Space units in tracks                       |
   |              | BLOCK     - Space units in blocks                       |
   |              | ????????  - Space units are unknown                     |
   |______________|_________________________________________________________|
   | SYSEXTENTS   | Number of extents allocated                             |
   |______________|_________________________________________________________|
   | SYSCREATE    | Creation date                                           |
   |              | Year/day format, for example: 1990/102                  |
   |______________|_________________________________________________________|
   | SYSREFDATE   | Last referenced date                                    |
   |              | Year/day format, for example: 1990/107                  |
   |              | (Specifying DIRECTORY causes the date to be updated)    |
   |______________|_________________________________________________________|
   | SYSEXDATE    | Expiration date                                         |
   |              | Year/day format, for example: 1990/365                  |
   |______________|_________________________________________________________|
   | SYSPASSWORD  | Password indication:                                    |
   |              |                                                         |
   |              | NONE   - No password protection                         |
   |              | READ   - Password required to read                      |
   |              | WRITE  - Password required to write                     |
   |______________|_________________________________________________________|
   | SYSRACFA     | RACF indication:                                        |
   |              |                                                         |
   |              | NONE      - No RACF protection                          |
   |              | GENERIC   - Generic profile covers this data set        |
   |              | DISCRETE  - Discrete profile covers this data set       |
   |______________|_________________________________________________________|
   | SYSUPDATED   | Change indicator:                                       |
   |              |                                                         |
   |              | YES  - Data set has been updated                        |
   |              | NO   - Data set has not been updated                    |
   |______________|_________________________________________________________|
   | SYSTRKSCYL   | Tracks per cylinder for the unit identified in the      |
   |              | SYSUNIT variable                                        |
   |______________|_________________________________________________________|
   | SYSBLKSTRK   | Blocks (whose size is given in variable SYSBLKSIZE) per |
   |              | track for the unit identified in the SYSUNIT variable   |
   |______________|_________________________________________________________|
   | SYSADIRBLK   | Directory blocks allocated - returned only for          |
   |              | partitioned data sets when DIRECTORY is specified.  For |
   |              | a partitioned data set extended (PDSE), "NO_LIM" will   |
   |              | be returned because there is no static allocation for   |
   |              | its directory.                                          |
   |______________|_________________________________________________________|
   | SYSUDIRBLK   | Directory blocks used - returned only for partitioned   |
   |              | data sets when DIRECTORY is specified.  For a           |
   |              | partitioned data set extended (PDSE), "N/A" will be     |
   |              | returned because it is not a static value.              |
   |______________|_________________________________________________________|
   | SYSMEMBERS   | Number of members - returned only for partitioned data  |
   |              | sets when DIRECTORY is specified                        |
   |______________|_________________________________________________________|
   | SYSREASON    | LISTDSI reason code                                     |
   |______________|_________________________________________________________|
   | SYSMSGLVL1   | First-level message if an error occurred                |
   |______________|_________________________________________________________|
   | SYSMSGLVL2   | Second-level message if an error occurred               |
   |______________|_________________________________________________________|
   | SYSDSSMS((1))| Contains information about the type of a data set,      |
   |              | provided by DFSMS/MVS.                                  |
   |              |                                                         |
   |              | If the SMSINFO keyword operand on the LISTDSI statement |
   |              | is not specified, or SMS DSNTYPE information could not  |
   |              | be retrieved, the SYSDSSMS variable contains:           |
   |              |                                                         |
   |              | SEQ   for a sequential data set                         |
   |              | PDS   for a partitioned data set                        |
   |              | PDSE  for a partitioned data set extended.              |
   |              |                                                         |
   |              | If the SMSINFO keyword operand on the LISTDSI statement |
   |              | is specified, and the data set is a PDSE, the SYSDSSMS  |
   |              | variable contains:                                      |
   |              |                                                         |
   |              | LIBRARY         for an empty PDSE                       |
   |              | PROGRAM_LIBRARY for a partitioned data set extended     |
   |              |                 program library                         |
   |              | DATA_LIBRARY    for a partitioned data set extended     |
   |              |                 data library.                           |
   |______________|_________________________________________________________|
   | SYSDATACLASS(|1The SMS data class name - returned only if SMSINFO is   |
   |              | specified on the LISTDSI statement and the data set is  |
   |              | managed by SMS.                                         |
   |______________|_________________________________________________________|
   | SYSSTORCLASS(|1The SMS storage class name - returned only if SMSINFO   |
   |              | is specified on the LISTDSI statement and the data set  |
   |              | is managed by SMS.                                      |
   |______________|_________________________________________________________|
   | SYSMGMTCLASS(|1The SMS management class name - returned only if        |
   |              | SMSINFO is specified on the LISTDSI statement and the   |
   |              | data set is managed by SMS.                             |
   |______________|_________________________________________________________|

algunas veces dependiendo de lo que quieras hacer puede ser mucho más efectivo atacar el problema en el origen, o sea, que los programas que catalogan esos ficheros que necesitas creen algún registro de control -o en una tabla db2- con la información que necesitas, como el número de registros..

canalejas

Mensaje por canalejas » 21 Ene 2008, 09:56

NJB escribió:Gente, es la primera vez que en este foro hay una discusión que empienza a tornarse desagradable y tengo que actuar como moderador y no como tecnico.

Les pido a ambos, ya que no voy a tomar partido, que se llamen a la reflexion, piensen y recien luego contesten.

Las palabras a veces sobran y otra veces faltan pero tomenselo con calma.

Creo que el ambiente que hay en este espacio es muy profesional y no tiene sentido ofendernos aún cuando las discusiones se tornen acaloradas y no estemos de acuerdo con el otro.

La vida es demasiado linda como para amargarse por tan poca cosa.

Les envio un cordial saludo a ambos
Reitero mis disculpas.

Un cordial saludo a ambos.

Avatar de Usuario
acevedo
Colaborador Senior
Colaborador Senior
Mensajes: 375
Registrado: 01 Abr 2005, 14:36
País: España
Ciudad: Malaga
Ocupación: Analista de desarrollo

Mensaje por acevedo » 21 Ene 2008, 10:30

acevedo escribió:Mi educación también me pide que me disculpe si no te gustó la respuesta.

Si le echas un vistazo al LISTDSI
verás que éstas son las variables que te proporciona...verás que entre ellas no está el número de registros.
igualmente reitero mis disculpas.

lucaspolidori

Mensaje por lucaspolidori » 21 Ene 2008, 15:25

Uan vez tuve que hacer algo parecido, contar los registros de unos ficheros y realizar operaciones con eso.
En ese momento lo resolvimos de un manera poco efectiva, con un cobol.
Luego más adelante, vi que la utilidad ICETOOL o SORT tienen un función llamada COUNT, precisamente para contar registros de un fichero.
No estuve investigando mucho eso ya que solo lo vi de pasada y justo no lo necesitaba en tal momento.
Si te sirve puedes averiguar un poco más y ver que pasa.
Espero te sea de utilidad este comentario y solucione tu problema.

Nicolas Florio

Mensaje por Nicolas Florio » 21 Ene 2008, 15:36

Yo uso este JOB para contar registros de un archivo, fijate si te sirve

Código: Seleccionar todo

//COUNT EXEC PGM=SORT                
//SORTIN DD DISP=SHR,DSN=ECUSD10.ARCH
//SYSOUT DD SYSOUT=*                 
//SORTOUT DD SYSOUT=*                
//SYSIN DD DATA                      
 OPTION COPY                         
 OUTFIL REMOVECC,NODETAIL,           
 TRAILER1=(COUNT=(M10,LENGTH=10))    
/*
Saludos!

lzrycki

Obtener numero de registros de un fichero

Mensaje por lzrycki » 21 Ene 2008, 16:17

Hola a todos,

adscribo a la respuesta de Acevedo.

Interpreto que la pregunta es:

existe alguna funcion o metodo que permita conocer la cantidad de registros de un archivo sin necesidad de realizar una lectura secuencial y completa ?

( Canalejas, es correcta mi interpretacion ? )

De existir una funcion como la descripta, desde ya muy deseable, su tiempo de ejecucion seria minimo, independiente de la cantidad de registros y supongo que popularmente conocida.

Tal como describe Acevedo, no existe esta informacion ni en el catalogo ni en la VTOC ni en cualquier otro lado y tampoco hay forma de calcularla con los datos de 'catalogo' del archivo que se registran.

Usar utilitarios como el 'sort', no evita que se lean secuencialmente todos los registros. La unica diferencia es que no lo hace un programa de usuario sino un utilitario.

Saludos

Avatar de Usuario
acevedo
Colaborador Senior
Colaborador Senior
Mensajes: 375
Registrado: 01 Abr 2005, 14:36
País: España
Ciudad: Malaga
Ocupación: Analista de desarrollo

Mensaje por acevedo » 21 Ene 2008, 19:31

Nicolás, Lucas la opción COUNT del DFSORT/Syncsort fué la primera que se me ocurrió...pero al volver a leer el post encontré la verdadera dificultad... ya que se pretende averiguarlo "sin leerlo".

canalejas

Mensaje por canalejas » 22 Ene 2008, 06:46

acevedo escribió:Nicolás, Lucas la opción COUNT del DFSORT/Syncsort fué la primera que se me ocurrió...pero al volver a leer el post encontré la verdadera dificultad... ya que se pretende averiguarlo "sin leerlo".
Os agradezco los post, pero he investigando por todos sitios que se me han ocurrido y acevedo ya acertó en su momento (gracias de nuevo). El sistema no guarda esa información. Cuando se abre un fichero en modo MOD, el puntero se posiciona en la zona del disco que el sistema se guarda donde este tiene el final de fichero, pero el fichero puede (casi siempre) estar fragmentado, con lo que ni un cálculo entre la @ inicial y la @ final sirve.
:idea:¿Quizá haciendo una macro que vaya calculando los fragmentos del fichero entre @fin - @ini?
:cry: El asunto se complica ... pero es un buen ejercicio si alguien se atreviera. El problema sin embargo son los de longitud variable, ya que no sirve sumar sus fragmentos y luego dividir por el LRECL que nos ofrece el LISTDSI por ejemplo.

canalejas

Re: Obtener numero de registros de un fichero

Mensaje por canalejas » 22 Ene 2008, 06:55

lzrycki escribió:Hola a todos,

adscribo a la respuesta de Acevedo.

Interpreto que la pregunta es:

existe alguna funcion o metodo que permita conocer la cantidad de registros de un archivo sin necesidad de realizar una lectura secuencial y completa ?

( Canalejas, es correcta mi interpretacion ? )

De existir una funcion como la descripta, desde ya muy deseable, su tiempo de ejecucion seria minimo, independiente de la cantidad de registros y supongo que popularmente conocida.

Tal como describe Acevedo, no existe esta informacion ni en el catalogo ni en la VTOC ni en cualquier otro lado y tampoco hay forma de calcularla con los datos de 'catalogo' del archivo que se registran.

Usar utilitarios como el 'sort', no evita que se lean secuencialmente todos los registros. La unica diferencia es que no lo hace un programa de usuario sino un utilitario.

Saludos
Tu interpretación es del todo correcta y acertada. Si un fichero tiene 100 millones de registros como he encontrado en el sistema en el que trabajo ... ¿os imaginais lo que es tener que leerlo para obtener una cifra? ¿Tendremos permisos sobre él? Me parece increible que nadie haya pedido un patch para que la VTOC se guarde eso.

Gracias.

Responder