Вы находитесь на странице: 1из 24

Advanced REXX Programacin Profesional

Copyright 2005 - N. Bocalandro

Advanced REXX Captulo 4


Porque avanzado

Se espera que un REXX cumpla una serie de requisitos para que se lo considere profesional o avanzado:
Estandares prediseados por la instalacin. RAS (Reliability,Availability,Serviciability) Signal ON . Diagnstico automtico. Documentacin. Pseudo cdigo (si fuera necesario).
Copyright 2005 - N. Bocalandro 2

Advanced REXX Captulo 4


Guidelines

1.

Buenos comentarios. (Un comentario por linea si es posible o necesario) Layout


Prlogo que contiene:
Funcin de esta REXX. Descripcin de parmetros de invocacin (detallada y sus defaults) Descripcin de TODOS los cdigos de retorno. Programas o REXX externas llamadas. Quienes invocan a esta REXX y desde que entorno (si es posible). Descripcin breve de subrutinas/funciones internas principales. Historia de los cambios.

2. 3. 4.

Codigo principal. Subrutinas (con su propio prlogo). Rutinas de recovery (con su propio prlogo).

Nombre de variables lgicos y breves. Diseo del flujo estructurado, natural y de acuerdo al usuario. Analizar SIEMPRE los cdigos de retorno de los comandos externos. Evitar a toda costa trucos que demuestran que se mucho de REXX. Cdigos de retorno lgicos y DOCUMENTADOS.
Copyright 2005 - N. Bocalandro 3

Advanced REXX Captulo 4


Signal
Signal es equivalante a GO TO pero tiene otros usos mejores.
Goto labelname Goto contenido expression Idem anterior Disable traps +--------------------------------------------------+ >>--SIGNAL----labelname--------;-------------->< +---expression------ +-VALUE-+ +-OFF---ERROR------- +-FAILURE- +-HALT---- +-NOVALUE- +-SYNTAX--+ +-ON---ERROR--------+ +-FAILURE- +-NAME--trapname-+ +-HALT---- +-NOVALUE- +-SYNTAX--+ +--------------------------------------------------+

Enable traps RC=0 Idem anterior (casi igual) Interrupcin Variable no asignada Error de sintaxis trapname es el label de la rutina de recovery

Ver TSO/E REXX Reference en TSO/E Bookshelf para su uso


Copyright 2005 - N. Bocalandro 4

Advanced REXX Captulo 4


Testeo de una REXX

El esfuerzo de testeo depende de que tan intensivo va a ser su uso y quien la va a usar (nosotros, usuarios finales, etc). Testear TODAS las lineas de cdigo. Forzar errorres ya sea en datos como dentro de la misma REXX. Usar la instruccin TRACE para el testeo.
1. 2. 3. 4. TRACE R (results) Trace N (normal ) Trace O (OFF) A, C, E, F, I, L, S, ?, !

(otras opciones)

EXECUTIL TS (antes de ejecutar la exec fuerza el TRACE desde afuera) TRACE() (Funcin muy util) Comandos inmediatos tiles para toda ocasin (PA1 mediante):
1. 2. 3. 4. HE Halt execution HI Halt execution TS Trace start TE Trace end
Copyright 2005 - N. Bocalandro 5

Advanced REXX Captulo 4


Subrutinas y funciones (cont)
Si no encuentra un label busca una REXX externa con ese nombre. Todo es igual salvo que no comparten el pool de variables. Si es una funcin cambia ligeramente la sintaxis: EJ: ........ parm1=6 /* valor para la funcin */ a= rutina1(parm1) /* invoco la funcion y el resultado lo pongo en A */ say a /* se ver 3 en la pantalla */ Exit /* Fin de la exec */ Rutina1: /* comienza la funcin */ arg p1 /* leo el argumento */ z = p1 / 2 /* codigo de la funcin */ Return z /* retorno con el resultado */
Copyright 2005 - N. Bocalandro 6

Advanced REXX Captulo 4


Manejo de datos
Hasta ahora hemos visto que hay variables. Un arreglo especial de variables es denominado STEM. Un STEM es un vector (o una matriz) y se compone de n elementos. Cada uno se denomina xxxx.subindice donde xxxx es el nombre del stem y subindice es el nombre del elemento (un vector) o xxxx.x.y donde xxxx es el nombre del stem y X e Y son los subindices de la matriz, en este caso de 2 dimensiones, pero puede ser de tantas como les de la memoria de la mquina. EJ: A.1=Norberto A.2 =Pepe Vector de 3 elementos A.3=Carlos A.0=3 (un caso tpico en vectores, en el elemento 0 de pone la longitud del vector)
Copyright 2005 - N. Bocalandro 7

Advanced REXX Captulo 4


Manejo de datos (cont.)
Una matriz contiene mas de un subindice. STEM.X.Y.Z es una matriz tridimensional. EJ: A.1.1.1=Norberto A.1.1.2=Pepe A.1.1.3=Carlos A.1.2.1=Fernando A.1.2.2=Diego Matriz tridimensional A.1.2.3=Yugo A.2.1.1=Guille A.2.2.1=Ricardo A.0.2.1=Miguel

Copyright 2005 - N. Bocalandro

Advanced REXX Ejercicio 5


Manos a la obra
1. Escribir una REXX de manera profesional hasta donde hemos visto. Invocar una subrutina interna que divida una variable por 2 y haga display de la misma Igual al anterior pero con una funcin interna. Igual a las 2 anteriores pero con subrutina o funciones externas. Usar SIGNAL ON ... en la primera de las REXX de este ejercicio. Use trace para Debug Intente algo mas complicado (use los conocimiento del curso previo) por ejemplo un STEM con valores numricos de entrada y de salida otro STEM con los mismos valores multiplicados por los elementos correspondientes de un tercer STEM. (Multiplicacin de vectores).
Copyright 2005 - N. Bocalandro 9

2.
3. 4. 5. 6. 7.

Advanced REXX Captulo 5


Host commands

Un comando externo es denominado Host command, y puede ser de TSO de ISPF, de Netview, etc. A cada uno de esos entornos los llamaremos Host command enviroment. Por default se va a TSO, pero puedo alterar esto con la sentencia REXX address(xxxxxx) donde xxxxx es el enviroment que deseo usar. Para volver al anterior enviroment uso address(). EJ: Address(TSO) /* switch a TSO */ TIME /* ejecuto el comando TIME */ Address() /* vuelvo al entorno anterior */ Address TSO TIME /* es equivalente a lo anterior */

Copyright 2005 - N. Bocalandro

10

Advanced REXX Captulo 5


Host enviroments
Enviroments disponibles:
TSO ISPEXEC ISREDIT CONSOLE MVS LINK/ATTACH APPCMVS Provisto por algun producto (ej: Netview) Escrito por Uds.

RECUERDEN SIEMPRE ANALIZAR EL CDIGO DE RETORNO DE LOS COMANDOS (viene en la variable llamada RC)

Copyright 2005 - N. Bocalandro

11

Advanced REXX Captulo 5


TSO enviroment
Se pueden ejecutar comandos de:
1. 2. 3. 4. 5. 6. 7. TSO IDCAMS RACF HSM TCP/IP OMVS Productos con interface a TSO Programas Clist o REXX.

O bien
1. 2.

De donde se ejecutan:
1. 2. 3. 4. REXX de la DD SYSEXEC o SYSPROC CLIST de la DD SYSPROC Programas de la DD STEPLIB o ISPLLIB Programas de LPA o de LINKLIST
Copyright 2005 - N. Bocalandro 12

Advanced REXX Captulo 5


OUTTRAP
Este comando permite capturar la salida de un comando de TSO. Esta informacin es puesta en un stem. Se la usa como funcin externa EJ: x=outtrap(line.) /* comienzo captura */ TIME /* comando de TSO */ x=outtrap(off) /* finalizo captura */

Do i=1 to line.0 Say line.i End


/* analizo el stem /* muestro la linea /* finalizo DO

*/ */ */

x es tan solo de forma, no se usa su contenido. (es el RC ) Se pueden atrapar tantos comandos como se quiera, pero una buena prctica es de a uno por vez. Captura solo comandos de TSO bien escritos (no soporta macros TPUT o WTO)
Copyright 2005 - N. Bocalandro 13

Advanced REXX Captulo 5


El stack

El stack es un area de memoria para guardar elementos. Normalmente lo mismo que entro por el teclado. Se lo maneja con 3 sentencias:
1. 2. 3. Push Pull Queue Queued() Introduce un elmento arriba (LIFO) Saca un elemento de arriba Introduce un elemento abajo (FIFO) Devuelve la cantidad de elementos en el stack

Para saber cuantos elementos hay se usa:


1.

Si se acaban los elementos del stack el PULL lee el teclado de la terminal. Si se quiere leer el teclado sin importar el stack se usa:
1. Parse external

Recuerden que PULL es PARSE UPPER PULL abreviado


Copyright 2005 - N. Bocalandro 14

Advanced REXX Captulo 5


Usos del STACK
Se lo puede usar para pasar variables entre REXXs. Se lo usa para programas como el FTP que requieren intervencion manual leyendo la terminal. Se lo puede usar para el EXECIO Permite enviar comandos al llamador de una exec cuando esta termina. Se pueden usar varios stack al mismo tiempo. (OJO, hay que saberlo hacer muy bien)
1. 2. 3. 4. MAKEBUF DROPBUF NEWSTACK DELSTACK Crea un nuevo buffer de stack Deletea un buffer de stack Crea un nuevo stack Destruye un stack

Cuando una REXX termina el stack es leido por el TSO, por eso se DEBE usar DROPBUF para limpiar el mismo previo a terminar una REXX.
Copyright 2005 - N. Bocalandro 15

Advanced REXX Captulo 5


EXECIO
Es la manera de hacer I/Os con REXX. Debe estar alocada la DD contra la que se hace el I/O. Solo datasets secuenciales o miembros de particionados. Sintaxis: EXECIO numlineas funcion ddname ( STEM stemname FINIS

numlineas: cantidad de lineas a transferir funcin: DISKR (read) DISKW (write) DISKRU (read for update) ddname: nombre de la DD STEM : si est indica operacin con stem stemname: nombre del stem si es usado FINIS : si est hace CLOSE del archivo Si no se usa stem va contra el stack Tiene mas opciones (ver el manual)
Copyright 2005 - N. Bocalandro 16

Advanced REXX Ejercicio 6


Manos a la obra
1. 2. 3. 4. 5. 6. 7. 8. Leer un archivo y decir cuantos registros tiene. Leer un archivo y mostrar (say) las lineas impares. Leer un archivo y grabarlo en sentido inverso. Leer un archivo y grabar solo los registros que cumplan ciertas condiciones. (a su eleccin). Idem 4 pero yo indique las condiciones. Atrapar la salida de un listcat y grabarla en un archivo. Hacer un FTP con una REXX contra la misma maquina y ejecutar un LS. Intente algo que normalmente usa en su tarea cotidiana y que hoy realiza manualmente.

Copyright 2005 - N. Bocalandro

17

Advanced REXX Captulo 6


Parsing
Sirve para manejar datos seprandolos en distintas variables. Es fundamental si uno pretende usar el REXX como se debe. Solo una sentencia: PARSE (y sus abreviadas PULL y ARG) Ocho fuentes posibles para el PARSE
1. 2. 3. 4. 5. 6. 7. 8. ARG PULL External VAR VALUE ... WITH SOURCE VERSION NUMERIC Argumento cuando se invoca Stack o teclado Teclado Una variable Expresin como fue invocado Versin de REXX Info sobre el ambiente numrico en uso

Tiene una cantidad importante de variantes. Ver el manual


Copyright 2005 - N. Bocalandro 18

Advanced REXX Captulo 6


Parsing (cont.)
Templates:
Usar blanco como delimitador. (clsico) Usar columnas para parsear o posiciones relativas. Usar literales como separadores. Usar . para descartar una parte de los datos. Forzar todo a maysculas. EJ:

Parse upper arg p1 p2p p3 . Lee los tres primeros parmetros, en maysculas y descarta el resto Parse var 18:40:35 hh : mm : ss Parsea la hora en hh mm ss Parse arg command ( parms Lee argumentos y lo que est antes del (lo pone en commands y el resto en parms respetando minsculas. Parse pull 5 var1 +2 14 var2 +3 . La var1 empieza en columna 5 y es de 2 de longitud, y var2 empieza en 14 y es 3 de longitud. Respeta minsculas y descarta resto.
Copyright 2005 - N. Bocalandro 19

Advanced REXX Ejercicio 7


Manos a la obra
Escribir las siguientes REXX:
1. 2. Input hora hh:mm:ss salida diferencia con la actual en hh:mm:ss Reformatear la salida del comando LISTALC STATUS para que quede encolumnado el nombre de la DD, luego el nombre del DATASET y finalmente la DISP. Averiguar si se tiene acceso a un dataset (por RACF) sin provocar una violacin. El nombre del dataset se debe pasar como parmetro. Averiguar el address space ID del usuario de TSO que est usando, con comandos de consola, y mostrarlo con un SAY. De un dataset especfico leer cuantas palabras se repiten y que cantidad de veces cada una. Grabar la salida en otro archivo encolumnado. Las que estan una sola vez descartarlas. Mejorar la REXXTRY para que no falle an ingresando mal los datos.(Use SIGNAL ....)
Que necesidad tienen hoy para usar REXX. Intentelo resolver.
Copyright 2005 - N. Bocalandro 20

3. 4. 5.

6.

7.

Advanced REXX Captulo 7


Algunos comandos de TSO Equivalencias entre JCL y TSO
1. 2. 3. 4. ALLOC es similar a DD solo que cuando se finaliza el uso de la misma se debe ejecutar el comando FREE EXEC ejecuta execs y no programas Para ejecutar programas se debe usar CALL. Call tambien se usa para invocar otras REXX o CLIST Se usa el programa IKJEFT01 Se debe usar la DD SYSPROC o la SYSEXEC para que encuentre las REXX a ejecutar El input va en SYSTSIN y el output en SYSTSPRT

Para correr una REXX en batch


1. 2. 3.

Copyright 2005 - N. Bocalandro

21

Advanced REXX Captulo 7


TSO Batch Se usa para no bloquear la terminal mientras se ejecuta la REXX EJ:
00010000 00173300 00173400 00173500 00210104 00211006 00220006 00230010 00240002

//xxxxTST JOB MSGCLASS=X,CLASS=A,NOTIFY=&SYSUID //*********************************************************** //** TSO BATCH ** //*********************************************************** //AA1 EXEC PGM=IKJEFT01,TIME=1440,DYNAMNBR=250 PARM='TEST1 ' //STEPLIB DD DISP=SHR,DSN=REXX.V1R3M0.SEAGLPA //SYSEXEC DD DSN=xxxx.EXEC,DISP=SHR //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * LU &SYSUID

Se puede usar la SYSTSIN o pasar un parmetro en la tarjeta EXEC


Copyright 2005 - N. Bocalandro 22

Advanced REXX Captulo 7


Console
Se pueden ejecutar comandos de consola desde una REXX, capturar su salida, etc. Se necesita autoridad para ejecutar el comando CONSOLE EJ:
CONSPROF SOLDISPLAY(NO/YES) SOLNUM(xxx) CONSOLE ACTIVATE ADDRESS CONSOLE nnnnnnnnnnnnnnnnnn

Para capturar la salida de los comamdos se usa GETMSG EJ:


Getcode = GETMSG(MSG.,SOL,,,3) Espera 3 segundos por la respuesta y la pone en el Stem MSG. Y solo si es un msg solicitado

Copyright 2005 - N. Bocalandro

23

Advanced REXX Ejercicio 8


Manos a la obra Escribir las siguientes REXX:
1. 2. 3. 4. 5. 6. Ejecutar un IEBGENER pero online Ejecutar una REX de su eleccin (de las ya escritas) pero batch. Leer un archivo y submitirlo Armar un JCL dinamico y submitirlo con el comando SUB IDEM pero con intrdr Armar una REXX y tirar algn comando de DISPLAY en la consola IDEM anterior pero capturando la salida Con una REXX displayar el numero de buffers de consola en uso Grabar en un archivo lo que hay en maquina cada 5 minutos.
Copyright 2005 - N. Bocalandro 24

7. 8.
9.

Вам также может понравиться