LLAMAR FUNCIÓN REXX - JCL

Todo lo relacionado con REXX en este ambiente.
Responder
Rickent

LLAMAR FUNCIÓN REXX - JCL

Mensaje por Rickent » 25 Feb 2009, 07:34

Hola, necesito ayuda para poder llamar a una función REXX de cálculo de fechas desde un jcl. Tenemos un fichero con registros en los que se informan dos fechas y queremos saber la diferencia entre las fechas en días. El problema es que no sabemos cómo realizar la llamada si no es con un programa cobol (pero esta posibilidad queremos obviarla porque pasar control de calidad para los programas cobol tarda mes y medio y nos urge todo este tema). La llamada a esta función que tenemos hecha en un programa cobol es:

EXEC-FUN XX_CALCULO_DIAS_ENTRE_FECHAS
EMPRESA('0049')
CENTRO('W-CENTRO-A')
FECHA1('W-FECHA-V')
FORMATO1('W-FECHAFO1')
FECHA2('W-FECHA-O')
FORMATO2('W-FECHAFO2')
DIAS_NATURALES()
DIAS('W-DIAS')
RETORNO('W-RETURN-CODE')
END-FUN.

Donde pasamos los parámetros EMPRESA, CENTRO, FECHA1, FORMATO1, FECHA2 y FORMATO2,

indicamos que los días sean naturales,

y recuperamos DIAS y RETORNO.

He intentado documentarme al respecto, buscando en manuales, en este foro y en internet en general pero no he encontrado nada que nos aclare. Nos gustaría hacer la llamada con un programa easytrieve y hemos encontrado algo así:

CALL <nombre_funcion>
USING <parámetros>

pero lo que hemos probado no nos ha funcionado.

Si es posible hacer la llamada a la función REXX desde el jcl, también nos valdría. Lo que queremos es evitar usar el programa cobol.

Espero que alguien pueda ayudarme.

Un saludo.

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

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por NJB » 25 Feb 2009, 08:50

Hola

No entiendo bien.

Llamar una función REXX desde un JCL es imposible salvo que esta sea invocada desde dentro de un programa escrito en lo que quieras.

El JCL solo puede llamar programas (EXEC=xxxx) y no otra cosa.

Ahora bien, si queres podes hacer una REXX que haga lo que deseas e invocarla ya sea con un paso de TSO BATCH (IKJEFT01) o bien podes compilarla y convertirla en un programa (no una exec compilada) e invocarla directamente.

Pero en todos los casos estas ejecutando un step de jcl que invoca a tu programa REXX de una u otra forma.

Espero tus comentarios para poder orientarte hasta donde pueda (y el resto de los foreros tambien)

Te mando un cordial saludo
Norberto Bocalandro

Rickent

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por Rickent » 25 Feb 2009, 09:31

Como dices, lo que nos gustaría es en el jcl llamar a un programa (EXEC=xxxx) y que este a su vez invoque a la función REXX, siempre y cuando este programa no sea un programa cobol, por lo que comenté en el primer post.

Nuestras dudas vienen en que no sabemos qué programa tenemos que utilizar ni cómo tendríamos que pasar los parámetros de entrada y recibir los parámetros de salida de la función.

Espero que puedas ayudarnos.

Muchas gracias por tu contestación y por la rapidez de la misma.

Un cordial saludo.

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

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por NJB » 25 Feb 2009, 12:50

Hola

Si es un pgm podes usar un rexx compilado, pero debes tener comprado el compilador.

Seria mejor un TSO batch invocando una rexx normal.

Código: Seleccionar todo

    
//AA1 EXEC PGM=IKJEFT01,TIME=1440,DYNAMNBR=250                   
//SYSEXEC  DD  DISP=SHR,DSN=dataset donde reside la rexx                       
//SYSTSPRT DD  SYSOUT=*                                          
//SYSIN    DD  DUMMY                                             
//SYSTSIN  DD  *                                                 
PROF NOPREFIX                                                    
tu_rexx          


Hay muchos parametros que pueden cambiar (DYNAMNBR, etc)

Por otro lado con tu rexx podes tomar los datos de varios lugares, como por ejemplo de un archivo (puede ser un temporario generado en un step previo , o puede venir por parámetro pero no me parece que sea lo que te convenga.

Por otro lado la salida igual, podes dejarlo en un archivo para usarlo luego.

Dentro de un JCL no hay muchas posibilidades.

En cuanto a usar la rexx como función no tiene sentido, sino que directamente tu rexx debiera ser lo que hace todo, no tiene sentido una rexx que lo unico que haga sea invocar una función, pero esto es discutible sobre todo si la función ya esta escrita.

Espero tus comentarios
Norberto Bocalandro

Rickent

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por Rickent » 27 Feb 2009, 06:10

Hola.

Me queda claro que debemos hacer la llamada a la función REXX con el PGM=IKJEFT01. La función REXX no llama a su vez a otra función sino que lo hace todo.

Tenemos un fichero con 1M de registros y la salida tiene que ser un fichero con el mismo nº de registros y el nº de días calculado.

La duda la tenemos en cómo indicar los parámetros de entrada a la función REXX.

EMPRESA('0049')
CENTRO('W-CENTRO-A')
FECHA1('W-FECHA-V')
FORMATO1('W-FECHAFO1')
FECHA2('W-FECHA-O')
FORMATO2('W-FECHAFO2')
DIAS_NATURALES()

Y cómo obtener los de salida

DIAS('W-DIAS')
RETORNO('W-RETURN-CODE')

Muchas gracias por todas tus molestias.

Un cordial saludo.

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

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por NJB » 27 Feb 2009, 12:57

Hola

Lo que tenes que hacer (si entendi bien) es leer el fichero con la REXX, hacer todos los cálculos y grabar el archivo de salida tambien desde la REXX.

En realidad no debieras pasar ningun parámetro a la REXX, el dsn de entrada y el de salida se lo pones por DD en el JCL y si deseas pasarle algun parámetro tenes dos opciones a saber:

Se lo pasas en el momento de la invocación mi_rexx parm1 parm2 ....
Se lo pasas en una SYSIN DD * a la que deberas leer desde dentro de la rexx

No se si esto aclara tu duda.

Es cuestion de seguir preguntando

Te mando un cordial saludo
Norberto Bocalandro

Avatar de Usuario
juancle
Usuario avanzado
Usuario avanzado
Mensajes: 39
Registrado: 15 Dic 2008, 20:32
País: Argentina
Ciudad: Vicente Lopez
Ocupación: System Programmer

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por juancle » 01 Mar 2009, 04:09

Ejecutar un REXX sobre el archivo con las fechas es basicamente lo mismo que ejecutar un programa COBOL sobre ese mismo archivo.
Si les esta permitido ejecutar un programa REXX sobre ese archivo, deberia ser posible ejecutar un COBOL tambien.

Supongo que codigo REXX no debe pasar el control de calidad, sino tardara tambien un mes y medio su autorizacion.

Lo que quiero decir, es que siempre se puede crear un programa COBOL o de cualquier lenguaje en una biblioteca fuera del control de calidad, que es lo que quieren hacer con el REXX.

Por lo tanto deberian poder ejecutar su propio programa COBOL con la llamada a la subrutina de fechas.

Ahora bien, si desean hacerlo en REXX, deberian hacer lo siguiente:
1- Codificar un REXX que haga exactamente lo que hace el programa COBOL, por ejemplo:
a- leer un registro de la DD ENTRADA
b- seleccionar los campos a comparar
b- comparar (o llamar a una subrutina o funcion REXX de comparacion que sea equivalente a la COBOL que usan)
c- generar un registro de salida apropiado y grabarlo en la DD SALIDA
d- repetir esto hasta que se acabe el archivo ENTRADA

Comentarios:
Como tu archivo parece bastante grande, creo que no conviene usar la funcion REXX EXECIO para leer en memoria
Esta manera de leer un archivo es mas comoda, pero leer 1 Millon de registros me parece demasiado.

Esqueleto REXX ejemplo:

'EXECIO 1 DISKR ENTRADA ( STEM LIN'
if rc = 2 then EOF = 1
do until EOF
/* por ej. aqui EMPRESA esta entre las posiciones 1 y 8 del registro, FECHA entre 11 y 16 etc etc */
parse var lin1 1 EMPRESA 9 CENTRO 11 FECHA1 17 FORMATO1 18 FECHA2 24 FORMATO2 25 .
call subrutina_de_fechas parm1 parm2 .... etc
/* o tambien se puede usar una funcion */
lout = .... /* armar lout o la puede armar la subrutina */
'EXECIO 1 DISKW SALIDA ( STEM LOUT'
end
'EXECIO 1 DISKR RMFDATA ( STEM LIN'
if rc = 2 then EOF = 1
end
exit
/* Subrutina de comparacion */
subrutina_de_fechas:
...
...
...
return


Otra manera de iniciar un REXX batch es:

// EXEC PGM=IRXJCL,PARM='TUREXX'
//SYSEXEC DD DSN=BIBLIOTECA.CON.TU.REXX,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//ENTRADA DD DSN=TU.ARCHIVO.CON.FECHAS,DISP=SHR
//SALIDA DD DSN=TU.ARCHIVO.RESULTADO,DISP=(,CATLG),SPACE=(CYL,(xxx,xxx)),UNIT=SYSDA

Saludos
juan

Rickent

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por Rickent » 02 Mar 2009, 09:05

Lo primero me gustaría agradeceros a los dos por vuestras respuestas, tiempo y ayuda.

Lo que queremos utilizar es la opción de:

"Se lo pasas en el momento de la invocación mi_rexx parm1 parm2 ...." pero ¿Cómo se indicarían los parametros? ¿Teneis algún ejemplo de esto, paso o jcl con esto?

¿Sería algo así? : mi_rexx EMPRESA('0049') CENTRO('W-CENTRO-A') FECHA1('W-FECHA-V') FORMATO1('W-FECHAFO1') FECHA2('W-FECHA-O') FORMATO2('W-FECHAFO2') DIAS_NATURALES()

Muchas gracias.

Un cordial saludo.

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

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por NJB » 02 Mar 2009, 09:19

Hola

Lo mas facil seria algo asi:

mi_rexx 0049 W-CENTRO-A W-FECHA-V W-FECHAFO1 W-FECHA-O W-FECHAFO2

poniendo cada parametro (si no contiene blancos) separados justamente por blancos.

En mi_rexx los capturas con la sentencia:

Parse arg EMPRESA CENTRO FECHA1 FORMATO1 FECHA2 FORMATO2 DIAS_NATURALES

Asi cada variable tendrá el valor adecuado. Si deseas pasar alguna variable en blanco debes reemplazarla por un . (punto) salvo la última en que no hace falta.

Espero te sirva.

Te mando un cordial saludo
Norberto Bocalandro

Rickent

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por Rickent » 03 Mar 2009, 09:47

Muchas gracias por toda vuestra ayuda.

El problema es que la función REXX no es nuestra, es una función general del banco y no podemos modificarla. Así que al final o pasamos control de calidad o nos creamos un fuente que haga exactamente lo quye hace esta función REXX.

De nuevo, muchas gracias por todas vuestras molestias.

Un fuerte abrazo.

Avatar de Usuario
hdezmm
Colaborador
Colaborador
Mensajes: 115
Registrado: 16 Jun 2007, 02:49
País: Mexico
Ciudad: Ciudad de Mexico DF
Ocupación: Técnico en Sistemas

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por hdezmm » 05 Sep 2009, 01:42

Yo elabore un programa que llama a otros, pasandole 3 parametros y regresa 6.

En el primer programa asi lo llamo:

IF TIP = 'L' THEN DO
RETPGM = REXMHM02(APL USR ORI) -- -- parametros de ida
PARSE VAR RETPGM, ----------- asi lo invocas y se ejecuta
CODRET'|'SWERR'|'MSGRET'|', ---- parametros de regreso
ODSN'|'CLEI'|'CWRI

IF CODRET = 0 THEN DO
DES = ODSN
L01 = MSGRET
L02 = LM.5||CLEI
L03 = LM.6||CWRI

En el segundo programa asi esta..

/*--------------------------------------------------------------------*/
/* DECLARACION DE VARIABLES */
/*--------------------------------------------------------------------*/
XXXX_VARS_EXTERNAS:
/* APL USR ORI */
ARG VE01 VE02 VE03

XXXX_REVISA_DATOS:
IF VE01 = '' THEN DO
SW_ERR = 1
CALL XXXX_FIN
END
ELSE DO
IF VE02 = '' THEN DO
SW_ERR = 2
CALL XXXX_FIN
END
ELSE DO
IF VE03 = '' THEN DO
SW_ERR = 3
CALL XXXX_FIN
END
END
END
SW_ERR = 0
RETURN;

XXXX_FECHA_HORA:
FECSYS = DATE()
HRSSYS = TIME()
WS_SEG = TIME(S)
FEC = FECSYS
HRS = HRSSYS
RETURN;

/*--------------------------------------------------------------------*/
/* ARMA NOMBRE ARCHIVOS */
/*--------------------------------------------------------------------*/
XXXX_ARMA_DATOS:
DEST = VE02||'.'||VE01||'.'||'TMP.PRGSAL.L'||WS_SEG

Asi termina el 2o programa y regresa datos al 1o ......

XXXX_FIN:
IF SW_ERR > 0 THEN DO
CALL XXXX_ERR_PROG
END
ELSE DO
SW_WRT = 4
CALL XXXX_WRITE_FILE
END
CALL XXXX_CLOSE_FILES
CALL XXXX_LIBERA_ARCHIVO

VARRET = CODRET'|'||SW_ERR'|'||MSGRET'|'||ODSN'|'||CLEI'|'||CWRI
EXIT VARRET;
Saludos desde Mexico DF
----------------------------------------------------
Lo importante no es saber ..... sino tener el telefono del que sabe .... :-))

os390
Usuario
Usuario
Mensajes: 10
Registrado: 09 Nov 2006, 18:57
País: PERU
Ciudad: LIMA
Ocupación: Analista de desarrollo
Ubicación: LIMA, PERU

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por os390 » 16 Dic 2013, 13:09

si se puede llmar un rexx desde un jcl directamete e incluso pasarle parametros

slds
hOLA,

cuburu

Re: LLAMAR FUNCIÓN REXX - JCL

Mensaje por cuburu » 11 May 2014, 15:17

Hola,
Mmm... por lo que pude leer y alcanzar a entender lo que intentas hacer es pasar parámetros (los campos de cada registro) a una función de rexx. De entrada pasar registro por registro leido en el JCL al REXX (desconozco sí el JCL puede realizar esta acción cíclica en particular). Ahora bien, sí esto fuese posible lo que se debería de hacer es crear un programa principal desde donde llames a la función rexx que deseas, imaginando que dicha función ya la tienes creada y por ello deseas hacer uso de la misma sin crear más código. Para ello sería

CÓDIGO DE JCL

Código: Seleccionar todo

//PROGREXX EXEC PGM=MainProg
//**************************************************************
//* EN ESTE PASO COLOCAS LAS BIBLIOTECAS DONDE RESIDE TU PROGRAMA PRINCIPAL Y EL QUE CONTIENE LA FUNCIÓN QUE DESEAS LLAMAR 
//**************************************************************
//SYSEXEC DD DSN=BIBLIOTECAS.CON.TUS.PROGRAMAS.REXX,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SALIDA DD DSN=TU.ARCHIVO.RESULTADO,DISP=(,CATLG),SPACE=(CYL,(xxx,xxx)),UNIT=SYSDA
//SYSTSIN  DD *
%nombre_del_programa_principal   parm1 parm2 parm... parmN
/*
Después de que ya tengas el JCL para llamar a tu REXX lo que sigue es, en el programa principal, llamar a la "función" con la que previamente cuentas y pasarle los mismos parámetros que estas recibiendo desde el JCL.

Código: Seleccionar todo

/*REXX*/

/* Puedes usar varias formar para pasarle parámetros a un programa REXX. Utiliza la que más te acomode y cubras tus necesidades*/
call FUNCION_REXX arg(1) arg(2) arg(3) arg(n)

parse arg Parm1 Parm2 Parm3 ParmN
call FUNCION_REXX Parm1 Parm2 Parm3 ParmN

call FUNCION_REXX DÍAS_NATURALES Parm1 Parm2 Parm3 ParmN

/*Obviamente la estructura está pensada imaginando que la función REXX está preparada para recibir datos de cualquiera de estas formas presentadas.*/

Suerte y espero haberte ayudado y entendido lo que necesitabas :arriba:

Responder