Extraer contenido de un campo de 2 miembros con una llave

Todo lo relacionado con REXX en este ambiente.
Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 15 May 2015, 10:39

Hola Italo,
Como dije, yo escribiría miembros nuevos en una librería nueva.
De este modo no tocas los originales y siempre puedes borrar y empezar de nuevo.
Yo procedería del siguiente modo:
Leería una línea de un miembro y, si procede, escribiría otra en el nuevo miembro modificada o no.
Es decir programaría un bucle DO para recorrer todas las líneas del miembro de entrada, con el siguiente esquema:

EXECIO 1 DISKR ...
DO WHILE rc = 0
....
toma de decisiones
y cambios de datos
....
EXECIO 1 DISKW ...
EXECIO 1 DISKR ....
END

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

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 21 May 2015, 02:32

hola Vicente, gracias por la respuesta, bueno la logica ya la comprendi, la verdad para lo que deseo hacer primero debere resolver otro problema... en mi problema anterior tenia que seleccionar los records que inician con VFY en un solo dataset de output....

ahora lo que debo hacer es seleccionar el resto de records y escribirlos en un fileout dataset por cada miembro... al inicio logre hacerlo usando la misma rexx con la diferencia de nombres oviamente y cambiando en el IF = VFY con IF /= VFY de esta manere obtengo el resto de lineas...

pero el problema es que los escribe en un solo dataset y a mi me serviria escribir por cada miembro que lee un data set por ejemplo con nombre Z99.MIREXX.FILEOUT._NOMBREMIEMBRO donde _NOMBREMIEMBRO es el miembro que a leido... crear los dataset desde la rexx, uniendo el nombre fijo del dataset mas el nombre del miembro...de que manera le paso el nombre del miembro (que en mi caso lo lee como record y no como simple nombre)....

algun ejemplo o mas que todo aclarame la logica...

gracias nuevamente por tu disponibilidad.

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

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 21 May 2015, 05:13

Hola,
En nuestros posts de los días 24 y 25 de abril, ya hablamos de esto.
Ambos pusimos ejemplos de ALLOC, EXECIO DISKW y EXECIO DISKR (FINIS.

Concretamente, debes crear el fichero/miembro con ALLOC, Leer y escribir, cerrarlo con (FINIs
Algo parecido a añadir algunas líneas a mi intervención anterior

Código: Seleccionar todo

DO bucle sobre la lista de miembros
   ALLOC del miembro a leer
   ALLOC del miembro a escribir
   EXECIO 1 DISKR ... 
   DO WHILE rc = 0
      ....
      toma de decisiones
      y cambios de datos 
      ....
      EXECIO 1 DISKW ...
      EXECIO 1 DISKR ....
   END
   EXECIO 0 DISKR ... (FINIS para cerrar el miembro leido
   EXECIO 0 DISKR ... (FINIS para cerrar el miembro creado
END
Haciendo la salvedad de modificar el código para crear (Hacer ALLOC ) o no el nuevo muembro, en función de que se den las condiciones para escribir algo en él.

Para conocer todas las posibilidades del ALLOC para crear ficheros nuevos, consulta el mandato ALLOCATE en el manual de TSO
http://publibfp.dhe.ibm.com/epubs/pdf/ikj4c5c0.pdf

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

italo_pm
Usuario avanzado
Usuario avanzado
Mensajes: 56
Registrado: 25 Mar 2015, 20:59
País: italia
Ciudad: milano
Ocupación: Consultor

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por italo_pm » 21 May 2015, 08:45

gracias Vicente, bueno tienes razon, son aspectos que ya tratamos, los leere nuevamente,

solo que aqui me interrumpo, como creae un dataset secuencial asi:

nombre fijo Z99.MIREXX.FILEOUT. + variable NOMBRE-MIEMBRO
donde _NOMBREMIEMBRO es el miembro que a leido.

por ejemplo el nombre del miembro leido es WIAX8

quedando Z99.MIREXX.FILEOUT.WIAX8

tendria que poner fijo Z99.MIREXX.FILEOUT en una variable y luego "unirlo" con MEMBER

MYOUT=&nomeout.&member ??

de esa manera la rexx me crea el dataset (y no un miembro en otra libreria)

...

al inicio de DO tal vez?

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

Re: Extraer contenido de un campo de 2 miembros con una llav

Mensaje por Vicente » 21 May 2015, 10:21

Mandato ALLOC para abrir un miembro de una librería en lectura.
"ALLOC FILE(MIEMBRO) DSNAME('"dsn1"("miembro")') SHR"
donde
dsn1: es una variable que contiene el nombre de la librería
miembro: Es una variable que contiene el nombre del miembro

Instrucción de lectura de una linea del miembro anterior:
"EXECIO 1 DISKR MIEMBRO (STEM LINEA."

Para escribir un miembro se pueden dar dos casos:

CASO 1, La librería de salida existe:
---------------------------------------
Mandato ALLOC para abrir un miembro que no existe en la librería para escritura.
"ALLOC FILE(SALIDA) DSNAME('"dsn2"("miembro")')"
donde
dsn2: es una variable que contiene el nombre de la librería de salida
miembro: Es una variable que contiene el nombre del miembro a crear

Instrucciones para escribir una linea en el miembro anterior:
'DROPBUF'
PUSH linea.1
"EXECIO 1 DISKW SALIDA"


CASO 2, La librería de salida No existe:
---------------------------------------
Puedes crearla manualmente y volver al caso 1.
Pero si el programa ha de crear muchas librerías distintas, entonces has de utilizar el mandato ALLOCATE con más parámetros.
Después de una atenta lectura del mandato ALLOCATE en el libro que te indiqué se puede escribir un mandato como:
"ALLOC DSNAME('"dsn1"'NEW VOLUME(disco) SPACE(10,10) CYLINDERS BLKSIZE(800) DIR(100) UNIT(3390) CATALOG LRECL(80) RECFM(B) DSORG(PO)"
Donde dsn1 es la variable que contiene el nombre de la libreria y disco es un VOLSER de tu instalación.
Es un ejemplo orientativo, lee el manual y adapta los parámetros y números a tus necesidades.
Este mandato se da una sola vez por cada nombre de librería y después se vuelve al PASO1

Nota:
No he hecho pruebas de funcionamiento. Quizás, después de probar habría que hacer algunos ajustes.
Te los dejo a tí.

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

Responder