Leer Secuencial y cargar en miembros pds selectivamente

Todo lo relacionado con REXX en este ambiente.
Responder
cporres

Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por cporres » 01 Oct 2014, 10:38

Buenos días, necesito un proceso que seleccione algunas líneas de un secuencial (varias) y genere distintos miembros en un fichero particionado.
No tengo mucha practica y o bien me carga todos las líneas en todos los miembros o solo escribe una línea por miembro y va machacando.
La lectura la realizo:
ENTRADA = 'CPORRES.FUSER.F140923.H1000.DATA'
"ALLOC DS ("ENTRADA") F(SYSOBJH) SHR REUSE"
"EXECIO * DISKR SYSOBJH (FINIS STEM LINEAS."
A continuación de las que empiezan por '*C' selecciono el nombre de programa
DO I=1 TO LINEAS.0
PREFIJO = SUBSTR(LINEAS.I,1,2)
IF PREFIJO = '*C' THEN
DO
PROGRAMA = SUBSTR(LINEAS.I,45,8)
END
Después selecciono las que empiezan por '*S' (que son un grupo) y por cada grupo necesito generar un member de un pds.
IF PREFIJO = '*S' THEN
DO WHILE PREFIJO = '*S'
J=1
WRITE.J = SUBSTR(LINEAS.I,3,78)
SAY WRITE.J
SALIDA1 = "CPORRES.OUTPUT1.DATA("PROGRAMA")"
"ALLOC DA("SALIDA1") FI("'OUTPUT1'") OLD REUSE"
SAY I
"EXECIO 1 DISKW OUTPUT1 (STEM WRITE."
"FREE F(OUTPUT1)"

He probado todas las combinaciones por no soy capaz, el fichero original tiene miles de líneas y cientos de grupos que corresponden a diferentes programas.

Si me pudierais ayudar o darme algún ejemplo simple estaría muy agradecido.
Muchas Gracias
Un saludo

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por Vicente » 01 Oct 2014, 12:37

Hola cporres,
Supongo que la librería CPORRES.OUTPUT1.DATA ya existe antes de ejecutar el programa.
Permíteme unos comentarios a tu programa:

"EXECIO * DISKR SYSOBJH (FINIS STEM LINEAS.
Esta instrucción lee todas las líneas del fichero de entrada
y las carga en memoria. Esto no sería viable para ficheros muy grandes.
En caso de necesidad se puede sustituir por un bucle de lecturas.

SALIDA1 = "CPORRES.OUTPUT1.DATA("PROGRAMA")"
"ALLOC DA("SALIDA1") FI("'OUTPUT1'") OLD REUSE"
Estas instrucciones se están ejecutando cada vez que se quiere escribir
una línea *S. Por lo que para cada línea *S estás abriendo-escribiendo-cerrando
el fichero. De ahí que "solo escribe una línea por miembro y va machacando".
Esta líneas deberían escribirse antes del la sentencia: DO WHILE PREFIJO = '*S'

DO WHILE PREFIJO = '*S'
Dentro de este bucle no estás haciendo avanzar el índice I ni refrescando
el valor de WRITE.J con lo contenido en la nueva línea, por lo que no te
mueves por las líneas de los datos de entrada.

Por no alargar esta intervención, te escribiré en otro post un ejemplo.
Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por Vicente » 01 Oct 2014, 13:28

Hola de nuevo,
En mi ejemplo trataré de respetar los nombres que has elegido para las variables.
Sunpondré que en el fichero de entrada, antes de un registro *S hay al menos un registro *C.
También supondré que un registro *C termina la secuencia de registros *S anteriores, dando así fin al miembro anterior y comenzando uno nuevo.
Cualquier otro registro distinto de *C o *S en la entrada será ignorado.

No he probado el programa, por lo que utilizalo solo a modo de guia y corrige o cambia lo que necesites.
No dudes en escribir si necesitas alguna aclaración.
Un saludo

Código: Seleccionar todo

entrada = 'CPORRES.FUSER.F140923.H1000.DATA' 
"ALLOC DS ("entrada") F(SYSOBJH) SHR" 

"EXECIO 1 DISKR SYSOBJH (FINIS STEM LINEA."  /* leo una linea de entrada */
DO WHILE rc = 0       /* Bucle de lectura de lineas hasta el final del fichero  */ 
   prefijo = SUBSTR(linea.1,1,2)
   IF prefijo = '*C' THEN DO
      programa = SUBSTR(linea.1,45,8)
      "FREE FILE(OUTPUT1)"             /* cierro el posible miembro anterior */ 
      SALIDA1 = "CPORRES.OUTPUT1.DATA("programa")"  /* nuevo miembro */ 
      "ALLOC DA("SALIDA1") FI("'OUTPUT1'")"
   END  /* de IF */
   IF prefijo = '*S'    
      write.1 = SUBSTR(linea.1,3,78)
      "EXECIO 1 DISKW OUTPUT1 (STEM WRITE."   /* escribo una linea */
   END
   "EXECIO 1 DISKR SYSOBJH (STEM LINEA."  /* leo una linea de entrada */
END
"FREE FILE(SYSOBJH)"
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

cporres

Re: Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por cporres » 02 Oct 2014, 06:36

Muchas gracias Vicente, lo he estado probando y esta muy bien, lo único que no consigo es generar el segundo miembro, supongo que hay que cerrar el data set pero no se donde.
El error es:
IKJ56861I FILE OUTPUT1 NOT FREED, DATA SET IS OPEN
IKJ56246I DATA SET CPORRES.OUTPUT1.DATA NOT ALLOCATED, FILE IN USE
14 *-* "ALLOC DA("SALIDA1") FI("'OUTPUT1'") shr"
>>> "ALLOC DA(CPORRES.OUTPUT1.DATA(IOLG0000)) FI(OUTPUT1) shr"
IKJ56246I DATA SET CPORRES.OUTPUT1.DATA NOT ALLOCATED, FILE IN USE
te incluyo el rexx completo:
********************************* Top of Data **************************
/* REXX */
TRACE('R')
ENTRADA = 'CPORRES.FUSER.F140923.H1000.DATA'
"ALLOC DS ("ENTRADA") F(SYSOBJH) SHR"
"EXECIO 1 DISKR SYSOBJH (FINIS STEM LINEA." /*Leo una linea de */
/* entrada */
DO WHILE RC = 0 /* bucle de lectura de lineas hasta el final del */
/* fichero */
PREFIJO = SUBSTR(LINEA.1,1,2)
IF PREFIJO = '*C' THEN DO
PROGRAMA = SUBSTR(LINEA.1,45,8)
"FREE FILE(OUTPUT1)" /* cierro el posible miembro anterior */
SALIDA1 = "CPORRES.OUTPUT1.DATA("PROGRAMA")" /*nuevo miembro*/
"ALLOC DA("SALIDA1") FI("'OUTPUT1'") shr"
END /* de IF */
IF PREFIJO = '*S' then do
WRITE.1 = SUBSTR(LINEA.1,3,78)
"EXECIO 1 DISKW OUTPUT1 (STEM WRITE." /* escribo linea */
END /* de IF */
"EXECIO 1 DISKR SYSOBJH (STEM LINEA." /*leo una linea de */
/* entrada */
end
"FREE F(OUTPUT1)"
"FREE F(SYSOBJH)"
EXIT

De nuevo, muchas gracias por tu ayuda.
Carlos

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por Vicente » 02 Oct 2014, 09:29

Hola Carlos.
Tienes razón en que hay que cerrar el fichero y no hay instrucción escrita para ello en el programa.
Escribe la siguiente linea:
"EXECIO 0 DISKW JCL (FINIS"
entre las lineas:
PROGRAMA = SUBSTR(LINEA.1,45,8)
"FREE FILE(OUTPUT1)" /* cierro el posible miembro anterior */

Escríbela también al final del programa, justo delante de:
"FREE F(OUTPUT1)"
"FREE F(SYSOBJH)"

Pruebalo y dime que ocurre.
Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por Vicente » 02 Oct 2014, 09:36

Hola de nuevo,
Escribo para corregir erratas de mi intervención anterior, provocadas por copiar y pegar con prisas.
Donde dije "EXECIO 0 DISKW JCL (FINIS"
Debería decir "EXECIO 0 DISKW OUTPUT1 (FINIS"
También deberías escribir "EXECIO 0 DISKR SYSOBJH (FINIS" al final del programa, antes de:
"FREE F(OUTPUT1)"
"FREE F(SYSOBJH)"

un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

cporres

Re: Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por cporres » 02 Oct 2014, 09:55

Muchas gracias Vicente, lo he probado y parece que va perfectamente. Te debo una.
Un saludo
Carlos

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Leer Secuencial y cargar en miembros pds selectivamente

Mensaje por Vicente » 02 Oct 2014, 10:08

Hola,
Encantado de haber podido ayudar.
Ahora he de desconectarme.
Hasta otra
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Responder