Lectura de archivo - Inicializacion de variable

Todo lo relacionado con REXX en este ambiente.
Responder
fedeylomas
Usuario
Usuario
Mensajes: 18
Registrado: 01 Dic 2008, 15:38
País: Argentina
Ciudad: Lomas de Zamora
Ocupación: Programador

Lectura de archivo - Inicializacion de variable

Mensaje por fedeylomas » 17 Jun 2014, 09:57

Buen dia a todos,
Tengo un problema con un rexx sencillo que hice el mismo, lo pongo pq es cortito
/*REXX*/
ADDRESS TSO
"SUBMIT 'ÑDS.SNPRD.JCL(JCLPROMO)'"

LINEA=0
VAR=0
VAR.1=0

/* LEO ARCHIVO DE ENTRADA Y GUARDO PRIMERA LINEA EN VARIABLE */
IF RC <= 4
THEN DO
ARCHIVO="ÑDSSN.SEQ.SNCOMER.CITI.REXX"
"ALLOC FI(INFILE0) DSN('"ARCHIVO"') OLD REUSE"
"EXECIO 1 DISKR INFILE0 (FINIS STEM VAR."

"FREE F(INFILE0)"
LINEA = VAR.1
END
SAY "ULTIMA PROMO CITI: " SUBSTR(LINEA,29,6)

EXIT

El problema es que siempre que lo ejecuto por primera vez en el dia la variable LINEA esta cargada cpn el valor del dia anterior he probado inicializarla como se ve en las primeras pero siempre me da lo mismo, luego en la 2da ejecucion empieza a funcionar bien. El jcl que ejecuta lo unico que hace es 1ero borrar archivo secuencial, copiar un archivo Vsam a este secuencial (que es el que uso en la rexx) y ordenarlo, por lo tanto no se si el problema es que cuando leo la variable no haya terminado de ordenarse el archivo

hmerovich
Usuario
Usuario
Mensajes: 7
Registrado: 07 Dic 2013, 09:45
País: Argentina
Ciudad: Buenos Aires
Ocupación: Consultor

Re: Lectura de archivo - Inicializacion de variable

Mensaje por hmerovich » 17 Jun 2014, 15:10

En tu REXX estas submitiendo el job pero luego tu rexx continua y no podes asegurar que el job hay terminado cuando se ejecutan las instruccciones siguientes. Tendrias dos caminos para resolverlo

a) verficar si el job termino por ejemplo mediante el uso de SDSF via REXX

b) o la otra opcion quizas mas sencilla : ejecutar las funciones de este job pero desde tu rexx asi estarias seguro de que hay terminado antes de seguir.

Saludos

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: Lectura de archivo - Inicializacion de variable

Mensaje por Vicente » 18 Jun 2014, 03:35

Hola fedeylomas:
Aún más simple creo que sería:
1) Quitar "SUBMIT 'ÑDS.SNPRD.JCL(JCLPROMO)'" y IF RC <= 4 del REXX
2) Suprimir LINEA=0 e inicializar LINEA y VAR.1 con un texto en lugar de con un número
3) Ejecutar el REXX en batch como un último paso de JCLPROMO
4) Opcional: podrías suprimir las instrucciones ARCHIVO= ALLOC y FREE y sustituirla por una DD en el JCL

Así quedaría TUREXX
/*REXX*/
"EXECIO 1 DISKR INFILE0 (FINIS STEM VAR."
LINEA = VAR.1
SAY "ULTIMA PROMO CITI: " SUBSTR(LINEA,29,6)

El paso de JCL para ejecución en batch del REXX sería,
entre otras posibilidades, el siguiente:
//REXX EXEC PGM=IKJEFT01,DYNAMNBR=30,REGION=4096K
//SYSEXEC DD DSN=MI.LIBRERIA.REXX,DISP=SHR /* libreria donde está el REXX */
//SYSPRINT DD SYSOUT=C
//SYSTSPRT DD SYSOUT=*
//INFILE0 DD DISP=SHR,DSN=.....
//SYSTSIN DD *
%TUREXX
/*

Este método garantiza ejecutar el REXX cuando hayan terminado las manipulaciones de los datos de entrada.
Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

fedeylomas
Usuario
Usuario
Mensajes: 18
Registrado: 01 Dic 2008, 15:38
País: Argentina
Ciudad: Lomas de Zamora
Ocupación: Programador

Re: Lectura de archivo - Inicializacion de variable

Mensaje por fedeylomas » 23 Jun 2014, 16:37

Muchas gracias, voy a probar a ver que pasa, saludos!!!!

fedeylomas
Usuario
Usuario
Mensajes: 18
Registrado: 01 Dic 2008, 15:38
País: Argentina
Ciudad: Lomas de Zamora
Ocupación: Programador

Re: Lectura de archivo - Inicializacion de variable

Mensaje por fedeylomas » 14 Jul 2014, 10:18

Buen día,
Les comento que probe poniendo hardcode el jcl dentro del REXX y me sigue trayendo el registro cuando el archivo no se ha terminado de ordenar. Como puedo hacer entonces para que me ejecute mi instruccion una vez que se ha finalizado el sort? si o si necesito que sea un rexx, no un jcl que dispare un rexx.

Gracias

riloama
Colaborador
Colaborador
Mensajes: 187
Registrado: 02 Sep 2008, 18:39
Ubicación: Caracas - Veenzuela

Re: Lectura de archivo - Inicializacion de variable

Mensaje por riloama » 14 Jul 2014, 15:10

Sin conocer exactamente lo que estas queriendo hacer, una solucion sucia y rapida, genera una REXX que submita un JCL con el sort y que luego submita otro JCL que contenga

//REXX EXEC PGM=IKJEFT01,DYNAMNBR=30,REGION=4096K
//SYSEXEC DD DSN=MI.LIBRERIA.REXX,DISP=SHR /* libreria donde está el REXX */
//SYSPRINT DD SYSOUT=C
//SYSTSPRT DD SYSOUT=*
//INFILE0 DD DISP=SHR,DSN=.....
//SYSTSIN DD *
%TUREXX
/*

tal como te lo envio Vicente. La clave esta en que el Jobname de los dos JCLs sea el mismo de modo tal que se encolen. De esta forma quedaria garantizado que el archivo ordenado este generado antes de que el segundo JCL se ejecute.

De todos modos no entiendo porque en tu caso, un JCL con un step que ordena y otro que procesa el archivo ordenado, el segundo step que contiene tu REXX no ve el archiv ordenado en el primer step.

Si envias el JCL completo tal vez podamos determinar lo que pasa.
Saludos

riloama

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: Lectura de archivo - Inicializacion de variable

Mensaje por Vicente » 15 Jul 2014, 03:56

Hola Fedeylomas:
dijiste:
si o si necesito que sea un rexx, no un jcl que dispare un rexx
Esto complica la solución, pero con REXX se pueden hacer muchas cosas.
Si solo se trata de ordenar un fichero, puedes llamar al programa sort desde el mismo REXX utilizando la instrucción:
"CALL 'libreria.del.sort(SORT)'"
Previamente tendrías que hacer ALLOC de todos los ficheros que necesite el programa SORT.
(Si se trata de hacer más cosas con los datos habría que programarlas en el REXX).
Sin conocer más detalles de lo que hace JCLPROMO no puedo ayudarte más.
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: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Lectura de archivo - Inicializacion de variable

Mensaje por Vicente » 15 Jul 2014, 04:15

Resumiendo, La estructura aproximada sería:
ALLOC de SORTIN al fichero VSAM
ALLOC de SORTOUT al fichero secuencial
ALLOC de SYSPRINT o SYSOUT del sort
ALLOC de SYSIN del SORT
EXECIO DISKW para escribir en SYSIN las instrucciones al sort.
CALL al sort
EXECIO DISKR sobre el SORTOU

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

fedeylomas
Usuario
Usuario
Mensajes: 18
Registrado: 01 Dic 2008, 15:38
País: Argentina
Ciudad: Lomas de Zamora
Ocupación: Programador

Re: Lectura de archivo - Inicializacion de variable

Mensaje por fedeylomas » 15 Jul 2014, 08:56

Hola Vicente, lo unico que hace el JCLPROMO es el sort

riloama
Colaborador
Colaborador
Mensajes: 187
Registrado: 02 Sep 2008, 18:39
Ubicación: Caracas - Veenzuela

Re: Lectura de archivo - Inicializacion de variable

Mensaje por riloama » 15 Jul 2014, 13:43

Fedeylomas

decis en tu primer envio:

"El jcl que ejecuta lo unico que hace es 1ero borrar archivo secuencial, copiar un archivo Vsam a este secuencial (que es el que uso en la rexx) y ordenarlo, por lo tanto no se si el problema es que cuando leo la variable no haya terminado de ordenarse el archivo"

Tal como mencionas, el archivo que sale de la copia del VSAM es el input del proceso del Sort y como decis que este es el archivo que usas en tu REXX supongo que estaras haciendo un Sort de ese archivo sobre si mismo. ( SORTIN = SORTOUT ).

Si este es el caso, estas son las recomendaciones del manual del Sort

1.* For a copy application, the SORTIN data set should not be the same as the
SORTOUT data set or any OUTFIL data set because this can cause lost or
incorrect data or unpredictable results.

2.* For a sort application, the SORTIN data set should not be the same as any
SORTWKdd data set because this can cause lost or incorrect data or
unpredictable results. The SORTIN data set can be the same as the SORTOUT
data set or an OUTFIL data set, but this situation can lead to the loss of the data
set if the sort application does not end successfully.

Entiendo que no estas haciendo un COPY sino un SORT, por lo que el punto 2. te sugiere que no utilices este metodo porque cualquier cancelacion en el SORT te puede provocar una perdida de datos y que uses un archivo de entrada y otro de salida.

Pero, vos estas haciendo esto ?

Por el contrario, si estas haciendo un sort de un archivo que deja su salida en otro, no me queda claro si en la rexx estas apuntando al archivo de entrada al sort o al de salida (" copiar un archivo Vsam a este secuencial (que es el que uso en la rexx) y ordenarlo " )
Saludos

riloama

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: Lectura de archivo - Inicializacion de variable

Mensaje por Vicente » 16 Jul 2014, 03:43

Hola fedeylomas:
Tu condicionante de no utilizar JCL lo hace todo algo más complicado.
He escrito un REXX que hace todo lo que quieres:
Llama al SORT para ordenar el fichero VSAM sobre un secuencial y después lee primera linea del fichero secuencial.
Te lo pongo a continuación para que lo adaptes a tu instalación, cambiado nombres de ficheros y parámetros del SORT:
Al no ejecutarlo en batch, si el fichero de entrada fuese muy grande tendrías que hacer adaptaciones de tamaños.
La ejecución de este REXX mediante JCL evitaría la necesidad de todo execepto las últimas 3 líneas, como dije en anterior intercención.
Espero que te sirva.
Un saludo

Código: Seleccionar todo

/* REXX  ejemplo de uso de SORT. Entrada VSAM y salida secuencial*/   
sortin  = "'DESA.TGA010K'"                                            
sortout = "'WORKP.REXPRU1.VICENTE.SORTOUT'"                           
sysout  = "'WORKP.REXPRU1.VICENTE.SYSOUT'"                            
sysin   = "'WORKP.REXPRU1.VICENTE.SYSIN'"                             
                                                                      
"ALLOC FILE(SORTIN) DSNAME("sortin") SHR" ,                           
                                                                      
/* ALLOC de la salida del SORT  */                                    
"DELETE ("sortout") PURGE"                                            
"FREE FILE(SORTOUT)"                                                  
"ALLOC FILE(SORTOUT) DSNAME("sortout") " ,                            
    "BLKSIZE(5000) LRECL(50) RECFM(F,B) NEW KEEP SPACE(1,1) CYLINDERS"
                                                                      
/* ALLOC de SYSOUT del SORT  */                                       
"DELETE ("sysout") PURGE"  
"FREE FILE(SYSOUT)"                                                   
"ALLOC FILE(SYSOUT) DSNAME("sysout") " ,                              
    "BLKSIZE(300) LRECL(300) RECFM(F,B) NEW KEEP SPACE(1,1) CYLINDERS"
                                                                      
/* Creación del fichero de parametros del SORT */                     
"DELETE ("sysin") PURGE"                                              
"FREE FILE(SYSIN)"                                                    
"ALLOC FILE(SYSIN) DSNAME("sysin") " ,                                
       "BLKSIZE(80) LRECL(80) RECFM(F) NEW SPACE(1,1) TRACKS"         
"DROPBUF"                                                             
PUSH " SORT FIELDS=(1,10,CH,A)"                                       
"EXECIO 1 DISKW SYSIN"                                                
"DROPBUF"                                                             
"EXECIO 0 DISKW SYSIN (FINIS"                                         
'DROPBUF'                                                             
"CALL 'SYS1.SICELINK(SORT)'"                                          

'DROPBUF' 
"EXECIO 1 DISKR INFILE0 (FINIS STEM VAR." 
LINEA = VAR.1 
SAY "ULTIMA PROMO CITI: " SUBSTR(LINEA,29,6)
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

fedeylomas
Usuario
Usuario
Mensajes: 18
Registrado: 01 Dic 2008, 15:38
País: Argentina
Ciudad: Lomas de Zamora
Ocupación: Programador

Re: Lectura de archivo - Inicializacion de variable

Mensaje por fedeylomas » 16 Jul 2014, 10:26

Hola Vicente, muchas gracias por tu ayuda, lo adapte a la instalacion y parece que anda 10 puntos!! muchas Gracias a todos por la ayuda

Responder