Tso Para Desarrolladores Nr 33933

374
TSO para desarrolladores - MVS - JCL - CLIST - ISPF José María Peco Palacios ************************* (2/7/1995)

Transcript of Tso Para Desarrolladores Nr 33933

Page 1: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores - MVS - JCL - CLIST - ISPF

José María Peco Palacios *************************

(2/7/1995)

Page 2: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 2 de 374

Tema 1: MVS 1.1 Generalidades 1.2 Versiones del MVS 1.3 Componentes principales del MVS 1.4 Usuarios de MVS 1.5 Componentes de Hardware 1.5.1 Procesadores y subsistemas de Canales 1.5.2 Dispositivos de Memoria Auxiliar. 1.5.3 Periféricos y consolas 1.5.4 Unidades de control 1.6 JES: Subsistema dedicado a la gestión de trabajos Batch 1.6.1 Iniciadores 1.6.2 SPOOL 1.6.3 Fichero de check-point 1.7 Los ficheros en MVS 1.7.1 Tipos de organizacion en ficheros no-VSAM 1.7.2 Tipos de registro 1.7.3 Organizacion VSAM 1.7.4 Acceso y recuperación de datos 1.8 Librerías que contienen el MVS 1.9 Bibliografía

Page 3: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 3 de 374

Tema 2 : JCL 2.1 Introducción 2.2 Definiciones previas 2.3 Formato general de las sentencia del JC 2.3.1 Etiqueta 2.3.2 Operación 2.3.3 Operadores o parámetros 2.4 Sentencia JOB 2.4.1 Informacion de contabilidad 2.4.2 Nombre del programador 2.4.3 ADDRSPC 2.4.4 CLASS 2.4.5 COND 2.4.6 MSGCLASS 2.4.7 MSGLEVEL 2.4.8 NOTIFY 2.4.9 PERFORM 2.4.10 REGION 2.4.11 RESTART 2.4.12 TIME 2.4.13 TYPRUN 2.5 Sentencia EXEC 2.5.1 PGM 2.5.2 PROC 2.5.3 ACCT 2.5.4 ADDRSPC 2.5.5 COND 2.5.6 PARM 2.5.7 REGION 2.5.8 TIME 2.6 Sentencia DD : Definición de datos 2.6.1 * (asterisco) 2.6.2 DATA 2.6.3 DLM 2.6.4 DUMMY 2.6.5 SYSOUT ( para ficheros de impresión) OUTLIM=n COPIES=n HOLD=YES DEST=dispositivo DCB=(par1[,par2[...]]) UCS (Universal Character Set) FCB (Form Control Buffer) BURST=Y CHARS=(tabla0[,tabla1[,tabla2[,tabla3]]]) MODIFY=(modulo,tabla_n) 2.6.6 COPIES (salida de impresión) 2.6.7 DEST ( ficheros de impresión ) 2.6.8 HOLD (para ficheros de impresión ) 2.6.9 FREE (para ficheros de impresión y de datos) 2.6.10 DSNAME (DSN) 2.6.11 DDNAME

Page 4: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 4 de 374

2.6.12 DISP 2.6.13 SPACE 2.6.14 VOLUME 2.6.15 UNIT 2.6.16 DCB 2.6.17 DATACLASS 2.6.18 LABEL 2.7 Sentencia OUTPUT 2.8 Sentencias DD especiales 2.9 Procedimiento 2.10 Utilidades 2.10.1 IEFBR14 2.10.2 IEBGENER 2.10.3 IEBCOPY 2.10.4 IEBPTPCH 2.10.5 IEBCOMPR 2.10.6 IEBUPDATE 2.10.7 IEHINITT 2.10.8 IEHLIST 2.10.9 IEHPROGM 2.11 Programas especiales 2.11.1 IEKFJ01 2.11.2 SORT SORT MERGE RECORD ALTSEQ INCLUDE / OMIT INREC / OUTREC SUM 2.11.3 IDCAMS Catalogo Fichero generacional (GDG) Copiar ficheros Listar ficheros Borrar ficheros 2.11.4 PRINTDS (comando de TSO) 2.12 Anexo: Listar un directorio (IEBPTDIR) 2.13 Anexo: LIstado de la VTOC y el directorio de un PDS IEHLIST.1

Page 5: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 5 de 374

Tema 3 : CLIST 3.1 Introducción 3.2 Librerías de CLISTs 3.3 Como se invoca a un procedimiento de CLIST 3.3.1 De forma explícita: 3.3.2 De forma implícita 3.3.3 Desde READY 3.3.4 Desde otra clist 3.3.5 Desde un programa de aplicacion 3.4 Variables 3.4.1 Variables de control 3.4.2 Variables de usuario simples 3.4.3 Variables de usuario compuestas 3.4.4 Uso del doble & (&&) : Variables anidadas 3.4.5 Variables indexadas 3.5 Operadores y expresiones 3.6 Etiquetas 3.7 Sentencias del lenguaje de CLIST 3.7.1 CONTROL : Estable opciones para el proceso de la CLIST MSG / NOMSG PROMPT / NOPROMPT LIST / NOLIST CONLIST / NOCONLIST SYMLIST / NOSYMLIST FLUSH / NOFLUSH MAIN END(cadena) 3.7.2 PROC : Primera instrucción de una CLIST 3.7.3 ERROR : rutina para el tratamiento de errores 3.7.4 GOTO : salto incondicional 3.7.5 EXIT : Salir de la clist 3.7.6 RETURN : Retornar al punto desde el que se bifurco a una rutina 3.7.7 WRITE : Escribir datos en el terminal 3.7.8 WRITENR : Escribir en el terminal y no ejecutar el <CR> 3.7.9 READ : Lee datos desde el terminal 3.7.10 IF-THEN-ELSE : Para bifurcacion 3.7.11 SET : permite asignar valores a variables 3.7.12 DO-WHILE END : Repetitiva mientras se cumple una condición. 3.7.13 OPENFILE : Abrir fichero 3.7.14 GETFILE : Lee el siguiente registro de un fichero secuencial 3.7.15 PUTFILE : Escribe un registro en un fichero físico. 3.7.16 CLOSEFILE : Cierra el fichero 3.7.17 ATTN : Rutina de ATENCION 3.7.18 TERMIN 3.7.19 READDVAL : Separar la informacion contenida en &SYSDVAL 3.7.20 GLOBAL : define variables globales 3.8 Comandos de TSO 3.9 Funciones estandar 3.9.1 &DATATYPE : Determinar tipo de variable 3.9.2 &EVAL : Evaluar el contenido de una expresión 3.9.3 &LENGTH : Determinar la longitud de una expresión

Page 6: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 6 de 374

3.9.4 &NRSTR : Determina que no se realicen sustituciones con && 3.9.5 &STR : Determina que el contenido del argumento es una cadena 3.9.6 &SUBSTR : Extrae una subcadena de una cadena o de una variable 3.9.7 &SYSCAPS : Pasa a mayúsculas el argumento 3.9.8 &SYSDSN : Determina si existe como dataset el argumento 3.9.9 &SYSINDEX : Buscar un carácter en una cadena 3.9.10 &SYSLC : Pasa a minusculas el argumento pasado 3.9.11 &SYSNSUB : Determina el nivel de sustituciones. 3.10 Ejemplos 3.10.1 JMPALO00 : Paso a fichero de las librerías alocadas 3.10.2 DISPLAY1 : visualizar en panel el fichero generado con JMPALO00 3.10.3 JMPLIB00 : capturar los miembros de una libreria 3.10.4 JMPLIB05 : 3.10.5 LISTAR : Listar por impresora, con IEBGENER un fichero 3.10.6 NAT

Page 7: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 7 de 374

Tema 4 : DIALOGOS ISPF 4.1 Generalidades 4.2 Variables 4.2.1 Variables del sistema ZCMD ZSEL ZPRIM ZPARENT 4.2.2 Variables de Usuario 4.2.3 Variables de control 4.3 Sentencias 4.3.1 Sentencias de asignación 4.3.2 Sentencias de verificación 4.3.3 Sentencia IF 4.3.4 Sentencia VGET 4.3.5 Sentencias VPUT 4.3.6 Sentencias REFRESH 4.4 Mensajes 4.5 Funciones 4.5.1 Función TRUNC 4.5.2 Función TRANS 4.5.3 Función PFK 4.5.4 Función LVLINE 4.6 Panel 4.6.1 Sección ATTR 4.6.2 Sección BODY 4.6.3 Sección INIT 4.6.4 Sección PROC 4.6.5 Sección REINIT 4.6.6 Sección MODEL 4.6.7 Sección END 4.7 Tablas ISPF 4.8 Función 4.8.1 Servicios Generales DISPLAY SETMSG SELECT 4.8.2 Servicios para el Tratamiento de tablas TBDISPL TBCREATE TBOPEN TBSORT TBSTATS

Page 8: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 8 de 374

TBQUERY TBSAVE TBCLOSE TBEND TBERASE 4.8.3 Tratamiento de filas TBADD TBDELETE TBEXIST TBGET TBMOD TBPUT TBSARG TBSCAN TBVCLEAR 4.8.4 Servicios para el posicionamiento TBTOP TBSKIP TBBOTTOM 4.8.5 De FILE TAILORING FTOPEN FTINCL FTCLOSE FTERASE 4.8.6 De variables VGET VPUT 4.8.7 Definición de librerías 4.8.8 Otros servicios 4.9 Tutorial

Page 9: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: TABLA DE CONTENIDOS Autor: José M. Peco

Página 9 de 374

4.10 Ejemplos: 4.10.1 Pasar un archivo particionado o PDS a fichero secuencial. Clist principal: Panel: INTUTIPS Esqueleto : INTUTIPS 4.10.2 Listar archivo por impresora: Panel: Clist LISTAR Formato:

Page 10: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: PRÓLOGO Autor: José M. Peco

Página 10 de 374

Prologo El pasado año, al guardar todos los apuntes y anotaciones que había ido recopilando a lo largo de los últimos años, pues cambiaba de trabajo y de entorno, se me ocurrió la idea de escribir este libro. Mis pretensiones no eran otras que las de poder ofrecer a todos aquellos que se incorporan año tras año a este mercado de trabajo, esa experiencia que tantas veces eche en falta, ya que no disponía de ningún libro que me pudiera contestar los interrogantes que se planteaban según la situación. Desde que termine la carrera, y de esto hace ya tiempo, siempre he trabajado en el entorno de grandes sistemas, pero en la parte correspondiente a desarrollo de aplicaciones. Y, por curioso que parezca, es en estas grandes instalaciones, donde bien por tener los manuales en el departamento de sistemas, o bien porque estos están en inglés, se echa de menos un libro de consulta, que supla los manuales de usuario, guías de referencia y que tenga ejemplos que resuelvan las dudas mas elementales de todos aquellos que para algún tema puntual se salen fuera del entorno en el que trabajan para entrar en el sistema. Como seguramente el lector conoce, los grandes sistemas de ordenadores tienen a su personal del centro de proceso de datos (CPD) dividido en dos mundos, el mundo de sistemas, y el de los desarrolladores. Tanto unos como otros reciben formación especifica de los temas que necesitan para desarrollar su trabajo. Pero muchas veces los desarrolladores necesitan hacer cosas que, por desconocimiento del mundo de sistemas, son consideradas imposibles o son resueltas dando demasiadas vueltas. Este libro va dirigido precisamente a los desarrolladores, si bien el personal que se inicie en sistemas puede beneficiarse de su uso por tratar profusamente el sistema de programación interactiva en TSO (Time Sharing Option) de IBM El libro se compone de 4 temas, que precisamente son los que un desarrollador que trabaje bajo TSO debe conocer. Y, posiblemente los temas tratados no tengan la profundidad ni expongan todas las opciones que cada una de las sentencias cuente, pero para eso están los manuales de referencia, pero si puedo asegurar, desde mi modesta opinión, que con lo aquí expuesto se pueden desarrollar utilidades 'muy útiles' en cualquier entorno TSO, ya que se hace uso únicamente de comandos, instrucciones y parámetros estándar.

Page 11: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: PRÓLOGO Autor: José M. Peco

Página 11 de 374

El primer tema: MVS es un tema de introducción que no pretende explicar el sistema operativo, sino simplemente posicionar al lector en la terminología y en los elementos que se referenciaran en los temas posteriores. El segundo tema: JCL trata el lenguaje usado para el control de trabajos BATCH. Este lenguaje es uno de los mas usados en cualquier instalación, pero no siempre bien aprovechado ya que se usan únicamente las opciones básicas. El tercer tema se dedica al lenguaje de comandos CLIST. Este es un lenguaje que tradicionalmente es usado por el personal de sistemas para preparar entre otras cosas las utilidades y el entorno que necesita todo el personal que quiera hacer uso del ordenador. Es un lenguaje sencillo, no requiere procesos de compilación, y su conocimiento beneficiara y mejorara el rendimiento del personal de desarrollo pues permitirá simplificar y personalizar las labores cotidianas. El ultimo tema se dedica a estudiar los servicios de ISPF, siendo este un producto de IBM para facilitar el uso de las utilidades del sistema operativo, también es un elemento mas del sistema que permite la creación de diálogos mediante una adecuada combinación de procedimientos de clist y servicios ISPF. Es muy fácil su implementación y muy elevado el rendimiento obtenido. Todo este conjunto he procurado documentarlo con un gran numero de ejemplos que sirvan además de utilidades con las que espero hacer mas inteligible y amena su lectura. Por ultimo, quiero desde aquí, dar las gracias a todos aquellos que me han ayudado en la confección de este libro, y muy especialmente a Ferran Palau i Fernandez.

Page 12: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 12 de 374

Tema 1 : MVS 1.1 Generalidades El MVS es el sistema operativo de IBM para sus grandes procesadores. Normalmente, los ordenadores que utilizan este S.O. suelen estar destinados a la gestión masiva de datos permitiendo funciones de multiprogramación y multiproceso, y dan soporte a uno o varios sistemas de teleproceso. El termino de MULTIPROGRAMACIÓN se da a aquellos sistemas que permiten la ejecución simultanea de varios procesos en el ordenador, repartiendo el tiempo de ejecución entre las distintas secuencias de instrucciones de cada uno de los programas. Mientras que el termino de MULTIPROCESO se aplica a aquellos sistemas que por tener varios procesadores, tienen la capacidad de ejecutar dos o mas instrucciones en el mismo instante, y en consecuencia, pueden ejecutar dos o mas procesos al mismo tiempo. Por otra parte, como cualquier otro sistema operativo, este sistema incorpora herramientas interactivas para facilitar la gestión de las funciones principales de un Centro de Proceso de Datos (CPD). El nombre de MVS se corresponde con el acronimo de Múltiple Virtual Storage, recogiendo este nombre de su funcionamiento ya que para su gestión se basa en los conceptos de paginación y memoria virtual. En general, en una instalación de MVS, se pueden encontrar los siguientes elementos: - MVS básico (MVS release 3.8) - ISPF Interactive System Productivity Facilitys Este es un producto que se ejecuta bajo TSO, contiene un editor y numerosos programas de utilidad que facilitan el uso de numerosos servicios que permiten el desarrollo de diálogos interactivos. - Software especifico para el mantenimiento de subsistemas específicos, capaces de optimizar entre otros, la gestión de ejecución de los trabajos Batch o la de almacenamiento de los datos. El mantenimiento del MVS es realizado directamente por IBM, pudiendo optarse por los métodos de: - Actualización de las mejoras según van apareciendo (PUT) - Sustitución total del MVS (CBIPO)

Page 13: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 13 de 374

1.2 Versiones del MVS Las diferentes versiones de los productos que acompañan al MVS básico, son las que establecen las diferentes versiones de este S.O.. Así, cuando se habla de: - la versión 1 de MVS, con sus diferentes revisiones (releases), se esta hablando de lo que comúnmente se conoce como MVS/370, pero se corresponde con el OS/VS1 versión 2, e introduce el concepto de Espacio de direcciones. - la versión 2 de MVS más sus diferentes releases componen el MVS/XA. (eXtended Architecture). Esta realmente fue una revisión de la versión anterior para solucionar la gran cantidad de problemas presentados en aquella. El MVS/XA es una versión que afecta tanto al hardware como al software ya que la memoria virtual pasa de 16 Mb a 2 Gb, necesitando 4 bytes para direccionar cada posición de memoria. - la versión 3 se corresponde con lo que se conoce como MVS/ESA (Enterprise System Architecture). Esta versión se diferencia de la anterior, entre otras cosas, en que puede direccionar hasta un máximo de 15 espacios de direcciones de 2 Gb. Así mismo esta versión introduce el uso de microcodigo.

Page 14: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 14 de 374

1.3 Componentes principales del MVS Como ya se ha dicho, el MVS es un compendio de rutinas del sistema operativo base, utilidades, subsistemas y productos, y todo el conjunto tiene por objetivo el resolver las necesidades planteadas por toda la instalación. Los subsistemas y productos más importantes son: VTAM Virtual Telecommunications Access Method Este método de acceso para comunicaciones fue creado por IBM a fin de aprovechar las nuevas capacidades del Hardware del S/370, de la memoria virtual, y de los terminales y unidades de control inteligentes. TSO Time Sharing Operation (Operaciones de tiempo compartido). Es un subsistema de IBM para poder acceder de forma interactiva a los servicios de MVS. Normalmente va acompañado de un producto a base de paneles, para hacer más sencillo su manejo. Este producto es ISPF/PDF. CICS Customer Information Control System (Sistema de control de información de clientes) Sistema de base de datos y comunicación de datos (DB/DC) de uso general para procesos interactivos. Suelen disponer de este sistema de teleproceso las instalaciones que trabajan con COBOL como lenguaje de programación. IMS Information Manager System (Sistema de administración de información) Fue uno de los grandes productos de IBM en sistemas DB/DC (DataBase/DataComunication). Suelen disponer de este sistema de teleproceso las instalaciones que trabajan con DL/I como base de Datos y PL/I como lenguaje de programación. DL/I Gestor de base de datos jerárquica DB2 Data Base 2 Gestor de base de datos relacional. JES Job Entry Subsistem (Subsistema de entrada de trabajos) Subsistema de entrada de trabajo (Gestor de trabajo por lotes). CONSOLAS Terminales maestros que controlan y gobiernan el sistema (Herramientas de operación).

Page 15: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 15 de 374

1.4 Usuarios de MVS Se entiende por usuario de un sistema operativo MVS, todo aquél que necesita y obtiene recursos de éste. Este concepto de usuario de MVS esta íntimamente relacionado con los tipos de trabajos que se van a ejecutar en el sistema, y que por lo tanto inciden en el S.O., por sus propias necesidades. 1.- Productos y subsistemas del propio MVS (Programas y Subsistemas necesarios para el funcionamiento de MVS, JES, VTAM, CICS, etc.) que van a resolver ciertas necesidades de los programas de aplicación. 2.- Usuarios de TSO. Usuarios que conectados a través de un terminal usan los servicios de MVS a través del producto interactivo TSO (tiempo compartido). 3.- Programas batch y aplicaciones, tanto por lotes como en modo on-line que accederán a la información residente en el ordenador, con el objeto de proporcionar unos resultados.

Page 16: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 16 de 374

1.5 Componentes de Hardware Algo vital en un sistema de proceso de datos es el entramado hardware donde se van a procesar y ejecutar todos los programas de la instalación. Se puede distinguir los siguientes componentes como elementos principales: 1.5.1 Procesadores y subsistemas de Canales MVS/ESA, está soportado por ordenadores IBM de la familia 3090 en sus diferentes versiones, y la familia 4381 modelos 91 y 92. Estos equipos pueden ser monoprocesadores (un solo procesador en máquina), cuyos modelos principales son: ES/3090 100 modelos S, ES/3090 150 modelos E y S. ES/3090 180 modelos E y S. ES/4381 modelos 90 y 91 E. O bien pueden ser multiprocesadores (varios procesadores en máquina) modelos: ES/3090 250S, 280E, 380E, 400E y S, 600E, y S. El subsistema de canales se puede definir como una pequeña máquina (con su software y hardware) particular, que libera al procesador de las funciones de operación de E/S pues este subsistema es el encargado de realizarlas de una manera autónoma, aunque limitada, pues su software solo le permite ejecutar las operaciones siguientes: - leer un bloque - escribir un bloque - leer hacia atrás - analizar - controlar (salto de línea en un impresora) - transferir en canal (bifurcar)

Page 17: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 17 de 374

1.5.2 Dispositivos de Memoria Auxiliar. Cualquier programa, para poder ejecutarse debe cargarse previamente en la memoria principal del ordenador, pero esta memoria es cara, volátil, pequeña y además no es suficiente para albergar la gran cantidad de datos, que necesita un C.P.D. para su funcionamiento. Por eso, todos estos datos son alojados en dispositivos auxiliares, y serán pasados a memoria central para su ejecución en su momento adecuado. Entre estos dispositivos auxiliares se pueden destacar los siguientes: 1. DISCOS Son los dispositivos de mayor capacidad. Un disco IBM, es en realidad un armario con dos volúmenes independientes. Los modelos existentes son: 1ª generación 2311, Tenían la característica de ser 2314 removibles y la capacidad de cada módulo 2319 era de 29 Mb. 2º generación 3330 Capacidad : 100 Mb Son semiremovibles 3ª generación 3340 34 Mb 3344 70 Mb 3350 3370 3375 409 Mb No son removibles 4ª generación 3380 su capacidad depende de la densidad, oscilando entre 630 a 1890 MB 2. Unidades de Cinta : 3420 Son unidades que permiten la grabación y lectura de la informacion soportada en cinta redonda, siendo este un almacenamiento externo con una capacidad máxima de 160 Mb. Entre sus características se puede destacar que utiliza el método de columna de vacío para preservar la rotura de la cinta. 3. Unidades de Cartucho: 3480 Son dispositivos de almacenamiento externo, parecidos a las cintas, pero con mayor velocidad de grabación y mayor capacidad de almacenamiento (200 Mb). Reciben el nombre de cinta cuadrada.

Page 18: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 18 de 374

1.5.3 Periféricos y consolas 1.- Impresoras A un ordenador IBM se puede conectar todo tipo de impresoras, locales 3800 y remotas 3274, 3825, 4250, etc. 2.- Terminales A un ordenador IBM se puede conectar cualquier tipo de terminal para recoger o sacar datos de éste en modo interactivo u on-line. Hay que tener en cuenta que hoy existen emuladores de todo tipo de terminal que facilitan esta conexión. Las conexiones que se pueden hacer son locales y remotas, es decir, a través de un controlador de comunicaciones, o utilizando la red telefónica como medio de transmisión de datos. 3.- Consolas Las consolas son unos terminales especiales, conectados directamente al ordenador y que sirven para el gobierno de todo el sistema. Lo normal es que exista una consola maestra y varias alternativas para realizar funciones específicas o bien como backup de la maestra.

Page 19: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 19 de 374

1.5.4 Unidades de control Son elementos hardware que controlan el funcionamiento y el acceso a los dispositivos, y son usados por el subsistema de canales. 1. Unidad de control de discos Existen varios modelos de estas unidades, entre los que se encuentran los tipos 3880 y 3990. De cada una de esta unidades pueden colgarse de 16 a 32 armarios de discos, por lo tanto controlan de 32 a 64 volúmenes. 2. Unidades de control de cintas y cartuchos Estas unidades son las encargadas de controlar la grabación y recuperación de datos de las unidades de cintas y cartuchos. Entre estas unidades tenemos los controladores de cinta 3480 y 3422 de IBM.

Page 20: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 20 de 374

1.6 JES: Subsistema dedicado a la gestión de trabajos Batch Su nombre proviene del acronimo de Job Entry Subsystem. Es decir es el encargado de gestionar la entrada de todos los trabajos. En los primeros sistemas operativos, este era el programa encargado de controlar las lectoras de tarjetas o fichas perforadas, y las impresoras; y como consecuencia ha heredado la función de interpretar las sentencias que se le envían como entrada para la ejecución de un trabajo. Existen dos versiones del JES: JES2 y JES3, pudiendo ejecutarse cualquiera de ellas con MVS. El JES2 es el resultado de la revisión del programa HASP (Houston Automatic Spooling Priority) del MVT (Multiprogramación con numero variable de tareas) mientras que el JES3 es el resultado de la revisión del programa ASP. Para ejecutar trabajos batch en MVS se puede utilizar cualquiera de las dos formulas siguientes: - ejecutar el comando de TSO SUBMIT para enviar a la cola de entrada de trabajos del JES el JCL que sirve de parametro a dicho comando; o - Escribiendo mediante cualquier programa o utilidad un JCL sobre la cola de entrada de trabajos del JES. Las principales funciones del JES son: - Gestión de entrada de trabajos en los iniciadores, en base a sus clases. - Verificación de la validez de la sintaxis del JCL. - Reserva y asignación de recursos (Fichas DD del JCL). - Interfase con MVS durante la ejecución de trabajos. - Gestión de salidas impresas en base a las clases de salidas de los diferentes impresos. Los tres componentes principales del JES son: - los iniciadores, - el spool y - el fichero de check-point.

Page 21: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 21 de 374

1.6.1 Iniciadores Los JOBs, mediante el parámetro CLASS, tienen asignado la clase de entrada del JES en la que se debe ejecutar. Los iniciadores son colas que tienen asignadas unas clases de proceso, y sirven para seleccionar trabajos a fin de repartir la carga de trabajos batch del sistema. La definición de los iniciadores y la asignación de las distintas clases a cada uno de ellos es misión del administrador del sistema. Las clases se definen con una letra o un número. Ejemplo : Supuesto que se ha submitido el JOB siguiente: //XXXXXXXX JOB CLASS=K ... Y que el sistema tiene definidos las siguientes relaciones: Iniciador Clases trabajos 1 ABC 8 2 ACK 15 3 AD 3 4 CE 5 El sistema podrá asignar dicho JOB solo al iniciador 2 pues es el unico que puede ejecutar los trabajos de la cola K. Suponiendo que en ese momento se encuentren 15 trabajos ejecutándose en dicho iniciador, el trabajo se encolara a la espera de tener hueco. Si en al mismo tiempo se submite otro trabajo para la cola A, este podrá ser asignado a cualquiera de los inicadores 1,2 o 3. Asi, si el iniciador 1 esta ejecutando menos de 8 trabajos. será asignado a este JOB; en caso contrario, se examinara el 2, que esta con sobrecarga. por lo que se examina el iniciador 3, que como no tiene trabajos en ejecución, será quien finalmente ejecute el trabajo.

Page 22: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 22 de 374

1.6.2 SPOOL El Spool es un fichero gestionado y controlado por el JES y que tiene por misión es contener todos los trabajos que estén: - ejecutándose, - en espera de ejecutar, o - en espera de salida. Para poder realizar esta gestión, el spool se organiza formando colas, entre las que cabe destacar: COLAS DE ENTRADA: En esta cola están todos los trabajos que se encuentran esperando un iniciador libre asignado a su clase para poder ejecutarse. Los trabajos se encuentran clasificados por la identificación de la cola asignada al JCL mediante el parámetro CLASS de la ficha JOB. COLAS DE EJECUCION: En esta cola se encuentran los trabajos que en ese momento están en ejecución. También se encuentran los trabajos en esta cola clasificados por clase. COLAS DE SALIDA: En esta otra cola se encuentran aquellos trabajos que hayan terminado, y estén esperando una salida impresa. También en esta cola la informacion se encuentra clasificada por el identificador de la cola asignada a las salidas generadas, que no tiene por que coincidir con la definida a nivel de JOB.

Page 23: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 23 de 374

1.6.3 Fichero de check-point Este fichero es en el que se basa el JES para establecer las operaciones a realizar. Contiene una referencia de todas las colas de entrada y salida, además de los trabajos en ejecución, por lo que este es el fichero que consulta y mantiene el JES para, explorando las colas, saber cual es el trabajo que debe atender en primer lugar; y una vez establecido este, accede el SPOOL, donde se encuentra realmente el JCL, para enviarle a ejecución, al tiempo que actualiza el estado de los ficheros con las colas afectadas. Normalmente, en las instalaciones se definen varios ficheros de SPOOL, pero en cambio,solo se define un fichero de chek-point, y opcionalmente otro, que sirve como una copia del primero, para poder reactivar las funciones del JES, en caso de error en el primer fichero de chek-point. La configuración de todo este sistema es labor del departamento de técnica de sistemas.

Page 24: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 24 de 374

1.7 Los ficheros en MVS En MVS como en cualquier otro sistema operativo, la informacion se encuentra agrupada en conjuntos homogéneos, recibiendo cada conjunto la denominación de fichero o Data-set. En MVS el nombre de los ficheros se forma agrupando calificadores y separando estos con un punto. Cada uno de los calificadores puede tener una longitud máxima de 8 caracteres alfanuméricos, no pudiendo empezar por dígito ni por un carácter especial con excepción del $ que es valido. La longitud máxima del nombre de un fichero no puede superar los 44 caracteres. y debe tener al menos dos calificadores, exceptuando los ficheros temporales, cuyo nombre se forma anteponiendo un & a un unico calificador. El nombre completo de un miembro de un fichero particionado se forma escribiendo el nombre del fichero y entre paréntesis el miembro a procesar. Además, MVS contempla también ALIAS para los nombres de ficheros, siendo estos ALIAS, nombres alternativos dados a ficheros. Para las versiones anteriores al MVS/ESA este nombre alternativo solo podía especificarse para el primer cualificador. En cambio, con esta versión de MVS el alias puede referenciar hasta los cuatro primeros calificadores de un fichero si se desea. Los alias residen en el catálogo maestro, como se vera a continuación, y apuntan a un determinado catálogo de usuario, donde estará ya la ubicación física de un determinado fichero.

Page 25: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 25 de 374

1.7.1 Tipos de organizacion en ficheros no-VSAM Los principales tipos de organizacion de ficheros no-VSAM en un sistema MVS son: - Secuencial - Particionada - Directa - Secuencial Indexada 1.- Organizacion secuencial - Los ficheros con este tipo de organizacion se definen como el conjunto generado al almacenar la informacion secuencialmente, es decir, escribiendo cada registro uno detrás del otro y manteniendo este orden. Cuando se desee recuperar la informacion, los registros deben leerse de la misma forma, es decir, leyendo un registro cada vez y en el mismo orden en el que se escribió. Para el manejo de la informacion en estos ficheros, ya sea en cinta o en disco, se puede usar cualquiera de los siguientes métodos: - El método de acceso QSAM (Queued Sequential Acces Method) que permite al usuario leer y escribir a nivel de registro lógico. Es el mas usado. - El método BSAM (Basic Sequential Acces Method) que permite al usuario leer y escribir a nivel de bloque.

Page 26: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 26 de 374

2.- Organizacion particionada Los ficheros pertenecientes a este tipo también reciben el nombre de bibliotecas, librerías o PDS (Particioned Data Set) debiendo este nombre, en parte a herencia de los sistemas operativos predecesores, y en parte a la forma en como organiza su informacion, pues dispone de las dos areas siguientes, a modo de biblioteca: - un área de directorio que permite la localización inmediata de cualquier miembro, - y un área de datos. El área de datos esta formada por conjunto de datos secuenciales. El directorio es un área que contiene una entrada para cada miembro. Cada una de estas entradas contiene la especificación del nombre, dirección relativa de comienzo dentro del area de datos, longitud y otras estadísticas de cada uno de los miembros. (ver utilidad ........) Estas dos áreas son independientes y se dimensionarán con distinto espacio. Un fichero particionado se gobierna por su directorio. (ver parámetro SPACE de la ficha DD). Este tipo de organización es muy usada en MVS, siendo además obligatoria para cierto tipo de información, tales como procedimientos y programas ejecutables entre otros. Y se emplea para contener tanto datos como programas. El método de acceso que procesa este tipo de ficheros es el BPAM (Basic Partitioned Access Method).

Page 27: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 27 de 374

3.- Organizacion Directa o Random Este tipo de organizacion permite al usuario leer y escribir directamente a nivel de bloque. Solo puede usarse con ficheros en disco, y su uso esta ligado a la gestión de Bases de datos (como IDMS) no siendo un método de acceso de uso normal para el usuario. El método de acceso que procesa este tipo de ficheros es el BDAM (Basic Direct Access Method) 4.- Organizacion Secuencial Indexada Este es un método obsoleto que ha sido reemplazado por los ficheros VSAM. El método de acceso que procesa este tipo de ficheros es el ISAM (Indexed Sequential Access Method).

Page 28: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 28 de 374

1.7.2 Tipos de registro Cualquier tipo de fichero no-VSAM definido en el punto anterior puede tener definido uno de los siguientes formatos de registro: - Formato FIJO (F) Este tipo de formato se caracteriza por tener todos los registros la misma longitud, y todos los bloques o conjuntos físicos de registros lógicos de un mismo fichero) también tienen el mismo tamaño. El máximo tamaño del bloque es de 32760 Bytes. Formato Variable (V) La característica de este tipo de registros es que los registros lógicos que componen el fichero tienen longitudes distintas, yendo precedido cada uno de los registros por 4 bytes para especificar su longitud. A su vez, cada bloque también va precedido por otros 4 bytes para indicar su longitud. El tamaño máximo del bloque es de 32760 mientras que el de registro es de 32756 bytes. Si pudiera darse el caso de que un registro lógico exceda el tamaño máximo de un bloque, habría que definir el fichero como de formato VBS(Variable Blocked Spanned) Formato Indefinido (U) Este tipo de formato se usa cuando el fichero no esta formado por registros lógicos, por lo que solo pueden leerse los datos leyendo el bloque entero. El tamaño del bloque no puede exceder de 32760 Bytes. Este formato es el usado entre otras, por las librerías de los programas ejecutables.

Page 29: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 29 de 374

1.7.3 Organizacion VSAM Este tipo de organización de fichero es especial contando además con un método de acceso propio. Su nombre proviene del acronimo Virtual Storage Access Method. Debiendo ser procesados por sistemas que traten memoria virtual, tal y como indica su nombre, y además deben residir en disco. Dentro de este tipo de organizacion existen 4 tipos: - Organizacion Secuencial (ESDS:Entry Sequential Data Set) Sustituye a los ficheros con acceso QSAM y BSAM. - Organizacion Directa (RRDS:Relative record Data Set) Sustituye a los BDAM. - Organizacion Indexada (KSDS: Key Sequential Data Set) Sustituye a los ISAM - Organizacion lineal : Este tipo de organizacion secuencial. Es usada solo por gestores de bases de datos.

Page 30: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 30 de 374

1.7.4 Acceso y recuperación de datos El acceso a datos en MVS se hace a través del juego de VTOC y catálogos. 1.- VTOC (Tabla de Contenidos del Volumen). En MVS todos los volúmenes DASD(Direct Access Storage Device) tienen una zona en la que se registra toda la información física que contiene, así como la organizacion de los ficheros que están en ese volumen. Esta area, que recibe el nombre de VTOC se crea en el momento de inicializar el volumen. La informacion contenida en ella esta organizada en distintos tipos de registros, todos ellos con una longitud de 144 bytes de longitud, y reciben el nombre de DSCB (Data set control Block) La primera parte del registro tiene una longitud de 44 bytes, y contiene o el tipo de registro o el nombre del fichero. Cada tipo de registro o formato, contiene la siguiente informacion especifica: Formato 4: Describe la VTOC. Es el primer registro Solo hay un registro de este tipo. Formato 5 Especifica el espacio libre Formato 1 Describe cada archivo y el espacio que ocupa, ajustándose a la siguiente estructura: 00-43 Nombre del fichero 44-44 Tipo de registro ... Organizacion Longitud del bloque Tamaño de registro Punteros a los 3 primeras extensiones Formato 3 Describe las extensiones del fichero Formato 2 Describe el método de acceso a los ficheros secuenciales indexados. Formato 0 Es un registro nulo. Nota: Con el lanzamiento del SMS (Sistema de gestión de memoria) las VTOC tienden a desaparecer.

Page 31: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 31 de 374

2.- Catálogos Los catálogos son el otro componente en el que se apoya MVS para el acceso y localización de ficheros. Un catalogo no es mas que un fichero VSAM, pero con un contenido especial ya que contiene información acerca de la ubicación física de otros ficheros, de modo que se pueda localizar solo con esa informacion cualquier fichero de la instalación. En MVS un fichero puede, o no, estar catalogado. En el caso de estarlo el sistema a través del catálogo puede determinar el volumen en el que se encuentra, y una vez en el volumen, examinando la VTOC podrá recoger todas las características de este fichero. En el caso de no estar catalogado, cuando se desee utilizar, habrá que especificar la información del volumen que le contiene, para que así, mirando la VTOC pueda localizarlo. Para poder gestionar la catalogación de todos los ficheros de la instalación, MVS mantiene un catálogo maestro y varios catálogos de usuario. En el catálogo maestro, normalmente figuraran entradas maestras, es decir referencias de los ficheros que son vitales para el funcionamiento de MVS, y sus alias. En los catálogos de usuario figurara la dirección lógica de los distintos ficheros de usuario.

Page 32: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 32 de 374

1.8 Librerías que contienen el MVS Por lo general todos los módulos del MVS se encuentran ubicados en librerías que tienen por primer cualificador SYS1, siendo alguna de las mas interesantes desde el punto de vista del desarrollador, las siguientes: SYS1.LPALIB Contiene los módulos del supervisor SYS1.NUCLEUS Contiene los módulos que definen el sistema como resultante del proceso de generación del sistema (SYSGEN) SYS1.LINKLIB Contiene las utilidades y módulos compartidos por todos los usuarios, tales como SORT, COBOL, IEBCOPY, ... SYS1.SVCLIB Esta librería contenía los módulos del supervisor (SVC) en el MVT, pero hoy solo se mantienen por razones de compatibilidad. SYS1.CMDLIB Esta librería contiene los módulos del procesador de comandos de TSO.

Page 33: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: MVS Autor: José M. Peco

Página 33 de 374

1.9 Bibliografía MVS - Manual para programadores Robert H. Johnson Editorial McGraw Hill

Page 34: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 34 de 374

Tema 2 : JCL 2.1 Introducción Como se ha visto en el tema anterior, uno de los subsistemas básicos del sistema operativo MVS es el JES o controlador de trabajos batch. Su misión fundamental consiste en preparar los trabajos que se le envían para su ejecución, interpretando las sentencias de control que componen cada una de las cadenas o JOBs, y asignar los recursos que requiere su ejecución así como el espacio de direcciones ,o partición, en la que poder ejecutarse. Estas cadenas son escritas en un lenguaje especial, llamado Lenguaje de Control de trabajos (Jobs), o abreviadamente JCL. Debemos diferenciar entre JC y JCL, siendo: JC el programa (Job control) JCL el lenguaje que se utiliza para trabajar con el JC También se suele dar el nombre de JCL, aunque erróneamente, a la cadena escrita para la ejecución de un trabajo. El JES, como ya se ha visto, es invocado cada vez que se ejecuta el comando SUBMIT de TSO, mediante el cual se envía a la entrada de ejecución de trabajos un fichero conteniendo la secuencia de sentencias de control que se desea ejecutar; o bien, copiando un fichero sobre la entrada de trabajos del sistema(Internal Reader) como también se vera a lo largo de este tema. Por otra parte, también se puede usar el JCL para ejecutar comandos propios del JES2 y JES3.

Page 35: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 35 de 374

2.2 Definiciones previas JOB o CADENA Recibe este nombre una sucesión de programas encadenados para su ejecución como un unico trabajo. Comienza siempre con una sentencia //nombre JOB y finaliza con : /& aunque esta ficha no es obligatoria, o con una sentencia vacia, entendiendo por tal la que solo contiene simplemente // STEP o PASO Recibe este nombre el conjunto de sentencias necesarias para ejecutar cada uno de los programas que integran un JOB. Un paso del trabajo comienza siempre con //nombre EXEC Finaliza cuando se encuentra con el fin del JOB o con otra ficha EXEC. Y debe contener tantas sentencias DD como ficheros lógicos tenga definidos el programa que se desea ejecutar. ALOCAR Este anglicismo, muy usado en las instalaciones, debería escribirse como ALLOCAR, pues proviene de usar el comando ALLOC abreviatura de ALLOCATION, que significa asignación. Se entiende por alocar un fichero o una librería el asignar dicho fichero o librería a nuestro entorno de trabajo a fin de poder hacer uso de él. Hay que tener en cuenta que en MVS solo se puede hacer uso de aquellos elementos que se encuentren alocados en el entorno del usuario que desea ejecutar el programa. Esto es lógico, ya que cuando se aloca un fichero se especifica también el modo en el que es asignado, de esta forma si se aloca un fichero como de Modificación, se estará asignado con exclusividad, y nadie podrá hacer uso de el, ni siquiera para lectura, pero, si se le aloca en modo compartido (SHaRed), todos los usuarios podrán incluirlo en su entorno, siempre y cuando también le aloquen como SHR.

Page 36: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 36 de 374

PROCEDIMIENTO CATALOGADO Es un conjunto de sentencias de control incluidas en un miembro de una librería del sistema, y que emplea nombres variables para la codificación de aquellos parámetros cuyo valor se desconoce en tiempo de codificación. PROCEDIMIENTO IN-STREAM Es, como el procedimiento catalogado, un conjunto de sentencias de control, pero, en lugar de estar ubicadas en una librería están incluidas dentro de la propia cadena de control.

Page 37: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 37 de 374

2.3 Formato general de las sentencia del JC Todas las líneas que componen una cadena se codifican siempre en formato imagen de ficha, es decir que su longitud es de 80 posiciones. La informacion ejecutable se encuentra siempre en las primeras 71 posiciones, ya que se reservan las 8 ultimas posiciones para un blanco, que actúa de delimitador, y 7 posiciones para la numeración de las fichas. En el caso de que la informacion a especificar en una línea fuera mayor de 71 posiciones, se puede continuar en las fichas siguientes, terminando la línea con una coma, y comenzando la codificación de la línea siguiente entre las columnas 7 y 16, tal y como se muestra en el siguiente ejemplo: //XXXXXX85 JOB (123,DES),'JMP-PRU',CLASS=T,MSGCLASS=X, 00000100 // NOTIFY=XXXXXX,MSGLEVEL=(1,1) 00000200 El formato general de las sentencias de control es: //Etiqueta b_1 operación b_2 operandos b_3 comentario Donde: // indica que se trata de una sentencia de control y deben ocupar las columnas 1 y 2 de la ficha. Etiqueta Sirve para identificar la sentencia de control en la que se encuentra. B_1 Delimitador de 1 a n blancos Operación Puede ser una de las operaciones comentadas en el siguiente apartado. B_2 Delimitador de 1 a n blancos Operandos Este campo debe comenzar antes de la columna 17, y especifica los operandos o parámetros del operador al que acompaña. En el caso de que los operadores fueran varios, estos irán separados por comas, y sin incluir blancos. B_3 Delimitador de 1 a n blancos Comentarios Es el ultimo grupo de informacion de la línea y es utilizada para especificar comentarios a la línea de la cadena.

Page 38: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 38 de 374

Otros formatos de las sentencias de control son los siguientes: (1) // (2) //* (3) /*comando donde el formato: (1) representa la sentencia vacía. Su uso especifica el fin de la cadena o JCL. (2) se usa para especificar comentarios Es una ficha no ejecutable (3) Este formato se usa para ejecutar comandos del JES

Page 39: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 39 de 374

2.3.1 Etiqueta Las etiquetas son identificadores que se utilizan para referenciar cualquier elemento individual dentro de su conjunto. Así, con la etiqueta de la ficha: - JOB queda identificado el JOB dentro de las colas de ejecución. - PROC queda identificado el procedimiento - EXEC queda identificado el paso - DD queda identificado de forma lógica el fichero ante el programa que va a manejar sus datos. Como características se pueden resaltar las siguientes: - La etiqueta es un campo opcional - En caso de codificarse debe comenzar en la columna 3 - No puede ser mayor de 8 posiciones alfanuméricas - Debe comenzar por un carácter alfabético - Identifica la ficha de control - Sirve para referenciar una ficha del JOB. //PASO1 EXEC PGM=IEBCOPY 00000600 //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR 00000700 //SALIDA DD SYSOUT=* 00000800 PASO1, STEPLIB, SALIDA son tres etiquetas que identifican tres fichas distintas del JOB.

Page 40: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 40 de 374

2.3.2 Operación Este lenguaje solo contempla los siguientes tipos de operación: JOB Solo puede haber una operación de este tipo por cadena, ya que define el conjunto del JOB o JCL. EXEC Esta operación sirve para especificar el programa o procedimiento que se desea ejecutar. Por lo tanto habrá tantas operaciones EXEC como pasos tenga el JCL o cadena. DD Este tipo de operación sirve para definir datos. Es decir, esta ficha se usa para determinar los contenedores de los datos que se van a manipular. En consecuencia deben definirse a nivel de programa, ya que son estos los únicos que pueden manejar los datos. Y habrá en un paso tantas operaciones DD como Definiciones de Datos requiera el programa. PROC Como se ha dicho en las definiciones previas, un procedimiento no es mas que un conjunto de pasos agrupados bajo un nombre. Pues bien, esta operación define el comienzo de un procedimiento, y la etiqueta que identifica la ficha, da nombre al procedimiento. (No confundir esta operación con el parámetro PROC de la ficha EXEC). PEND Esta operación define el final de un procedimiento. OUTPUT Este tipo solo es valido para MVS/XA y MVS/ESA y va ligada al parámetro OUTPUT de la sentencia DD.

Page 41: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 41 de 374

2.3.3 Operadores o parámetros Los operadores o parámetros de un operando pueden ser de dos tipos: - Posicionales Aquellos cuyo valor esta asociado con la posición que ocupa como operador. //DESJMPL1 JOB (40,123),'JMP-PRU' - Palabra clave Aquellos cuyo valor va acompañado de una palabra clave que identifica al operador o parámetro usado. // MSGCLASS=Z,NOTIFY=DESJMP A su vez, los parámetros pueden estar compuestos de subparametros posicionales y de palabra clave. En cualquier caso, estos subparametros deberán ir encerrados entre paréntesis, o entre comillas. Como ejemplo de todas estas definiciones se acompaña el siguiente JCL, que como especifica en los comentarios, realiza la copia de un miembro de un fichero particionado sobre un fichero secuencial. //DESJMPL1 JOB (40,123),'JMP-PRU',CLASS=D,MSGCLASS=Z, // NOTIFY=DESJMP,MSGLEVEL=(1,1) //********************************************************************** //* COPIAR UN MIEMBRO A UN SECUENCIAL //********************************************************************** //PASO1 EXEC PGM=IEBCOPY //ENTRADA DD DISP=OLD,DSN=&librería.(&miembro.) //SALIDA DD DSN=&secuenc, // DISP=(,CATLG,DELETE),UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE), // DATACLAS=DFBAQ,LRECL=80 //SYSIN DD * DDIN=ENTRADA DDOUT=SALIDA /* //SYSPRINT DD SYSOUT=* Como REGLA GENERAL: Cuando un parámetro posicional no se codifique y existan operadores cuya posición relativa sea posterior a la del que falta, deberán codificarse los huecos de los parámetros no especificados mediante tantas comas como faltas haya, no debiendo dejar ningún blanco entre estas ya que este es el delimitador de los distintos campos de la ficha de control. El siguiente ejemplo muestra este extremo, ya que falta el primer subparametro del operador DISP // DISP=(,CATLG,DELETE)

Page 42: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 42 de 374

2.4 Sentencia JOB Especifica el comienzo de un trabajo o cadena. Cada Job solo puede contener una única ficha JOB. Por esto, en el caso de que en una misma corriente de control vinieran especificadas varias fichas job, cada una de ellas indicará el fin de un trabajo, si no es la primera, y el comienzo de un nuevo trabajo. En el caso de que dicha cadena contuviera alguna ficha nula ( solo con // ) se ignorara el resto de la corriente. El nombre del JOB puede tener hasta 8 caracteres, empezando siempre por un carácter alfabético. No se considera el guión como carácter especial. El formato de esta sentencia se ajusta al formato general. //Nombre JOB ([cuenta][,informacion_de_contabilidad,...]) CLASS=clase_ejecución MSGCLASS=clase_salida MSGLEVEL=([sentencias],[mensajes]) [COND=(código,operador),...] [NOTIFY=identificación usuario] [PRTY=prioridad del job] [REGION=valorK] o [REGION=valorM] [TIME={([minutos][,segundos])}] [TYPRUN={HOLD}] o [TYPRUN={SCAN}] [RESTART=id_paso_reinicio] Los parámetros obligatorios en general son los parámetros CLASS para saber a que iniciador se debe enviar el trabajo, y MSGCLASS para determinar que tipo de mensajes se quiere recoger. El resto de los parámetros son obligatorios u optativos dependiendo de la instalación. Como ejemplo se acompaña el siguiente, si bien puede tomarse cualquier otro ejemplo de este tema. //DESJMPL1 JOB (40,123),'JMP-PRU',CLASS=D,MSGCLASS=Z, // NOTIFY=DESJMP,MSGLEVEL=(1,1),RESTART=*

Page 43: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 43 de 374

2.4.1 Informacion de contabilidad Es un parámetro posicional y siempre es el primer parámetro de la ficha JOB. Por lo general, todas las instalaciones suelen imputar los gastos del centro de calculo a los distintos departamentos en función del tiempo de maquina que hayan consumido. Este parámetro sirve para contabilizar dicho tiempo, y se ajustara a las especificaciones de la instalación. Si hubiera que codificar subparametros, este parámetro ira delimitado por paréntesis, y los subparametros separados en el interior por comas. En el caso de que algún parámetro contuviera apóstrofes o ampersands (&) se codificaran dobles, pero serán considerados por el sistema como si fueran sencillos. La longitud total máxima de este parámetro es de 144 bytes. Ejemplos //JMP1 JOB 123, ... //JMP2 JOB (123,12-12-94), ... //JMP3 JOB , ... //JMP5 JOB 123&&456, ...

Page 44: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 44 de 374

2.4.2 Nombre del programador Parámetro posicional. Este parámetro es el segundo de la ficha JOB, y por tanto, si no se especifica el parámetro anterior, este debe ir precedido de una coma a fin de respetar la regla general. Este parámetro identifica al responsable del Job, y debe ir delimitado por comillas simples ('). En el caso de que este parámetro contuviera comillas, estas deben especificarse dobles, a fin de que no sea interpretada como fin del parámetro. Ejemplos //JMP1 JOB 123,'JMP-PRU' ... //JMP2 JOB (123,12-12-94),'JMP-PRU' ... //JMP3 JOB ,'JMP-PRU' ... //JMP4 JOB ,'Jose O''Donnel' ... //JMP5 JOB 123&&456,'JMP-PRU' ...

Page 45: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 45 de 374

2.4.3 ADDRSPC Parámetro de palabra clave Este parámetro especifica si el JOB se va a ejecutar en memoria REAL o en memoria VIRTual. La diferencia entre un valor y el otro estriba en que si se ejecuta en memoria REAL, no hay paginación, mientras que si se ejecuta en memoria VIRTual, si la hay, lo cual implica un mayor tiempo de ejecución, si bien, esta diferencia de tiempos solo será apreciable en procesos muy largos. Los valores posibles de este parámetro son : - VIRT - REAL Por defecto asume VIRT. Ejemplos //JMP01 JOB (123,(456,ABC)),ADDRSPC=VIRT ... //JMP02 JOB ADDRSPC=REAL

Page 46: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 46 de 374

2.4.4 CLASS Parámetro de palabra clave Este parámetro especifica la cola de entrada a la que se desea que el JES asigne el trabajo para su ejecución. Las instalaciones definen en el JES distintos iniciadores para la ejecución de los trabajos. A su vez, cada iniciador tiene asignadas distintas clases o colas de entrada, y estas tienen asignadas distintas prioridades de ejecución, por lo que el enviar un trabajo a una u otra cola, puede repercutir en el tiempo que tarda en ejecutarse dicho trabajo. Así, por ejemplo, una instalación podría tener definidas las siguientes colas: Entrada A: Trabajos que consumen menos de 1 minuto B: Trabajos que consumen menos de 10 minutos X: Trabajos con tiempo ilimitado ... Salida A: Salida normal B: Salida en DIN-A4 C: Salida para diskettes ... Por defecto asume la clase que tenga asignada el usuario de TSO que submite o envía el trabajo a ejecución. Valores: A - Z 0 - 9 Ejemplo: //JMP03 JOB ADDRSPC=REAL,CLASS=B

Page 47: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 47 de 374

2.4.5 COND Parámetro de palabra clave Este parámetro especifica la condición que de forma general debe cumplir el código de retorno devuelto por los programas que configuran el JOB, para que siga ejecutándose el JOB. Cada paso de un JOB cuando termina, devuelve un código de retorno que por regla general suele tomar los valores: 0 Todo correcto 4 Existen avisos o warnings 8 Existen errores 12 Existen errores graves Estos valores son cargados en la variable del sistema RC (Return Code) por los programas dependiendo de la lógica programada, o por el propio sistema. La codificación de este parámetro se ajusta al siguiente formato: COND=((código,operación),(código,operación),...) COND=EVEN COND=ONLY donde código es un numero decimal comprendido en el rango 0 a 4095, y representa el valor con el que se debe comparar el código de retorno de los pasos. Operación Especifica como debe ser el código de retorno para que deje de ejecutarse el JOB. Los valores posibles de este campo son: GT Mayor que (greater than) GE Mayor o igual (greater equal) LT Menor que (less than) LE Menor o igual (Less equal) EQ Igual (equal) NE No igual (Not equal) Se puede especificar hasta 8 condiciones distintas, y solo se especificaran los paréntesis internos si se incluye mas de una condición, funcionando en este caso como la operación lógica OR. Ejemplos //JMP05 JOB CLASS=J,COND=(8,LT) ... //JMP06 JOB ADDRSPC=VIRT,COND=((8,EQ),(40,GT))

Page 48: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 48 de 374

2.4.6 MSGCLASS Parámetro de palabra clave Este parámetro especifica la clase de salida en la que el JES dejara los mensajes devueltos por el sistema, así como la interpretación de las sentencias del JOB. Por defecto asume la clase que tenga asignada el usuario de TSO que submite o envía el trabajo a ejecución. Valores: A - Z 0 - 9 Ejemplo: //JMP03 JOB ADDRSPC=REAL,CLASS=B,MSGCLASS=8

Page 49: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 49 de 374

2.4.7 MSGLEVEL Parámetro de palabra clave Este parámetro especifica el tipo de mensajes que se desea tener en el log del job, es decir, los tipos de mensajes que se desea recibir de la ejecución del job. Se admite la abreviatura MSG La codificación de este parámetro se ajusta al siguiente formato: MSGLEVEL=([sentencias],[mensajes]) donde ambos parámetros están codificados, e indican sentencias el tipo de mensajes relacionados con la interpretación de las sentencias de control que se desean. mensajes especifica lo mismo pero con los mensajes que devuelve el sistema. Los valores posibles para estos subparametros posicionales son: Sentencias 0 Solo se imprime la sentencia JOB 1 Se imprimen todas las sentencias de control incluida la expansión de los procedimientos. 2 Solo se imprimen las sentencias de control de entrada. Mensajes 0 No se imprimen los mensajes de asignación de recursos a menos que el JOB termine anormalmente. 1 Se imprimen todos los mensajes de asignación de recursos. En caso de no codificarse el subparametro de mensajes, no son necesarios los paréntesis. Cuando se especifica el valor 1 para las sentencias de control, y además se emplean procedimientos, los parámetros variables son sustituidos por los valores reales, y el resultado se registra en el log del Job. Ejemplos: //JMP07 JOB (1,2),'pruebas',MSGLEVEL=(0,0) //JMP08 JOB ,'pruebas',MSGLEVEL=(,1) //JMP09 JOB MSGLEVEL=2,ADDRSPC=REAL

Page 50: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 50 de 374

Cuando se codifica el valor 1 para el parámetro de sentencias, en la corriente de control se obtiene la imagen expandida de la cadena, donde cada línea se inicia con : // las fichas codificadas en el fichero submitido XX las fichas expandidas de procedimientos catalogados ++ las fichas expandidas de procedimientos in-stream X/ las llamadas hechas a un procedimieto expandido +/ las llamadas hechas a un procedimiento in-stream El siguiente ejemplo muestra un fragmento de la salida de un JOB. En el se distinguen las siguientes partes: - LOG del JOB: en esta parte se registra la hora de comienzo de cada evento. _ Interpretacion del JCL ejecutado: en el que se ve cómo el JES ha numerado cada una de las sentencias ejecutables, con independencia de que ocupen 1 o mas fichas de la cadena. - La tercera parte se corresponde con la salida de mensajes devueltos por el sistema. 1 J E S 2 J O B L O G -- S Y S T E M X 0 14.21.48 JOB07054 IRR010I USERID DESJMP IS ASSIGNED TO THIS JO 14.21.50 JOB07054 ICH70001I DESJMP LAST ACCESS AT 14:21:41 ON W 14.21.50 JOB07054 $HASP373 DESJMPCA STARTED - INIT CK - CLASS K 14.21.50 JOB07054 IEF403I DESJMPCA - STARTED - TIME=14.21.50 14.21.53 JOB07054 - --TIM 14.21.53 JOB07054 -JOBNAME STEPNAME PROCSTEP RC EXCP CPU 14.21.53 JOB07054 -DESJMPCA PASO0010 00 35 .00 14.21.59 JOB07054 IEF404I DESJMPCA - ENDED - TIME=14.21.59 14.21.59 JOB07054 -DESJMPCA ENDED. NAME-JMP-PRU TOT 14.21.59 JOB07054 $HASP395 DESJMPCA ENDED 1 //DESJMPCA JOB (30,123),'JMP-PRU',CLASS=K,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(1,1) //* - - - - - - - - - - - - - - - - - - - - - - - - - - 2 //PASO0010 EXEC PGM=DESNAT,REGION=3000K,TIME=1400, // PARM='STACK=INT,IM=D,MAXCL=0,A' 3 //STEPLIB DD DSN=JMP.NATURAL.DES,DISP=SHR 4 //DDKARTE DD DUMMY 5 //DDDRUCK DD SYSOUT=* 6 //DDPRINT DD SYSOUT=* ... ICH70001I DESJMP LAST ACCESS AT 14:21:41 ON WEDNESDAY, AUGUST 10 IEF236I ALLOC. FOR DESJMPCA PASO0010 IGD103I SMS ALLOCATED TO DDNAME STEPLIB IEF237I DMY ALLOCATED TO DDKARTE IEF237I JES2 ALLOCATED TO DDDRUCK IEF237I JES2 ALLOCATED TO DDPRINT ...

Page 51: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 51 de 374

El siguiente ejemplo muestra la salida proporcionada por el mismo JOB pero codificando el parámetro MSGLEVEL tal y como se especifica en la ficha JOB que aparece en la sección de interpretación del JCL. 1 J E S 2 J O B L O G -- S Y S T E M X 0 14.21.48 JOB07054 IRR010I USERID DESJMP IS ASSIGNED TO THIS JO 14.21.50 JOB07054 ICH70001I DESJMP LAST ACCESS AT 14:21:41 ON W 14.21.50 JOB07054 $HASP373 DESJMPCA STARTED - INIT CK - CLASS K 14.21.50 JOB07054 IEF403I DESJMPCA - STARTED - TIME=14.21.50 14.21.53 JOB07054 - --TIM 14.21.53 JOB07054 -JOBNAME STEPNAME PROCSTEP RC EXCP CPU 14.21.53 JOB07054 -DESJMPCA PASO0010 00 35 .00 14.21.59 JOB07054 IEF404I DESJMPCA - ENDED - TIME=14.21.59 14.21.59 JOB07054 -DESJMPCA ENDED. NAME-JMP-PRU TOT 14.21.59 JOB07054 $HASP395 DESJMPCA ENDED 1 //DESJMPCA JOB (30,123),'JMP-PRU',CLASS=K,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(0,0) //* - - - - - - - - - - - - - - - - - - - - - - - - - -

Page 52: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 52 de 374

2.4.8 NOTIFY Parámetro de palabra clave Este parámetro especifica el identificador del usuario de TSO al que el sistema enviara un mensaje cuando finalice el Job. La codificación de este parámetro se ajusta al siguiente formato: NOTIFY=identificador_usuario El identificador del usuario se corresponde con la identificación que se da al sistema cuando se hace LOGON para iniciar una sesion de TSO. Ejemplo //JMP10 JOB (123,456),'JMP-PRU',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614

Page 53: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 53 de 374

2.4.9 PERFORM Parámetro de palabra clave Este parámetro especifica el grupo de rendimiento o PERFORMance que se asigna al JOB. La codificación de este parámetro se ajusta al siguiente formato: PERFORM=n donde n es un numero comprendido entre 1 y 255 Normalmente a mayor numeración, la prioridad aumenta. No obstante, la definición de este parámetro depende de la instalación. Ejemplo //JMP11 JOB (123,456),'JMP-PRU',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614, // PERFORM=12

Page 54: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 54 de 374

2.4.10 REGION Parámetro de palabra clave Este parámetro especifica la cantidad de memoria que se asigna al JOB. No obstante esta memoria depende del valor especificado con el parámetro ADDRSPC, ya que si se ha especificado: =REAL este parámetro especifica la cantidad de memoria real que se asigna a este JOB. =VIRT este parámetro limita la cantidad de memoria virtual que se puede tomar cuando se haga una GETMAIN variable. Por lo tanto especifica el máximo tamaño de memoria virtual que se podrá tomar en el citado GETMAIN. La codificación de este parámetro se ajusta al siguiente formato: REGION=nK REGION=mM donde n es el numero de Kb que representa el tamaño asignado o limitado, y m es el numero de Mb que representa el tamaño asignado o limitado. Ejemplo //JMP11 JOB (123,456),'JMP-PRU',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614, // PERFORM=12,REGION=32M

Page 55: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 55 de 374

2.4.11 RESTART Parámetro de palabra clave Este parámetro especifica el paso desde el que se desea rearrancar el JOB. Normalmente, este parámetro se utiliza para rearrancar un JOB desde el paso que termino mal, ya que los primeros pasos se ejecutaron correctamente. La codificación de este parámetro se ajusta al siguiente formato: RESTART=* RESTART=nombre_paso RESTART=nombre_paso.nombre_proc donde * indica que el JOB se rearranque desde el primer paso. nombre_paso especifica el nombre del paso desde el que se desea rearrancar. //XXXXXXND JOB (123,DES),'JMP-PRU',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1),RESTART=COPIAR01 Nombre_paso.nombre_proc Este formato se usa cuando se desea rearrancar desde un paso que invoca a un procedimiento. //XXXXXXND JOB (123,DES),'JMP-PRU',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1),RESTART=NATURA11.NATDES //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //NATDES PROC ... procedimiento in-stream // PEND //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //NATURA01 EXEC NATDES //CMWKF01 DD DSN=DESJMP.FTP.J180B01, ... //COPIAR01 EXEC PGM=IEBGENER //SYSUT1 DD DSN=DESJMP.FTP.J180B01 ... //NATURA11 EXEC NATDES ...

Page 56: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 56 de 374

2.4.12 TIME Parámetro de palabra clave Este parámetro especifica el máximo tiempo que un JOB puede estar usando la CPU. Es de resaltar que el tiempo que se especifique no es tiempo real de ejecución, sino tiempo de CPU. La diferencia entre ambos tiempos estriba en que la CPU no tiene dedicación exclusiva a un trabajo, y por lo tanto, al repartirse un segundo de CPU entre muchos trabajos, a cada trabajo le corresponderá para 1 segundo real x milisegundos de CPU. La codificación de este parámetro se ajusta al siguiente formato: TIME=([minutos],[segundos]) donde minutos especifica el numero de minutos máximo de CPU que utilizara el JOB. Su valor debe estar comprendido en el rango 1-1439 segundos especifica el numero de segundos máximo de CPU que utilizara el JOB. Su valor debe estar comprendido en el rango 0-59 Un caso particular es aquel en el que se especifica TIME=1439 ya que este es el numero de minutos de un día. En este caso, lo que se estaría haciendo es no poniendo limite para el uso de la CPU por parte de ese trabajo. El siguiente ejemplo muestra cómo limitar el tiempo de CPU a 5 minutos y 30 segundos //JMP14 JOB (123,456),'JMP-PRU',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614, // RESTART=PASO2,TIME=(5,30) ... Y este otro, le limita a 5 minutos //JMP15 JOB (123,'JMP'),CLASS=Y,NOTIFY=TEST87, // RESTART=PASO3.NATURALP,TIME=5

Page 57: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 57 de 374

2.4.13 TYPRUN Este parámetro especifica al JES el tratamiento que debe dar al JOB. En el caso de que no se especifique este parámetro el trabajo pasa a ejecución inmediatamente. La codificación de este parámetro se ajusta al siguiente formato: TYPRUN=valor donde los valores posibles son: HOLD este valor especifica que el trabajo se coloque en la cola de entrada pero para no ejecutarse hasta que no se libere manualmente por el operador, lo cual se hace ejecutando el comando de línea 'A' en el panel de SDF correspondiente a las colas de entrada. SCAN este valor especifica al sistema que no se desea ejecutar el JOB, solo se desea chequear la sintaxis de la corriente de control. COPY este valor especifica al sistema que no se desea ejecutar el JOB, sino simplemente listar el JOB, por lo cual aparecerá en la cola de salida en la clase indicada en MSGCLASS. Ejemplo //JMP15 JOB (123,456),'JMP-PRU',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614, // RESTART=PASO2,TYPRUN=SCAN En este caso, solo se chequea la sintaxis del JCL, no valida si existen los ficheros o datasets especificados en las distintas fichas DD de cada paso. En el siguiente ejemplo, el JOB se interpreta y pasa a la cola de entrada, pero no se ejecuta hasta que no sea liberado. //JMP16 JOB (123,'JMP'),CLASS=Y,NOTIFY=TEST87, // TYPRUN=HOLD

Page 58: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 58 de 374

2.5 Sentencia EXEC Esta sentencia se utiliza para especificar que se desea ejecutar un programa, un procedimiento catalogado o un procedimiento in-stream. Como se dijo en la introducción de este tema, un JOB o cadena se compone de un conjunto de pasos. Y cada paso se encuentra identificado por esta sentencia. Un paso como se ha dicho, sirve para ejecutar un programa, o para invocar un procedimiento, pero también los procedimientos constan de pasos, los cuales solo pueden ejecutar programas. En este caso, estos pasos se ejecutaran tantas veces como sea llamado el procedimiento, asignando los valores que correspondan a las variables definidas. Al igual que la ficha JOB, esta sentencia tiene parámetros posicionales y de palabra clave, pero, a diferencia de aquella, los parámetros posicionales que tiene esta sentencia son algo especiales, ya que son excluyentes entre si, y solo sirven para especificar si se va e ejecutar un procedimiento o un programa. Por otra parte, como siguen el método general, deben especificarse antes que el resto de parámetros de palabra clave. Concretamente, cualquiera de los dos que se codifique, deberá ser el primero, y además siempre deberá codificarse uno de ellos. Los parámetros citados son: - PGM=programa - PROC=procedimiento Por defecto el sistema asume PROC. Los parámetros de palabra clave tienen idéntica sintaxis tanto si son parámetros de un programa o si actúan como parámetros de un procedimiento. La diferencia entre ambos, estriba en que en el caso de acompañar al parámetro PGM , los parámetros especificados son aplicables al programa que se desea ejecutar, mientras que si el parámetro al que acompañan es el PROC, los parámetros especificados sustituyen a los parámetros que por defecto se hayan definido en el procedimiento. Como ejemplo de esta diferencia, se puede examinar el que acompaña al parámetro de palabra clave PARM.

Page 59: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 59 de 374

2.5.1 PGM Este parámetro posicional, debe ser el primero de la ficha EXEC. Sirve para especificar el nombre del programa que queremos ejecutar. Dicho programa deberá ser miembro de: - una librería alocada de forma general por el sistema, - o de una librería particular (JOBLIB) que alocada para el JOB - o de una librería particular (STEPLIB) alocada para la ejecución de este paso La codificación de este parámetro se ajusta al siguiente formato: PGM=nombre_programa Ejemplos //JMP20 JOB ... //JOBLIB DD DSN=... ... //PASO1 EXEC PGM=PROGRAM1 //STEPLIB DD DSN=... ... //PASO2 EXEC PGM=PROGRAM2 ... En este ejemplo, PROGRAM1 será buscado como miembro de la librería asociada a la DDname STEPLIB, y en el caso de no encontrarle le buscara en las librerías generales del sistema. En el PASO2, el sistema buscara PROGRAM2 en la librería asociada a la DDname JOBLIB, y en el caso de no encontrarle, le buscara en las librerías generales del sistema, entre las que suele estar SYS1.LINKLIB

Page 60: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 60 de 374

2.5.2 PROC Este parámetro posicional, ocupa también la primera posición de la sentencia EXEC. Sirve para especificar el nombre del procedimiento que se desea ejecutar. Este procedimiento puede estar incluido en el propio JOB, en cuyo caso le denominaríamos 'in-stream' o puede ser un procedimiento catalogado, es decir, el nombre que especifiquemos debe ser el nombre de un miembro de: - una de las librerías de procedimientos alocadas por el sistema, - una librería particular, alocada a nivel de JOB (JOBCAT) - una librería particular, alocada a nivel de paso (STEPCAT). En el caso de ser un procedimiento in-stream este debe estar definido al principio del JOB. La codificación de este parámetro se ajusta al siguiente formato: PROC=nombre_procedimiento Ejemplos //JMP21 JOB ... ... //PASO2 EXEC PROC=XNATURAL //STEPCAT DD DSN=DESJMP.PROCS,DISP=SHR ... En este ejemplo, se ejecuta el procedimiento catalogado XNATURAL, siendo este además, el nombre de un miembro de la librería DESJMP.PROCS

Page 61: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 61 de 374

2.5.3 ACCT Parámetro de palabra clave Este parámetro sirve para contabilizar el tiempo de ejecución del paso, debiéndose ajustar a las especificaciones de la instalación. En el caso de que hubiera que codificar subparametros, el valor de este parámetro ira delimitado por paréntesis, y los subparametros separados en el interior por comas. Y si algún parámetro contuviera apóstrofes (') o ampersands (&) se codificaran dobles, si bien serán considerados por el sistema como si fueran sencillos. La longitud total máxima de este parámetro es de 142 bytes. Su codificación al ser de palabra clave, se ajusta al siguiente formato: ACCT[.nom_paso_proc]=valor Donde VALOR sigue las reglas dadas en la ficha JOB con la informacion de contabilidad. Ejemplo: 01 //JMP11 JOB (123,456),'JMP-PRU',CLASS=X, 02 // MSGLEVEL=(1,1),NOTIFY=T976614 03 //PROCESO PROC 04 //PASO@0 EXEC ... 05 ... 06 //PASO@1 EXEC ... 07 ... 08 // PEND 09 //* ------------------ fin procedimiento 10 //PASO1 EXEC PGM=PROGRAM1,ACCT=135 11 ... 12 //PASO2 EXEC PGM=PROGRAM2,ACCT=(123,567) 13 ... 14 //PASO3 EXEC PROC=PROCESO,ACCT=(123,999) 15 ... 16 //PASO4 EXEC PROCESO,ACCT.PASO@1=(123,555) ...

Page 62: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 62 de 374

donde, la línea : 10 Determina la informacion contable para PASO1 12 En este caso la informacion contable tiene subparametros. 14 asigna informacion contable para todos los pasos del procedimiento PROCESO. 16 Asigna informacion contable al PASO@1 del procedimiento. El resto de los pasos se contabiliza donde indique la informacion contable de la ficha JOB.

Page 63: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 63 de 374

2.5.4 ADDRSPC Parámetro de palabra clave Este parámetro especifica cómo se ha de ejecutar el PASO en el que se ha especificado. Su codificación al ser de palabra clave, se ajusta al siguiente formato: ADDRSPC[.nom_paso_proc]=valor donde el valor puede ser : - VIRT - REAL Por defecto asume VIRT a no ser que se haya especificado a nivel de JOB. Como ya se dijo en la explicación de la sentencia JOB, la diferencia entre ambos valores estriba en el hecho de que haya o no paginación. En el caso de que se especifique este parámetro a nivel de JOB, y a nivel de EXEC, solo se tendrá en cuenta lo especificado a nivel de JOB, ignorándose los especificados a nivel de paso. Por tanto cuando se quiera ejecutar unos pasos en memoria real y otros en memoria virtual deberá especificarse este parámetro solo a nivel de EXEC. Ejemplo 01 //JMP12 JOB (123,456),'JMP-PRU',CLASS=X, 02 // MSGLEVEL=(1,1),NOTIFY=T976614 03 //PROCESO PROC 04 //PASO@0 EXEC ... 05 ... 06 //PASO@1 EXEC ... 07 ... 08 // PEND 09 //* ------------------ fin procedimiento 10 //PASO1 EXEC PGM=PROGRAM1,ADDRSPC=REAL 11 ... 12 //PASO2 EXEC PGM=PROGRAM2,ADDRSPC=VIRT 13 ... 14 //PASO3 EXEC PROC=PROCESO,ADDRSPC=VIRT 15 ... 16 //PASO4 EXEC PROCESO,ADDRSPC.PASO@1=REAL ...

Page 64: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 64 de 374

donde, la línea : 10 Determina que PASO1 se ejecute en memoria REAL. 12 Determina que PASO2 se ejecute en memoria VIRTual. 14 Determina que todos los pasos del procedimiento se ejecuten en memoria VIRTual. 16 Determina que PASO@1 del procedimiento se ejecute en memoria REAL.

Page 65: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 65 de 374

2.5.5 COND Parámetro de palabra clave Este parámetro especifica la condición que de forma general deben cumplir los códigos de retorno de los distintos pasos del JOB previos para que se ejecute el paso en el que se encuentra codificado. Como ya se vio a nivel de JOB, la codificación de este parámetro se ajusta al siguiente formato: COND[.nom_p_p]=((cod,op[,n_p_p]),(c,o[n])...EVEN) COND[.nom_p_p]=((cod,op[,n_p_p]),(c,o[n])...ONLY) siendo nom_p_p: el nombre del paso del procedimiento y donde cod es un numero decimal de 0 a 4095, y representa el valor con el que se debe comparar el código de retorno de los pasos. op Especifica como debe ser el código de retorno para que se ejecute el paso. Los valores posibles de este campo son: GT Mayor que (greater than) GE Mayor o igual (greater equal) LT Menor que (less than) LE Menor o igual (Less equal) EQ Igual (equal) NE No igual (Not equal) EVEN (incluso) especifica que este paso se ha de ejecutar aun cuando algún paso anterior haya terminado anormalmente. ONLY (solo) especifica que este paso solo se ejecuta si algún paso anterior se ha terminado anormalmente. Se puede especificar hasta 8 condiciones distintas, y solo se especificaran los paréntesis internos si se incluye mas de una condición. En este caso las distintas condiciones funcionan como la operación lógica OR. Si se especifica el parámetro COND a nivel de JOB y a nivel de EXEC, el especificado a nivel de paso tiene prioridad sobre el parámetro COND especificado a nivel de JOB.

Page 66: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 66 de 374

Ejemplos 1 //PASO07 EXEC PROCESO1,COND=(0,NE) 2 //PASO22 EXEC PROGRAMA,COND=((4,EQ,PASO01),(4,EQ,PASO02)) 3 //CARGAA4 EXEC PGM=IEFBR14,COND=(4,EQ,PASO04), 4 //CARGAB5 EXEC PROCESO4,COND=(7,LT), 5 //COPIDO1 EXEC PGM=IEBGENER,COND=EVEN donde: 1 se ejecuta PROCESO1 si todos los pasos anteriores han devuelto un código de retorno distinto de 0. 2 Se ejecuta PROGRAMA si el código devuelto por PASO01 Y PASO02 ha sido 4. 3 Se ejecuta el programa IEFBR14 si el programa ejecutado en el paso PASO04 devolvio un código de retorno igual a 4. 4 Se ejecuta PROCESO4 si todos los pasos anteriores han devuelto un código de retorno menor que 7. 5 Se ejecuta el programa IEBGENER siempre

Page 67: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 67 de 374

2.5.6 PARM Parámetro de palabra clave Este parámetro sirve para pasar datos a los programas que se ejecutan. En el caso de un programa COBOL, estos parámetros son recogidos a través de la LINKAGE SECTION. La longitud máxima de este area de parámetros es de 100 caracteres. La codificación de este parámetro se ajusta al siguiente formato: PARM=valor donde: valor Representa la informacion que se pasa al programa. En el caso de que este formada por mas de una expresión, estas irán separadas por comas, las cuales pasan al programa, y todo el conjunto debe ir encerrado entre paréntesis o apóstrofes, los cuales no pasan al programa. Ejemplos El siguiente paso ejecuta el programa de utilidad SORT, al cual se le pasa el parámetro ABEND //******************************************************************* //* ELIMINAR REFERENCIAS DUPLICADAS //******************************************************************* //SORT00 EXEC PGM=SORT,PARM='ABEND' //* //SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,(10,50)) //SORTWK02 DD UNIT=SYSDA,SPACE=(CYL,(10,50)) //SORTWK03 DD UNIT=SYSDA,SPACE=(CYL,(10,50)) //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSUDUMP DD DUMMY //SORTIN DD DSN=DESJMP.ENTRADA,DISP=OLD //SORTOUT DD DSN=DESJMP.SALIDA,DISP=(OLD,CATLG,KEEP), // UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE), // DCB=*.SORTIN //SYSIN DD * SORT FORMAT=CH,FIELDS=(1,19,A) SUM FIELDS=NONE /* //*******************************************************************

Page 68: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 68 de 374

El siguiente es un JCL genérico que sirve para buscar la cadena 'CCCCCCCC' entre los miembros de la librería especificada por LLLLLLLL //DESJMPBT JOB (123,DES),'JMP-PRU',CLASS=T,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(1,1) //***************************************************************** //* BUSCAR CADENA EN DIRECTORIO //***************************************************************** //BUSCAR EXEC PGM=ISRSUPC,PARM=(SRCHCMP,'ANYC') //NEWDD DD DISP=SHR,DSN=LLLLLLLL //OUTDD DD SYSOUT=X //SYSIN DD * SRCHFOR 'CCCCCCCC' /* En este caso, el programa ISRSUPC recibe dos parámetros, los que se pasan como valor del parámetro PARM

Page 69: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 69 de 374

El siguiente ejemplo muestra un esqueleto de JCL para localizar el &MODULO en las distintas librerías de la Base 10. //DESJMPSM JOB (123,DES),'JMP-PRU',CLASS=Q,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(0,0) //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //* BUSCAR ALGUN OBJETO MEDIANTE SYSMAIN //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //******************************************************************* //* PROCEDIMIENTO XNATURAL //******************************************************************* //XNATURAL PROC BPID=0 //PASO1 EXEC PGM=DESNATB, // PARM='INTENS=1,MT=0,FSIZE=64,ESIZE=64,BPID=&BPID' //STEPLIB DD DSN=PRU.NATURAL.PRO.LOAD,DISP=SHR //DDKARTE DD DUMMY //DDDRUCK DD SYSOUT=* //DDPRINT DD SYSOUT=* //CMPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,(1,01)) //SORTWK02 DD UNIT=SYSDA,SPACE=(CYL,(1,01)) //SORTWK03 DD UNIT=SYSDA,SPACE=(CYL,(1,01)) //SORTWK04 DD UNIT=SYSDA,SPACE=(CYL,(1,01)) //SORTWK05 DD UNIT=SYSDA,SPACE=(CYL,(1,01)) //SORTWK06 DD UNIT=SYSDA,SPACE=(CYL,(1,01)) //DDCARD DD DSN=PRU.PRO.OPTION(RUNUSERM),DISP=SHR // DD DSN=PRU.PRO.OPTION(RUNTIME),DISP=SHR // PEND //*------------------------------------------------------------ //SYSMAIN EXEC XNATURAL,REGION=2048K,TIME=1400,DPRTY=(13,9), // DPID=10 //DDPRINT DD SYSOUT=* //CMPRINT DD SYSOUT=* //CMSYNIN DD * %* LIBRERIA/USUARIO/PASSWORD SYSMAIN FIND ALL MODULO IN * where DBID 10 FNR 9 FIN /* Cabe resaltar en este ejemplo que los parámetros que se envían al procedimiento XNATURAL sirven para sustituir los valores declarados por defecto en el procedimiento in-stream XNATURAL, concretamente se envía como parámetro la variable BPID el %* es un parámetro que especifica que no se liste en el LOG el nombre de la librería a la que se accede, el nombre del usuario, ni la password que se especifique.

Page 70: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 70 de 374

2.5.7 REGION Parámetro de palabra clave Como ya se vio al hablar del JOB, este parámetro tiene distinto significado según se haya especificado en el parámetro ADDRSPC el valor REAL o el valor VIRT. Si se ha especificado ADDRSPC=REAL, el tamaño definido en el parámetro REGION indica el tamaño de la memoria real que se planifica para la ejecución del paso. Si se ha especificado ADDRSPC=VIRT, el tamaño definido en el parámetro REGION indica el máximo tamaño de memoria virtual que se puede admitir en las GETMAIN que se ejecuten en la ejecución del paso. Al igual que en los parámetros anteriores, si se especifico un parámetro REGION a nivel de JOB se ignoran los especificados a nivel de EXEC. La codificación de este parámetro se ajusta al siguiente formato: REGION=n REGION=nK REGION=mM donde n es el numero de octetos, de Kb o de Mb que representa el tamaño asignado o limitado. Ejemplo //PASO0010 EXEC PGM=NBATBASE,REGION=3000K, // PARM='IM=D,MADIO=0,MT=0,INTENS=1'

Page 71: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 71 de 374

2.5.8 TIME Parámetro de palabra clave Este parámetro expresa el tiempo máximo que un paso del Job puede hacer uso de la CPU. En el caso de que un paso alcanzara el valor especificado el paso terminaría su ejecución. A diferencia de los parámetros anteriores, si se especifico un parámetro TIME a nivel de JOB, y otro a nivel de EXEC, los dos tienen validez, pero cada uno para su entorno. Es decir, el especificado a nivel de JOB limita el tiempo total del JOB, y el especificado a nivel de paso limita el tiempo para ese EXEC concreto. Si la suma de los tiempos de ejecución de los distintos pasos superara el tiempo especificado en el JOB, este terminaría anormalmente. La codificación de este parámetro se ajusta al siguiente formato: TIME=([minutos],[segundos]) donde minutos puede tomar los valores de 1 a 1440 segundos puede tomar los valores de 0 a 59 En el caso de que no se especifique el subparametro SEGUNDOS, no es necesario especificar los paréntesis. Cuando se especifica TIME=1440 , es decir 24 horas, se esta indicando que no hay limite para el uso de la CPU en ese paso. Ejemplo 1 //JMP16 JOB (123,456),'JMP-PRU',CLASS=X, // MSGLEVEL=(1,1),TIME=5 //PROCESO PROC //PASO00 EXEC DESNAT ... //PASO01 EXEC PGM=PPP0,TIME=(1,30) ... // PEND //* ------------------ fin procedimiento //PASO1 EXEC PGM=PROGRAM1,TIME=(,30) ... //PASO2 EXEC PGM=PROGRAM2,TIME=3 ...

Page 72: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 72 de 374

2.6 Sentencia DD : Definición de datos Esta sentencia se utiliza para especificar al sistema los recursos que se consideran necesarios para ejecutar el programa indicado en la sentencia EXEC. En cada paso deben especificarse tantas sentencias DD como ficheros se necesiten, ya que estas fichas establecen la relación entre el nombre utilizado en el programa y el nombre del Dataset físico que soporta los datos. En consecuencia no pueden existir varias sentencias DD con el mismo nombre para un mismo paso. A diferencia de las sentencias anteriores, esta sentencia, lógicamente, solo puede definirse a nivel de paso. En el caso de que un fichero lógico se compusiera de varios ficheros físicos, se especificara solo la primera DD con el nombre lógico asignado a la Ddname y el DSN del primer fichero físico. A continuación se especificaran tantas sentencias DD sin nombre como sean necesarias, especificando en cada una de ellas el DSN de cada uno de los ficheros físicos. En este caso se dice que los ficheros definidos son una EXTENSION del primer fichero especificado, y que ambas sentencias DD están concatenadas. Ejemplo 1 //PASO00 EXEC PGM=IEBGENER //* ----------- fichero de entrada //SYSUT1 DD DSN=ALIAS.JMP.FICHERO1,DISP=SHR // DD DSN=ALIAS.JMP.FICHERO2,DISP=SHR //* ----------- fichero de salida //SYSUT2 DD DSN=ALIAS.JMP.FICHERO3,DISP=OLD //* ----------- otros ficheros necesarios //SYSIN DD DUMMY En este caso se usa la utilidad de IEBGENER para copiar los ficheros especificados en la Ddname: SYSUT1 , obteniendo el fichero de salida especificado en la Ddname: SYSUT2. La Ddname SYSIN es el fichero de entrada de comandos, y debe definirse obligatoriamente ya que es un fichero de entrada de datos, y por lo tanto necesario para la ejecución del programa IEBGENER, aunque no contenga informacion, como es el caso. (ver utilidad IEBGENER) Al igual que las dos sentencias vistas anteriormente, esta sentencia también tiene parámetros posicionales y de palabra clave. Son los siguientes:

Page 73: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 73 de 374

2.6.1 * (asterisco) Parámetro Posicional. Si se usa, debe ser el primero. Cuando la sentencia DD tiene como parámetro un * esta expresando que los datos asociados a la DDname especificada vienen en las siguientes fichas del JCL. Por omisión el final del fichero definido de esta forma, viene definido por la secuencia de caracteres "/*" situada en las columnas 1 y 2. No obstante, las siguientes secuencias de caracteres también especifican el fin del fichero: - Sentencia vacía // - EOF (end of File) - Delimitador definido previamente como parámetro. (ver parámetro DLM) Este parámetro puede ir acompañado del parámetro DCB en el que se especifiquen los subparametros BLKSIZE, BUFNO, donde: BLKSIZE especifica el tamaño del bloque en bytes BUFNO especifica el numero de buffers que debe mantener Existe una restricción en el uso de esta sentencia: No puede usarse la sentencia DD con el parámetro * dentro de un procedimiento, ya sea In Stream o catalogado. Ejemplo //JMP15 JOB (123,456),'JMP-PRU',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614 //********************************** //PROCESO PROC //PASO00 EXEC ... ... //PASO01 EXEC ... ... // PEND //********************************** //PASO1 EXEC PGM=PROGRAM1,ACCT=135 //ENTRADA DD * 19941231 /* //*--------------------------------- //PASO2 EXEC PROCESO //PASO00.ENTRADA DD * P94-A8 ... /* //*--------------------------------- //PASO3 EXEC PGM=PROCESO //PASO00.ENTRADA DD *,DCB=(BLKSIZE=80,BUFNO=5) P01-XX ... //

Page 74: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 74 de 374

2.6.2 DATA Parámetro Posicional. Si se usa debe ser el primero. Este parámetro es idéntico al anterior, con la salvedad de que no considera la secuencia // en las columnas 1 y 2 como fin de JOB y en consecuencia fin de fichero. Se usa normalmente cuando los datos que siguen a este parámetro son las sentencias de control de otro JOB. La restricción de este parámetro es que los datos no pueden contener una sentencia DD DATA. Tampoco puede aparecer dentro de un procedimiento. En caso de necesitarlo, se añadirá este fichero como dummy en el procedimiento, y se referenciara la DDname en el paso que invoca al procedimiento. Ejemplo //DESJMPCA JOB (44,123),'DESARROLLO',CLASS=C,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(0,1) //PASO0030 EXEC PGM=IEBGENER,COND=(0,LT) //SYSUT2 DD SYSOUT=(A,INTRDR) //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //SYSUT1 DD DATA,DLM=WB //DESJMPCA JOB (55,456),'TEST',CLASS=C,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(0,1) //******************************************************************** //* FUSIONAR LOS REGISTROS 01 Y 11 EN UN UNICO FICHERO ** //* EN LOS CASOS EN QUE HAYA 01 Y 11 DEJAR UNO SOLO CON LA SUMA: 1B ** //******************************************************************** //PASO03 EXEC TSORT //SORTIN DD DSN=DESJMP.WSALOPER.PRO.WORK01S,DISP=(OLD,DELETE,KEEP) // DD DSN=DESJMP.WSALOPER.PRO.WORK11S,DISP=(OLD,DELETE,KEEP) //SORTOUT DD DSN=DESJMP.WSALOPER.PRO.WORK99, // DISP=(NEW,CATLG,DELETE), // UNIT=(ACL1,,DEFER),VOL=(,,,30),LABEL=(1,SL), // DATACLAS=DFBXP,LRECL=52 //SYSIN DD * SORT FORMAT=CH,FIELDS=(16,19,A) SUM FIELDS=(14,2,ZD) /* WB Este ejemplo muestra como se puede submitir un Job desde otro JOB, pues lo que hace es copiar los datos que vienen en la misma cadena, a continuación, sobre la cola "A", de entrada de trabajos (INTRDR).

Page 75: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 75 de 374

El objetivo de este JOB es ejecutar en otro entorno, el de TEST (notar que cambia la informacion de contabilidad de las fichas JOB), el procedimiento TSORT para clasificar el fichero de entrada fusionando registros, tal y como lo describe el comentario del propio JOB. Si no fuera por el parámetro DATA al encontrarse en la segunda ficha de datos con la secuencia // daría por cerrado el JOB. De esta forma el programa IEBGENER toma toda la secuencia como el fichero de entrada y la copia sobre la salida.

Page 76: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 76 de 374

2.6.3 DLM Parámetro de palabra clave. Este parámetro, nemonico de delimitador, se usa conjuntamente con los parámetros anteriores a fin de definir el delimitador que se usara como fin de fichero. Evidentemente este parámetro se usa cuando dentro del fichero de datos que siguen a la sentencia DD figura la secuencia /* formando parte de los datos, y por lo tanto no puede interpretarse como fin de fichero. Cuando el delimitador definido contiene caracteres especiales, debe ir encerrado entre apóstrofes. Ejemplo //PASO1 EXEC PGM=IEBGENER //SYSUT2 DD SYSOUT=(A,INTRDR) //SYSDUMP DD DUMMY //SYSUT1 DD *,DLM='$$' //DESJMP01 JOB ... ... $$

Page 77: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 77 de 374

2.6.4 DUMMY Parámetro posicional Este parámetro define un fichero ficticio o fantasma, ya que establece una relación entre una ddname y nada. De esta forma, si su definición se considerara obligatoria para la ejecución del programa, estaría definido, aunque realmente no se ha definido físicamente. Cuando quieran leerse los datos asociados a este fichero daría EOF ya que no tiene datos, y, si por el contrario el programa quisiera escribir en el, iría simulando que escribe los datos, pero realmente no se escribirían. //PASO1 EXEC PGM=IEBGENER //SYSUT1 DD DSN=DESJMP.JCL(PRUEBA),DISP=SHR //SYSUT2 DD SYSOUT=(A,INTRDR) //SYSIN DD DUMMY Caso particular: Cuando en una secuencia de DDs concatenadas existe alguna con el parámetro DUMMY, todas las que le sigan se consideraran también como DUMMY, aunque no sea eso lo que tenga especificado. Por otra parte, existe un nombre especial de fichero NULLFILE que equivale a este parámetro. Es decir: //FICHERO DD DSN=NULLFILE equivale a //FICHERO DD DUMMY

Page 78: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 78 de 374

2.6.5 SYSOUT ( para ficheros de impresión) Parámetro de palabra clave Se utiliza para especificar las características del fichero de salida, sabiendo que este se envía al SPOOL para su impresión. El formato de este parámetro es: SYSOUT=* SYSOUT=([clase],[,programa][,formulario]) donde clase especifica la clase de la cola de salida del spool a la que se envía el fichero para su impresión. En el caso de que se especifique * la salida se envía a la misma clase a la que se envían los mensajes del JOB, y que se ha definido en la sentencia JOB con el parámetro MSGCLASS. Programa En el caso de que dicha salida deba ser tratada por algún programa para escribirle, ese será el nombre del programa que se especifique aquí. Existen dos nombres especiales: - INTRDR : nemonico de INTernal ReaDeR - STDWTR : nemonico de STandarD WriTeR Formulario Este es el nombre del formulario que debe usarse para imprimir la salida. Este nombre estará compuesto por una palabra de hasta 4 caracteres. Cuando se especifica INTRDR lo que le indicamos al sistema es que el fichero de salida sea enviado a la entrada del JES ya que el resultado es un conjunto de fichas de control. Es decir, es un JOB. Ejemplo //JMP15 JOB (123,456),'DESARROLLO',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614 //PASO1 EXEC PGM=IEBGENER //SYSUT2 DD SYSOUT=(A,INTRDR) //SYSUT1 DD DATA,DLM='$$' //JMP15C JOB (999,H,234),'PRODUCCION',CLASS=Q, // MSGLEVEL=(1,0) ... /* //PASO2 EXEC PGM=IEBGENER //SYSUT2 DD SYSOUT=* //SYSUT1 DD * ... /* $$

Page 79: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 79 de 374

Este parámetro puede ir acompañado de los siguientes parámetros: OUTLIM=n donde n representa un numero comprendido entre 1 y 16777215. Por defecto se asume que no hay limite. Este parámetro limita el numero de registros escritos. Su formato es : En el caso de que se alcance el numero especificado, se cede el control a una rutina del SMF para determina lo que se debe hacer. En caso de que no exista dicha rutina, se termina el JOB. Ejemplo: //SALIDA DD SYSOUT=*,DEST=RMT55,OUTLIM=5000 COPIES=n Este parámetro especifica el numero de copias a imprimir. HOLD=YES Este parámetro especifica que la salida quede en HOLD hasta ser liberado por el usuario o por el operador. DEST=dispositivo Este parámetro especifica la dirección de la impresora de salida. Por defecto se asume DEST=LOCAL DCB=(par1[,par2[...]]) Este parámetro no es obligatorio, pero puede especificarse para definir atributos complementarios a la salida mediante los siguientes subparametros:

Page 80: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 80 de 374

Para impresora PRTSP=n especifica el espaciado. Por defecto asume PRTSP=1 RECFM=fc especifica el formato y los caracteres de control, donde: f Puede tomar los valores: F (fijo) V (variable) U (indeterminado) c Puede tomar los valores: A : Para usar los caracteres de control ASA M : Para usar los caracteres de control maquina Para lectora y perforadora MODE=C especifica que se usen columnas binarias, es decir dos posiciones por carácter, por lo que en este caso BLKSIZE,LRECL y BUFL=160 MODE=E especifica que se usen columnas de EBCDIC (es el valor asumido por defecto). UCS (Universal Character Set) Este parámetro especifica el conjunto de caracteres a usar, pues pide al operador la cadena que debe colocar en la impresora. Solo puede usarse este parámetro en sentencias donde UNIT especifique una impresora. El formato de este parámetro es el siguiente: UCS=(código,FOLD,VERIFY) FCB (Form Control Buffer) Este parámetro especifica el formato que debe usar la impresora. El formato de este parámetro es el siguiente: FCB=(formato[,ajuste]) donde: formato especifica el formato que debe usar, estando este definido por un nombre de 4 caracteres alfanuméricos. IBM proporciona de forma standard los siguientes formatos, pero pueden definirse los que se deseen en la instalación.

Page 81: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 81 de 374

STD1 y STD6 para 6 líneas por pulgada en 11 (vertical y apaisado) STD2 y STD8 para 8 líneas por pulgada en 8.5 (idem) STD3 para 8 líneas por pulgada (para impresoras 3800) ajuste Puede tomar los siguientes valores: ALIGN Especifica que el operador chequee que la impresora esta ajustada antes de imprimir. VERIFY Este parámetro es parecido al anterior, pues especifica que el operador verifique que la salida que se esta imprimiendo es la que se pide. BURST=Y Este parámetro especifica que la salida se haga en hojas separadas (BURST=Y) o en papel continuo (BURST=N). Aunque lo normal en las instalaciones es tener asignado uno de estos valores a cada una de las colas de salida, CHARS=(tabla0[,tabla1[,tabla2[,tabla3]]]) Este parámetro especifica el conjunto de caracteres que se debe usar en la impresión. En el caso de especificarse mas de una tabla se debe especificar además el parámetro siguiente: DCB=OPTCB=J para indicar que el segundo byte de cada línea es un carácter de control que especifica la tabla que se debe usar pudiendo tomar los valores de 0 a 3 MODIFY=(modulo,tabla_n) Este parámetro especifica el nombre del modulo contenido en la librería SYS1.IMAGELIB que se usara para tratar datos o blancos de las líneas impresas. Tabla_n especifica el numero de tabla a usar, correspondiendo su valor con el conjunto que se debe usar especificado en el parámetro CHAR.

Page 82: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 82 de 374

2.6.6 COPIES (salida de impresión) Parámetro de palabra clave Este parámetro especifica el numero de copias que se desean imprimir del mismo fichero. Como es lógico, este parámetro solo puede especificarse en fichas DD que envían su salida al SPOOL para su posterior impresión. El formato de este parámetro es: COPIES=numero donde NUMERO especifica el numero de copias a realizar. Su valor debe estar comprendido en el rango 1 a 255. Por defecto asume 1 Ejemplo //JMP18 JOB (123,456),'DESARROLLO',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614 //PASO1 EXEC PGM=IEBGENER //SYSUT2 DD SYSOUT=K,COPIES=5 //SYSUT1 DD DSN=DESJMP.JCL(EJEMPLO),DISP=SHR //SYSIN DD DUMMY

Page 83: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 83 de 374

2.6.7 DEST ( ficheros de impresión ) Parámetro de palabra clave Este parámetro especifica la dirección de la impresora por la que se desea realizar la impresión del fichero. Este parámetro, como en los anteriores, solo puede especificarse en fichas DDs que envían su salida al SPOOL para su impresión. El formato de este parámetro es: DEST=dirección donde DIRECCION especifica la identificación de la impresora a la que se envía el fichero a imprimir. Ejemplo //JMP18 JOB (123,456),'DESARROLLO',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614 //PASO1 EXEC PGM=IEBGENER //SYSUT2 DD SYSOUT=K,COPIES=5,DEST=RMT57 //SYSUT1 DD * ... /* //PASO2 EXEC PGM=IEBGENER //SYSUT2 DD SYSOUT=K,COPIES=5,DEST=LOCAL //SYSUT1 DD * ... /* Por defecto, en el caso de no especificarse este parámetro, los trabajos quedan asignados a la impresora LOCAL.

Page 84: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 84 de 374

2.6.8 HOLD (para ficheros de impresión ) Parámetro de palabra clave Este parámetro especifica que el fichero no se imprima hasta que no sea liberado desde la cola de salida por el operador, cosa que se hace con el comando de línea 'A' en el panel del SDF correspondiente a los trabajos de salida. Este parámetro, como en los anteriores, solo puede especificarse en fichas DDs que envían su salida al SPOOL para su impresión. El formato de este parámetro es: HOLD=YES/NO Ejemplo //JMP18 JOB (123,456),'DESARROLLO',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614 //PASO1 EXEC PGM=IEBGENER //SYSUT2 DD SYSOUT=K,COPIES=5,DEST=RMT57, // HOLD=YES //SYSUT1 DD * ... /* En el caso de no especificarse este parámetro, el JES asume por defecto el valor HOLD=NO

Page 85: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 85 de 374

2.6.9 FREE (para ficheros de impresión y de datos) Parámetro de palabra clave. Este parámetro especifica que el fichero asociado a este parámetro se libere: - cuando se termine de ejecutar el paso en que se encuentra definido. Es decir cuando termine de ejecutarse el programa. - o cuando el programa cierre el fichero, no esperando por tanto a que termine el paso. Este parámetro tiene sentido en programas de largo tiempo de ejecución y en ficheros de impresión. El formato de este parámetro es: FREE=END/CLOSE Ejemplo //JMP18 JOB (123,456),'DESARROLLO',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614 //PASO1 EXEC PGM=BATCHP1 //ENTRADA1 DD DSN=DESJMP.JMP.PARAM1, // DISP=SHR,FREE=END //ENTRADA2 DD DSN=DESJMP.JMP.FICHERO,DISP=SHR ... /* En el caso de no especificarse este parámetro, el JES asume por defecto el valor FREE=END

Page 86: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 86 de 374

2.6.10 DSNAME (DSN) Parámetro de palabra clave. Este parámetro especifica el nombre del fichero que contiene o contendrá los datos tratados por el programa que ejecuta el paso donde esta definida esta DD. El formato de este parámetro es: (1) DSN=nombre_fichero (2) DSN=librería(miembro) (3) DSN=nombre_fichero(numero_versión) (4) DSN=nombre_temporal (5) DSN=*.nombre_DD (6) DSN=*.nombre_paso.nombre_DD (7) DSN=*.nombre_paso.Nombre_paso_proc.nombre_DD (8) DSN=NULLFILE En cualquiera de los formatos definidos, se puede utilizar tanto la palabra clave DSN como la palabra clave DSNAME. El nombre del fichero sigue las reglas generales, es decir, estará formado por grupos de cualificacion de 1 a 8 caracteres separados por puntos, no pudiendo sobrepasar todo el conjunto los 44 caracteres. Cada cualificador deberá comenzar por un carácter alfabético (A-Z) o los caracteres especiales ($,@,=). Como particularidad figura que el nombre de un fichero en cinta no puede contener mas de 17 caracteres. El formato (1) especifica el nombre del fichero secuencial que se utilizara en la ejecución del paso, ya sea de entrada, de salida o de entrada/salida. //SORTIN DD DSN=DESJMP.SECUENC,DISP=(OLD,DELETE,KEEP) El formato (2) especifica el nombre del miembro de una librería. //SORTIN DD DSN=DESJMP.JCL(ENTRADA),DISP=SHR

Page 87: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 87 de 374

El formato (3) especifica el numero de versión para los ficheros generacionales (GDG). Un fichero generacional es aquel que bajo el mismo nombre mantiene diversas versiones, hasta 255. Estas versiones se referncian como: (0) la ultima, (+1) la próxima, (-1) la anterior. La longitud máxima del nombre de un fichero GDG es de 35 caracteres. //** **************************************************************** ** //COPIAF01 EXEC PGM=IEBGENER //SYSUT1 DD DSN=DESJMP.HISTORIA(0),DISP=SHR // DD DSN=DESJMP.MVTOS,DISP=(OLD,DELETE,KEEP) //SYSUT2 DD DSN=DESJMP.HISTORIA(+1), // DISP=(,CATLG,DELETE), // DATACLAS=DFBXP,LRECL=133 //SYSIN DD DUMMY //SYSPRINT DD DUMMY //** **************************************************************** ** El formato (4) especifica el nombre de un fichero temporal que se utilizara como continente receptor de informacion para un paso posterior del mismo JOB. Se entiende por fichero temporal un fichero que se crea en un paso de un JOB y desaparece cuando termina el JOB. La única diferencia con respecto a los ficheros permanentes, estriba en el nombre, que en los temporales empiezan por & o &&. Los ficheros temporales no admiten cualificadores. //******************************************************************** //PASO1 EXEC PGM=PROGRAMA //CMPRINT DD SYSOUT=W //SALIDA DD DSN=&&BAJAS, // DISP=(NEW,PASS), // SPACE=(TRK,(20,10)), // DCB=(LRECL=64,BLKSIZE=6144,RECFM=FB), // UNIT=SYSDA //********************************************************************

Page 88: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 88 de 374

El formato (5) especifica un fichero por referencia, es decir, especifica el nombre de la ficha DD en la que se encuentra definido el nombre del fichero con el parámetro DSN. El asterisco (*) significa que la ficha DD referenciada pertenece al mismo paso de la ficha DD en la que se define la referencia. //******************************************************************** //PASO2 EXEC PGM=PROGRAMA //CMPRINT DD SYSOUT=W //ENTRADA1 DD DSN=&&BAJAS,OLD //ENTRADA2 DD DSN=*.ENTRADA1 //SALIDA DD DSN=DESJMP.LISTADO, // DISP=(NEW,CATLG), // SPACE=(TRK,(20,10)), // DCB=(LRECL=64,BLKSIZE=6144,RECFM=FB), // UNIT=SYSDA //******************************************************************** El formato (6) es parecido al anterior, pero en este caso, la ficha DD referenciada se encuentra en un paso distinto al de la ficha DD que define la referencia. //******************************************************************** //PASO3 EXEC PGM=PROGRAMA //SYSPRINT DD SYSOUT=W //SYSUT1 DD DSN=*.PASO2.SALIDA,DISP=SHR //SYSUT2 DD SYSOUT=K,DEST=RMT11 //******************************************************************** El formato (7) también es parecido al anterior, pero en este caso, la ficha DD referenciada se encuentra en un procedimiento, y por eso se referencia especificando el nombre del paso que llama al procedimiento, y el nombre del paso dentro del procedimiento, ya que este procedimiento puede tener varios pasos. El formato (8) es un formato que especifica como nombre del fichero un nombre especial, el nombre NULLFILE, lo cual indica al sistema que no le asigne recursos, pero que le contemple como si existiera. Es decir ese nombre define un fichero fantasma. //FICHERO DD DSN=NULLFILE equivale a //FICHERO DD DUMMY

Page 89: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 89 de 374

2.6.11 DDNAME Parámetro de palabra clave. Este parámetro referencia el nombre de una DDname del JCL que se desea ejecutar en el que esta definido el nombre o nombres de ficheros que se desean definir con esta sentencia DD. El formato de este parámetro es: DDNAME=*.nombre_DD DDNAME=*.nombre_paso.nombre_DD En el caso de que no se especificara la DDname referenciada, se asumiria como DUMMY el valor de este parámetro.

Page 90: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 90 de 374

2.6.12 DISP Parámetro de palabra clave. Este parámetro especifica la situación o disposición que tiene el fichero cuando se inicia el paso, cuando finaliza bien el paso, y cuando finaliza con error. El formato de este parámetro es: DISP=(dis_inicial,disp_fin_normal,disp_fin_anormal) La disposición inicial puede ser una de las siguientes: NEW no existe el fichero OLD El fichero ya existe SHR El fichero es compartido MOD Los datos se apendizan al fichero existente. , Si no se especifica, se asume NEW por defecto. La disposición en el caso de que el paso finalice normalmente puede ser una de las siguientes: ,DELETE El fichero se borrara ,KEEP El fichero se mantendrá ,PASS El fichero se utilizara en pasos posteriores del mismo JOB. ,CATLG El fichero se guardara y además se catalogara. ,UNCATLG El fichero se guardara, pero se borrara la entrada del catalogo. , En el caso de no especificar ningún parámetro, asume: - DELETE para estado inicial NEW - KEEP para estado inicial OLD La disposición en el caso de que el paso finalice anormalmente puede ser una de las siguientes: ,DELETE El fichero se borrara ,KEEP El fichero se mantendrá ,CATLG El fichero se guardara y además se catalogara. ,UNCATLG El fichero se guardara, pero se borrara la entrada del catalogo.

Page 91: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 91 de 374

La diferencia entre KEEP y PASS estriba solo en como se codifica la sentencia DD, ya que si la primera vez que codificamos la DD especificamos KEEP, al referenciar de nuevo el fichero en un paso posterior debemos especificar todos los parámetros de ese fichero, mientras que si hubiéramos especificado la primera vez PASS , ya no seria necesario codificar toda esa informacion en los pasos siguientes. Restricción: En los ficheros temporales no se admite la disposición KEEP. Cuando la DDname referencia un fichero particionado, lo que este parámetro especifique se aplica al fichero completo, no a un miembro concreto, incluso si se especifica en el DSN el nombre de un miembro. En el caso de trabajar con cintas, si se especifica KEEP, el sistema descargara la cinta cuando termine el paso, mientras que si se especifica PASS no se descarga la cinta. Ejemplo //JMP20 JOB (123,456),'DESARROLLO',CLASS=X, // MSGLEVEL=(1,1),NOTIFY=T976614 //PASO1 EXEC PGM=BATCHP1 //ENTRADA1 DD DSN=&&FILE1,DISP=(MOD,PASS) //ENTRADA2 DD DSN=DESJMP.JMP.JCL(EJEMPLO),DISP=SHR ... /* En general, todas las fichas JOBLIB, JOBCAT, STEPLIB, STEPCAT, SYSLIB, SYSLMOD, COBLIB deben llevar obligatoriamente DISP=SHR.

Page 92: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 92 de 374

2.6.13 SPACE Parámetro de palabra clave. Este parámetro especifica el espacio que se desea asignar a un fichero. El formato de este parámetro es : SPACE=(unidad,(c_pri[,c_sec][,c_dir]),[,RLSE][modo][,ROUND]) Donde : UNIDAD Especifica la unidad en la que se mide la asignación de recursos que se solicitan para el fichero. Puede ser: - TRK : La cantidad especifica numero de pistas. - CYL : La unidad especifica numero de cilindros. - nnnn : donde nnnn representa la longitud de bloque c_pri Cantidad Primaria Especifica el numero de unidades que se asignan inicialmente al fichero. c_sec Cantidad Secundaria Especifica el numero de unidades que se asignaran al fichero en el caso de que no fuera suficiente la cantidad primaria asignada. El sistema hará hasta 16 extensiones de un mismo fichero en cada volumen, dando en cada extensión la cantidad especificada como cantidad secundaria. Esto esta establecido así a fin de no reservar espacio innecesariamente, e ir ampliando el fichero cuando se necesite. c_dir Este parámetro especifica dos cosas distintas: - en el caso de que e trate de un fichero particionado: Numero de Bloques de 256 bytes que se dedican como directorio del fichero. - Y, si es un fichero secuencial-indexado: Numero de cilindros que se asignan al area de índices. RLSE Este parámetro especifica al sistema que cuando se cierre el fichero se libere el espacio que no haya sido utilizado. Para seguir las normas generales de los parámetros posicionales, en el caso de no especificarse este parámetro, debe escribirse una coma, si es que siguen otros parámetros.

Page 93: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 93 de 374

modo Este parámetro puede tener los siguientes valores: CONTIG Con este valor indicamos al sistema que el espacio que se asigne como cantidad primaria debe asignarse en un espacio contiguo del disco. MXIG Este valor especifica casi lo mismo que el valor anterior, con la diferencia de que en este caso especificamos al sistema que asigne el espacio contiguo, si es que dispone de él. ALX Con este valor, especificamos al sistema que asigne para la cantidad primaria, hasta 5 areas contiguas del tamaño especificado como cantidad primaria. Ejemplo //*=================================================================== //P010 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //I DD DSN=DESJMP.SAP2060.DB1,DISP=(SHR) //O DD DSN=DESJMP.JMP31785.DB1(+1),DISP=(,PASS), // SPACE=(CYL,(25,2),RLSE,,ROUND), // UNIT=(SYSALLDA,01), // VOL=(SER=), // LABEL=(000), // DCB=(MODEL,LRECL=16377,BLKSIZE=16384,RECFM=VB) //SYSIN DD DSN=DESJMP.CONTROL(JMP00000),DISP=(SHR) //*=================================================================== En el siguiente ejemplo el espacio asignado se especifica dando la longitud del bloque. // SPACE=(09076,(003140,001046),RLSE,,ROUND),

Page 94: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 94 de 374

2.6.14 VOLUME Parámetro de palabra clave. Este parámetro especifica el volumen en el que residirá el fichero. También puede usarse la palabra abreviada VOL. Este parámetro es opcional, ya que el sistema, en el caso de que no se especifique, hará la asignación del espacio solicitado en cualquiera de los volúmenes que en ese momento se encuentren montados. El formato de este parámetro es: VOL=([PRIVATE][,RETAIN][,sec][,cuenta][,ser_ref]) Donde: PRIVATE especifica que el volumen es un volumen privado, y por tanto este se asigna como de utilización exclusiva para el paso en el que figura este parámetro. RETAIN especifica que el volumen en cinta no se desmonte, ya que de no especificar este parámetro, el volumen se desmontara cuando acabe el paso. sec especifica la posición del fichero dentro del volumen de cinta montado. cuenta Numero de volúmenes que necesita un fichero multivolumen, es decir, aquel fichero que ocupa varias cintas. ser_ref Este parámetro puede tomar los siguientes formatos: SER=num_serie Especifica el numero de serie del volumen REF=nom_fichero Con este formato le indicamos al sistema que se desea asignar para el nuevo fichero el mismo volumen que el que tiene asignado el fichero cuyo nombre especificamos en este parámetro. REF=*.nombre_DD Es parecido al anterior, con la diferencia que en este caso especificamos el fichero mediante el nombre de la DD que le referencia. En el caso de que se necesite especificar mas de un numero de serie, estos se especificaran separándolos por comas, y encerrándolos entre paréntesis para seguir las normas generales de codificación de parámetros posicionales.

Page 95: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 95 de 374

Ejemplos El siguiente paso de JOB muestra cómo se puede copiar un fichero sobre cinta. En este caso son varios ficheros físicos los que se copian, aunque, al tener DDs concatenadas, son todos considerados como un unico fichero lógico. El fichero de salida puede tener hasta 30 volúmenes o cintas. //****************************************************** //* COPIAR FICHERO DE DISCO A CINTA //*- - - - - - - - - - - - - - - - - - - - - - - - - - - //PASO1 EXEC PGM=IEBGENER //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=DESJMP.WTZZ0D0X.PRO,DISP=OLD // DD DSN=DESJMP.WTZZ0D0X.PRO@01,DISP=OLD // DD DSN=DESJMP.WTZZ0D0X.PRO@02,DISP=OLD // DD DSN=DESJMP.WTZZ0D0X.PRO@03,DISP=OLD //* ----------- FICHERO DE SALIDA //SYSUT2 DD DSN=DESJMP.WTZZ0D0X.PRO.REPORT11,DISP=(NEW,CATLG,), // UNIT=(ACL1,,DEFER),VOL=(,,,30),LABEL=(1,SL), // DCB=*.SYSUT1 //SYSIN DD DUMMY El siguiente ejemplo ejecuta la utilidad IEBCOPY. Esta utilidad ejecuta lo que se le indica en el fichero que contiene los comandos de entrada, identificado por la DDname SYSIN. Lo que se dice a través de esta entrada es que copie la DDname indicada en IN-DD sobre la DDname especificada en OUT-DD. En este caso se especifica que no desmonte el volumen porque, posiblemente, se quiera usar el fichero siguiente. //***************************************************** //PASO1 EXEC PGM=IEBCOPY //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //LIB1 DD DSN=LINKLIB,DISP=(OLD,PASS),UNIT=482, // LABEL=(1,SL),VOL=(,RETAIN,SER=ENE001) //* ----------- FICHERO DE SALIDA //LIB2 DD DSN=DESJMP.SECLOAD,DISP=SHR //SYSIN DD * COPY INDD=LIB1,OUTDD=LIB2 /* //******************************************************

Page 96: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 96 de 374

2.6.15 UNIT Parámetro de palabra clave. Este parámetro se usa para definir al sistema la unidad física, o tipo de unidad en la que se ubicara el nuevo fichero, ya que si el fichero ya existe, y esta catalogado, este parámetro es ignorado si se especifica. El formato de este parámetro es: UNIT=([parm1][,parm2][,DEFER]) donde: parm1 es el primer subparametro, y sirve para determinar donde se ubicara el nuevo fichero, pudiendo especificarse de tres formas distintas: - dando la Dirección de la unidad es decir especificando la dirección lógica de la unidad elegida. - dando el tipo de la unidad es decir especificando un nombre conocido por el sistema que agrupa unidades del mismo tipo de dispositivo. Ejemplo: 2314,3330,... - dando el nombre genérico. es decir especificando un nombre genérico, que identifica a una serie de dispositivos. Estos nombres, que constan de 1 a 8 caracteres, son definidos en tiempo de generación del sistema, y por tanto dependen de cada instalación. Ejemplo: - SYSDA : Dispositivos de acceso directo - ALLSYSDA : Dispositivos de acceso directo - SYSSO : Dispositivos secuenciales - TAPE : Dispositivo en cinta - etc.. parm2 Este subparametro, opcional, puede tomar los siguientes valores: - cuenta : especifica el numero de unidades que se necesitan para el fichero.

Page 97: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 97 de 374

- P : si se especifica el valor "P" le estamos indicando al sistema que los volúmenes especificados deben montarse en unidades distintas, es decir, en p_aralelo. DEFER Este subparametro se utiliza para indicarle al sistema que los volúmenes deben montarse cuando el programa ejecute el open del fichero, no cuando comience la ejecución del paso. Como particularidad de este parámetro figura el hecho de que es el unico parámetro necesario de las sentencias DD de los ficheros temporales en cinta magnética. Ejemplo //PASO1 EXEC PGM=PROG0001 //ENTRADA1 DD DSN=FICHERO1,DISP=OLD,UNIT=(2400,,DEFER) //ENTRADA2 DD DSN=FICHERO2,UNIT=123,DISP=OLD //ENTRADA3 DD DSN=FICHERO3,UNIT=SYSDA,VOL=SER=DES92 //SALIDA01 DD DSN=DESJMP.JMP,DISP=SHR,UNIT=2400 //SALIDA02 DD DSN=&FILE1,UNIT=3330,... //SALIDA03 DD DSN= ... /* En el anterior ejemplo, la sentencia DD: ENTRADA1 especifica que el FICHERO1 se encuentra ubicado en la unidad de cinta (tipo 2400) pero no se desea que se monte hasta que el programa ejecute el OPEN del fichero. ENTRADA2 especifica que el FICHERO2 se encuentra ubicado en la unidad que tiene por dirección 123. Este tipo de designacion se usa para ficheros no catalogados. ENTRADA3 especifica que el FICHERO3 se encuentra en la unidad de disco que tiene por numero de serie DES92 SALIDA01 Define un fichero sobre una unidad del tipo 2400 que corresponde a cinta magnética. SALIDA02 Define el fichero temporal sobre un disco del tipo 3330. Como no se especifica VOLUMEN, el sistema elegirá un dispositivo de los que tiene montados, del tipo 3330 y no declarado como PRIVATE para ubicar en él el nuevo fichero.

Page 98: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 98 de 374

2.6.16 DCB Parámetro de palabra clave. Este parámetro es el que determina el formato interno del registro del fichero que se esta definiendo. Este parámetro solo es obligatorio en el momento de crear un fichero, por lo que si el fichero tiene DISP=MOD/OLD no es necesario especificarlo. El formato de este parámetro es: DCB=(parm1,parm2,...) donde los distintos subparametros que configuran el parámetro son todos de palabra clave, razón por la que pueden ir en el orden que se desee. Los parámetros mas usados son: RECFM especifica el tipo de formato del registro, pudiendo tomar los siguientes valores: - U : Indefinido - V : Variable - VB : Bloqueado de longitud variable. - F : Fijo - FB : Fijo bloqueado. - FBA: Fijo Bloqueado con carácter control de carro LRECL especifica la longitud del registro en bytes. BLKSIZE especifica el tamaño de bloque o registro físico, expresándole en numero de bytes. DSORG Especifica el tipo de organizacion del fichero, pudiendo tomar los siguientes valores: - PS : Secuencial - IS : Secuencial indexado. - DA : Organización directa. - PO : Organización particionada. DEN Especifica el tipo de densidad de grabación, pudiendo tomar los siguientes valores: 2 para 800 bpi (Bits per Inche) 3 para 1600 bpi 4 para 6250 bpi

Page 99: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 99 de 374

Ejemplo //PASO1 EXEC PGM=PROG0001 //ENTRADA1 DD DSN=FICHERO1,DISP=OLD //SALIDA01 DD DSN=DESJMP.JMP.JCL(EJEMPLO), // DISP=SHR,UNIT=2400, // DCB=(LRECL=80,RECFM=FBA,BLKSIZE=23440) En el anterior ejemplo, la sentencia DD: SALIDA01 Define un fichero que tiene una longitud de registro de 80 Bytes, agrupados en bloques de 293 registros, es decir en bloques de 23440 octetos. El formato del registro es Fijo, bloqueado y se utilizara el primer octeto del registro como informacion de control para la impresora. El siguiente ejemplo muestra 2 DCBs típicas de un fichero en cinta y otro en disco. Solo hay que ajustar los valores del tamaño del bloque en función del tamaño del registro, lo cual, dependiendo de las instalaciones se suele hacer usando el comando de TSO BLKSIZE, aunque en otras instalaciones se usa SPACE2, o alguno parecido. //CMWKF04 DD DSN=DESJMP.WRK49406.D22,DISP=(NEW,CATLG,CATLG), // UNIT=(ACL1,,DEFER),VOL=(,,,30),LABEL=(1,SL), // DCB=(RECFM=FB,LRECL=4538,BLKSIZE=18152) //* //SYSUT2 DD DSN=DESJMP.WTZZ0D0X.PRO.XXX,DISP=(NEW,CATLG,), // UNIT=SYSDA,SPACE=(CYL,(4,1),RLSE), // DCB=(LRECL=33,BLKSIZE=23464,RECFM=FB)

Page 100: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 100 de 374

2.6.17 DATACLASS Parámetro de palabra clave. Este parámetro especifica el nombre de una clase definida por el administrador del sistema que permite simplifica las labores de alocacion de los nuevos ficheros, siendo ignorado este parámetro en el caso de que ya exista el fichero. Los parámetros estándar que cubre este parámetro son: - LRECL y RECFM (subparametros de DCB) - SPACE - VOL El formato de este parámetro es: DATACLAS=nombre_clase donde nombre_clase es el nombre de una clase definida por el administrador del sistema que puede tener de 1 a 8 caracteres y que sigue la norma general de empezar por carácter.

Page 101: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 101 de 374

2.6.18 LABEL Parámetro de palabra clave. Este parámetro especifica el tipo de etiqueta utilizado por el dispositivo sobre el que se encuentra el fichero definido en la sentencia DD. El formato de este parámetro es: LABEL=([secuencia][,tipo][,password][,expiración]) donde : secuencia Especifica la posición relativa del fichero con respecto al origen dentro del volumen de cinta. Por omisión se asume el valor 1, es decir es el primero de la cinta. tipo Especifica el tipo de etiqueta usado. Puede tomar los siguientes valores: SL Usa Etiquetas estándar IBM SUL Usa Etiquetas estándar IBM de usuario AL Usa Etiquetas ANS AUL Usa etiquetas ANS de usuario NSL No usa etiquetas estándar NL No usa ninguna etiqueta LTM El sistema debe ignorar la marca de cinta de relleno en la cabecera. BLP El sistema no debe procesar etiquetas de fichero de cinta. Por omisión, se asume el valor SL. password especifica la protección asociada al fichero. Puede tomar los siguientes valores: PASSWORD en este caso, el fichero no podrá leerse ni modificarse ni borrarse a menos que se especifique la clave que le protege. NOPWREAD en este caso, la clave de protección no será necesaria para leer el fichero, pero si para actualizarlo o borrarlo. expiración Especifica la fecha en la que expira el fichero.

Page 102: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 102 de 374

Ejemplo //PASO1 EXEC PGM=PROG0001 //ENTRADA1 DD DSN=FICHERO1,DISP=OLD //SALIDA01 DD DSN=DESJMP.JMP.JCL(EJEMPLO), // DISP=SHR,UNIT=2400, // DCB=(LRECL=80,RECFM=FBA,BLKSIZE=80), // LABEL=(3,SL),VOL=SER=JMP94 En el anterior ejemplo, la sentencia DD: SALIDA01 Define el tercer fichero de la cinta montada en la unidad de tipo 2400 y cuyo numero de serie del volumen es JMP94.

Page 103: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 103 de 374

2.7 Sentencia OUTPUT Esta sentencia esta íntimamente ligada al parámetro OUTPUT de la sentencia DD, y permite especificar características especiales para cada uno de los archivos de SYSOUT, pudiéndose incluso usar para enviar un mismo archivo a varias impresoras. La etiqueta de esta sentencia debe ser única a nivel de JCL //PASO1 EXEC PGM=PROGRAMA //GOYA OUTPUT DEST=RMT111 //BARNA OUTPUT DEST=RMT222 //SALIDA DD SYSOUT=A,OUTPUT=(GOYA,BARNA) Esta sentencia solo es aplicable para MVS/XA y MVS/ESA, y los parámetros que pueden especificarse son: BURST Para especificar tipo de papel (separado o continuo) CHARS Para especificar conjunto o conjuntos de caracteres a usar en la impresión. CKPTLNS=líneas Especifica el máximo numero de líneas que puede contener una página lógica. Debe estar comprendido en el rango 0-32767. CKPTPAGE=paginas Especifica el máximo numero de páginas lógicas que se pueden imprimir. Debe estar comprendido en el rango 0-32767. CKPTSEC=segundos Especifica el tiempo de CPU, expresado en segundos, transcurrido entre checkpoints del sysout. CLASS=clase Este parámetro especifica la clase de salida, y se debe usar cuando se ha especificado un valor nulo en el parámetro de la fiche DD. //PASO1 EXEC PGM=PROGRAMA //GOYA OUTPUT DEST=RMT111,CLASS=A //BARNA OUTPUT DEST=RMT222,CLASS=J //SALIDA DD SYSOUT=(,)A,OUTPUT=(*.GOYA,*.BARNA)

Page 104: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 104 de 374

2.8 Sentencias DD especiales Una vez vista la estructura de las fichas DD y los parámetros que la pueden configurar, se pasa a estudiar una serie de fichas DD cuyo nombre tiene significado propio para el sistema, pero que por ser sentencias DD siguen las reglas generales vistas para estas fichas. JOBLIB Esta sentencia especifica la localización dentro del sistema de las librerías en las que se encuentran los programas que se desean ejecutar en este JOB. Por defecto cuando un JOB en un paso quiere ejecutar el programa indicado en la sentencia EXEC, le busca en la librería SYS1.LINKLIB. En consecuencia, esta DD se utilizara para especificar todas aquellas librerías en las que debe buscar los programas que se desean ejecutar en los distintos pasos del JOB, cesando esta búsqueda cuando encuentre el primer miembro cuyo nombre coincida con el nombre del programa a ejecutar. Esta sentencia tiene validez para todo el JOB, es decir debe especificarse a nivel de JOB, y por tanto tiene como restricción que debe seguir inmediatamente a la sentencia JOB. JOBCAT Esta sentencia tiene un significado parecido al de la ficha anterior, con la salvedad de que especifica el catalogo VSAM en el que se encuentran catalogados los ficheros VSAM que use el JOB. Para sistemas que usen el SMS esta fiche no puede usarse. Al igual que la anterior, esta ficha por su propio significado, debe especificarse a nivel de JOB, y tiene como particularidad que si se especifica la sentencia JOBLIB, esta debe preceder a la ficha JOBCAT.

Page 105: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 105 de 374

STEPLIB Esta ficha es igual a la ficha JOBLIB, con la diferencia de que aquella se especifica a nivel de JOB y esta, como su propio nombre indica, se especifica a nivel de paso. En el caso de especificarse en un mismo JOB ficha JOBLIB y en uno de los pasos STEPLIB, la ficha JOBLIB es ignorada en dicho paso. Otra diferencia con la ficha JOBLIB consiste en que no es necesario especificarla como primera DD del paso, pues puede ocupar cualquier posición del mismo. STEPCAT Esta ficha, es similar a la ficha JOBCAT, con la diferencia de que en este caso le indicamos al sistema que ignore la ficha JOBCAT si es que se ha especificado, y que busque los ficheros VSAM del paso en el catalogo que se especifica en esta ficha. SYSABEND Esta ficha referencia un fichero en el que se desea volcar la memoria en el caso de que el programa termine anormalmente. La zona de memoria volcada a fichero es: - Nucleo del sistema - Area del programa problema - tabla del TRACE SYSUDUMP Esta ficha referencia, igual que la anterior, un fichero en el que se desea volcar la memoria en el caso de que el programa termine anormalmente. La zona de memoria volcada a fichero es únicamente el Area del programa problema.

Page 106: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 106 de 374

2.9 Procedimiento Como se ha dicho al hablar del parámetro PROC de la ficha EXEC, el nombre que acompaña a este parámetro especifica el nombre del procedimiento que se desea ejecutar. En cambio, la Sentencia PROC define el comienzo de un procedimiento, y la etiqueta de esta ficha PROC establece el nombre del procedimiento. Se entiende por PROCEDIMIENTO un conjunto de n pasos que se ejecutan de forma inseparable tantas veces como sea llamado el procedimiento. Estos procedimientos tienen la restricción de que los pasos contenidos en ellos no pueden invocar a otros procedimientos. Los datos variables se referencian en el procedimiento como nombres de variables, empezando por un &. Dichas variables pueden definirse al principio del procedimiento a fin de asignarlas valores por defecto. En el caso de tener que definir ficheros temporales en el procedimientos, el nombre asignado debe ir precedido de dos && a fin de diferenciarlos de las variables del procedimiento. Se entiende por PROCEDIMIENTO CATALOGADO un conjunto de pasos que se encuentran catalogados en la librería definida al efecto, y que precisamente por estar catalogados no es necesario incluir en el JOB; no obstante, este se expandirá cuando el JES interprete el JCL. Normalmente es la librería SYS1.PROCLIB la que contiene los procedimientos catalogados del sistema, si bien puede ser cualquier otra concatenada con esta. Existe una restricción en la definición de los procedimientos, y es que dentro de un procedimiento no se puede especificar una DD con el parámetro * o DATA. Como ejemplo se acompaña el JCL que sirve para: - generar el DBRM del interface de un producto. Es decir, la rutina que DB2 ejecutara para manejar los datos de la tabla de una aplicacion. - precompilar el modulo obtenido - compilar - linkeditar - Hacer BIND

Page 107: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 107 de 374

//DESJMP19A JOB TBJMP,'PRODUCTO', // CLASS=C,NOTIFY=DESJMP19,MSGCLASS=V //******************************************************************* //COMPILAR PROC MODULO=@@@@@@@@ //*------------------------------------------------------------------ //SQLGEN EXEC PGM=XXXSQLGN,PARM='&MODULO',REGION=4096K //STEPLIB DD DSN=DESJMP.XXX2060.LINKLIB,DISP=SHR //CT DD DISP=SHR,DSN=DESJMP.XXX2060.DB1 //MF DD DISP=SHR,DSN=DESJMP.XXX2060.DB1 //II DD DISP=SHR,DSN=JMP.JMP35071.II.DIC //IIPUR DD DISP=SHR,DSN=JMP.JMP35078.PUR //IIDAT DD DISP=SHR,DSN=JMP.JMP35072.II.DAT //IISEC DD DISP=SHR,DSN=JMP.JMP35074.II.SEC //TEMP DD DSN=DESJMP.JMP.FONTSQL(&MODULO),DISP=SHR //OUT DD SYSOUT=* //*------------------------------------------------------------------ //PC EXEC PGM=DSNHPC,PARM='HOST(ASM),SOURCE,XREF',REGION=4096K //DBRMLIB DD DSN=DESJMP.DBRMLIB(&MODULO),DISP=SHR //SYSCIN DD DSN=&&DSNHOUT,DISP=(,PASS),UNIT=SYSDA, // SPACE=(800,(500,500)) //SYSIN DD DSN=DESJMP.JMP.FONTSQL(&MODULO),DISP=SHR //SYSPRINT DD SYSOUT=*,OUTLIM=999999 //SYSTERM DD SYSOUT=* //SYSUT1 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //*------------------------------------------------------------------ //ASM EXEC PGM=IEV90, // PARM='LOAD,NODECK' //SYSIN DD DSN=&&DSNHOUT,DISP=(OLD,DELETE) //SYSLIB DD DSN=DESJMP.XXX2060.MACLIB,DISP=SHR // DD DSN=SYS1.MACLIB,DISP=SHR //SYSGO DD DSN=&&LOADSET,DISP=(,PASS),UNIT=SYSDA, // SPACE=(800,(500,500)) //SYSTERM DD SYSOUT=* //SYSPRINT DD SYSOUT=*,OUTLIM=999999 //SYSUDUMP DD SYSOUT=* //SYSUT1 DD SPACE=(TRK,(50,5)),UNIT=SYSDA,DISP=(,DELETE) //SYSUT2 DD SPACE=(TRK,(36,5)),UNIT=SYSDA,DISP=(,DELETE) //SYSUT3 DD SPACE=(TRK,(36,5)),UNIT=SYSDA,DISP=(,DELETE) //*------------------------------------------------------------------ //LKED EXEC PGM=IEWL,PARM='REUS,XREF,LIST,MAP', // COND=((4,LT,ASM),(4,LT,PC)) //SYSLIB DD DISP=SHR,DSN=SYS1.DB2CT.DSNLOAD //SYSLIN DD DSN=&&LOADSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSLMOD DD DSN=DESJMP.XXX.LOAD(&MODULO),DISP=SHR //SYSPRINT DD SYSOUT=*,OUTLIM=999999 //SYSUDUMP DD SYSOUT=* //SYSUT1 DD SPACE=(1024,(50,50)),UNIT=SYSDA

Page 108: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 108 de 374

//*----------------------------------------------------------------- //*---------- BIND PACKAGE ------------------------ //*----------------------------------------------------------------- //BINDPACK EXEC PGM=IKJEFT01,DYNAMNBR=20 //SYSTSPRT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSTSIN DD DUMMY //COMPILAR PEND //*----------- FIN PROCEDIMIENTO ------------- //******************************************************************* //STEP20 EXEC COMPILAR,MODULO=JMPL20T <--- CAMBIAR EN LOS 3 SITIOS //LKED.SYSIN DD * NAME JMPL20T(R) /* //BINDPACK.SYSTSIN DD * DSN SYSTEM(DBT1) BIND PACKAGE(JMPL01T) OWNER(DESJMP) MEMBER(JMPL20T) - LIBRARY('DESJMP.DBRMLIB') - VALIDATE(BIND) ISOLATION(CS) RELEASE(DEALLOCATE) - EXPLAIN(Y) END /* //******************************************************************* Al llamar a este procedimiento, mediante la ficha EXEC correspondiente, se pasa como parámetro el nombre del Modulo, que sustituirá al nombre dado por defecto en el procedimiento: "@@@@@@@@" Así mismo, se pasan dos ficheros que sustituyen a los definidos en el procedimiento, la DDname SYSIN del paso LKED y la DDname SYSTSIN del paso BINDPACK.

Page 109: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 109 de 374

2.10 Utilidades Dentro de este apartado se estudian diversos programas de utilidad proporcionados por MVS para facilitar la gestión de las librerías y ficheros. Estos programas reciben este nombre porque van a librar al usuario de codificar rutinas y códigos para realizar funciones de uso común, tales como: - Mantener y manipular datos del Sistema. - Reorganizar, cambiar, comparar o manipular datos y/o ficheros de usuario. Es de resaltar el hecho de que estas utilidades operan sobre ficheros particionados y/o secuenciales, y que todos los programas de utilidad pueden acceder a datos que estén en cualquier tipo de dispositivo: cintas, discos, etc. Estas utilidades no se diferencian en nada de cualquier programa de aplicacion, a no ser por su finalidad, y pueden ejecutarse como cualquier otro, bien mediante un procedimiento de comandos, clist por ejemplo, o a través de un trabajo batch, siendo esta ultima forma la mas normal. Los programas de utilidad necesitan para su control dos tipos de sentencias: - las sentencias propias del JCL, para asignación de recursos; y - las sentencias de control de la utilidad, para especificar lo que debe ejecutar. Por otra parte, cada programa de utilidad tiene sus diferentes sentencias de JCL y sus diferentes sentencias de control de utilidades, que se verán en detalle cuando se vea cada uno de ellos. El formato general de un paso que ejecuta un programa de utilidad es: //etiqueta EXEC PGM=utilidad //SYSPRINT DD ... salida de los mensaje //SYSIN DD * fichas de control de la utilidad /* //ddname1 DD ... //ddname2 DD ... //... donde la DDname SYSPRINT define donde se escribirán los mensajes devueltos por la utilidad. SYSIN contiene las fichas de control de la utilidad.

Page 110: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 110 de 374

El formato de las fichas de control es el siguiente. nombre operación operando1,operando2,... comentario donde cada elemento va delimitado por blancos, y nombre comienza en la columna 1 y consta de 1 a 8 caracteres operación Identifica la operación a realizar operandos Es el area siguiente, y esta compuesta por parámetros de palabras clave separadas por comas. comentarios Ira separado por blancos después del ultimo parámetro. Como ya se ha dicho, las sentencias de control de utilidades se codifican dentro de una sentencia SYSIN, siguiendo las normas generales de cualquier ficha DD ya vista, por lo tanto, las fichas de control pueden especificarse: 1.- mediante una entrada 'in stream' de formato //SYSIN DD * 2.- o, dentro de un fichero secuencial o miembro de un particionado de 80 caracteres de longitud. //SYSIN DD DSN=USER424.DATOS.UTIL,DISP=SHR // DD DSN=USER525.SENTEN.UTIL(miembro),DISP=SHR El contenido de estos dos ficheros serán las sentencias de control de utilidades específicas para una función y utilidad particular. Dentro de una misma SYSIN pueden codificarse varias sentencias de control de utilidades.

Page 111: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 111 de 374

2.10.1 IEFBR14 Este programa de utilidad realmente solo ejecuta un "FIN DE PROGRAMA". La utilidad de este programa radica en la posibilidad de manejar la creación , catalogación o borrado de ficheros mediante una adecuada combinación de fichas DD y parámetros de DISP. Las DDnames de este paso no tienen significado, pudiendo especificarse o concatenarse tantas como sean necesarias, en función de los ficheros que se quieran tratar. El siguiente ejemplo muestra este hecho. El primer paso, ejecuta el programa IEFBR14 y la única DD que existe, esta asociada a un fichero con disposición MOD, lo cual quiere decir que: - Si el fichero no existe, debe crearle con las especificaciones que siguen (DCB,UNIT,SPACE) - Si el fichero existe, los datos se apendizan a los ya existentes. (Este programa no genera informacion) A continuación, se ejecuta el programa, y termina, con lo que el fichero anterior, en base al parámetro DISP, se borra, pues ha terminado bien. En una palabra, este paso asegura que cuando se termina de ejecutar no existe el fichero de la DD especificada en el mismo. //************************************************************** //* BORRAR FICHEROS //* //BORRAR EXEC PGM=IEFBR14 //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //D1 DD DSN=DESJMP.CMWKF01,DISP=(MOD,DELETE,) // UNIT=SYSDA,SPACE=(CYL,(4,1),RLSE), // DCB=(DSORG=PS,RECFM=FB,LRECL=205,BLKSIZE=23370) //*---------------------------------------------------------- //* COPIAR FICHEROS //* //PASO1 EXEC PGM=IEBGENER //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=DESJMP.FILE01,DISP=SHR //* ----------- FICHERO DE SALIDA //SYSUT2 DD DSN=DESJMP.CMWKF01, // DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(CYL,(4,1),RLSE), // DCB=(DSORG=PS,RECFM=FB,LRECL=205,BLKSIZE=23370) //SYSIN DD DUMMY //**************************************************************

Page 112: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 112 de 374

2.10.2 IEBGENER La utilidad de este programa se basa en copiar ficheros, con independencia de cual sea el dispositivo donde se encuentra el fichero origen o de destino, ya que básicamente lo que hace es copiar el fichero que tiene por DDname SYSUT1 sobre el fichero especificado en la DDname SYSUT2. La DDname SYSIN, de especificación obligatoria, contendrá las fichas de control. Estas fichas solo son obligatorias en el caso de que las características del fichero de salida no coincidan con las del fichero de entrada. En caso contrario puede definirse como DUMMY. Las fichas de control en este ultimo caso podrán contener: GENERATE Esta palabra especifica que los registros de salida son distintos a los de entrada. MAXFIELDS = n Este es el unico parámetro que puede llevar esta ficha de control, y con el se indica al sistema que en la ficha de control RECORD se va a encontrar con N parámetros FIELD. RECORD Esta ficha de control especifica el diseño del registro de salida mediante la concatenacion de tantos parámetros de palabra clave FIELD como sean necesarios.. El parámetro FIELD se ajustara al siguiente formato FIELD=(num_bytes,pos_ini,conv,pos_sal) donde cada subparametro especifica: num_bytes Tamaño del campo pos_ini Posición inicial en el registro de entrada conv Posible conversión pos_sal Posición del registro de salida donde depositarla Un caso particular le constituye el que los datos a copiar (SYSUT1) estén definidos en la propia cadena. En este caso debe especificarse la DCB en la DDname SYSUT2.

Page 113: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 113 de 374

El siguiente ejemplo muestra cómo se usa esta utilidad para copiar tres ficheros físicos sobre una impresora determinada. //******************************************************* //* LISTAR POR IMPRESORA //******************************************************* //IMPRIMIR EXEC PGM=IEBGENER //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=DESJMP.RESUMEN1,DISP=SHR // DD DSN=DESJMP.RESUMEN2,DISP=SHR // DD DSN=DESJMP.RESUMEN3,DISP=SHR //* ----------- FICHERO DE SALIDA //SYSUT2 DD SYSOUT=F,DEST=RMT5,COPIES=32 //SYSIN DD DUMMY //******************************************************* El siguiente ejemplo muestra cómo copiar un fichero editando la salida, de modo que: En la posición 1 del registro de salida se coloquen los 30 octetos que se encuentran en la posición 1 y siguientes del registro de entrada. Y En la posición 50 del registro de salida se coloquen los 175 bytes que se encuentran en la posición 31 y siguientes del registro de entrada. Los octetos 31 a 49 ambos inclusive del registro de salida quedaran rellenos a ceros binarios. //***************************************************************** //PASO1 EXEC PGM=IEBGENER //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=DESJMP.FILE01,DISP=SHR //* ----------- FICHERO DE SALIDA //SYSUT2 DD DSN=DESMGO.CMWKF01, // DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(CYL,(4,1),RLSE), // DCB=(DMYDCB,DSORG=PS,RECFM=FB,LRECL=205,BLKSIZE=23370) //SYSIN DD * GENERATE MAXFLDS=2 RECORD FIELD=(30,1,,1),FIELD=(175,31,,50) /* //*****************************************************************

Page 114: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 114 de 374

El siguiente ejemplo muestra cómo copiar un fichero especificando que las características del fichero de salida las asume de las del fichero fuente. //***************************************************************** //* COPIAR FICHERO DE CINTA A CINTA //*---------------------------------------------------------------- //PASO1 EXEC PGM=IEBGENER //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=DESJMP.PRUEBA.WORK99S,DISP=OLD //* ----------- FICHERO DE SALIDA //SYSUT2 DD DSN=DESJMP.PRUEBA.WORK99S.SEC,DISP=(NEW,CATLG,), // UNIT=(ACL1,,DEFER),VOL=(,,,30),LABEL=(1,SL), // DCB=*.SYSUT1 //SYSIN DD DUMMY //***************************************************************** El siguiente ejemplo muestra como enviar a la cola de entrada de trabajos, un job que se encuentra escrito en el fichero asociado a la DDname SYSUT1. //DESJMP01 JOB (44,123),'DESARROLLO',CLASS=C,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(0,1) //*------------------------------------------------------- //PASO0030 EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=DESJMP.JOBPROD,DISP=(OLD,DELETE,KEEP) //SYSUT2 DD SYSOUT=(A,INTRDR) //SYSIN DD DUMMY

Page 115: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 115 de 374

2.10.3 IEBCOPY Este programa de utilidad se usa para: - Pasar fichero particionado a secuencial - copiar fichero particionado a fichero particionado - restaurar fichero desde cinta En el caso de que la salida sea un fichero secuencial, y el fichero de entrada un fichero particionado, copia en él todos los miembros a no ser que se especifique otra cosa con las fichas de control. Las fichas de control en este programa son obligatorias, ya que es el medio de que se dispone para indicarle lo que debe realizar. Estas fichas pueden ser: COPY Esta ficha se usa para indicar al programa cuales son las DDnames de entrada y de salida, mediante el uso de los parámetros de palabra clave siguientes: INDD=DDname_entrada OUTDD=DDname_salida SELECT Esta ficha se usa para indicar que miembros queremos copiar, lo cual se hace mediante el uso del parámetro de palabra clave siguiente: MEMBER=(miembro1[,miembro2[,...]]) EXCLUDE esta ficha se usa para indicar que miembros se quieren excluir de la copia. Se hace mediante el uso del parámetro de palabra clave MEMBER visto en la ficha SELECT Las opciones SELECT y EXCLUDE deben siempre ir acompañadas de una sentencia COPY. El formato de la especificación del MIEMBRO en el parámetro de palabra clave MEMBER es: (1) nombre_miembro (2) (nombre_fuente,nombre_destino) (3) (nombre_fuente,nombre_destino,R) (4) (nombre_miembro,,R)

Page 116: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 116 de 374

donde cada formato se usa para: (1) especificar el nombre de un miembro. (2) copiar cambiando de nombre al miembro. (3) Copiar cambiando el nombre, y si existe en el destino, reemplazar el existente. (4) Copiar sin cambiar el nombre, pero en caso de miembros con el mismo nombre, reemplazar el de la librería de destino. Evidentemente, estos formatos solo son aplicables al parámetro MEMBER usado en la ficha de control SELECT. Ejemplo 1 // EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //SYSUT3 DD UNIT=SYSDA,SPACE=(TRK,(1,1)) //SYSUT4 DD UNIT=SYSDA,SPACE=(TRK,(1,1)) //SEC@IN DD DSN=DESJMP.ENTRADA,DISP=SHR SECUENCIAL ENTRADA //SEC@OUT DD DSN=DESJMP.SALIDA,DISP=OLD SECUENCIAL SALIDA //PDS@IN DD DSN=DESJMP.ENTRADA,DISP=SHR LIBRERIA ENTRADA //PDS@OUT DD DSN=DESJMP.SALIDA,DISP=OLD LIBRERIA SALIDA //SYSIN DD * COPY INDD=PDS@IN OUTDD=SEC@OUT /* Las DDnames SYSUT3 y SYSUT4 son definiciones que puede necesitar para trabajo el propio programa, y que en caso de no especificarlas en el JCL, cuando se interrumpe el trabajo por necesitarlas, presenta en el log del JOB el mensaje explicativo de que no se ha especificado la SYSUTn correspondiente. En el ejemplo anterior se copia toda la librería de entrada sobre el fichero secuencial especificado como salida. Ejemplo 2 : Copia en el secuencial los miembros M1, M2 y M5. //SYSIN DD * COPY INDD=PDS@IN OUTDD=SEC@OUT SELECT MEMBER=(M1,M2,M5) /*

Page 117: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 117 de 374

Ejemplo 3 : Copia todos los miembros de la librería de entrada, excluyendo los miembros M6, M7 y M9. //SYSIN DD * COPY INDD=PDS@IN OUTDD=SEC@OUT EXCLUDE MEMBER=(M6,M7,M9) /* Ejemplo 4: Copia todos los miembros de la librería de entrada, a la de salida. Los miembros duplicados no los copia. //SYSIN DD * COPY INDD=PDS@IN OUTDD=PDS@OUT /* Ejemplo 5: Copia todos los miembros desde el secuencial de entrada a la librería de salida. Se excluye de la copia el miembro EJEMPLO. //SYSIN DD * COPY INDD=SEC@IN OUTDD=PDS@OUT EXCLUDE MEMBER=(EJEMPLO) /* Ejemplo 6: Copia todos los miembros de las dos librerías especificadas ENTRADA1 Y ENTRADA2 sobre el fichero particionado o secuencial asociado a la DDname SALIDA. Y también copia todos los miembros de la librería especificada en la DDname ENTRADA3 sobre la librería asociada a la DDname SALIDA3. En el caso de que algún miembro de la librería destino tuviera el mismo nombre que el de la librería fuente, seria reemplazado. //SYSIN DD * COPY INDD=(ENTRADA1,ENTRADA2) OUTDD=SALIDA COPY INDD=((ENTRADA3,R)) OUTDD=SALIDA3 /*

Page 118: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 118 de 374

2.10.4 IEBPTPCH Este programa de utilidad se usa para imprimir o perforar lo siguiente: - un fichero secuencial o particionado completo - Miembros específicos de un fichero particionado - Registros seleccionados de un fichero secuencial o particionado - el directorio de un fichero particionado - Versión editada de un fichero secuencial o particionado. El fichero de entrada se especifica en la DDname SYSUT1, y el de salida en la SYSUT2. Las fichas de control en este programa son obligatorias, ya que es el medio de que se dispone para indicarle lo que debe realizar. Estas fichas pueden ser: PRINT Esta ficha se usa para especificar determinadas características mediante los siguientes parámetros de palabra clave: TYPORG=valor especifica el tipo de organizacion del fichero asociado a la DDname SYSUT1 Puede tomar los valores: - PO : Organizacion particionada - PS : Organizacion secuencial. MAXFLDS=n1 Especifica el numero de parámetros FIELD que se especifican en la ficha de control RECORD MAXNAME=n2 Especifica el numero de parámetros NAME que se especifican en la ficha de control MEMBER STRTAFT=n3 Especifica que empiece a listar desde el registro n3 STOPAFT=n4 Especifica que pare después de escribir n4 registros. SKIP=n5 Especifica que deje una línea en blanco cada 5 registros escritos MAXGPS=n6 Este parámetro especifica el numero de parámetros IDENT que aparecen en fichas RECORD. Estos parámetros especifican tipos de registro. MAXLITS=n7 Este parámetro especifica el numero de caracteres que componen el tipo de registro.

Page 119: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 119 de 374

PREFORM=p Especifica que el primer carácter del registro es un carácter de control, y por tanto no será impreso. Los posibles valores de P son: PREFORM=A para caracteres de control ASA PREFORM=M para caracteres de control maquina TOTCONV=t Este parámetro especifica el tipo de conversión que se hará para imprimir la entrada. Los posibles valores de T son: TOTCONV=XE se imprime en formato hexadecimal, Es decir dos caracteres por carácter de entrada. TOTCONV=PZ Con este parámetro se indica que la entrada viene en formato empaquetado. La impresión se realizara usando dos caracteres numéricos por cada uno de entrada. CNTRL=n8 Especifica el espaciado del fichero de salida. Los posibles valores son 1,2 o 3. Por defecto asume el espaciado simple =1 INITPG=n9 Especifica el numero de página inicial. Por defecto asume el valor 1, y no puede exceder el valor 9999 MAXLINE=nn Especifica el numero de líneas por página, incluyendo títulos, líneas en blanco y espaciado. PUNCH Esta ficha es parecida a la anterior, tiene la misma finalidad y los mismos parámetros, con la salvedad de que inserta en salida un blanco cada 5 columnas. Para evitar este efecto, en el caso de salida impresa, podría expecificarse una ficha RECORD con el parámetro FIELD=(80). MEMBER Esta ficha sirva para indicar al sistema, cuando existe, los miembros de la librería que se desean listar. En el caso de que no se defina esta ficha, se asume que son todos. NAME=miembro Este parámetro se usa para especificar el nombre del miembro a listar

Page 120: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 120 de 374

RECORD Esta ficha de control se usa para especificar el formato del registro de salida. FIELD=(num_bytes,pos_ini,conv,pos_sal) donde cada subparametro especifica: num_bytes Tamaño del campo pos_ini Posición inicial en el registro de entrada conv Posible conversión pos_sal Posición del registro de salida donde depositarla TITLE Este parámetro sirve para especificar un literal para la cabecera del listado, el cual ira acompañando al parámetro de palabra clave ITEM, el cual tiene el siguiente formato: ITEM=('titulo',nn) donde nn especifica el offset o margen izquierdo. Cuando no se especifica DCB en el fichero de salida, asume la siguiente: DCB=(LRECL=121,BLKSIZE=121,RECFM=FBA) Ejemplo // EXEC PGM=IEBPTPCH //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSN=FICHERO,DISP=SHR //SYSUT2 DD SYSOUT=* //SYSIN DD * PRINT TYPORG=PO,MAXFLDS=1,STOPAFT=100 RECORD FIELD=(80) /* Con estas fichas de control especificamos: - Organizacion del fichero de entrada: Particionada - Hay 1 parámetro FIELD en la ficha RECORD - Listar todos los miembros del fichero - Listar solo los 100 primeros registros de cada miembro. - listar los 80 primeros bytes de cada registro.

Page 121: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 121 de 374

//SYSIN DD * PRINT TYPORG=PO,MAXFLDS=2,MAXNAME=1,SKIP=5 MEMBER NAME=EJEMPLO TITLE ITEM=('cabecera listado',40) RECORD FIELD=(40,25,,1),FIELD=(25,1,,41) /* Con estas fichas de control especificamos: - Organizacion del fichero de entrada: Particionada - Hay 2 parámetro FIELD en la ficha RECORD - Hay 1 parámetro NAME en la ficha MEMBER - dejar una línea en blanco cada 5 registros - Escribir como cabecera del listado 'CABECERA SALIDA' - escribir en la posición 1 del registro de salida los 40 bytes que se encuentran en el registro de entrada desde la posición 25. - Escribir los 25 primero bytes del registro de entrada sobre las posiciones 41 y siguientes del registro de salida. //SYSIN DD * PRINT TYPORG=PS,MAXFLDS=2,STRTAFT=12,STOPAFT=200 RECORD FIELD=(1,1,XE,2),FIELD=(70,2,,4) /* Con estas fichas de control especificamos: - Organizacion del fichero de entrada: secuencial - Hay 2 parámetros FIELD en la ficha RECORD - Listar los 200 registros que siguen al registro 12 del fichero de entrada. - Escribir en la posición 2 del registro de salida el primer byte del registro de entrada, pero en formato hexadecimal. - Escribir los 70 bytes del registro de entrada que se encuentran en las posiciones 2 y siguientes sobre las posiciones 4 y siguientes del registro de salida. //SYSIN DD * PRINT MAXFLDS=3,MAXGPS=3,MAXLITS=1 RECORD IDENT=(1,'A',1),FIELD=(75,2,,6) RECORD IDENT=(1,'B',1),FIELD=(70,5,6) RECORD IDENT=(1,'C',1),FIELD=(50,10,6) /* Con estas fichas de control especificamos: - Hay 3 parámetros FIELD en fichas RECORD - Hay 3 tipos de registros (MAXGPS) - El tipo de registro tiene una longitud de 1 carácter. - Cuando en la primera posición de un registro, se encuentra el carácter 'A', se utilizara el PARAMETRO FIELD de la primera ficha de control RECORD - Si fuera 'B' se utilizaría la segunda ficha RECORD. - Y, si fuera 'C' se utilizara la ultima.

Page 122: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 122 de 374

El siguiente ejemplo muestra cómo pasar todos los miembros de un fichero particionado a un miembro de otro fichero particionado. //****************************************************** //IEBPTPCH EXEC PGM=IEBPTPCH //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=SHR,DSN=DESJMP.SEC.DBCOBOL //SYSUT2 DD DISP=SHR,DSN=DESJMP.SEC.SALIDAS(DBCOBOL) //SYSIN DD * PRINT TYPORG=PO,MAXFLDS=1 RECORD FIELD=(80) /* //******************************************************* El siguiente ejemplo muestra cómo listar un directorio. Cabe resaltar el hecho de que hay que especificar el parámetro DCB en la SYSUT1 que especifica el nombre de la librería de entrada; y el parámetro TYPORG=PS en la ficha de control PUNCH. El definir el parámetro DCB=LRECL=43 es para que salga encolumnada las entradas del directorio. //****************************************************** //IEBPTPCH EXEC PGM=IEBPTPCH //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=SHR,DSN=DESJMP.SEC.DBCOBOL, DCB=(RECFM=U,BLKSIZE=256) //SYSUT2 DD SYSOUT=X,DCB=LRECL=43 //SYSIN DD * PUNCH TYPORG=PS /* //******************************************************* En el anexo se incluye la ejecución de un JCL para listar un directorio.

Page 123: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 123 de 374

2.10.5 IEBCOMPR Esta utilidad permite comparar ficheros particionados o secuenciales. IEBCOMPR considerará que dos ficheros secuenciales son iguales si: - Contienen el mismo número de registros. - Cada registro tiene la misma información que su correspondiente en el otro fichero. IEBCOMPR, considerará que dos ficheros particionados son iguales si: - Los directorios de los ficheros son iguales. - Los miembros correspondientes de los dos ficheros son iguales. - Los datos de esos miembros son iguales. Las DDnames necesarias para esta utilidad son: //SYSPRINT Fichero de salida de mensajes de IEBCOMPR //SYSUT1 Sentencia DD para asignación del fichero de entrada. //SYSUT2 Sentencia DD para asignación del fichero de salida. //SYSIN Sentencia DD para entrada de sentencias de control de utilidades. Esta utilidad, IEBCOMPR, solo tiene una sentencia de control, la cual se ajusta al siguiente formato: COMPARE=TYPORG=tipo donde COMPARE Es una sentencia obligatoria, que expresa además la función a realizar. TYPORG Especifica la organizacion del fichero, Para lo cual, TIPO puede tomar los valores: PS Secuencial. Es el valor que asume por defecto. Si se comparan ficheros secuenciales no hace falta codificar este parámetro, y la SYSIN puede tener DUMMY. PO Particionado.

Page 124: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 124 de 374

2.10.6 IEBUPDATE Esta utilidad se usa para crear o modificar ficheros, ya sean secuenciales o miembros de un particionado, pero siempre tomando como referencia registros lógicos de 80 posiciones (imagen ficha). Las posibles operaciones que se pueden realizar con esta utilidad son: - Añadir un nuevo miembro a un fichero particionado. - Sustituir un miembro - Añadir un registro a un fichero secuencial o particionado. - Borrar un registro lógico. - Convertir un fichero secuencial en particionado. Las fichas de control de esta utilidad, IEBUPDTE, tienen como particularidad, la obligatoriedad de llevar './' en las columnas 1 y 2 de la ficha, a fin de diferenciarlas de las fichas de datos que pudieran ir en la misma cadena. Por otra parte, la sentencia EXEC puede ir acompañada de los siguientes parámetros: PARM=NEW o MOD en función de que se vaya a crear o modificar una librería. Por defecto asume MOD Las DDnames utilizadas por esta utilidad son las siguientes: //SYSPRINT Fichero de salida de mensajes de la utilidad //SYSUT1 Esta DDName se usa para especificar el fichero de entrada cuando sea necesario. Por ejemplo, para crear una librería no se especifica pues no hay entrada. //SYSUT2 Esta ficha no es necesaria cuando se modifican ficheros. //SYSIN Sentencia DD para entrada de sentencias de control de utilidades.

Page 125: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 125 de 374

Las fichas de control en este programa son las siguientes: ./ ADD Esta sentencia hace que se añada un miembro al fichero PDS especificado en SYSUT1. Concretamente el especificado con el parámetro NAME en esta ficha. Los datos para crear ese nuevo miembro pueden venir a continuación de esta ficha, en la propia cadena. ./ ADD NAME=miembro,LIST=ALL ./ REPL Esta sentencia reemplaza el miembro especificado con el parámetro NAME de la librería de SYSUT1, con los datos que vienen a continuación en la cadena. También puede llevar el parámetro LIST=ALL ./ REPL NAME=miembro,LIST=ALL ./ NUMBER Esta sentencia se usa para numerar, y en caso de usarse debe seguir a la ficha ADD o REPL. Admite los parámetros: NEW1=nnnn INCR=incremento ./ REPRO Esta sentencia copia el miembro o el secuencial especificado desde SYSUT1 Puede llevar el parámetro LIST=ALL ./ REPRO NAME=miembro,LIST=ALL La siguiente sentencia copia el fichero secuencial especificado en SYSUT1 como miembro de la librería especificada en SYSUT2, con el nombre especificado en la ficha ./ REPRO NEW=PO,MEMBER=miembro,LIST=ALL La próxima sentencia es la inversa a la anterior, pues copia el miembro de la librería especificada en SYSUT1, como un fichero secuencial con el nombre especificado en la ficha SYSUT2. ./ REPRO NEW=PS,NAME=miembro,LIST=ALL

Page 126: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 126 de 374

./ CHANGE Esta sentencia precede a una sentencia DELETE o NUMBER o a fichas de datos que updatan un fichero. Para ficheros secuenciales se puede omitir el parámetro NAME. ./ CHANGE NAME=miembro,LIST=ALL Cuando se especifica la opción COLUMN=dd se esta indicando que las columnas dd a 80 de los registros de datos que siguen a esta sentencia reemplazaran a las mismas columnas de aquellos registros del fichero cuya secuencia coincida con la secuencia del registro de datos. ./ CHANGE NAME=miembro,LIST=ALL,COLUMN=dd Cuando se especifica la opción UPDATE=INPLACE se esta indicando que los registros de datos que siguen a esta sentencia reemplazaran a aquellos registros del fichero cuya secuencia coincida con la secuencia del registro de datos. ./ CHANGE NAME=miembro,LIST=ALL,UPDATE=INPLACE ./ DELETE Esta sentencia va precedida por una ficha CHANGE, y borra todos los registros comprendidos entre sec1 y sec2 ./ DELETE SEQ=sec1,SEQ=sec2 ./ NUMBER Puede haber mas de una ficha NUMBER El conjunto debe ir precedido por una ficha CHANGE Lo que hace esta ficha es renumerar un miembro o una parte del mismo. utilizando para ello los valores que se especifican en NEW1 e INCRemento. ./ NUMBER SEQ1=ALL,NEW1=val_ini,INCR=incremento ./ ENDUP Esta sentencia marca el final de todas las sentencias de control. ./ ENDUP Las fichas ADD, REPL, CHANGE y REPRO pueden contener, además las siguientes opciones: LIST=ALL Esta opción hace que también se copie sobre SYSPRINT el miembro. SEQFLD=ccl Esta opción especifica que las columnas CC y la longitud L donde ira la secuencia de numeración. El valor de CC no puede exceder de 80 y la longitud de 8, asumiéndose por defecto el valor 738.

Page 127: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 127 de 374

LEVEL=hh Esta opción especifica el nivel de modificación. HH es un valor hexadecimal, y el valor que representa es guardado en el directorio del miembro de salida, para ser usado en el mantenimiento de los sectores de los niveles modificados. El siguiente ejemplo muestra un paso de un JCL que ejecuta esta utilidad. //************************************************************ //PASO1 EXEC PGM=IEBUPDTE,PARM=NEW //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=DESJMP.JMP.ESKELETX,DISP=SHR //* ----------- FICHERO DE SALIDA //SYSUT2 DD DSN=DESJMP.JMP.ESKELETF,DISP=(NEW,CATLG,), // SPACE=(TRK,(10,5,10),RLSE),UNIT=SYSDA, // DCB=(RECFM=FB,LRECL=80,BLKSIZE=23440) //SYSIN DD * ./ ADD NAME=INTUTIPS,LIST=ALL ************************************************************ *** IMPRIME LIBRERIA SOBRE UN SECUENCIAL ************************************************************ ./ ENDUP /*

Page 128: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 128 de 374

2.10.7 IEHINITT Este programa de utilidad del sistema se utiliza para inicializar cintas y cartuchos formateandolos para que puedan contener ficheros e información de control. La información y el formato de inicialización que se logra con este programa es el siguiente: - Etiqueta de volumen de cinta: Contiene el número de serie del volumen de cinta. - 80 bytes de etiqueta de cabecera: Son rellenados y conforman la etiqueta de tipo HDR1 que será rellenada al hacer uso de la cinta. - Una marca de cinta física. Cuando una cinta inicializada es usada para contener datos, las sucesivas etiquetas de ésta quedan como sigue: - La etiqueta de volumen de cinta queda inalterada. - El registro HDR1 creado por IEHINITT es rellenado con información de fechas de creación del fichero que va a rellenar la cinta e información del sistema. - Se crea un registro HDR2 conteniendo características físicas (DCB) del fichero creado. - Se crea una marca de cinta a continuación. - Los datos son escritos a continuación. Las DDnames utilizadas por la utilidad IEHINITT son: //SYSPRINT Fichero para la salida de mensajes del programa IEHINITT. //etiqueta Esta DD define la unidad de cinta que va a ser usada en la operación de inicialización. Se pueden referenciar en un mismo paso varias unidades de cinta. Debe ajustarse al siguiente formato: //etiqueta DD DCB=DEN=n,UNIT=(TAPE,n,DEFER)

Page 129: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 129 de 374

donde DCB=DEN=n Este parámetro es obligatorio, ya que N especifica la densidad de grabación correcta. Esta densidad se encuentra codificada de acuerdo con la siguiente tabla: 2 Densidad de grabación 800BPI 3 Densidad de grabación 1600BPI 4 Densidad de grabación 6200BPI. Por defecto se asume DCB=DEN=4 UNIT=(TAPE,n,DEFER) Indica que se insertan n dispositivos de unidad de cinta para las operaciones de inicialización. El valor por defecto es 1. El valor DEFER obliga a la sentencia a no asignar el dispositivo hasta que el programa IEHINITT pida el montaje físico de la cinta. //SYSIN DD Indica la entrada de las sentencias de control para el IEHINIT. Esta utilidad, IEHINIT, solo tiene una sentencia de control, la cual se ajusta al siguiente formato: DDname INITT SER=nun_serie,NUMBTAPE=n donde DDname el nombre de la etiqueta dado a la ficha DD que describe la unidad y la densidad. INITT Palabra clave para la sentencia de control. SER Este parámetro especifica el numero de serie con el que se quiere inicializar la/s cinta/s. NUMBPTAPE Este parámetro especifica el numero de cintas que quieran ser inicializadas. El valor por defecto de este parámetro es 1.

Page 130: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 130 de 374

Si el NUMBTAPE es mayor que 1, el sistema irá asignando números de serie a las sucesivas cintas que se vayan inicializando incrementando de uno en uno a partir del nº de serie que se haya especificado en el parámetro SER. Ejemplos: El primer paso del siguiente JOB muestra cómo se inicializa una cinta asignandola el numero de serie, (que se grabarán en la etiqueta de volumen), 2500, y con una densidad de grabación de 1600 BPI. //USER5000 JOB CLASS=X,MSGCLASS=X,MSGLEVEL=(1,1) //PASO1 EXEC PGM=IEHINITT //SYSPRINT DD SYSOUT=* //CINTA2 DD DCB=DEN=3,UNIT=(TAPE,,DEFER) //SYSIN DD * CINTA2 INITTSER=002500 /* Este 2º paso, inicializa cuatro cintas con números de serie consecutivos, empezando por el 3000 y usando para esta operación dos dispositivos de unidad de cinta. Las cintas tienen una densidad de grabación de 67200 BPI. //PASO EXEC PGM=IEHINITT //SYSPRINT DD SYSOUT=* //CINTA3 DD DCB=DEN=4,UNIT=(TAPE,2,DEFER) //SYSIN DD * CINTA3 INITTSER=003000,NUMBTAPE=4 /*

Page 131: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 131 de 374

2.10.8 IEHLIST Este programa de utilidad se usa para: - Listar la VTOC de un volumen - Listar el directorio de un fichero particionado La informacion que proporciona esta utilidad respecto a directorios de ficheros particionados es la siguiente: - Nombre miembro. - Punto de entrada. - Dirección relativa de comienzo del miembro. - Indicadores del sistema. - Bloques de directorio libres. Mientras que la informacion que proporciona respecto a la VTOC (Volume Table Of Contents) la obtiene de las DSCB de la VTOC, siendo la siguiente: - Información de espacio disponible en el volumen en pistas y cilindros (DSCB 0). - Longitud de registro y tamaño del bloque (ficheros). - Alocaciones primarias y secundarias. - Formatos de registros. - Nombre del fichero. - Fechas de creación y expiración. - Organización del fichero. - Extensiones. Las DDnames utilizadas por esta utilidad son las siguientes: //SYSPRINT Fichero de salida de mensajes de la utilidad //DDn Sentencia DD para descripción del volumen referenciado en la ficha de control de la utilidad. Habrá tantas DDn como volúmenes se referencien. El hecho de codificar esta DD por cada volumen a procesar, es para que el sistema reserve ese volumen mientras se ejecuta el paso, pues le asigna al trabajo. //SYSIN Sentencia DD para entrada de sentencias de control de utilidades.

Page 132: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 132 de 374

Las fichas de control en este programa son las siguientes: LISTPDS Esta sentencia hace que se liste el directorio de un fichero particionado. Los parámetros que acompañan a esta ficha se ajustan al siguiente formato: DSNAME=dsn,VOL=tipo_disp=num_serie,formato LISTVTOC Esta sentencia hace que se liste la VTOC del volumen que se especifique, pudiendo listarse o bien entera o bien parcial, dependiendo que de que se especifique el parámetro DSNAME o no. Los parámetros que acompañan a esta ficha se ajustan al siguiente formato: VOL=tipo_disp=num_serie,formato,DSN=(dsn1[,dsn2[,...]) donde VOL= Este parámetro describe la unidad y el numero de serie del volumen que se quiere tratar, pues: tipo_disp especifica el tipo de dispositivo en el que se ha montado el volumen num_serie especifica el numero de serie del volumen. Este numero de serie es el que sirve para relacionar la DDname con esta ficha de control. formato especifica como se desea el listado: FORMAT : formateado DUMP : en hexadecimal. El siguiente ejemplo muestra estos extremos //***************************************************** //LVTOC EXEC PGM=IEHLIST,PARM='LINECNT=56' //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //DD1 DD DISP=SHR,UNIT=3390,VOL=SER=DES100 //SYSIN DD * LISTVTOC VOL=3390=DES100,DSN=DESJMP.JMP.ESKELETO LISTPDS VOL=3390=DES100,DSN=DESJMP.JMP.ESKELETO /* Al final del tema puede verse listada la ejecución de esta utilidad.

Page 133: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 133 de 374

2.10.9 IEHPROGM Esta utilidad permite realizar las siguientes operaciones: - Borrar, catalogar, descatalogar y renombrar un fichero - Borrar y renombrar un miembro de un fichero particionado. Las DDnames utilizadas por esta utilidad son las siguientes: //SYSPRINT Fichero de salida de mensajes de la utilidad //DDn Sentencia DD para descripción del volumen referenciado en la ficha de control de la utilidad. Habrá tantas Ddn como volúmenes se referencien. El hecho de codificar esta DD por cada volumen a procesar, es para que el sistema reserve ese volumen mientras se ejecuta el paso, pues le asigna al trabajo. //SYSIN Sentencia DD para entrada de sentencias de control de utilidades. Las fichas de control en este programa son las siguientes: CATLG Esta sentencia sirve para catalogar en el volumen que se indica, el DSNname especificado como parámetro en esta ficha. El formato de esta ficha se ajusta al siguiente: DSN=nombre_fichero,VOL=tipo_disp=etiqueta UNCATLG Esta sentencia borra del catalogo, el DSname especificado, pero no borra el fichero, por lo que se mantiene en el volumen, direccionado desde la VTOC. SCRATCH Esta sentencia borra el fichero cuyo Dsname se especifica. Requiere especificar la etiqueta del volumen donde se encuentra el fichero. En el caso de querer borrar solo un miembro del fichero particionado especificado con el parámetro DSN, hay que especificar el parámetro MEMBER=nombre_miembro. Esta sentencia puede ir acompañada del parámetro PURGE, el cual especifica que se borren el fichero aunque no haya expirado. RENAME Este parámetro permite renombrar un fichero, dando el nombre que acompaña al parámetro NEW al fichero cuyo DSN se especifica también en esta ficha. En el caso de querer renombrar un miembro habría que especificar su nombre con el parámetro MEMBER, y entonces el que acompaña al parámetro NEW seria el nuevo nombre del miembro especificado.

Page 134: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 134 de 374

Page 135: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 135 de 374

Los siguientes ejemplos muestran el uso de todos estos parámetros. //***************************************************** //IEHPROGM EXEC PGM=IEHPROGM //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //DD1 DD DISP=SHR,UNIT=3390,VOL=SER=DES100 //SYSIN DD * CATLG DSN=DESJMP.JMP.PRUIEH01,VOL=3390=DES100 CATLG DSN=DESJMP.JMP.PRUIEH02,VOL=TAPE=(002365,1,153,1) UNCATLG DSN=DESJMP.JMP.ESKELETO SCRATCH DSN=DESJMP.JMP.ESKELETO,VOL=3390=DES100,PURGE SCRATCH DSN=DESJMP.JMP.ESKELETO,VOL=3390=DES100,MEMBER=PPPPP SCRATCH DSN=DESJMP.JMP.ESKELETO,VOL=3390=DES100 RENAME DSN=DESJMP.JMP.ESKELETO,VOL=3390=DES100, NEWNAME=DESJMP.JMP.EJEMPLO2 RENAME DSN=DESJMP.JMP.ESKELETO,VOL=3390=DES100, NEWNAME=EJEMPLO3,MEMBER=PRUEBA /*

Page 136: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 136 de 374

2.11 Programas especiales 2.11.1 IEKFJ01 Este programa no es uno de los programas mas importantes del sistema, ya que es el propio TSO ejecutado en BATCH. Este programa es invocado cada vez que se desee ejecutar un comando de TSO, constituyendo estos comandos las fichas de control de este programa. Dichas fichas deben especificarse asociadas a la DDName SYSTSIN. La Ddname SYSTSPRT especifica dónde se desea recoger los mensajes devueltos por la ejecución del TSO. En el siguiente ejemplo lo que se hace es invocar al programa EDIT para generar una serie de cambios en el fichero que se especifica como parámetro. //XXXXXXLM JOB (123,456),'JMP-PRU-4',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1) //*==================================================================== //* TSO EN BATCH //*==================================================================== //* //EDITAR EXEC PGM=IKJEFT01 //* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * EDIT 'DESJMP.TMP' OLD CNTL NONUM C * 999 'CCCCCCC' 'PRUEBA' SAVE 'DESJMP.TMP1' /*

Page 137: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 137 de 374

2.11.2 SORT Este programa es usado para copiar los registros de un fichero de entrada en otro de salida, cambiando la secuencia en la que se encuentran estos. Las Ddnames necesarias para la ejecución de este programa son: SORTIN Esta Ddname especifica el fichero a clasificar SORTOUT Esta Ddname especifica el fichero de salida SYSIN Esta Ddname especifica las fichas de control para realizar la clasificación. Las sentencias de control de este programa deben comenzar en la columna 2 o posterior, y son las siguientes: SORT Esta sentencia establece los parámetros para la clasificación del fichero. MERGE Esta sentencia es idéntica a la sentencia SORT, con la salvedad de que en este caso se mezclan registros de hasta 16 ficheros en lugar de los registros de un unico fichero. RECORD Esta sentencia establece el formato del registro de salida en el caso de que se desee editar, es decir que no coincida con el de entrada. ALTSEQ Esta sentencia permite cambiar el valor, a efectos de clasificación de determinados caracteres. INCLUDE Esta sentencia especifica los campos que permiten seleccionar los registros del fichero de entrada en un sort OMIT Esta sentencia especifica los campos que permiten excluir registros del fichero de entrada en un sort INREC Esta sentencia reformatea el registro de entrada antes de ejecutar el sort, de modo que solo se ejecute la clasificación con aquellos campos que interesan. OUTREC Esta sentencia reformatea el registro de salida después de ejecutar el sort SUM Esta sentencia especifica al programa que escriba en el fichero de salida un registro totalizando los n registros de igual clave del fichero de entrada. Para poder llevar a buen fin su trabajo, este programa necesita alocar una serie de recursos, definidos con las Ddnames SORTWKnn tal y como se muestra en el siguiente ejemplo suficientemente autocomentado:

Page 138: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 138 de 374

//******************************************************************** //PSORT PROC // EXEC PGM=SORT,PARM='ABEND' //SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,(10,50)) //SORTWK02 DD UNIT=SYSDA,SPACE=(CYL,(10,50)) //SORTWK03 DD UNIT=SYSDA,SPACE=(CYL,(10,50)) //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSUDUMP DD DUMMY //SORTIN DD DUMMY //SORTOUT DD DUMMY //SYSIN DD * // PEND //******************************************************************** //* ELIMINAR LOS REGISTROS TIPO 01 DUPLICADOS ** //*-----------------------------------------------------------------** //PASO01 EXEC PSORT //SORTIN DD DSN=DESJMP.TRABAJO1.WORK01,DISP=SHR //SORTOUT DD DSN=DESJMP.TRABAJO1.WORK01S,DISP=(NEW,CATLG,), // UNIT=(SYSDA,3), // DATACLAS=DFBXP,LRECL=050,SPACE=(CYL,(4,1),RLSE) //SYSIN DD * SORT FORMAT=CH,FIELDS=(16,19,A) SUM FIELDS=NONE /* //******************************************************************** //* ELIMINAR LOS REGISTROS TIPO 11 DUPLICADOS * //*-----------------------------------------------------------------** //PASO02 EXEC PSORT //SORTIN DD DSN=DESJMP.TRABAJO1.WORK11,DISP=SHR //SORTOUT DD DSN=DESJMP.TRABAJO1.WORK11S,DISP=(NEW,CATLG,), // UNIT=(SYSDA,3), // DATACLAS=DFBXP,LRECL=050,SPACE=(CYL,(4,1),RLSE) //SYSIN DD * SORT FORMAT=CH,FIELDS=(16,19,A) SUM FIELDS=NONE /* //******************************************************************** //* FUSIONAR LOS REGISTROS 01 Y 11 EN UN UNICO FICHERO ** //* EN LOS CASOS EN QUE HAYA 01 Y 11 DEJAR UNO SOLO CON LA SUMA: 1B ** //*-----------------------------------------------------------------** //PASO03 EXEC PSORT //SORTIN DD DSN=DESJMP.TRABAJO1.WORK01S,DISP=(OLD,DELETE,) // DD DSN=DESJMP.TRABAJO1.WORK11S,DISP=(OLD,DELETE,) //SORTOUT DD DSN=DESJMP.TRABAJO1.WORK99,DISP=(NEW,CATLG,), // UNIT=(SYSDA,3), // DATACLAS=DFBXP,LRECL=050,SPACE=(CYL,(4,1),RLSE) //SYSIN DD * SORT FORMAT=CH,FIELDS=(16,19,A) SUM FIELDS=(14,2,ZD) /* //******************************************************************** //* ELIMINAR DEL FICHERO RESULTANTE LOS REGISTROS SUMA 1B Y 01 ** //*-----------------------------------------------------------------** //PASO04 EXEC PSORT //SORTIN DD DSN=DESJMP.TRABAJO1.WORK99,DISP=(OLD,DELETE,DELETE)

Page 139: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 139 de 374

//SORTOUT DD DSN=DESJMP.TRABAJO1.WORK99S,DISP=(NEW,CATLG,), // UNIT=(SYSDA,3), // DATACLAS=DFBXP,LRECL=050,SPACE=(CYL,(4,1),RLSE) //SYSIN DD * SORT FORMAT=CH,FIELDS=(01,08,A) OMIT COND=(14,2,CH,EQ,C'1B',OR,14,2,CH,EQ,C'01') /*

Page 140: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 140 de 374

SORT Esta sentencia establece los parámetros para la clasificación del fichero. El formato de esta sentencia es : SORT FIELDS=(clave1[,clave2[,...[,claven]]]), [FILSZ=En], [FORMAT=formato], [SKIPREC=n] [CKPT] [EQUALS] [NOEQUALS] donde: clave determina cada una de las claves de clasificación. Esta formada por un cuarteto con la siguiente informacion: Pos_ini,longitud,formato,orden siendo Pos_ini : la posición inicial Longitud : El numero de bytes que configuran la clave Formato : El formato de la clasificación Orden : Tipo de ordenación Ascendente/Descendente El formato de la clasificación puede ser uno de los siguientes: cod x Descripción CH Carácter EBCDIC ZD s Zoned Decimal PD s Packed Decimal FI s Fixed Point BI Binary FL s Floating Point CSL s Numeric Character, Leading separate sign CST s Numeric Character, trailing separate sign CLO s Numeric Character, Leading overpunch sign CTO s Numeric character, trailing overpunch sign AC ASCII character ASL s ASCII numeric character, leading separate sign AST s ASCII numeric character trailing separate sign AQ EBCDIC character alternative collating sequence set by installation Donde Cod: representa el código a incluir en el cuarteto X : Especifica si admite el signo

Page 141: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 141 de 374

Ejemplo: SORT FIELD=(3,25,CH,A,50,5,CH,D),FILSZ=E1000 Este ejemplo estima clasificar 1000 registros, de acuerdo con dos las dos claves de clasificación dadas con las cuartetas siguientes: 3,25,ZD,A lo cual quiere decir que la primera clave se corresponde con los 25 bytes que se encuentran en las posiciones 3 y siguientes del fichero de entrada. El formato a seguir será el código EBCDIC y en Ascendente. 50,5,CH,D En el caso de que existan claves primarias repetidas, los registros seguirán esta segunda clave, la cual especifica que tiene una longitud de 5 posiciones, concretamente las que se encuentran en las posiciones 50 a 54, se seguirá el código EDCDIC, y el orden será descendente.

Page 142: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 142 de 374

El resto de parámetros de esta ficha de control son optativos, y son los siguientes: FILSZ Establece una estimación del numero de registros a clasificar, lo cual hace mas eficiente el SORT. FORMAT En el caso de que todas las claves sean del mismo formato, se puede extraer el tercer campo del cuarteto especificandole con este parámetro, y dejando los cuartetos con tres campos, tal y como se muestra en el siguiente ejemplo que es el mismo que el anterior: SORT FORMAT=CH,FIELD=(3,25,A,50,5,D),FILSZ=E1000 SKIPREC Con este parámetro se le dice al programa que no clasifique los n primeros registros del fichero EQUALS Con este parámetro se especifica que en el caso de que existan varios registros con idéntica clave, se mantenga el orden de los registros del fichero de entrada. NOEQUALS Con este parámetro se especifica que en el caso de que existan varios registros con idéntica clave, no es necesario mantener el orden de los registros del fichero de entrada.

Page 143: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 143 de 374

MERGE Esta sentencia es idéntica a la sentencia SORT, con la salvedad de que en este caso se mezclan registros de hasta 16 ficheros en lugar de los registros de un unico fichero. Como particularidad de esta sentencia, las DDnames que especifican los ficheros de entrada tienen por nombre : SORTINnn donde nn puede tomar los valores 01 a 16 debiendo especificarse además en secuencia. Podría usarse incluso la sentencia SORT, simplemente habría que concatenar los distintos ficheros de entrada a la DDname SORTIN, pero el resultado no seria tan eficiente como con el uso de esta sentencia. Aparte de esto, la sentencia MERGE se diferencia de la sentencia SORT en: - FILSZ no es necesaria para estimar los registros de entrada - SKIPREC y EQUALS si se codifican son ignorados. En cambio, esta sentencia tiene las siguientes reglas especiales: - el parámetro RECFM de todos los ficheros asociados a las DDname SORTINnn deben ser iguales. - el parámetro LRECL para los registros de longitud fija deben ser iguales. - El parámetro BLKSIZE no tiene por qué coincidir en todos los ficheros de entrada, pero en este caso, el fichero con el tamaño de bloque mayor deberá ser el asociado a la SORTIN01.

Page 144: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 144 de 374

RECORD Esta sentencia establece el formato del registro de salida en el caso de que se desee editar, es decir que no coincida con el de entrada. El formato de los parámetros de esta ficha de control es: RECORD LENGTH=(n1,n2,n3,n4,n5),TYPE=tipo donde: tipo puede tomar los valores siguientes: F : para registros de longitud fija V : Para registros de longitud variable en EBCDIC D : Para registros de longitud varaible en ASCII n1 Establece la longitud del registro de entrada n2 Establece la longitud del registro de salida n4 Especifica la longitud de registro mínima n5 Especifica la longitud modal, es decir para registros de longitud variable, es la longitud de registro mas normal. Este dato aumenta la eficiencia del sort. ALTSEQ Esta sentencia permite cambiar el valor, a efectos de clasificación de determinados caracteres. El formato de esta sentencia es: ALTSEQ CODE=hhii ALTSEQ CODE=(hhii,jjkk,..) donde - HH representa el valor hexadecimal en EBCDIC del valor a cambiar - II representa el valor hexadecimal en EBCDIC del valor dado a HH Ejemplo : SORT FIELD=(3,25,CH,A, 50,5,CH,D),FILSZ=E1000 ALTSEQ CODE=4161 Cambia la "A" mayúscula por la "a" minúscula.

Page 145: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 145 de 374

INCLUDE / OMIT Esta sentencia especifica los campos que permiten seleccionar los registros del fichero de entrada en un sort El formato de esta sentencia es: INCLUDE COND=(campo1,operador,campo2) donde: campo1 Especifica un campo del registro de entrada, el cual queda definido mediante el trió siguiente: pos_ini,longitud,formato operador Establece el operador mediante el que se compararan los dos campos. EQ equal NE not equal GT Greater than GE greater than or equal LT less than LE less than or equal campo2 Puede ser un campo o una constante. En el caso de ser una constante hexadecimal se especifica entre comillas y precedida por la letra X En el caso de ser una constante alfanumérica se especifica entre comillas y precedida por la letra C. INCLUDE COND=(10,6,CH EQ, C'PRUEBA') INCLUDE COND=(10,1,BI NE, X'00110100') INCLUDE COND=(10,6,CH GT, 20,6,CH) Las reglas aplicables a esta sentencia son - Se permite el uso de tantos AND y OR como sean necesarios. - Solo se permite el uso de los formatos BI CH PD ZD O FI - Los campos a comparar deben encontrarse en los primeros 4092 bytes del registro. - Se permite la agrupación de condiciones con la siguiente secuencia de paréntesis: COND=(..(..(..))) pero no con las secuencias de los tipos siguientes: COND=(..(..)..(..)), o COND=(((...))) - A falta de paréntesis, las condiciones AND son evaluadas antes que las condiciones OR - La longitud máxima de un campo es de 256 bytes. - Los campos con formato carácter son rellenados a blancos. - Los campos con formato numérico son rellenados a ceros.

Page 146: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 146 de 374

INREC / OUTREC La sentencias INREC reformatea los registro de entrada antes de ejecutar el sort, de modo que solo se ejecute la clasificación con aquellos campos que interesan. Mientras que la sentencia OUTREC formatea el registro de salida después de ejecutar el sort La sentencia INREC reformatea los registros después de ser seleccionados por INCLUDE u OMIT. El formato de las sentencias SORT, MERGE, OUTREC o SUM esta referido, en el caso de contar con una sentencia INREC al resultado del reformateado. El formato de esta sentencia es : INREC FIELDS=(nX,pos_ini,longitud,alineación,...) donde: nX es opcional y representa n blancos Pos_ini especifica la posición inical del registro de entrada Longitud especifica el numero de octetos del campo. Alineación es opcional y especifica el tipo de alineación, pudiendo ser: H : Media palabra F : Palabra completa D : Doble palabra Por omisión se asume que no se desea alineación. Ejemplo: Supuesto que el registro de entrada contiene: 1234567890ABCDEFGHIJ Si se especifican las siguientes fichas de control: INREC FIELDS=(5,6) OUTREC FIELDS=(5X,11,5,1,4,5X,5,6) El registro de salida contendrá: ABCDE1234_____567890 Las reglas aplicables a esta sentencia son - El parámetro LRECL de la DDname SORTOUT tienen que especificarse si se cambia la longitud del registro. - Si se realiza MERGE o una copia, se tiene que incluir una ficha de control RECORD - Para registros de longitud variable, se anteponen al registro de salida 4 bytes especificando la longitud del registro. - Para copiar en registros de longitud variable, la informacion que hay desde un byte determinado hasta el final, basta con especificar

Page 147: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 147 de 374

la posición de comienzo, sin especificar longitud. SUM Esta sentencia hace que se escriba en el fichero de salida un unico registro que totalice los n registros de igual clave del fichero de entrada. Los registros son sumados después de la clasificación. El formato de esta sentencia es: (1) SUM FIELDS=(campo1[,campo2[,...]]) (2) SUM FIELDS=NONE donde: campo=pos_ini,longitud,formato formato = BI,FI,PD,ZD o FL El formato (2) se usa cuando no se desea totalizar nada, simplemente se desea eliminar registros repetidos. Las reglas aplicables a esta sentencia son - No se pueden totalizar campos clave - No se pueden totalizar campos que se superponen. - Si se produce overflow, se trunca el resultado y no se produce error - Los campos a sumar deben encontrarse en los primeros 4096 bytes del registro.

Page 148: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 148 de 374

2.11.3 IDCAMS Este programa es invocado para el tratamiento de los ficheros de acceso directo, VSAM e ISAM. Puede usarse este programa para: - Mantener catálogos - Definir ficheros generacionales o GDGs - Copiar ficheros - Listar ficheros - Borrar ficheros No siendo objetivo de este libro el estudio de estos tipos de ficheros, se pasa directamente a describir los comandos mas elementales de este programa: Las DDnames que requiere este programa son : //SYSPRINT Fichero de salida de mensajes del programa //DDn DDnames para describir los ficheros de entrada y de salida. //SYSIN DDname asociada al fichero que contiene las sentencias de control. Las sentencias de control se codifican entre las columnas 2 y 72, y en el caso de necesitar su continuación en otra línea, se especifica escribiendo un guión. REPRO - INFILE(ENTRADA) Catalogo Los ficheros VSAM no pueden ser creados desde un JCL, como cualquier otro dataset, ya que requiere una serie de especificaciones que solo se le pueden dar a través de comandos AMS. El primer paso para la creación de un fichero VSAM es la definición de un catalogo, la cual puede hacerse mediante el siguiente paso de JCL:

Page 149: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 149 de 374

//********************************************** ** //CATALOGO EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //DDname1 DD UNIT=dispositivo,VOL=SER=volumen,DISP=OLD //SYSIN DD * DEFINE MASTERCATALOG - (NAME (nombre_catalogo) - FILE(ddname1) - VOL(volumen) - RECORDS(can_primaria can_secundaria) - MASTERPW(password) - UPDATEPW(password) - READPW(password) - ) /* //********************************************** ** donde DDname1 sirve para definir el volumen que contendrá el catalogo. Puede especificarse cualquier nombre de DD RECORDS puede ser sustituido por CYLINDERS o TRAKS, pero en este caso, las unidades especificadas como cantidades primarias y secundarias se referiran no a numero de registros sino a la unidad de medida indicada. Después de crear el catalogo maestro,puede crearse catálogos de usuario. Estos catálogos se crean de forma similar a la del catalogo maestro, con la salvedad de que la sentencia DEFINE debe referenciar al catalogo maestro. //********************************************** ** //USERCAT EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //DDname1 DD UNIT=dispositivo,VOL=SER=volumen,DISP=OLD //SYSIN DD * DEFINE USERCATALOG - (NAME (nombre_catalogo) - FILE(ddname1) - VOL(volumen) - RECORDS(can_primaria can_secundaria) - MASTERPW(password) - UPDATEPW(password) - READPW(password) - CATALOG(nom_cat_maestro/password) - ) /* //********************************************** ** donde son aplicables todas las consideraciones hechas en la anterior definición, incluida la de la definición de RECORDS.

Page 150: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 150 de 374

Para usar un catalogo de usuario en un JOB mediante la DDname JOBCAT solo debe especificarse el DSN del catalogo y DISP=shr tal y como se muestra en el siguiente ejemplo. //DESJMPJC JOB (123,456),'JMP-IDCAMS',MSGCLASS=(1,1) //JOBLIB DD DSN=DESJMP.LINKLIB,DISP=SHR //JOBCAT DD DSN=nombre_catalogo,DISP=SHR //PASO1 EXEC ... //STEPCAT DD DSN=nombre_catalogo,DISP=SHR ... Una vez creados los catálogos, debe asignarse (alocarse) el espacio que será usado por todos los ficheros VSAM del catalogo, lo cual se hace siguiendo la siguiente estructura: //********************************************** ** //ESPACIO EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //DDname1 DD UNIT=dispositivo,VOL=SER=volumen,DISP=OLD //SYSIN DD * DEFINE SPACE - (VOLUME(volumen) - FILE(ddname1) - RECORDS(can_primaria can_secundaria) - RECORDSIZE(media máximo) - CATALOG(nom_cat_maestro/password) - ) /* //********************************************** ** También aquí es aplicables la consideración realizada en la primera definición sobre el parámetro de palabra clave RECORDS.

Page 151: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 151 de 374

Por ultimo, una vez reservado el espacio, debe reservarse el espacio a asignar a un fichero concreto. Esto es lo que realiza la siguiente estructura: //********************************************** ** //FICHERO EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE CLUSTER - (NAME(nombre_fichero) - VOLUME(volumen) - INDEXED - RECORDS(can_primaria can_secundaria) - RECORDSIZE(media máximo) - FREESPACE(intervalo total) - KEYS(longitud posición) - UPDATEPW(password) - READPW(password) - ATTTEMPTS(0) - ) CATALOG(nom_cat_maestro/password) /* //********************************************** ** donde : RECORDS Admite los mismos comentarios de todos los DEFINEs anteriores. RECORDSIZE especifica los tamaños medios y máximo de los registros. Para el caso de registros de longitud fija, estos valores deben coincidir. FREESPACE Este parámetro especifica el porcentaje que se debe dejar como espacio libre en el intervalo de control (interval) y el porcentaje que se debe dejar como espacio libre del fichero (total) ATTEEMPTS(0) Solo debe codificarse en el caso de que se codifique los parámetros UPDATEPW O READPW Para listar las entradas de un catalogo puede usarse el comando de TSO: LISTCAT CATALOG(nombre_catalogo/password)

Page 152: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 152 de 374

Fichero generacional (GDG) Para poder usar un grupo de ficheros GDG o generacionales antes debe definirse este mediante una estructura similar a la siguiente: //********************************************** ** //gdg EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE GDG - (NAME (nombre_fichero) - LIMIT(numero) - [EMPTY] - [SCRATCH] - ) - CATALOG(nombre_catalogo/password) /* //********************************************** ** donde: NAME este parámetro de palabra clave sirve para especificar el nombre del fichero genérico LIMIT Establece el numero de versiones a mantener. Debe estar comprendido en el rango 1-255 EMPTY Este parámetro es opcional, y en el caso de codificarse descataloga todos los ficheros cuando se supera el limite. NOEMPTY Este parámetro es el que se asume en el caso de no codificarse EMPTY; y especifica que en el caso de superarse el limite, descatalogue la versión mas vieja. SCRATCH Este parámetro es opcional, y lo que especifica es que en el caso de que se codifique, el fichero al descatalogarse que se borre. NOSCRATCH Este parámetro es el que se asume en el caso de no codificarse SCRATCH, y lo que significa es que cuando una versión se descatalogue, que se mantenga, es decir que no se borre.

Page 153: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 153 de 374

Copiar ficheros También puede usarse el programa IDCAMS para realizar las siguientes acciones de copia de ficheros: - Copiar fichero secuencial no-VSAM sobre fichero VSAM - Copiar VSAM sobre VSAM - Copiar VSAM sobre secuencial no-VSAM - Copiar fichero ISAM o secuencial no-VSAM sobre fichero VSAM La ficha de control que se debe incluir en SYSIN para ejecutar esta copia es: REPRO Este comando es el que especifica que se va a realizar una acción de copiado. Los parámetros que admite son: INFILE(ddname_fichero_fuente) OUTFILE(ddname_fichero_destino) Otros parámetros opcionales son: COUNT(n1) especifica que se copien los n primeros registros. SKIP(n2) especifica que no se copien los n2 primeros registros. //************************************************** //* REPRO (CARGA DESDE SECUENCIAL) //* - - - - - - - - - - - - - - - - - - - - - //PASO1 EXEC PGM=IDCAMS //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //INVOL1 DD DSN=DESJMP.PRUEBA,DISP=SHR //OUTVOL1 DD SYSOUT=X //SYSIN DD * REPRO INFILE(INVOL1) OUTFILE(OUTVOL1) COUNT(50) /* //**************************************************

Page 154: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 154 de 374

Listar ficheros Otro uso del programa IDCAMS es para imprimir ficheros. En este caso la estructura del paso a incluir en el JOB se ajusta a la siguiente: //********************************************** ** //LISTAR EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=A,DEST=RMT55 //entrada DD DSN=... //SYSIN DD * INFILE(entrada) formato /* //********************************************** ** donde: entrada referencia el fichero a listar formato especifica el formato en el que deseamos realizar la impresión del fichero. Puede tomar los siguientes valores: CHAR en formato carácter HEX en formato hexadecimal - cada carácter 2 bytes. DUMP Cada registro se imprime con los dos formatos.

Page 155: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 155 de 374

Borrar ficheros Por ultimo, también puede usarse el programa IDCAMS para borrar ficheros. La ficha de control que se debe incluir en SYSIN para ejecutar este borrado puede ser cualquiera de las siguientes: DELETE(dsn) Esta sentencia borra el fichero cuyo DSN se especifica como argumento. FILE(ddname) Esta sentencia borra el fichero asociado a la DDname especificada. PURGE Esta sentencia borra todas los ficheros cuya fecha de expiración se haya sobrepasado. ERASE Esta sentencia borra y sobreescribe ceros binarios sobre los escritos borrados para que no se pueda recuperar. SCRATCH Esta sentencia es obligatoria para borrar ficheros no-VSAM. CATALOG(nom_cat) esta sentencia especifica el nombre del catalogo //********************************************** ** //BORRAR01 EXEC PGM=IDCAMS //SYSPRINT DD DUMMY //SYSIN DD * DELETE DESJMP.PRUEBA.BORRADO SET MAXCC=0 //********************************************** **

Page 156: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 156 de 374

2.11.4 PRINTDS (comando de TSO) Este no es un programa normal, es un comando de TSO, y se usa para imprimir un fichero secuencial o particionado. El hecho de incluirlo en este capitulo es debido a la importancia que tiene en el entorno de desarrollo, pues como ya se ha dicho es el programa invocado para listar con formato cualquier fichero. Cuando el fichero a imprimir es un particionado, se puede imprimir, o los miembros (MEMBERS) o el directorio (DIRECTORY) o ambos (ALL). Por defecto se imprimen todos los miembros del PDS. También pueden añadirse títulos al listado generado, conteniendo este titulo el nombre del Dataset, la fecha, hora y el numero de página impresa. Los posibles opciones son: DATASET Estas opciones, sinónimas, especifican el nombre físico del DA fichero a ser impreso. TODATASET Estas opciones, sinonimas, direccionan la salida a un nuevo TODSNAME fichero. No es necesario que exista este fichero, ya que si no existe este comando le crea. PR DATASET('DESJMP.SALIDA') TODATASET('DESJMP.TMP') FILE Estas opciones sinonimas se usan cuando en lugar de DDNAME especificar el nombre físico del fichero, se usa el nombre lógico a DDname. PR FILE(SALIDA) TODATASET('DESJMP.TMP') COLUMNS Esta opción se usa para especificar las columnas del fichero de entrada que se desean imprimir en salida. Las columnas se especifican dando el numero de los octetos inicial y final, y separando cada grupo por blancos o por comas, tal y como muestra el siguiente ejemplo. PRINTDS DATASET('DESJMP.TMP') COLUMNS(1:71 86:126) En salida cada grupo especificado se va adosando uno a continuación del otro. En el ejemplo dado las columnas 86 a 126 se escriben en las columnas 72 y siguientes. LINES Esta opción permite especificar los registros del fichero que serán escritos. En este caso debe especificarse la línea de comienzo y de final, yendo ambas separadas por una coma.

Page 157: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 157 de 374

TRUNCATE Esta opción permite especificar la columna en la que se truncara el registro de salida. FOLD Esta opción es usada para cortar los datos en la columna especificada. En este caso los datos continúan escribiéndose en sucesivas líneas. PAGELEN Este parámetro se usa para especificar el numero de líneas que serán impresas en cada página. LMARGIN Este parámetro se usa para especificar el margen izquierdo. Su valor indica el numero de columnas a usar como margen. TMARGIN Esta opción se usa para especificar el numero de líneas que se dejan como margen superior en la página impresa. BMARGIN Esta opción se usa para especificar el numero de líneas que se dejan como margen inferior en la página impresa. COPIES Esta opción se usa para especificar el numero de copias que se desean obtener del fichero de entrada. El siguiente ejemplo muestra cómo ejecutar el programa PRINTDS para imprimir un fichero por una impresora determinada. //*===================================================================== //* IMPRIMIR TEMPORAL CON MARGEN //*===================================================================== //IMPRIMIR EXEC PGM=IKJEFT01 //* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * PRINTDS DATASET('DESJMP.TMP') DEST(RMT55) CLASS(I) + COLUMNS(1:71 86:126) LMARGIN(15) /*

Page 158: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 158 de 374

2.12 Ejemplo 1: Listar un directorio (IEBPTDIR) Directorio a listar: **************************************************************************** EDIT --- DESJMP.JMP.ESKELETO ---- --------------------- ROW 00001 OF 00005 COMMAND ===> SCROLL ===> CSR NAME VV.MM CREATED CHANGED SIZE INIT MOD ID INTUTIPS 01.09 95/01/11 95/05/10 17:26 19 19 0 DESJMP JMPINT53 01.13 94/09/27 95/03/28 10:24 38 19 37 DESJMP JMP16500 01.00 95/03/15 95/03/15 09:19 25 25 0 DESJMP PSSEC 01.01 95/03/16 95/03/16 18:53 19 19 0 TEST33 SYSMAIN 01.02 95/01/09 95/01/09 19:45 17 17 0 DESJMP **END** **************************************************************************** Jcl para listar directorio: **************************************************************************** EDIT ---- DESJMP.JMP.JCL(IEBPTPCH) - 01.03 --------------- COLUMNS 001 072 COMMAND ===> SCROLL ===> CSR ****** ****************************** TOP OF DATA ************************ 000001 //XXXXXXIE JOB (123,DES),'JMP-PRU',CLASS=T,MSGCLASS=X, 000002 // NOTIFY=XXXXXX,MSGLEVEL=(1,1),RESTART=* 000003 //* - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - 000004 //* LISTAR DIRECTORIO 000005 //* - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - 000006 //PASO1 EXEC PGM=IEBPTPCH 000007 //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR 000008 //SYSPRINT DD SYSOUT=* 000009 //* ----------- FICHERO DE ENTRADA 000010 //SYSUT1 DD DSN=DESJMP.JMP.ESKELETO, 000011 // DISP=SHR,DCB=(RECFM=U,BLKSIZE=256) 000012 //* ----------- FICHERO DE SALIDA 000013 //SYSUT2 DD SYSOUT=X,DCB=LRECL=43 000014 //SYSIN DD * 000015 PUNCH TYPORG=PS 000016 // ****** **************************** BOTTOM OF DATA *********************** Salida de la ejecucion, y forma de pasar a modo hexadecimal: *************************************************************************** SDSF OUTPUT DISPLAY DESJMPIE JOB12636 DSID 4 LINE 17 COLUMNS 02- 81 COMMAND INPUT ===> SET HEX ON SCROLL ===> CSR IEF375I JOB /DESJMPIE/ START 95145.1200 IEF376I JOB /DESJMPIE/ STOP 95145.1200 CPU 0MIN 00.03SEC SRB 0MIN PRINT/PUNCH DATA SET UTILITY PUNCH TYPORG=PS EOF ON SYSIN END OF DATA FOR SDS OR MEMBER \INTUTIPS n n DESJMP JMPINT53 m n " DESJMP JMP16500 n n DESJMP PSSEC n ^ n ^ TEST33 SYSMAIN n n DESJMP ****************************************************************************

Page 159: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 159 de 374

Salida en formato hexadecimal: **************************************************************************** SDSF OUTPUT DISPLAY DESJMPIE JOB12636 DSID 4 LINE SET COMMAND COMPLETE COMMAND INPUT ===> SCROLL ===> CSR ---------------------------------------------------------------------------- END OF DATA FOR SDS OR MEMBER 4CDC4DC4CCEC4CDD4ECE4DD4DCDCCD4444444444444444444444444444444444444444444444 0554066041310669024206904542590000000000000000000000000000000000000000000000 ---------------------------------------------------------------------------- \INTUTIPS n n DESJMP 0ECDEEECDE000000010901091012010100EEDCFE444444444444444444444444444444444444 0095343972023F1907051F053F76030300327782000000000000000000000000000000000000 ---------------------------------------------------------------------------- JMPINT53 m n " DESJMP 44DDDCDEFF001000030920090712020102EEDCFE444444444444444444444444444444444444 0014795353019F1D03047F058F04060305327782000000000000000000000000000000000000 ---------------------------------------------------------------------------- JMP16500 n n DESJMP 44DDDFFFFF002000010904090401010100EEDCFE444444444444444444444444444444444444 0014716500006F1007057F057F99090900327782000000000000000000000000000000000000 ---------------------------------------------------------------------------- PSSEC n ^ n ^ TEST33 44DEECC444000000040905090515010100EEDCFF444444444444444444444444444444444444 0072253000011F1101057F057F83030300327733000000000000000000000000000000000000 ---------------------------------------------------------------------------- SYSMAIN n n DESJMP 44EEEDCCD4001000050909090914010100EEDCFE444444444444444444444444444444444444 0028241950004F1207050F050F95010100327782000000000000000000000000000000000000 ---------------------------------------------------------------------------- 44FFFFFFFF000000000000000000000000000000004444444444444444444444444444444444 00FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 ---------------------------------------------------------------------------- 0000444444444444444444444444444444444444444444444444444444444444444444444444 0000000000000000000000000000000000000000000000000000000000000000000000000000 ---------------------------------------------------------------------------- **************************************************************************** DSLIST -- DESJMP.JMP.ESKELETO ------------------------- ROW 00001 OF 00005 COMMAND ===> SCROLL ===> CSR NAME RENAME VV.MM CHANGED SIZE INIT MOD ID INTUTIPS 01.09 95/05/10 17:26 19 19 0 DESJMP JMPINT53 01.13 95/03/28 10:24 38 19 37 DESJMP JMP16500 01.00 95/03/15 09:19 25 25 0 DESJMP PSSEC 01.01 95/03/16 18:53 19 19 0 TEST33 SYSMAIN 01.02 95/01/09 19:45 17 17 0 DESJMP **END** ****************************************************************************

Page 160: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 160 de 374

2.13 Ejemplo 2: Listado de la VTOC y el directorio de un PDS IEHLIST.1 //XXXXXXIE JOB (123,DES),'JMP-PRU',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1) //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //* LISTAR VTOC DE LOS DISCOS ESPECIFICADOS EN DDXX //* HAY QUE REPETIR LA SYSIN SI SE QUIERE MAS DE UN DISCO //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //LVTOC EXEC PGM=IEHLIST,PARM='LINECNT=56' //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //DD1 DD DISP=SHR,UNIT=3390,VOL=SER=GEST00 //SYSIN DD * LISTVTOC VOL=3390=GEST00,DSN=DESJMP.JMP.ESKELETO LISTPDS VOL=3390=GEST00,DSN=DESJMP.JMP.ESKELETO /* 1 J E S 2 J O B L O G -- S Y S T E M C 0 8 3 -- N 0 17.01.13 JOB10807 IRR010I USERID DESJMP IS ASSIGNED TO THIS JOB. 17.01.14 JOB10807 ICH70001I DESJMP LAST ACCESS AT 17:00:21 ON THURSDAY, MAY 17.01.14 JOB10807 $HASP373 DESJMPIE STARTED - INIT 46 - CLASS T - SYS C083 17.01.14 JOB10807 IEF403I DESJMPIE - STARTED - TIME=17.01.14 17.01.14 JOB10807 - --TIMINGS (MINS.)- 17.01.14 JOB10807 -JOBNAME STEPNAME PROCSTEP RC EXCP CPU SRB 17.01.14 JOB10807 -DESJMPIE LVTOC 00 30 .00 .00 . 17.01.14 JOB10807 IEF404I DESJMPIE - ENDED - TIME=17.01.14 17.01.14 JOB10807 -DESJMPIE ENDED. NAME-JMP-PRU-4 TOTAL CPU TIME= 17.01.14 JOB10807 $HASP395 DESJMPIE ENDED 0------ JES2 JOB STATISTICS ------ - 25 MAY 2001 JOB EXECUTION DATE - 18 CARDS READ - 69 SYSOUT PRINT RECORDS - 0 SYSOUT PUNCH RECORDS - 4 SYSOUT SPOOL KBYTES - 0.01 MINUTES EXECUTION TIME 1 //DESJMPIE JOB (123,DES),'JMP-PRU',CLASS=T,MSGCLASS=X, // NOTIFY=DESJMP,MSGLEVEL=(1,1), // TIME=5 /*JOBPARM TIME=30 //*** JOB SUBMITIDO POR DESJMP FECHA: 95.145 HORA: 17:01:13 //*** //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //* LISTAR VTOC DE LOS DISCOS ESPECIFICADOS EN DDXX //* HAY QUE REPETIR LA SYSIN SI SE QUIERE MAS DE UN DISCO //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 //LVTOC EXEC PGM=IEHLIST,PARM='LINECNT=56' 3 //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR 4 //SYSPRINT DD SYSOUT=* 5 //DD1 DD DISP=SHR,UNIT=3390,VOL=SER=GEST00 6 //SYSIN DD *

Page 161: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: JCL Autor: José M. Peco

Página 161 de 374

ICH70001I DESJMP LAST ACCESS AT 17:00:21 ON THURSDAY, MAY 25, 2001 IEF236I ALLOC. FOR DESJMPIE LVTOC IEF237I 692 ALLOCATED TO STEPLIB IEF237I JES2 ALLOCATED TO SYSPRINT IGD103I SMS ALLOCATED TO DDNAME DD1 IEF237I JES2 ALLOCATED TO SYSIN IGD103I SMS ALLOCATED TO DDNAME SYS00001 IGD104I DESJMP.JMP.ESKELETO RETAINED, DDNAME=SYS00001 IEF142I DESJMPIE LVTOC - STEP WAS EXECUTED - COND CODE 0000 IEF285I SYS1.LINKLIB KEPT IEF285I VOL SER NOS= MVSR9Y. IEF285I DESJMP.DESJMPIE.JOB10807.D0000102.? SYSOUT IGD104I SYS95145.T170114.RA000.DESJMPIE.R0216853 RETAINED, DDNAME=DD1 IEF285I DESJMP.DESJMPIE.JOB10807.D0000101.? SYSIN IEF373I STEP /LVTOC / START 95145.1701 IEF374I STEP /LVTOC / STOP 95145.1701 CPU 0MIN 00.03SEC SRB 0MIN IEF375I JOB /DESJMPIE/ START 95145.1701 IEF376I JOB /DESJMPIE/ STOP 95145.1701 CPU 0MIN 00.03SEC SRB 0MIN 1 SYSTEMS SUPPORT UTILITIES---IEHLIST -DATE: 2001.145 TIME: 17.01.14 CONTENTS OF VTOC ON VOL GEST00 <THIS IS AN SMS MANAGED VOLUME> ----------------DATA SET NAME--------------- CREATED DATE.EXP FILE DESJMP.JMP.ESKELETO 1994.270 00.000 PARTITIONED S 1 SYSTEMS SUPPORT UTILITIES---IEHLIST -DATE: 2001.145 TIME: 17.01.14 DIRECTORY INFO FOR SPECIFIED PDS ON VOL GEST00 DESJMP.JMP.ESKELETO 0 MEMBERS TTRC VARIABLE USER DATA ---(USER DATA AND TTR INTUTIPS 0002030F 0109001700 95011F0095 130F172600 130013000 JMPINT53 0001190F 010D003300 94270F0095 087F102400 260013002 JMP16500 0000260F 0100001700 95074F0095 074F091900 190019000 PSSEC 0001010F 0101004100 95075F0095 075F185300 130013000 SYSMAIN 0000140F 0102005700 95009F0095 009F194500 110011000 OF THE 00010 DIRECTORY BLOCKS ALLOCATED TO THIS PDS, 00009 ARE(IS) COMPLETELY

Page 162: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 162 de 374

Tema 3 : CLIST 3.1 Introducción CLIST significa lista de comandos. pero esa palabra puede tener dos significados: - Lenguaje de alto nivel, interprete de comandos propios y de TSO. - Fichero secuencial que contiene el procedimiento, o conjunto de comandos a ejecutar. En si, este lenguaje por su funcionalidad es parecido al JCL por la capacidad que tiene para hacer uso de los recursos del sistema, pero se diferencia del JCL en que no envía ningún trabajo al JES para su ejecución ya que él puede realizar este cometido directamente, de forma interactiva, enviando mensajes al usuario y tratando la informacion que este introduce en el sistema. Como se vera a lo largo de este tema, el lenguaje de clist es un lenguaje sencillo, pero no por ello deja de ser potente. Puede hacer uso de todos los comandos estándar del TSO, pero, para poder ejecutar un procedimiento de clist solo es necesario estar en una sesión de TSO, aunque no es necesario estar directamente en ISPF, ya que desde cualquier lenguaje de programación de aplicaciones, COBOL por ejemplo, se puede hacer una llamada y ejecutar en consecuencia, un procedimiento escrito en lenguaje de CLIST. Una de las ventajas que tiene la ejecución de una clist, es la de tener programadas aquellos comandos que mas habitualmente se usan en el sistema, evitando los errores en el tecleo de nombres largos. Por ultimo, también cabe destacar que este lenguaje de CLIST se puede usar para escribir aplicaciones, si bien las sentencias para la manipulación de datos, o de bifurcación no gozan de la flexibilidad que tienen en otros lenguajes orientados al manejo de datos. Una combinación muy interesante es la que integra este lenguaje con los paneles de ISPF para crear diálogos. Por otra parte, al ser un lenguaje interprete, no necesita de compilación previa, por lo que una vez escrita la secuencia de comandos a ejecutar, esta puede ejecutarse directamente Como cualquier lenguaje de programación, cada una de las líneas de que consta un fichero de comandos o CLIST, configura lo que se denomina una sentencia, la cual puede:

Page 163: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 163 de 374

- Asignar valores a variables - Hacer uso de funciones - Ejecutar comandos de TSO - Alocar ficheros - Controlar ficheros en entrada y/o salida En consecuencia, a lo largo de este tema, se definirán los distintos elementos de este lenguaje: - Variables - Funciones - Control de errores - Tratamiento de ficheros

Page 164: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 164 de 374

3.2 Librerías de CLISTs Como ya se ha dicho en la introducción, una clist no es mas que un fichero secuencial, y en consecuencia se almacena en el sistema como tal. No obstante, y con objeto de facilitar grandemente, entre otras, las tareas mecánicas del desarrollo, el sistema entiende distintos defectos para la ejecución de CLISTs. El nombre del fichero o dataset que contiene la clist, ya sea un fichero PDS, o secuencial, puede tener hasta 44 caracteres, y seguir las reglas generales para la construcción de los nombres de ficheros. Se recomienda usar ficheros particionados para almacenar CLISTs, entre otras, por las siguientes razones: - Normalmente las CLIST son ficheros pequeños, y en consecuencia, la gestión de su almacenamiento físico es gestionada mejor en una librería que en un fichero secuencial. - Permite la agrupación lógica de CLISTs. El registro del fichero que contiene una CLIST, debe cumplir los siguientes requisitos: - Si son de longitud fija: no puede superar los 255 bytes de longitud, reservándose los últimos 8 bytes de la longitud definida para el numero de secuencia. - Si son de longitud variable: pueden tener una longitud de hasta 259 bytes, ya que el sistema coloca a los ficheros de longitud variable 4 bytes en la cabecera del registro para especificar la longitud del mismo. En este caso, la secuencia se especifica en los 8 bytes siguientes a los de longitud. En general, se recomienda el uso de del formato de longitud fija, no por nada en especial, sino porque admite tanto los ficheros numerados (NUMBER ON) como los no numerados (UNNUM).

Page 165: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 165 de 374

3.3 Como se invoca a un procedimiento de CLIST Un procedimiento de comandos, o clist, puede invocarse por cualquiera de los modos que se indican a continuación: 3.3.1 De forma explícita: Invocando un procedimiento mediante la palabra clave EXEC. Los siguientes ejemplos ilustran esta forma de invocar a la clist: COMMAND ===> tso ex 'DESJMP.clist.jmp(lnatddm)' 'test' COMMAND ===> tso ex 'DESJMP.clist.jmp(lnatddm)','test' En estos dos casos, se invoca la misma clist pasando como parámetro la cadena TEST. Los siguientes ejemplos muestran como el propio TSO nos indica cual es el defecto que entiende cuando se invoca una clist erróneamente. COMMAND ===> tso ex (lnatxxx) IKJ56520I MEMBER LNATXXX NOT IN DATASET JMPDES.CLIST *** En este caso, el sistema busca el dataset 'JMPDES.CLIST(LNATXXX)' y como no le encuentra, devuelve el mensaje que se acompaña. COMMAND ===> tso ex clist.jmp(lnatddm) IKJ56228I DATA SET JMPDES.CLIST.JMP.CLIST NOT IN CATALOG OR CATALOG CAN NOT BE ACCESSED *** En este ejemplo se espera que el sistema anteponga el prefijo del usuario tal y como hace con cualquier nombre de fichero, pero el resultado es otro, ya que por defecto el sistema no solo antepone el prefijo definido en el PROFILE del usuario, sino que también pone como sufijo de la librería que es invocada con EXEC el cualificador 'CLIST', con independencia de que se llame a un procedimiento que sea miembro de un Particionado, o que se encuentre en un fichero secuencial, como muestra el siguiente ejemplo. COMMAND ===> tso ex JMP COMMAND ===> tso ex 'JMPDES.JMP.CLIST' En ambos casos estamos invocando al mismo procedimiento, suponiendo que el usuario tenga definido JMPDES como PREFIX en su perfil. (Ver anexo dedicado al PROFILE del usuario)

Page 166: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 166 de 374

3.3.2 De forma implícita En este caso, se invoca procedimientos que se encuentran en las librerías alocadas. Existe una librería especial de procedimientos clist, la SYSPROC, que se aloca o asigna al usuario, al hacer el LOGON de TSO, y que contiene aquellos procedimientos generales de la instalación para uso común. Además de esta, el usuario puede alocar su propia librería utilizando los comandos de TSO: - ALLOC para alocar la librería - ALTLIB para asignarla como librería de comandos del usuario, tal y como muestra el siguiente ejemplo. /* ------------------------------------------ LLAMADA PANEL INICIAL */ /* */ ALLOCATE FI(SYSUPROC) DS('DESJMP.OPER.OPERCLIB') SHR REUSE ALTLIB ACTIVATE USER (CLIST) ISPEXEC SELECT PANEL(MENU000P) ALTLIB DEACTIVATE USER (CLIST) EXIT /* */ TSO para la búsqueda del comando a ejecutar, examina todas las librerías de CLIST alocadas en el sistema, en el orden inverso al de su alocacion, lo cual quiere decir que se puede anular una clist de uso general, creando una clist con el mismo nombre que la de uso general, de forma que cuando se mande ejecutar dicho procedimiento se ejecute antes el del usuario que el general. Cuando se desee ejecutar una clist de la librería SYSPROC, y además, se desea que el sistema solo busque en SYSPROC, se debe anteponer al comando el símbolo % El siguiente ejemplo muestra la forma de invocar un procedimiento de clist usando la forma implícita, y además buscando solo en la librería SYSPROC. (forma implícita extendida) COMMAND ===> tso ex %NATDESA Este procedimiento establece el entorno de NATURAL-DESARROLLO y nos introduce en el. Para conocer las librerías que se encuentran alocadas, es decir, definidas o asignadas en el entorno de cada usuario, se puede ejecutar el comando de TSO: LISTALL con la opción STATUS.

Page 167: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 167 de 374

3.3.3 Desde READY Cuando un usuario ejecuta el procedimiento de logon, esta puede dejarle en el primer panel de ISPF o bien le deja en el sistema, apareciendo el mensaje READY en el terminal. Este es el caso. Desde esta pantalla se puede ejecutar el comando ISPSTART o el comando EXEC con formato explícito. El formato de este comando es el siguiente: ISPSTART CMD(nombre_clist) 3.3.4 Desde otra clist Ejecutando el comando EXEC o el comando ISPEXEC para invocar al servicio SELECT de ISPF con la opción CMD tal y como se vera en el tema correspondiente. Los formatos de ambas llamadas se ajustan a los siguientes: - EXEC '&nomclist' - ISPEXEC SELECT CMD('&nomclist')

Page 168: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 168 de 374

3.3.5 Desde un programa de aplicacion Casi todos los programas de aplicacion disponen de la sentencia CALL para poder invocar y ejecutar programas o rutinas escritas en un lenguaje distinto al que hace la llamada. Este es el caso de COBOL y PL/I, que pueden invocar el procedimiento de clist mediante la llamada a cualquiera de las rutinas siguientes: COBOL: - CALL 'ISPEXEC' USING longitud parametro1 - CALL 'ISPLINK' USING servicio longitug parametro2 PL/I - CALL ISPEXEC (longitud,parametro1) - CALL ISPLINK ('SELECT',longitud,parametro2) donde LONGITUD especifica la longitud del parámetro (1 o 2) que le sigue en formato PIC 9(6) PARAMETRO1 Este parámetro debe especificar el servicio y el nombre de la clist que se desea ejecutar, debiendo ajustarse su contenido a: SELECT CMD(nomclist) PARAMETRO2 Este parámetro debe especificar solo el nombre del comando a ejecutar ya que el nombre del servicio invocado se especifica en el primer parámetro, por lo que su contenido debe ajustarse a: CMD(nomclist) El siguiente ejemplo escrito en COBOL muestra una forma practica de realizar esta llamada: ... WORKING-STORAGE SECTION 77 SERVICIO PIC X(8) VALUE 'SELECT'. 77 LONGITUD PIC 9(6) VALUE 70 COMP. 77 PARAMETRO PIC X(70) ... PROCEDURE DIVISION ... MOVE 'CMD(DESJMP.JMP.CLIST)' TO PARAMETRO. CALL 'ISPLINK' USING SERVICIO LONGITUD PARAMETRO. ... MOVE 'SELECT CMD(DESJMP.JMP.CLIST)' TO PARAMETRO CALL 'ISPEXEC' USING LONGITUD PARAMETRO. ...

Page 169: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 169 de 374

Otro ejemplo que ilustra esta llamada le constituye el siguiente ejemplo, mediante el cual se invoca a una clist, concretamente la raíz de las utilidades desarrolladas en este libro, desde el entorno de NATURAL. ************************************************************ * Programa : JMP-ISPP * Autor : JMP * Fecha : 28/10/94 * Objetivo : Ejecutar utilidades TSO desde NATURAL ************************************************************ DEFINE DATA LOCAL 1 W-SERVICIO (A8) INIT <'SELECT'> 1 W-LONGITUD (I4) INIT <50> 1 W-COMANDO (A50) END-DEFINE * INPUT MARK 2 AND SOUND ALARM 08/5 '***********************************************************' 09/5 '* EJECUTAR PROCEDIMIENTO DE CLIST DESDE ENTORNO NATURAL *' 10/5 '***********************************************************' 11/5 ' ' 12/5 '* COMANDO:' *OUTIN W-COMANDO 13/5 ' ' 14/5 '===========================================================' 15/5 'PF3: RETORNO PF4:MENU DE UTILIDADES DE TSO' * DECIDE ON FIRST VALUE OF *PF-KEY VALUE 'PF3' RESET W-COMANDO VALUE 'PF4' MOVE 'EX '''Jmpdes.JMP.CLIST''' TO W-COMANDO NONE VALUE IGNORE END-DECIDE IF W-COMANDO = ' ' ESCAPE ROUTINE END-IF * CALL 'ISPLINK' W-SERVICIO W-LONGITUD W-COMANDO END

Page 170: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 170 de 374

3.4 Variables Puesto que podemos considerar una Clist como un programa, necesitaremos usar variables para controlar su flujo. Este es el objetivo de este apartado: - conocer cuales son las variables del sistema que podemos utilizar, - cómo se puede definir una variable ; y - cómo se pueden cargar las variables de usuario. 3.4.1 Variables de control Las siguientes variables contienen el valor que se especifica, y pueden o no modificarse por el procedimiento que se ejecuta según se especifica en la tercera columna. &SYSUID Contiene la identificación del usuario. no &SYSPROC Contiene el nombre del procedimiento de LOGON que no se ejecuto cuando se conecto al sistema. &SYSPREF Prefijo de los Datasets. no &LASTCC Ultimo código de retorno devuelto por la ultima si función ejecutada. &MAXCC Máximo código de retorno devuelto si &SYSICMD Nombre del procedimiento invocado 'implícitamente' no por el usuario. Si la invocacion fue de forma explícita, su contenido esta a blancos. &SYSSCAN limita al numero contenido en esta variable, el si numero de sustituciones simbólicas que realizara TSO en una línea. &SYSDLM Delimitador de terminal usado con TERMIN no &SYSDVAL Parámetros de terminal usado con READDVAL si &SYSNEST Indicador de nivel de anidamiento no &SYSPCMD Nombre del comando primario actual no &SYSSCMD Nombre del subcomando actual no &SYSDATE Fecha actual no &SYSTIME Hora actual no

Page 171: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 171 de 374

&SYSOUTLINE&n Esta variable se usa cuando se quiere capturar la no salida de un comando. Es una variable compuesta por la cadena SYSOUTLINE y un contador que hace referencia a la línea que almacena el sistema. &SYSOUTTRAP Numero de líneas a capturar si

Page 172: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 172 de 374

3.4.2 Variables de usuario simples Las variables de usuario, para su definición, siguen las normas generales, es decir nombres que comiencen por un & seguido por un máximo de 31 caracteres alfanuméricos, debiendo ser el primero alfabético. Para asignar un valor a una variable se usa la sentencia SET, quedando a partir de ese momento definida la variable localmente para la Clist que se esta ejecutando. Por ejemplo: SET &CONTA = 0 SET &FICHERO = ALIAS.JMP.LISTDS SET &FICHERO1 = &SYSUID..JMP.LISTDS en este ejemplo, se asigna: - el valor numérico 0 a la variable CONTA - el valor alfanumérico 'ALIAS.JMP.LISTDS' a la variable FICHERO - el valor resultante de concatenar el contenido de la variable del sistema &SYSUID (supongamos que es JMPDES) con la cadena '.JMP.LISTDS', por lo que estaríamos asignando el valor 'JMPDES.JMP.LISTDS' a la variable FICHERO1. Es de resaltar el hecho de que no existe diferencia entre continentes para variables numéricas y alfanuméricas; incluso para la asignación de valores no es necesario emplear los apóstrofes o las comillas para diferenciar su contenido.

Page 173: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 173 de 374

3.4.3 Variables de usuario compuestas Una variante en la forma de definir nombres de variables, es decir, continentes, consiste en concatenar cadenas de caracteres con contenidos de variables. Por ejemplo: SET &CONTA = 0 SET &SALIDA&CONTA = &FICHERO En este ejemplo, se asigna el contenido de la variable FICHERO a la variable SALIDA0, nombre que se ha formado concatenando la cadena SALIDA y el contenido de la variable CONTA. 3.4.4 Uso del doble & (&&) : Variables anidadas En el punto anterior se ha visto como configurar el nombre de una variable utilizando el contenido de otra variable mediante el uso de un &. En este punto se expone como asignar a una variable el valor contenido en el continente definido por otra variable. Esto se hace usando el doble & al principio de la variable emisora. Es decir: Por ejemplo: SET &CONTA = 0 SET &ENTRADA&CONTA = ESTO_ES_UN_EJEMPLO SET &NOMBRE = ENTRADA&CONTA SET &SALIDA&CONTA = &&NOMBRE En este ejemplo se asigna : - el valor 0 a la variable CONTA. - el valor ESTO_ES_UN_EJEMPLO a la variable ENTRADA0 - el valor ENTRADA0 a la variable NOMBRE - el valor contenido en la variable cuyo nombre se encuentra en la variable NOMBRE, es decir el valor contenido en la variable ENTRADA0, (ESTO_ES_UN_EJEMPLO) se asigna a la variable SALIDA0.

Page 174: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 174 de 374

3.4.5 Variables indexadas Una vez vistos los casos anteriores, es fácil suponer como trata este lenguaje las variables indexadas, tan necesarias para procesos repetitivos. Esto lo hace concatenando el nombre de la variable y el indice, obteniendo de esta forma nombres de variables distintos en lugar de un nombre unico y un índice variable, aunque el resultado es el mismo. Como ejemplo se presenta un fragmento de la Clist 'JMPLIB05' en el que se muestra cómo se puede escribir por pantalla todos los elementos almacenados previamente en un conjunto de variables similar a una tabla indexada. ... LOOP1: IF condición THEN GOTO EXIT1 ... SET &NOMBRE&CONTA = &&SYSOUTLINE&CONTA 00001302 GOTO LOOP1 00001305 EXIT1: SET &CONTA = 0 00001306 WRITE NUMERO DE ELEMENTOS: &ULTIMO 00001307 /* */ 00001308 LOOP2: SET &CONTA = &CONTA + 1 00001309 IF &CONTA > &ULTIMO THEN GOTO LISTAR 00001310 SET &SALIDA = &&NOMBRE&CONTA 00001311 WRITE &SALIDA 00001312 GOTO LOOP2 00001313 /* */ 00001318 LISTAR: SET &FICHERO= &SYSUID..JMP.LISTDS 00001320 Donde, la línea: 1306 inicializa la variable CONTA 1307 muestra el numero de elementos que tiene la Tabla 1309 incrementa en 1 el valor de la variable CONTA 1310 examina si el valor de CONTA excede el numero de elementos y si es así, bifurca al párrafo etiquetado con LISTAR (Línea 1320) 1311 asigna a la variable SALIDA el contenido de la variable que tiene por nombre NOMBRE1 , NOMBRE2 , ... , NOMBRE19 , etc... 1312 Escribe en pantalla el contenido de la variable SALIDA 1313 Bifurca incondicionalmente el flujo al párrafo etiquetado como LOOP2 (Línea 1309) 1320 Cuando se quiere concatenar contenidos de variables, estas deben delimitarse con un punto, tal y como se explico en el punto dedicado a las variables.

Page 175: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 175 de 374

3.5 Operadores y expresiones Los operadores que un procedimiento admite en la evaluación de sus expresiones o condiciones son: Operadores aritméticos: + Adicción - Sustracción * Multiplicación / División ** Exponenciacion // Resto o división modular El rango de los valores contenidos en una variable numérica es -2.147.483.648 a +2.147.483.648 (= 2^31) Operadores de Comparación = EQ igual Ø= ^= NE no igual < LT Menor que > GT Mayor que <= LE Menor o igual que >= GE Mayor o igual que Ø> ^> NG No mayor que Ø< ^< NL No menor que Operadores Lógicos && AND || OR Como ejemplo se presenta un fragmento de la Clist JMPLIB05, si bien puede utilizarse cualquier otro fragmento, pues se usa en cualquier clist. /* ============= MEMORIZAR SALIDA ====================== */ 00001220 /* */ 00001230 LOOP1: SET &CONTA = &CONTA + 1 00001300 IF &CONTA > &ULTIMO THEN GOTO LISTAR 00001301 SET &NOMBRE&CONTA = &&SYSOUTLINE&CONTA 00001302 GOTO LOOP1 00001305 LISTAR: SET &CONTA = 0 00001306 WRITE NUMERO DE ELEMENTOS: &ULTIMO 00001307 En esta segunda parte, se carga una variable tabulada con cada una de las líneas memorizadas, esto es necesario ya que el próximo comando que se ejecute inicializa las variables del sistema SYSOUTLINE&nnn La línea: 1300 Incrementa el contador de línea 1301 Examina si el numero de línea es mayor que el numero de líneas capturadas y que se encuentra contenido en la variable ULTIMO. En el caso de que sea así, bifurca al párrafo etiquetado como LISTAR. 1302 Carga en la variable de usuario &NOMBREnnn el contenido de la variable del sistema SYSOUTLINEnnn que contiene la línea nnn capturada en la ejecución del comando.

Page 176: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 176 de 374

Es de resaltar el hecho de que a pesar de comenzar por && la variable, no es una variable anidada, pues &SYSOUTLINE es una variable del sistema. 1305 cede el control al párrafo etiquetado como LOOP1. El resto de la clist se comenta al final del presente tema.

Page 177: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 177 de 374

3.6 Etiquetas Las etiquetas son nombres que permiten identificar puntos del procedimiento a los que poder bifurcar el flujo de ejecución. Estos nombres pueden tener de 1 a 8 caracteres alfanuméricos, y deben ir seguidos por el carácter ':' (dos puntos). Existen dos restricciones al uso de etiquetas: - No pueden usarse en sentencias PROC - TSO no lista nunca las etiquetas, incluso cuando se esta depurando un comando usando la opción de control CONLIST que se estudiara mas adelante. Como ejemplo de este apartado puede tomarse cualquier ejemplo de este tema, ya que son usadas ampliamente en todos ellos.

Page 178: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 178 de 374

3.7 Sentencias del lenguaje de CLIST Como se decía en la introducción de este tema, el lenguaje de CLIST es uno mas de los lenguajes de programación. Entre sus características se encuentra la de ejecutar comandos de TSO de forma directa. En consecuencia, junto a los comandos propios de TSO pueden considerarse las siguientes instrucciones o sentencias, las cuales han sido agrupadas en base a la función que realizan. Para control ATTN define la rutina de atención CONTROL Establece opciones de control DATA-ENDDATA ERROR para manejo de errores EXIT salir de la clist GLOBAL define variables globales GOTO salto incondicional PROC Primera instrucción RETURN regreso TERMIN Suspensión temporal de la clist WRITE escribir datos en terminal WRITENR escribir sin ejecutar CR Para asignación de READ leer datos desde el terminal valores READDVAL Separa contenido de &SYSDVAL SET asignar valor a variable Para bifurcación IF-THEN-ELSE bifurca en función de condición DO-WHILE-END repite bucle si condición WHEN TSO comando Para acceso a ficheros OPENFILE abrir fichero GETFILE leer fichero PUTFILE escribir en fichero CLOSEFILE cerrar fichero Por lo general, la sintaxis de las sentencias incluidas en los procedimientos de CLIST se ajusta a las siguientes reglas básicas: - El verbo u operación va separado de los operandos por al menos 1 blanco. - La continuación de una sentencia en otro línea puede especificarse con: - el signo '-' concatena la siguiente línea ignorando los blancos de final de una y principio de otra. - el signo '+'concatena la línea siguiente incluyendo los blancos de principio de la segunda línea. - Todas las sentencias pueden ir acompañadas de una etiqueta. Antes de pasar a analizar cada una de las sentencias citadas, es necesario comentar tres puntos importantes para la codificación de una clist: - Una CLIST siempre se escribe en mayúsculas - Los comentarios se delimitan con /* al principio y */ al final - La primera instrucción ejecutable de una CLIST es siempre la instrucción PROC.

Page 179: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 179 de 374

El siguiente ejemplo muestra estos aspectos. Las dos primeras líneas de la CLIST son líneas de comentarios, mientras que la tercera establece que esta CLIST no tiene ningún parámetro de entrada, pues eso es lo que indica el numero que acompaña a la palabra clave PROC /* <<<<<<<<<<<<<<<<<<<<<< JMPLIB00 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ==== PIDE LIBRERIA DE LA QUE SE DESEA CONOCER LOS MIEMBROS ===== */ PROC 0 ... EXEC 'DESJMP.CLIST.JMP(JMPLIB05)','&LIBRERIA' EXIT Este otro ejemplo muestra las primeras líneas de la CLIST llamada por el procedimiento anterior. En ellas se observa cómo esta clist tiene un parámetro obligatorio, LIBRERIA, y otro optativo, TEST que puede venir o no informado, tal y como se vera al hablar de la sentencia PROC. /* <<<<<<<<<<<<<<<<<<<<<< JMPLIB05 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ====== CAPTURA LOS MIEMBROS DE UNA LIBRERIA ===================== */ PROC 1 LIBRERIA TEST ...

Page 180: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 180 de 374

3.7.1 CONTROL : Estable opciones para el proceso de la CLIST Esta sentencia establece las opciones básicas de control que tendrán efecto en la ejecución de la Clist, tales como si se hará, o no, eco sobre la pantalla de las instrucciones que se ejecuten , antes o después de las sustituciones de las variables, etc. El formato de esta instrucción es : CONTROL [opcion1 [opcion2 [ ... opcionn]]] donde las posibles opciones, sus opuestas y su significado, son: MSG NOMSG mostrar mensajes PROMPT NOPROMPT especificar el prompt del terminal LIST NOLIST Listar comandos de TSO CONLIST NOCONLIST Listar sentencias de la CLIST SYMLIST NOSYMLIST Listar las líneas de la clist FLUSH NOFLUSH Limpiar stack MAIN Determinar procedimiento ppal. END(Cadena) define la cadena que cierra bucle Como las opciones que se establezcan, normalmente se desea que surtan efecto desde el principio, esta sentencia suele seguir a la sentencia PROC, yendo por lo tanto, al principio de la CLIST. El siguiente ejemplo muestra una codificación que permite, con solo asignar un valor a la variable TESTEAR, que se activen unas u otras opciones para la ejecución de la CLIST. /* <<<<<<<<<<<<<<<<<<<<<< LISTAR >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ PROC 0 TESTEAR IF &TESTEAR = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOCONLIST MSG ... Notar que normalmente se usa siempre MSG. En este ejemplo, si se llama a la clist con: TSO EX (LNAT),'TEST' como se asigna el valor TEST a la variable TESTEAR, se activaran las opciones de : - Visualizar en pantalla todas las sentencias de CLIST y los comandos de TSO antes de sustituir las variables pos sus valores. (SYMLIST) - Visualizar en pantalla todas las sentencias de CLIST después de sustituir los nombres de las variables por sus valores. (CONLIST) - Visualizar en pantalla los mensajes que devuelven los comandos de TSO o las sentencias de la CLIST.

Page 181: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 181 de 374

Por el contrario, si se llama a la clist con: TSO EX (LNAT) como no se asigna ningún valor a la variable TESTEAR, que se ha definido como optativa, pues el numero de parámetros posicionales es 0 (PROC 0) se activaran las opciones de : - No visualizar en pantalla todas las sentencias de CLIST después de sustituir los nombres de las variables por sus valores. (CONLIST) - Visualizar en pantalla los mensajes que devuelven los comandos de TSO o las sentencias de la CLIST. A continuación se explica cada una de las opciones. MSG / NOMSG Esta opción establece que se muestren o se supriman los mensajes devueltos por las ejecuciones de los comandos incluidos en la clist. TSO por defecto tiene definida la opción CONTROL MSG PROMPT / NOPROMPT Esta opción establece si se permite o no el prompt para pedir los valores de los parámetros posicionales en las clist llamadas, ya que para la clist actual, tuvo efecto el valor que tuviera este parámetro en el profile del usuario. El siguiente ejemplo muestra de una forma mas clara este extremo: COMMAND ===> Tso Profile Al ejecutar el comando PROFILE, el sistema devuelve los valores que este tiene asignados a cada uno de los parámetros que integran el perfil del usuario. IKJ56688I CHAR(0) LINE(0) PROMPT INTERCOM .... Pues bien, al invocar la clist que se muestra de fondo. sin los valores de los parámetros posicionales, el sistema muestra un mensaje pidiendo el valor de cada uno de los parámetros que no se han informado.

Page 182: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 182 de 374

EDIT ---- DESJMP.CLIST.JMP(LISTAR) - 01.00 -------------------------- COMMAND ===> tso ex 'DESJMP.clist.jmp(listar) SCROLL ===>CSR /* */ 00001318 /* <<<<<<<<<<<<<<<<<<<<<<< LISTAR >>>>>>>>>>>>>>>> */ 00000100 /* */ 00001205 /* === LISTAR POR RMT101 EN VERTICAL Y LETRA PEQUE#A ==*/ 00000100 /* */ 00001205 PROC 9 FICHERO 00000200 FORMATO 00000200 REMOTO + 00000200 CLASE + 00000200 CABECERA + 00000200 DERECHA + 00000200 IZQUIERDA + 00000200 PIE + 00000200 LRCL 00000200 /* */ 00001205 SET &TEST = TESTNO 00000210 IF &TEST = TEST THEN CONTROL LIST CONLIST */ 00001205 IKJ56700A ENTER POSITIONAL PARAMETER FICHERO - ejemplos(salida) IKJ56700A ENTER POSITIONAL PARAMETER FORMATO - v IKJ56700A ENTER POSITIONAL PARAMETER REMOTO - ... Al cambiar ahora el parámetro PROMPT del Profile del usuario mediante el siguiente comando: COMMAND ===> Tso Profile NOPROMPT Para validar que se ha modificado, se ejecuta de nuevo el comando sin opciones. COMMAND ===> Tso Profile el sistema devuelve: IKJ56688I CHAR(0) LINE(0) NOPROMPT INTERCOM ....

Page 183: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 183 de 374

y al ejecutar exactamente igual la misma clist, se obtiene el mensaje que se muestra. EDIT ---- DESJMP.CLIST.JMP(LISTAR) - 01.00 -------------------------- COMMAND ===> tso ex 'DESJMP.clist.jmp(listar) SCROLL ===>CSR IKJ56701I MISSING POSITIONAL PARAMETER FICHERO PROC 9 FICHERO FORMATO REMOTO CLASE CABECERA DERECHA IZQUIERDA PI E LRECL *** y se da por concluida la clist. Así pues, cuando en una clist se establece el parámetro de la sentencia CONTROL como NOPROMPT, no se cambia el PROFILE del usuario como se ha hecho en este ejemplo, pero se activa ese valor desde que se ejecuta la sentencia CONTROL hasta que se termine la ejecución de la clist, y por lo tanto, si ese procedimiento llama a otro sin pasarle todos los parámetros posicionales requeridos, el procedimiento invocado sacara el mensaje IKJ56701I y dará por terminada su ejecución. TSO por defecto tiene definida la opción CONTROL NOPROMPT LIST / NOLIST Esta opción de control establece si se desea listar o no los comandos de TSO y los subcomandos después de que se sustituyan las variables por sus valores. TSO por defecto tienen definida la opción CONTROL LIST CONLIST / NOCONLIST Esta opción de control establece si se desea o no listar las sentencias de la clist después de sustituir las variables por sus valores. TSO por defecto tienen definida la opción CONTROL NOCONLIST SYMLIST / NOSYMLIST Esta opción de control establece si se desea o no listar las sentencias de la clist, y los comandos y subcomandos de TSO antes de sustituir las variables por sus valores TSO por defecto tienen definida la opción CONTROL NOSYMLIST

Page 184: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 184 de 374

FLUSH / NOFLUSH El stack de TSO es una cola en la que se especifica a TSO la fuente de donde debe recoger la próxima entrada, pudiendo tener los valores de terminal o clist. Cuando se produce un error en una clist, TSO hace un borrado o FLUSH del STACK, y como TSO por defecto tiene definida la opción FLUSH, el próximo input siempre le leerá del terminal, a menos que se especifique NOFLUSH. Esta es la función de esta opción de control, evitar el borrado del stack, para que así la próxima entrada la lea del stack, si es que había. Esta opción solo se activa si el código de retorno es mayor que 12, por lo que hay que combinar esta opción con rutinas de error. MAIN Esta opción define la clist que se tomara como de primer nivel cuando se ejecute en una clist llamada, es decir de un nivel inferior, la sentencia EXIT QUIT. END(cadena) Esta opción establece la cadena que actuara como delimitadora en los grupos de instrucciones. Estos grupos siempre empezaran por la instrucción DO y terminaran cuando se encuentren con el delimitador que se establezca aquí. TSO por defecto tienen definida la opción CONTROL END(END) Es decir tiene definida la cadena END como delimitadora de los grupos de instrucciones. Ejemplo : CONTROL END(END-DO) En este caso se establece la cadena END-DO como cadena delimitadora. IF condición THEN + DO sentencias END-DO

Page 185: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 185 de 374

3.7.2 PROC : Primera instrucción de una CLIST Esta instrucción establece el numero de parámetros posicionales que se deben pasar para que se ejecute el procedimiento o CLIST. El formato de esta instrucción es : PROC n [variable1 [variable2 ... [variable n]]]] donde n es el numero que representa el numero de parámetros posicionales obligatorios que se deben pasar, asignandose cada parámetro pasado a cada una de las variables que se establecen como receptores en esta sentencia. En el caso de que no se pasen parámetros, el valor de n debe ser 0. En el caso de pasar parámetros con palabra clave, los parámetros pueden venir en el orden que se quiera ya que el valor acompaña a la palabra clave como argumento. Ejemplo PROC 0 REMOTO(RMT20) FICHERO('JMPDES.SALIDA') El siguiente ejemplo muestra un procedimiento o clist que edita un fichero que contiene el esqueleto de un JCL, (no confundir con un esqueleto de ISPF). Este procedimiento lo que hace es editar ese esqueleto, cambiar esos nombres genéricos por los valores reales, lanzar al JES el JCL, y salir dejando el esqueleto como estaba. La siguiente CList seria llamada desde la línea de comando como sigue: TSO EX JMP(LNAT),'PROGRAMA','PRUEBAS' /* <<<<<<<<<<<<<<<<<<<<< LNAT >>>>>>>>>>>>>>>>>>>>> */ 000100 /* LISTA OBJETO POR RMT101 EN VERTICAL Y LETRA PEQUEÑA */ 000200 PROC 2 OBJETO LIBRERIA 000300 /* CONTROL LIST CONLIST */ 000400 EDIT 'JMPDES.JMP.JCLTIPO(LISTAPGM)' OLD CNTL NONUM 000500 C * 999 'YYYYYYYY' '&OBJETO' ALL 000600 TOP 000700 C * 999 'ZZZZZZZZ' '&LIBRERIA' ALL 000800 SUBMIT 000900 END NOSAVE 001000 Las líneas: 0100 es un comentario que establece el nombre de la CLIST 0200 es un comentario que especifica el objetivo de la misma. 0300 es la primera instrucción ejecutable, y establece que para su ejecución necesita dos parámetros posicionales obligatorios: El primero le asignara a la variable OBJETO y el segundo le asignara a la variable LIBRERIA. 0400 es un comentario que sirve para depurar la clist cuando deja de ser comentario.

Page 186: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 186 de 374

0500 llama al programa EDIT pasándole como parámetro el nombre del fichero a editar así como las características de disposición : OLD, el tipo de fichero que es : CNTL , y un parámetro del fichero NOMUN, que especifica la característica de NO NUMERADO de su perfil. (Este parámetro afecta a cómo definir los parámetros de edición del fichero) 0600 especifica al editor que cambie desde la línea que se encuentra, y en cualquier posición de la línea, la cadena YYYYYYY por el contenido de la variable OBJETO, y que esto lo haga en todo el fichero (ALL) 0700 también es un comando del editor mediante el que se le indica que se posicione en el comienzo del fichero. 0800 especifica que sustituya desde la línea actual (la primera) hasta la 999 la cadena ZZZZZZZZ por el contenido de la variable LIBRERIA 0900 submite el fichero resultante 1000 hace que termine la ejecución del programa EDIT y que salga sin salvar el fichero resultante. El fichero editado : 'JMPDES.JMP.JCLTIPO(LISTAPGM)' realiza el listado de un modulo de Natural por una impresora especifica, pero los nombres del modulo a listar y de la librería en la que se encuentra se han codificado en dicho esqueleto de forma genérica como YYYYYYYY y ZZZZZZZZ. Su contenido es el siguiente:

Page 187: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 187 de 374

//XXXXXXLP JOB (123,456),'JMP-PRU ',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1) //*======================================================= //* PASAR OBJETO NATURAL A FICHERO TEMPORAL //*====================================================== //* //NATBATCH EXEC DESNAT //* //DDPRINT DD DUMMY SYSOUT=* //CMPRINT DD DUMMY SYSOUT=* //CMPRT01 DD DSN=JMPDES.JMP.TMP,DISP=OLD //CMSYNIN DD DSN=JMPDES.JMP.JCL(LOGONPGM),DISP=SHR //********************************************************* // DD * JMP0001P ZZZZZZZZ YYYYYYYY FIN /* //*======================================================== //* IMPRIMIR TEMPORAL CON MARGEN //*======================================================== //* //IMPRIMIR EXEC PGM=IKJEFT01 //* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * PRINTDS DATASET('JMPDES.JMP.TMP') DEST(RMT101) CLASS(I) + COLUMNS(1:124) LMARGIN(8) /* Es de resaltar el hecho de que al ser NONUM, no tiene la numeración de las líneas que figura en otros ejemplos. Por otra parte, la DDname CMSYNIN se compone de 2 sentencias DD concatenadas. La primera DD referencia los parámetros necesarios para entrar en Natural, tales como LIBRERIA, USUARIO Y PASSWORD, y que por ser comunes a todos los JCL, se han escrito como miembro independiente ya que de esta forma, cuando cambia la password solo hay que cambiarla en un sitio. La segunda DD contiene realmente lo que se desea realizar, ejecutar el programa JMP0001P, el cual espera recibir dos datos: El primero representa la librería y el segundo el programa a listar.

Page 188: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 188 de 374

3.7.3 ERROR : rutina para el tratamiento de errores Esta instrucción establece el conjunto de instrucciones que se ejecutaran cuando se produzca una situación de excepción, o un código de retorno distinto de cero. Dicho conjunto de instrucciones vendrá enmarcado por la pareja DO - END, suponiendo que sea END la cadena definida con la sentencia de CONTROL END El formato de esta sentencia es : (1) ERROR sentencia (2) ERROR + DO sentencias END (3) ERROR OFF Los formatos (1) y (2) son similares, con la única salvedad de que en el formato 1 solo se ejecuta una sentencia cuando se bifurca a esta rutina, mientras que en el formato (2) se ejecuta el grupo de sentencias incluidas entre los limitadores DO y END. Es la mas normal El formato (3) desactiva la rutina de error. Esta instrucción, no es una etiqueta aunque tiene un funcionamiento similar. La rutina para el tratamiento de los errores estará activa desde que el flujo ejecute la instrucción ERROR, hasta que se ejecute una nueva sentencia ERROR o se termine la clist, si bien no se ejecutaran sus instrucciones mas que en el caso ya dicho anteriormente de que se devuelva un código distinto de 0. Un caso particular de esta instrucción viene representado por el formato (3), ya que cuando se ejecuta ERROR OFF, deja de estar activa la rutina de error que lo estuviera. En un procedimiento puede haber tantas sentencias ERROR como se consideren necesarias, pero solo estará activa la correspondiente a la ultima sentencia ERROR ejecutada. Esto quiere decir que no es independiente de donde se encuentre dentro del procedimiento, como suele ocurrir con otros lenguajes, pues debe ejecutarse la sentencia para que se active.

Page 189: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 189 de 374

La siguiente secuencia se corresponde a la rutina de tratamiento de errores de la clist DISPLAY1. El sistema bifurcara incondicionalmente a esta rutina cada vez que se produzca una situación de excepción, como por ejemplo, detectar el fin de fichero al ejecutarse una sentencia de lectura. ERROR + 00008100 DO 00008200 SET RETCOD = &LASTCC 00008300 IF &RETCOD = 8 THEN + 00008400 DO 00008500 IF &PASO = EXAMEN THEN + 00008600 DO 00008700 SET EXISTE = NO 00008800 RETURN 00008900 END 00009000 WRITENR YA EXISTE LA TABLA JMPALO01. 00009100 READ SEGUIR 00009200 EXIT CODE(99) 00009300 END 00009400 IF &RETCOD = 400 THEN + 00009500 DO 00009600 SET EOF = SI 00009700 RETURN 00009800 END 00009900 ELSE + 00010000 DO 00010050 WRITE error en la ejecución RC : &RETCOD 00010070 EXIT CODE(&RETCOD) 00010100 END 00010150 END 00010200 8300 memoriza el código de retorno que ha generado la cesión del control a esta rutina. Dicho código se encuentra contenido en la variable del sistema &LASTCC. 8400 Examina si el código de retorno es 8, y si es así ejecuta las instrucciones contenidas entre las línea 8500 a 9400. 8600 Examina el contenido de una variable que se carga en el flujo de ejecución normal, y que sirve para detectar el punto desde el que ha bifurcado a esta rutina ya que el código de retorno 8 es devuelto por mas de una función. Concretamente esta examinando si la variable PASO contiene la cadena EXAMEN, valor que se carga en el flujo normal de la clist. 8800 En el caso de que contenga dicho valor, quiere decir que no existe la fila que se esta buscando, cosa que es correcta ya que se quiere dar de alta una fila en una tabla indexada, y para ello necesitamos que no exista. Por esta razón es por lo que se carga la variable EXISTE con el valor NO. En el caso de que exista la fila buscada, el código de retorno es 0 y no bifurca a la rutina de error. 8900 Retorna al punto desde el que se bifurco a esta rutina.

Page 190: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 190 de 374

9100 Escribe el mensaje de que se quiere crear una tabla que ya existe. Hay que tener en cuenta que el código de retorno 8 también es devuelto cuando se quiere crear una tabla que ya existe. 9200 Se interrumpe la ejecución de la clist hasta que el usuario pulse INTRO. Esto se consigue indicando al sistema que lea desde el terminal el valor de la variable SEGUIR, la cual no sirve mas que para interrumpir la ejecución de la clist, a la espera de que se pulse INTRO. 9300 Se sale de la clist. 9500 En el caso de que el código que provoco esta bifurcación incondicional no fuera el 8 (línea 8400) , se examina si es 400, código generado cuando en la lectura de un fichero se ha detectado el fin de fichero. 9700 si se ha detectado esta condición, se carga la variable de usuario EOF con el valor SI y se regresa con RETURN al punto desde el que se bifurco a esta rutina de errores. 10000 En el caso de no ser ninguno de estos errores, se ejecutan las instrucciones de las líneas 10050 a 10150. 10100 Escribe en el terminal un mensaje con el código de error que no se controla, y sale de la clist con EXIT y devuelve al procedimiento llamante el código de retorno que ha provocado el ERROR. Como puede observarse en esta rutina de ERROR confluyen muchas bifurcaciones, todas unidas únicamente por el código de retorno, y por lo tanto, puede usarse como elemento discriminador variables que indiquen su procedencia, como es el caso de la variable PASO. Las siguientes sentencias constituyen el procedimiento para el que se ha escrito la rutina de errores previa. Con el fin de poder seguir este ejemplo, y dado que todavía no se han explicado todas las instrucciones usadas, es por lo que se comentan estas. El objetivo de esta clist es presentar en un panel ISPF un fichero secuencial que contiene el nombre de todas las librerías alocadas por el sistema, y que se ha cargado previamente con una clist previa.

Page 191: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 191 de 374

ALLOC FI(ENTRADA) DA('&FICHERO') SHR REUSE 00010300 ISPEXEC TBCREATE JMPALO01 NOWRITE NAMES(ELEMENTO,COMENTA) 00010400 OPENFILE ENTRADA INPUT 00010500 /* */ 00010600 GETFILE ENTRADA 00010700 /* */ 00010900 GETFILE ENTRADA 00011000 10300 Aloca el dataset cuyo nombre se encuentra contenido en la variable FICHERO para ser usado de entrada con disposición SHARED, y le asigna el nombre lógico de ENTRADA. 10400 Llama a la función de ISPF : TBCREATE para crear una tabla ISPF en memoria (NOWRITE) con los campos de nombre ELEMENTO y COMENTA. ISPF, por haber invocado una de sus funciones, nos devuelve siempre un código de retorno. Si este código de retorno no es 0 salta a la rutina de errores que se ha comentado. Como lo normal es que en este caso sea 0, pues no existe la tabla ya que es en memoria, sigue en secuencia. 10500 Abre el fichero ENTRADA en modo INPUT. 10700 Lee el primer registro, que no interesa ya que solo contiene un texto de cabecera fijo. 11000 Lee el siguiente registro, el cual contiene informacion valida. Por lo tanto, con un registro valido leido, se entra en la repetitiva siguiente: SET EOF = NO 00011099 DO WHILE &EOF = NO 00011100 SET ELEMENTO = &STR(&SUBSTR(01:44,&ENTRADA)) 00011200 SET COMENTA = &STR(&SUBSTR(45:60,&ENTRADA)) 00011300 /* */ 00011400 SET PASO = EXAMEN 00011500 SET EXISTE = SI 00011600 ISPEXEC TBEXIST JMPALO01 00011700 IF &EXISTE = NO + 00011750 THEN ISPEXEC TBADD JMPALO01 SAVE(ELEMENTO,COMENTA) 00011800 GETFILE ENTRADA 00011900 END 00012000 CLOSFILE ENTRADA 00012100 FREE FI(ENTRADA) 00012200 11099 Inicializa la variable de usuario EOF (End of File) 11100 Repetitiva mientras el contenido de EOF sea NO 11200 Carga en la variable ELEMENTO las posiciones de 1 a 44 de la variable ENTRADA (buffer que contiene el registro leído) 11300 Carga en la variable COMENTA las posiciones 45 a 60 de ENTRADA.

Page 192: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 192 de 374

11500 Carga en la variable PASO la cadena EXAMEN. Esta variable es la que se examina en la rutina de ERROR. 11600 Carga en la variable EXISTE la cadena SI 11700 Llama a la función de ISPF : TBEXIST para saber si existe una fila en la tabla ispf de nombre JMPALO01 Llegados a este punto se puede producir una situación de excepción, pues puede existir o no una fila con el valor contenido en la variable ELEMENTO, dependiendo de que estén duplicados los nombres de las librerías (contenido del fichero que se esta tratando), con lo que esta función puede retornar: - el código 0 si existe la fila, y sigue en secuencia, o - el código 8 si no existe la fila, y por tanto bifurca a la rutina de error. Una vez en esta rutina, pregunta por el código, y como sabe de donde viene por el contenido de la variable PASO, carga el valor NO en la variable EXISTE y retorna a la siguiente sentencia a la que provocó su bifurcación. Es decir, retorna a la sentencia 11750 11750 Pregunta por el contenido de la variable EXISTE. 11800 En el caso de que el contenido sea NO, es decir no existe una fila con la entrada dada, llama a la función de ISPF: TBADD para añadir la fila a la tabla, con los campos ELEMENTO Y COMENTA. 11900 Lee un nuevo registro del fichero ENTRADA 12000 Cierra el bucle de la repetitiva DO-WHILE. Este bucle se repetira hasta que al leer un nuevo registro se detecte el fin de fichero, con lo que se bifurcara de nuevo a la rutina de error, y al comprobar que el código de retorno es 400, cargar en la variable EOF el valor SI, por lo que al retornar de nuevo a este punto, e ir a la cabecera de la repetitiva, comprobara que el contenido de la variable EOF no es NO, y saltara a la línea 12100. 12100 Cierra el fichero asociado al nombre lógico ENTRADA 12200 Libera para el sistema el fichero físico asociado al nombre lógico ENTRADA.

Page 193: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 193 de 374

Con lo cual, al llegar a este punto ya se dispone de una tabla ISPF cargada con los datos que interesan. Las siguientes sentencias presenta la parte de la clist que muestra la tabla en un panel, y permite tratar la informacion contenida en cada una de sus líneas. ERROR OFF 00012300 ISPEXEC TBSCAN JMPALO01 ARGLIST(ELEMENTO) NEXT 00012400 ISPEXEC TBSORT JMPALO01 FIELDS(ELEMENTO,C,A) 00012500 12300 ejecuta una nueva sentencia ERROR pero esta vez con el parámetro OFF por lo que la anterior rutina deja de estar activa. 12400 establece como argumento de búsqueda para un SCAN , el campo ELEMENTO, y la búsqueda se realizara hacia delante. 12500 Clasifica la tabla por el campo ELEMENTO, en ascendente, y su contenido, aunque sea numérico, será tratado como caracteres alfanuméricos. El siguiente fragmento contiene una repetitiva a fin de tratar todos los elementos de la tabla. SET &SIGUE = SI 00012600 DO WHILE &SIGUE = SI 00012700 ISPEXEC TBTOP JMPALO01 00012800 ISPEXEC TBDISPL JMPALO01 PANEL(JMPALO02) 00012900 IF &LASTCC = 8 THEN - 00013000 DO 00013100 ISPEXEC TBCLOSE JMPALO01 00013200 EXIT 00013300 END 00013400 12600 Inicializa la variable SIGUE con el valor SI 12700 Inicia un bucle que se ejecutara mientras la variable SIGUE contenga el valor SI 12800 posiciona el puntero en el la primera fila de la tabla clasificada. 12900 LLama a la función de ISPF para presentar en un panel las filas de la TABLA. ISPF ya se encarga de la paginación, numero de filas por página, etc. 13000 Al no haber una rutina de error a la que bifurcar, después de cada llamada se debe preguntar por el código de retorno que devuelve ISPF. Esto es lo que se hace en esta línea. En el caso de que el código sea 8 , es decir no hay filas, cierra la tabla, y sale de la clist. Las siguientes líneas preparan los datos de ELEMENTO, LIBRERIA y FICHERO de la fila seleccionada.

Page 194: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 194 de 374

SET &ELEMENTO = &ELEMENTO 00013500 SET &LIBRERIA = &LIBRERIA 00013600 SET &FICHERO = &LIBRERIA.(&ELEMENTO.) 00013700 El resto de esta clist se limita a examinar la marca utilizada para seleccionar la fila y ejecutar la acción correspondiente. Es de resaltar el hecho de que ISPF se encarga de seleccionar la fila correspondiente a la primera marca realizada en el campo MARCA. IF &MARCA = B THEN - 00013800 DO 00013900 ISPEXEC BROWSE DATASET('&FICHERO') 00014000 SET &COMENTA = 'VISUALIZADA' 00014100 END 00014200 IF &MARCA = E THEN - 00014300 DO 00014400 ISPEXEC EDIT DATASET('&FICHERO') 00014500 SET &COMENTA = 'EDITADA ' 00014600 END 00014700 IF &MARCA = M THEN - 00014800 DO 00014900 EXEC 'JMPDES.CLIST.JMP(JMPZZZ0M)','&FICHERO' 00015000 END 00015100 SET &MARCA = &STR( ) 00015200 END 00015300 14000 llama a la función de ISPF : BROWSE pasándole como argumento el contenido de la variable FICHERO. 14100 Mueve el texto VISUALIZADA en la variable COMENTA de la fila seleccionada. 14500 llama a la función de ISPF : EDIT pasándole como argumento el contenido de la variable FICHERO. 14100 Mueve el texto EDITADA en la variable COMENTA de la fila seleccionada. 15000 Llama a la clist JMPZZZ0M, pasándole como argumento el contenido de la variable FICHERO con el fin de presentar los miembros de una librería. 15200 mueve blancos a la variable MARCA 15300 Cierra el bucle de la repetitiva. Al final del tema se muestra la pantalla resultante, acompañando al listado completo de esta clist.

Page 195: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 195 de 374

3.7.4 GOTO : salto incondicional Esta sentencia se usa para ceder el control de la ejecución de una clist al párrafo etiquetado con el nombre que sirve de parámetro a esta sentencia. El formato de esta instrucción es : GOTO etiqueta GOTO &variable Como se ve, la etiqueta puede ser dinámica, es decir que un mismo GOTO bifurcara a un párrafo o a otro en función del valor que se haya asignado a la variable, en base a determinadas condiciones. El siguiente ejemplo sigue siendo un fragmento de la clist JMPLIB05. En él se pretende escribir en un fichero el contenido de la variable indexada que se ha cargado previamente en la captura de la salida del comando. SET &CONTA = 6 00003200 GRABAR: SET &CONTA = &CONTA + 1 00003300 IF &CONTA > &ULTIMO THEN GOTO CERRAR 00003411 SET &LINEA = &&NOMBRE&CONTA 00003600 SET &SALIDA = &LINEA 00003610 PUTFILE SALIDA 00003700 /* WRITE &SALIDA */ 00003800 GOTO GRABAR 00003900 CERRAR: CLOSFILE SALIDA 00004000 /* FREE FILE(SALIDA) */ 00004100 La línea: 3200 inicializa el contador a 6 pues las 7 primeras líneas no contienen informacion significativa. 3300 Aquí comienza un párrafo, etiquetado como GRABAR, y como una etiqueta no puede ir sin una sentencia que le acompañe, se aprovecha esta línea para incrementar el valor de la variable CONTA en 1. 3411 Esta sentencia examina el contenido de la variable CONTA para saber si ha sobrepasado el valor de la ultima posición del índice. Si es así, salta al párrafo etiquetado con CERRAR. 3600 Asigna a la variable temporal LINEA el contenido de la variable cuyo nombre se forma concatenando la cadena NOMBRE con el contenido de la variable CONTA. 3610 Asigna al buffer de salida el contenido de la variable temporal LINEA. 3700 Escribe en el fichero de salida el buffer cargado previamente. 3800 Ahora figura como comentario, pero en el caso de que no fuera así,

Page 196: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 196 de 374

escribiría en pantalla el contenido de la variable escrita en el fichero. 3900 Salta incondicionalmente al párrafo GRABAR. 4000 Esta línea contiene el nombre del párrafo CERRAR , y como sentencia ejecutable, la que cierra el fichero en el que se ha escrito la tabla. 4100 Libera ese fichero para que pueda ser usado por el sistema. El siguiente ejemplo ilustra el GOTO dinámico. IF &RC = 8 THEN SET &LABEL = CERRAR IF &RC = 4 THEN SET &LABEL = ABRIR IF &RC = 0 THEN SET &LABEL = SEGUIR GOTO &LABEL

Page 197: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 197 de 374

3.7.5 EXIT : Salir de la clist Esta sentencia termina la ejecución de una clist. El formato de esta instrucción es : EXIT EXIT CODE(nn) EXIT QUIT donde nn es un valor numérico que se devuelve como código de retorno al procedimiento llamante, para que este sepa como fue la ejecución de la CLIST llamada. El código de retorno devuelto puede ser cualquier expresión numérica, donde el valor se encuentre en el rango 0 - 16.777.215 Cuando se usa el parámetro QUIT se sale de la clist actual y se retorna a la clist de nivel mas alto si está protegida, es decir que tenga las sentencias de control : CONTROL MAIN NOFLUSH , y en el caso de que no exista un nivel protegido, se termina la ejecución de la clist. Como ejemplo se muestra un fragmento de la rutina de error comentada en la sentencia ERROR. ERROR + 00008100 DO 00008200 SET RETCOD = &LASTCC 00008300 IF &RETCOD = 8 THEN + 00008400 DO 00008500 IF &PASO = EXAMEN THEN + 00008600 DO 00008700 SET EXISTE = NO 00008800 RETURN 00008900 END 00009000 WRITENR YA EXISTE LA TABLA JMPALO01. 00009100 READ SEGUIR 00009200 EXIT CODE(99) 00009300 END 00009400 ...

Page 198: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 198 de 374

3.7.6 RETURN : Retornar al punto desde el que se bifurco a una rutina Esta sentencia hace que el control de la ejecución pase a la sentencia siguiente a la que provoco la bifurcación a la rutina de error o a la de atención a fin de continuar la secuencia lógica normal de la clist. En consecuencia esta sentencia solo puede encontrarse en las rutinas de ERROR o de ATTN. El formato de esta instrucción es : RETURN Como ejemplo se muestra un fragmento de la rutina de error comentada en la sentencia ERROR. ERROR + 00008100 DO 00008200 SET RETCOD = &LASTCC 00008300 IF &RETCOD = 8 THEN + 00008400 DO 00008500 IF &PASO = EXAMEN THEN + 00008600 DO 00008700 SET EXISTE = NO 00008800 RETURN 00008900 END 00009000 WRITENR YA EXISTE LA TABLA JMPALO01. 00009100 READ SEGUIR 00009200 EXIT CODE(99) 00009300 END 00009400 ... 8900 Esta línea, una vez comprobado que es normal que no exista una fila con el nombre que se quiere dar de alta, y en consecuencia que el código de retorno devuelto por la función es el normal, cede de nuevo el control a la instrucción siguiente a la de la función que provoco que se bifurcara a la rutina para el manejo de errores, a la 11750, para dar de alta la fila en la tabla.

Page 199: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 199 de 374

3.7.7 WRITE : Escribir datos en el terminal Esta instrucción se usa para enviar mensajes al usuario desde la clist. No espera respuesta, solo escribe el mensaje en pantalla. El formato de esta instrucción es : WRITE mensaje El mensaje estará formado por cualquier secuencia de palabras y variables. En tiempo de ejecución, estas serán sustituidas por sus valores. En el caso de que se desee evaluar y escribir el resultado de una expresión, se debe utilizar la función &VAL. Como ejemplo se muestra un fragmento de la rutina de error comentada en la sentencia ERROR. ... DO 00010050 WRITE error en la ejecución RC : &RETCODE 00010070 EXIT CODE(&RETCODE) 00010100 END 00010150 ... 10070 Escribe en el terminal un mensaje y el valor del código de retorno que ha provocado que la secuencia de ejecución pase por esta línea.

Page 200: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 200 de 374

3.7.8 WRITENR : Escribir en el terminal y no ejecutar el <CR> Esta instrucción se usa para enviar mensajes al usuario desde la clist, pero en este caso, este mensaje suele servir de prompt para que el usuario sepa que es lo que tiene que contestar al sistema, ya que normalmente esta sentencia va seguida de la sentencia READ. En este caso, no se ejecuta el salto de línea por lo que los datos a introducir se escriben a continuación del mensaje enviado por la clist. El formato de esta instrucción es : WRITENR mensaje El siguiente ejemplo es un fragmento del procedimiento LNATDDM. En el se muestra cómo se pregunta por pantalla cual es el nombre del objeto a listar. WRITENR NOMBRE DE LA DDM A LISTAR : 00001000 READ &DDM 00001100 Este otro ejemplo muestra un fragmento de la rutina de error comentada en la sentencia ERROR, con un uso muy particular de esta sentencia. ERROR + 00008100 DO 00008200 SET RETCOD = &LASTCC 00008300 IF &RETCOD = 8 THEN + 00008400 DO 00008500 IF &PASO = EXAMEN THEN + 00008600 DO 00008700 SET EXISTE = NO 00008800 RETURN 00008900 END 00009000 WRITENR YA EXISTE LA TABLA JMPALO01. 00009100 READ SEGUIR 00009200 EXIT CODE(99) 00009300 END 00009400 ... 9100 Esta línea saca un mensaje en pantalla. 9200 Esta sentencia interrumpe temporalmente la ejecución de la clist a la espera de que el usuario pulse INTRO. Una vez pulsado este, carga el valor tecleado por el usuario en la variable SEGUIR. Realmente esta sentencia solo sirve para interrumpir la ejecución de la clist hasta que se pulse INTRO, ya que el contenido de la variable seguir no se examina ni se trata.

Page 201: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 201 de 374

3.7.9 READ : Lee datos desde el terminal Esta instrucción se usa para leer datos desde el terminal cargando la variable que sirve de parámetro a esta sentencia. Normalmente esta instrucción va precedida por la WRITENR para escribir un mensaje que informa al usuario de que es lo que espera recibir el sistema. El formato de esta instrucción es : READ &variable Como ejemplo se muestra la clist usada para imprimir por una impresora determinada una vista de un fichero ADABAS o DDM. /* <<<<<<<<<<<<<<<<<<<<<< LNATDDM >>>>>>>>>>>>>>>>>>>>>>> */00000100 /* ====== lista una DDM de Natural por la impresora RMT101 */00000200 PROC 0 TEST 00000300 /* */00000400 IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG 00000600 ELSE CONTROL MSG 00000700 /* -------------------------------------------------------- */00000800 /* */00000900 WRITENR NOMBRE DE LA DDM A LISTAR : 00001000 READ &DDM 00001100 EDIT 'JMPDES.JMP.JCLTIPO(LNATDDM)' OLD CNTL NONUM 00001200 C * 999 'VVVVVVVV' '&DDM' ALL 00001300 /* LIST */00001400 SUBMIT 00001500 END NOSAVE 00001600 EXIT 00001700 En la línea: 1000 se presenta un mensaje explicativo de lo que se desea del usuario: El nombre de la DDM a listar. 1100 se lee el nombre que escriba el usuario en el terminal y se guarda en la variable DDM. 1200 se ejecuta el programa EDIT del sistema, pasándole como parámetro el nombre de un fichero que contiene un JCL genérico que es quien realmente va a listar la DDM por la impresora predeterminada. 1300 Esta línea contiene un subcomando del programa EDIT que tiene por misión cambiar la cadena VVVVVVVV por el contenido de la variable DDM (leído desde pantalla). 1400 Esta línea, ahora comentario, solo sirve para comprobar que se ha realizado lo que se pretendía. Es un subcomando de EDIT y esta enmarcado como comentario por resultar innecesario que salga listado por pantalla el JCL con las modificaciones realizadas.

Page 202: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 202 de 374

1500 Este subcomando de EDIT, envía al JES el contenido del fichero actual, es decir submite el fichero modificado. También es un subcomando del programa EDIT. 1600 Este subcomando finaliza la ejecución del programa EDIT y no salva los cambios, con lo que el programa genérico sigue siendo genérico. 1700 Termina la ejecución de la clist. A fin de completar el ejemplo, se incluye a continuación el JCL genérico que edita la clist anterior. En el no se ha incluido la numeración ya que su profile especifica NONUM. //XXXXXXLD JOB (123,456),'JMP-PRU ',CLASS=U,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1) //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //* PASAR DDM A TMP MEDIANTE CLIST //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //NATBATCH EXEC DESNAT //DDPRINT DD SYSOUT=* //CMPRINT DD SYSOUT=* //CMPRT01 DD DSN=JMPDES.JMP.TMP,DISP=OLD //CMSYNIN DD DSN=JMPDES.JMP.JCL(LOGONPGM),DISP=SHR //********************************************************* // DD * JMP002P VVVVVVVV FIN /* //*=========================================================== //* IMPRIMIR TEMPORAL CON MARGEN //*=========================================================== //* //IMPRIMIR EXEC PGM=IKJEFT01 //* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * PRINTDS DATASET('JMPDES.JMP.TMP') DEST(RMT101) CLASS(I) + COLUMNS(1:71 86:126) LMARGIN(15) COPIES(1) /* El primer paso de este JCL se encarga de llamar a un procedimiento para ejecutar un programa de NATURAL en batch. Cuando se ejecute el programa, pedirá como entrada el nombre de la DDM a listar, y ese es el que figura en forma genérica como VVVVVVVV y dejando la salida en el fichero asociado a la DDname CMPRT01, es decir en el fichero JMPDES.JMP.TMP, que ya existe. El segundo paso, ejecuta el TSO en batch para ejecutar el comando de TSO: PRINTDS que se encarga de listar el dataset especificado como argumento del parámetro clave DATASET, listandole, en la clase dada en el parámetro CLASS, por la impresora especificada como argumento del parámetro DEST. Deja un margen a la izquierda de 15 posiciones, y escribiendo a continuación las columnas 1 a 71 y 86 a 126.

Page 203: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 203 de 374

Page 204: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 204 de 374

3.7.10 IF-THEN-ELSE : Para bifurcación Esta sentencia se usa para ejecutar una u otra instrucción, en base a que se cumpla la condición que acompaña a la palabra clave IF. El formato de esta instrucción es : IF condición THEN + DO sentencias END-DO ELSE + DO sentencias END-DO En el caso de que se cumpla dicha condición, se ejecuta la instrucción asociada a la palabra clave THEN, y en caso contrario, se ejecuta la asociada a la palabra clave ELSE si es que existe, ya que es optativa. Como ejemplo de esta sentencia se incluye un fragmento de la clist DISPLAY1 que se explica detalladamente al final del tema. Este fragmento permite alocar un fichero si ya existe, o crearlo si no existe. /* */ 001400 /* ============= ESCRIBIR SALIDA EN FICHERO =========== */ 001500 /* */ 001600 IF &SYSDSN('&FICHERO') = OK THEN + 001611 ALLOC FILE(SALIDA) DATASET('&FICHERO') OLD REUSE 001620 ELSE ALLOC FILE(SALIDA) DATASET('&FICHERO') NEW CATALOG + 001630 UNIT(3380) RECFM(F B) LRECL(80) + 001640 BLKSIZE(6240) TRACKS SPACE(3 1) REUSE 001650 OPENFILE SALIDA OUTPUT 001800 SET &SALIDA = 'CONTENIDO DE :' &LIBRERIA 001810 1611 antes de examinar la condición contenida en esta línea hay que explicar que &SYSDSN('nombre_fichero') es una función del sistema que devuelve la cadena OK si existe el fichero que se le pasa como argumento. En consecuencia, la condición expresada en esta línea examina si existe el data set cuyo nombre esta contenido en la variable FICHERO. 1620 En el caso de que exista, ejecuta el comando ALLOC a fin de alocar dicho dataset asignándole el nombre lógico de SALIDA. 1630 En el caso de que no exista el fichero, le crea, para lo cual se especifican todos los parámetros necesarios para la creación de un fichero.

Page 205: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 205 de 374

A veces, en lugar de ejecutar una única instrucción se desea ejecutar un conjunto de instrucciones. En este caso, estas deben enmarcarse entre DO y END. Como ejemplo de este punto se muestra un fragmento de la rutina para el manejo de errores de la clist DISPLAY1 que se explica en detalle al final del tema. ERROR + 00002000 DO 00002100 SET &RC = &LASTCC 00002200 IF &RC = 400 THEN + 00002300 WRITE FIN NORMAL DE LA CLIST 00002400 ELSE + 00002500 DO 00026000 WRITE INESPERADO FIN DE CLIST 00002610 WRITE RC ES &RC 00002700 WRITE LINEA 00002700 EXIT 00002800 END 00002900 END 00003000 2610-2900 todas estas sentencias se ejecutaran en el caso de que el contenido de la variable RC no sea 400

Page 206: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 206 de 374

3.7.11 SET : permite asignar valores a variables Esta sentencia se encarga de asignar un valor a una variable, o el resultado de evaluar una expresión aritmética. El formato de esta instrucción es : SET &variable = valor Los valores, ya sean numéricos o alfanuméricos, se ajustan a la izquierda. En el caso de no querer que se realice esta justificación se debe hacer uso de la función &STR. También se usara dicha función cuando el valor asignado sea una cadena que contenga signos aritméticos, a fin de que no intente evaluar las expresiones. Como ejemplo se presenta un fragmento de la clist JMPALO00 que captura la salida de un comando pasándola a un fichero y que se explica con detalle al final del tema. SET &CONTA = 0 00001300 SET &ULTIMO = &SYSOUTLINE 00001400 /* */00001500 /* ============= MEMORIZAR SALIDA ===================*/00001600 /* */00001700 LOOP1: SET &CONTA = &CONTA + 1 00001800 IF &CONTA > &ULTIMO THEN GOTO LISTAR 00001900 SET &TABLA&CONTA = &&SYSOUTLINE&CONTA 00002000 GOTO LOOP1 00002100 1300 Inicializa la variable CONTA asignandola el valor 0 1400 Inicializa la variable ULTIMO asignándola el valor contenido en la variable del sistema SYSOUTLINE. Es de resaltar el hecho de que para asignar a una variable el contenido de otra, se indica anteponiendo el símbolo & al nombre de la variable. 1800 Esta línea incrementa el valor de la variable CONTA en una unidad. 2000 Esta línea asigna a la variable TABLAnnn el contenido de la variable del sistema &SYSOUTLINEnnn. En este caso es de resaltar el hecho de que las variables indexadas se forman concatenando el índice a la variable. Lo mismo ocurre con la variable del sistema &SYSOUTLINEnnn, solo que en este caso se trata de asignar a las variables TABLA1, TABLA2, ... el contenido de las variables cuyo nombre es &SYSOUTLINE1, ... Este es un caso particular del uso del && visto en las variables anidadas, ya que en este caso solo hay que tratarlo como con un unico & ya que el segundo & forma parte del nombre de la variable por ser del sistema.

Page 207: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 207 de 374

3.7.12 DO-WHILE END : Repetitiva mientras se cumple una condición. Esta sentencia establece una estructura repetitiva mediante la cual se ejecutaran todas las instrucciones que se encuentren entre la sentencia DO WHILE y END mientras se cumpla la condición que sirve de parámetro a la sentencia. El formato de esta estructura es : DO WHILE condición sentencia1 ... sentencian END Como ejemplo se presenta la repetitiva para leer un fichero que forma parte de la clist DISPLAY1 que se explica al final del tema. OPENFILE ENTRADA INPUT 001000 GETFILE ENTRADA 001010 IF &LASTCC = 400 THEN SET &EOF = SI 001020 ELSE SET &EOF = NO 001030 DO WHILE &EOF = NO 001040 SET MIEMBRO = &STR(&SUBSTR(1:10,&ENTRADA)) 001050 ISPEXEC TBADD JMPLIB01 SAVE(MIEMBRO) 001060 GETFILE ENTRADA 001070 IF &LASTCC = 400 THEN SET &EOF = SI 001080 END 001090 CLOSFILE ENTRADA 002000 1000 Abre el fichero físico asociado al nombre lógico ENTRADA 1010 Lee un registro del fichero lógico ENTRADA 1020-1030 Examina el código de retorno, y si es 400 carga la variable EOF con el valor SI que especifica que es fin de fichero, y en caso contrario, carga el valor NO en dicha variable. 1040 Cabecera de repetitiva con la condición que debe cumplirse para que entre en la estructura. 1050 asigna a la variable MIEMBRO una cadena formada con los octetos 1 a 10 del buffer que contiene el registro leído. 1060 Añade a la tabla de ISPF JMPLIB01 una fila con la columna MIEMBRO 1070 Lee un nuevo registro del fichero ENTRADA. 1080 Examina el código de retorno devuelto. y en caso de detectarse el fin de fichero carga la variable EOF con el valor SI. 1090 devuelve el control a la línea 1040. 2000 Cuando no se cumpla la condición de la línea 4 se pasara a

Page 208: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 208 de 374

ejecutar esta sentencia ya que es la siguiente al bucle.

Page 209: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 209 de 374

3.7.13 OPENFILE : Abrir fichero Esta sentencia abre un fichero lógico. El formato de esta sentencia es : OPEN fichero INPUT OPEN fichero OUTPUT OPEN fichero UPDATE Este formato es lo suficientemente explicativo por si solo, no obstante, cabe comentar que para poder definir un fichero con el parámetro INPUT debe existir el fichero. Por defecto, los ficheros abiertos se abren con el modo de INPUT. En el caso de definir un fichero como UPDATE, se permite leer y escribir en el mismo fichero, y en este caso, cuando se da la orden de escribir, se machaca el ultimo registro leído con el contenido movido al buffer. Como ejemplo se presenta un fragmento de la clist JMPALO00 comentada mas extensamente al final del tema. SET &FICHERO= &SYSUID..JMP.LISTDS 001610 IF &SYSDSN('&FICHERO') = OK THEN + 001611 ALLOC FILE(SALIDA) DATASET('&FICHERO') OLD REUSE 001620 ELSE ALLOC FILE(SALIDA) DATASET('&FICHERO') NEW CATALOG + 001700 UNIT(3380) RECFM(F B) LRECL(80) + 001710 BLKSIZE(6240) TRACKS SPACE(3 1) REUSE 001720 OPENFILE SALIDA OUTPUT 001800 SET &SALIDA = 'LA SALIDA CONTIENE:' 001810 PUTFILE SALIDA 001820 1610 Asigna a la variable FICHERO la cadena que se forma al concatenar el prefijo del usuario a la cadena ".JMP.LISTDS" 1611 Examina si existe el fichero, y si es así le aloca; y si no es así, establece los parámetros para su creación y le aloca. 1800 Abre para salida el fichero designado como SALIDA 1810 Carga en el buffer SALIDA la cadena que se indica. 1820 Escribe en el fichero físico el contenido del buffer.

Page 210: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 210 de 374

3.7.14 GETFILE : Lee el siguiente registro de un fichero secuencial Esta sentencia lee un registro de un fichero secuencial, dejando su contenido en el buffer que tiene como nombre el nombre lógico asociado al fichero físico en la sentencia ALLOC. El formato de esta sentencia es : GETFILE nombre_fichero Cuando al ejecutar esta instrucción el sistema devuelve el código de retorno 400 es porque ha detectado el fin del fichero. Como ejemplo se presenta el mismo fragmento de la clist DISPLAY1 comentado con la sentencia ERROR, pero ligeramente modificado. ERROR OFF 00010299 ALLOC FI(ENTRADA) DA('&FICHERO') SHR REUSE 00010300 ISPEXEC TBCREATE JMPALO01 NOWRITE NAMES(ELEMENTO,COMENTA) 00010400 OPENFILE ENTRADA 00010500 /* */ 00010600 GETFILE ENTRADA 00010700 IF &LASTCC ^= 0 THEN EXIT CODE(88) 00010750 /* */ 00010900 GETFILE ENTRADA 00010925 SET RC = &LASTCC 00010950 IF &RC = 400 THEN SET EOF = SI 00011960 ELSE EXIT CODE(89) 00011099 10299 desactiva la rutina de errores si la había. 10300 Aloca el dataset cuyo nombre se encuentra contenido en la variable FICHERO para ser usado de entrada con disposición SHARED, y le asigna el nombre lógico de ENTRADA. 10400 Llama a la función de ISPF : TBCREATE para crear una tabla ISPF en memoria (NOWRITE) con los campos de nombre ELEMENTO y COMENTA. 10500 Abre el fichero ENTRADA 10700 Lee el primer registro, que no interesa ya que contiene un texto fijo. 10750 Examina si el código de retorno es distinto de 0, y si es así, sale de la clist devolviendo el código de retorno 88 10925 Lee el siguiente registro, el cual contiene informacion valida. Por lo tanto, con un registro valido leído, se entra en la repetitiva que sigue a esta instrucción. 10950 Memoriza en la variable RC el código de retorno devuelto por el sistema al leer el siguiente registro. 11960 Examina el código de retorno memorizado. Si es el

Page 211: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 211 de 374

correspondiente al fin de fichero, carga la variable EOF con el valor SI. 11099 en caso contrario sale de la clist devolviendo el código de retorno 89 para ser tratado como corresponda.

Page 212: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 212 de 374

3.7.15 PUTFILE : Escribe un registro en un fichero físico. Esta sentencia escribe el contenido de un buffer como un registro en un fichero secuencial. El formato de esta sentencia es : PUTFILE nombre_fichero Como ejemplo se presenta el mismo fragmento de la clist DISPLAY1 comentada con la sentencia OPENFILE. SET &FICHERO= &SYSUID..JMP.LISTDS 001610 IF &SYSDSN('&FICHERO') = OK THEN + 001611 ALLOC FILE(SALIDA) DATASET('&FICHERO') OLD REUSE 001620 ELSE ALLOC FILE(SALIDA) DATASET('&FICHERO') NEW CATALOG + 001710 UNIT(3380) RECFM(F B) LRECL(80) + 001720 BLKSIZE(6240) TRACKS SPACE(3 1) REUSE 001730 OPENFILE SALIDA OUTPUT 001800 SET &SALIDA = 'LA SALIDA CONTIENE:' 001810 PUTFILE SALIDA 001820 1800 Abre para salida el fichero designado como SALIDA 1810 Carga en el buffer SALIDA la cadena que se indica. 1820 Escribe en el fichero físico el contenido del buffer.

Page 213: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 213 de 374

3.7.16 CLOSEFILE : Cierra el fichero Esta sentencia cierra un fichero lógico. El formato de esta sentencia es : CLOSEFILE fichero1[,fichero2[,... ficheron]]]) Este formato es lo suficientemente explicativo por si solo, no obstante, cabe comentar que para poder liberar el fichero, en el caso de que sea de salida, es necesario ejecutar la sentencia FREE(fichero). Como ejemplo se presenta un fragmento de la clist DISPLAY1 comentada mas ampliamente al final del tema. ALLOC FI(ENTRADA) DA('&FICHERO') SHR 000100 ISPEXEC TBCREATE JMPLIB01 NOWRITE NAMES(MIEMBRO) 000200 OPENFILE ENTRADA INPUT 000300 /* */ 000400 GETFILE ENTRADA 000500 /* SET LIBRERIA = &STR(&SUBSTR(1:45,&ENTRADA)) */ 000600 /* */ 000700 GETFILE ENTRADA 000800 DO WHILE &EOF = NO 000900 SET MIEMBRO = &STR(&SUBSTR(1:10,&ENTRADA)) 001000 ISPEXEC TBADD JMPLIB01 SAVE(MIEMBRO) 001100 GETFILE ENTRADA 001200 END 001300 CLOSFILE ENTRADA 001400 FREE FI(ENTRADA) 001500 0100 Aloca el fichero físico cuyo nombre se encuentra contenido en la variable FICHERO, y le asigna el nombre lógico de ENTRADA. 0300 Abre el fichero ENTRADA como de lectura 1400 cierra el fichero ENTRADA 1500 Libera para el sistema el fichero ENTRADA

Page 214: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 214 de 374

3.7.17 ATTN : Rutina de ATENCION Esta sentencia establece la rutina de atención, la cual controlara la salida de una clist después de pulsar la tecla de atención (ATTN). Esta sentencia es muy similar a la rutina de ERROR en el sentido de que solo estará activa desde que el flujo de proceso ejecute esta sentencia, pero no se ejecutara mientras no se pulse la tecla de atención ATTM. El formato de esta sentencia es : (1) ATTN sentencia (2) ATTN DO sentencias END (3) ATTN OFF Los formatos 1 y 2 son similares, con la única salvedad que en el formato 1 solo se ejecuta una sentencia cuando se bifurca a esta rutina, mientras que en el formato 2 se ejecuta el grupo de sentencias incluidas entre los limitadores DO y END. El formato 3 desactiva la rutina de atención. Un ejemplo de esta rutina le constituye el siguiente fragmento: ATTN DO 00100 WRITENR Desea terminar la ejecución (S/N) ? 00200 READ &CONTESTA 00300 IF &CONTESTA = S THEN 00400 DO 00500 CLOSEFILE ENTRADA 00600 FREE FILE ENTRADA 00700 EXIT QUIT 00800 END 00900 ELSE RETURN 01000 END 01100 200 Pregunta se si desea terminar la ejecución de la clist 400 En el caso de que la respuesta sea S cierra el fichero y le libera para que no se quede "pillado" por el sistema. 800 Esta sentencia provoca la salida de la clist hasta el nivel superior protegido. (ver sentencia EXIT) 1000 En el caso de que no se desee terminar la ejecución de la clist se retorna al punto desde el que se bifurco a ejecutar esta rutina.

Page 215: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 215 de 374

3.7.18 TERMIN Esta sentencia suspende temporalmente la ejecución de una clist, devolviendo el control de entrada de comandos al terminal. Al ejecutar desde el terminal el comando RETURN se continuara con la ejecución de la clist suspendida. El formato de esta sentencia es : TERMIN El siguiente ejemplo puede ilustrar el uso de esta sentencia: ATTN DO 00100 WRITE Para regresar con esta clist escriba RETURN 00200 TERMIN 00300 RETURN 00400 END 00500 0100 Establece la rutina de atención de la clist 0200 Saca un mensaje recordando que se va a salir temporalmente de la clist, pero que para volver a ella basta con ejecutar el comando RETURN 0300 Sale temporalmente al sistema a fin de ejecutar comandos de TSO. 0400 Cuando se retorne a esta clist, por haber ejecutado el comando RETURN desde el sistema, se retorna al punto desde el que se bifurco a esta rutina de atención.

Page 216: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 216 de 374

3.7.19 READDVAL : Separar la informacion contenida en &SYSDVAL Esta sentencia se usa para separar en distintas variables el contenido de la variable &SYSDVAL. Esta variable del sistema puede contener: - la ultima entrada leída desde el terminal cuando se ejecuto una sentencia READ sin el nombre de una variable; o - un valor cargado directamente en la clist. El formato de esta sentencia es : READDVAL var1 [var2 [... varn]] El siguiente ejemplo ilustra el uso de esta sentencia: WRITE Escribe tu nombre y dos apellidos : 00100 READ 00200 READDVAL &NOMBRE &APE1 &APE2 00300 WRITE TU NOMBRE ES &NOMBRE 00400 WRITE Y TUS APELLIDOS SON &APE1 &APE2 00500 0200 Como se ejecuta la sentencia READ sin ningún nombre de variable, lo que se hace es cargar la variable SYSDVAL 0300 Asigna la primera palabra a la variable NOMBRE. El carácter blanco actúa de delimitador. La segunda a APE1 y la tercera a APE2 y desprecia el resto en el caso de que lo haya. 0400-0500 Escribe los datos para validacion

Page 217: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 217 de 374

3.7.20 GLOBAL : define variables globales La comunicación de informacion entre procedimientos de clist puede hacerse pasando el contenido de las variables como parámetros cuando se llama a otra clist, la cual a su vez, mediante las variables definidas en la sentencia PROC asigna los valores recogidos a las variables especificadas. Existe una segunda forma de pasar informacion a una clist: usar variables globales, con lo cual no es necesario pasar parámetros a la segunda clist, y en consecuencia, no declarar las variables en la sentencia PROC. Pero, para poder usar variables globales, es necesario definirlas mediante la sentencia GLOBAL tanto en la clist primaria como en la clist llamada. El formato de esta sentencia es: GLOBAL &var1 &var2 ... &varn El siguiente ejemplo es una clist que pide el nombre de una librería para poder listar sus miembros. Si se especifica un nombre, este es pasado a otra clist para tratar dicha librería. /* <<<<<<<<<<<<<<<<<<<<<< JMPLIB00 >>>>>>>>>>>>>>>>>>> */ 0010100 /* ====== CAPTURA LOS MIEMBROS DE UNA LIBRERIA ========= */ 0010200 PROC 0 0010300 CONTROL MSG 0010400 SET RC = 0 0010500 GLOBAL &LIBRERIA 0010600 SET &LIBRERIA = &SYSUID.. 0010700 ISPEXEC DISPLAY PANEL(JMPLIB01) CURSOR(LIBRERIA) 0010800 SET RC = &LASTCC 0010900 IF &LIBRERIA = &STR() THEN EXIT 0010000 EXEC 'DESJMP.CLIST(JMPLIB05)' 0011000 EXIT 0011100 10600 Define como GLOBAL la variable LIBRERIA 10700 Carga la variable con el identificador del usuario 10800 Saca un panel para que el usuario especifique la librería de la que se desea listar los miembros. 11000 Invoca a la clist que realizara esta función sobre la librería que el usuario especifique en el panel.

Page 218: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 218 de 374

/* */ /* <<<<<<<<<<<<<<<<<<<<<< JMPLIB00 >>>>>>>>>>>>>>>>>>>>>>>>*/ 00000100 /* */ 00001030 PROC 0 00001040 CONTROL NOLIST NOCONLIST 00001050 GLOBAL &LIBRERIA 00001055 SET &SYSOUTTRAP = 999 00001060 LISTDS '&LIBRERIA' MEMBERS 00001070 ... 1055 Establece como global la variable LIBRERIA 1070 Hace uso del contenido de esa variable para ejecutar el comando de TSO LISTDS con el parámetro LIBRERIA y con la opción MEMBERS a fin de obtener una lista de los miembros de un fichero particionado. . El resto de la clist es similar a la que captura las librerías alocadas.

Page 219: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 219 de 374

3.8 Comandos de TSO Este apartado trata los comandos de TSO de uso mas frecuente, presentando junto al nombre del comando, la abreviatura admitida, y una breve descripción del mismo. ALLOCATE ALLOC este comando se usa para incluir en el entorno del usuario la librería o el fichero que le acompaña como parámetro. ALTLIB Este comando se usa para añadir hasta dos niveles de librerías al fichero SYSPROC a fin de poder ejecutar clist invocandolas de forma implícita. ATTRIB ATTR Este comando se usa para definir características de ficheros CALL Este comando se usa para ejecutar el programa contenido en la librería(miembro) que se especifique. CANCEL Este comando cancela la ejecución del job cuyo JOBID se especifica como parámetro. COPY Este comando, que puede no estar disponible en la instalación, se usa para copiar ficheros desde un fuente al fichero que se especifica como destino detrás de la palabra clave TO. En el caso de que el fichero destino no existiera, le crea. DEFINE DEF Este comando se usa para crear entradas en el catalogo del sistema referenciando ficheros u objetos VSAM. DELETE DEL Este comando se usa para borrar ficheros. EDIT E Este comando permite crear o modificar los datos de un fichero. END Este comando termina la ejecución de un procedimiento. EXEC EX Este comando permite ejecutar un procedimiento de CLIST o un comando REXX FORMAT FORM Este comando es usado para formatear datos que vayan a ser impresos, con control de páginas, cabeceras, etc. FREE Este comando libera, es decir desasigna, recursos definidos con el comando ALLOC HELP H Este comando invoca a la aplicacion de ayudas del TSO

Page 220: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 220 de 374

LINK Este comando invoca al programa linkador-editor para convertir la salida del compilador en código ejecutable. LIST L Lista el contenido de un fichero por el terminal. Puede no estar disponible en la instalación. LISTALC LISTA Este comando lista todos los recursos que están asignados a la sesión de quien ejecuta el comando. LISTBC LISTB Este comando lista los mensajes dejados para el usuario en la librería de BROADCAST. LISCAT LISTC Este comando lista el catalogo del sistema. LISTDS LISTD Este comando lista características de los ficheros o datasets. LOADGO LOAD Este comando se usa para convertir la salida del compilador en un programa ejecutable, y ejecutarlo directamente. LOGOFF Termina la sesión de TSO. MERGE M Este comando se usa para unir en un fichero datos de varios ficheros. Puede ser que no este disponible en la instalación el uso de este comando. OUTDES Este comando se usa para definir características del fichero de SYSOUT. OUTPUT OUT Este comando se usa para escribir la salida de un Job en un fichero. PRINT Este comando se usa para imprimir ficheros VSAM. PROFILE PROF Este comando se usa para cambiar características asociadas al perfil del usuario. PROTECT PROT Este comando se usa para crear o cambiar la password de ficheros. Es ignorado si la instalación dispone de RACF. RENAME REN Este comando se usa para cambiar el nombre de un fichero. REPRO Este comando es usado para copiar ficheros. RUN Este comando se usa para compilar, cargar y ejecutar el código fuente del fichero pasado como parámetro. SEND SE Este comando se usa para enviar mensajes a otro terminal de usuario. STATUS Este comando se usa para chequear el estado de un job que esta en ejecución.

Page 221: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 221 de 374

SUBMIT SUB Este comando se usa para enviar al JES un JCL para su ejecución. TERMINAL TERM Este comando es usado para cambiar características del terminal. TEST Este comando se usa para testear un programa. TIME Este comando visualiza la fecha y hora, así como otras estadísticas. VERIFY VFY Este comando es usado para verificar la informacion del catalogo con la del fichero VSAM. WHEN Este comando se usa para ejecutar condicionalmente funciones en base al código de retorno devuelto por el programa que le precede.

Page 222: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 222 de 374

3.9 Funciones estándar 3.9.1 &DATATYPE : Determinar tipo de variable Esta función se usa para determinar si el contenido de una variable es numérica o alfanumérica. Los valores devueltos son: "NUM" o "CHAR" dependiendo del contenido. Ejemplo: SET &TIPO = &DATATYPE(&VARIABLE) IF &TIPO = CHAR + THEN SET .... ELSE SET .... 3.9.2 &EVAL : Evaluar el contenido de una expresión Esta función se usa normalmente en sentencias WRITE para evaluar el contenido de una expresión y escribir el resultado. Ejemplo: SET &VAL1 = 5 SET &VAL2 = 3 WRITE &VAL1 + &VAL2 = &EVAL(&VAL1 + &VAL2) 3.9.3 &LENGTH : Determinar la longitud de una expresión Esta función se usa normalmente para determinar la longitud de una cadena de caracteres o el contenido de una variable. Suele usarse en combinación con la función &SUBSTR. Ejemplo: SET &LONGITUD = &LENGTH(&VARIABLE) 3.9.4 &NRSTR : Determina que no se realicen sustituciones con && Esta función especifica que en el caso de que la cadena que sirve de argumento a esta función contenga un doble ampersand (&&), no se realice la sustitución de la variable.

Page 223: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 223 de 374

3.9.5 &STR : Determina que el contenido del argumento es una cadena Esta función especifica que la cadena pasada como argumento sea tratada como cadena de caracteres, no debiendo efectuarse sustituciones ni evaluarse expresiones. Ejemplo: Sentencia Contenido SET &VAL1 = UN EJEMPLO "EJEMPLO" SET &VAL2 = &STR( UN EJEMPLO ) " EJEMPLO " SET &VAL3 = ESTADOS R3-R5 Error al evaluar expresión SET &VAL4 = &STR(ESTADOS R3-R5) "ESTADOS R3-R5" 3.9.6 &SUBSTR : Extrae una subcadena de una cadena o de una variable Esta función extrae de una cadena o de una variable la subcadena que se indica, de acuerdo con el siguiente formato: &SUBSTR(octeto_inicio:octeto_final,variable) Ejemplo: SET &ELEMENTO = &SUBSTR(2:5,EJEMPLO) "JEMP" SET &VARIABLE = EJEMPLO SET &ELEMENTO = &SUBSTR(1:3,&VARIABLE) "EJE" 3.9.7 &SYSCAPS : Pasa a mayúsculas el argumento Esta función se usa para convertir a mayúsculas el argumento de la función. Ejemplo: SET &VARIABLE = &SYSCAPS(&VARIABLE) 3.9.8 &SYSDSN : Determina si existe como dataset el argumento Esta función se usa para saber si existe un fichero determinado. Los valores devueltos por la función son: - "OK" si existe , o - "DATASET NOT FOUND" si no existe.

Page 224: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 224 de 374

3.9.9 &SYSINDEX : Buscar un carácter en una cadena Esta función se usa para determinar la posición que ocupa un determinado carácter en una cadena. Ejemplo: SET &POSICION = &SYSINDEX(HOLA,ESTO SIRVE PARA BUSCAR HOLA) WRITE SE ENCUENTRA EN &POSICION Al ejecutar aparece: SE ENCUENTRA EN 24 3.9.10 &SYSLC : Pasa a minúsculas el argumento pasado Esta función se usa para convertir a minúsculas el valor que se le pase como argumento. Ejemplo: SET &VARIABLE = &SYSLC(&VARIABLE) 3.9.11 &SYSNSUB : Determina el nivel de sustituciones. Esta función se utiliza para controlar el nivel de sustitución de variables simbólicas y expresiones. Ejemplo : SET &VALOR1 = EJEMPLO SET &VALOR2 = &&VALOR1 SET &VALOR3 = &&VALOR2 WRITE &SYSNSUB(0,&VALOR3) WRITE &SYSNSUB(1,&VALOR3) WRITE &SYSNSUB(2,&VALOR3) WRITE &SYSNSUB(3,&VALOR3) Al ejecutar este procedimiento, aparece escrito en pantalla: &VALOR3 &VALOR2 &VALOR1 EJEMPLO

Page 225: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 225 de 374

3.10 Ejemplos 3.10.1 JMPALO00 : Paso a fichero de las librerías alocadas Salida del comando de TSO LISTA ejecutado directamente: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ------------------- MENU PARTICULAR DE JMP ------------------------ OPTION ===> tso lista 1 ... X EXIT - SALIR DEL MENU TERMFILE DESJMP.JMP.PANEL DESJMP.ISPF.ISPPROF DESJMP.INT.TABLA *** <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Page 226: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 226 de 374

Listado del procedimiento de comandos: /* <<<<<<<<<<<<<<<<<<<<<< JMPALO00 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* =========== CAPTURA Las librerías alocadas ==================== */ PROC 0 CONTROL MSG SET CABECERA = <<< Librerías alocadas >>> SET RC = 0 EXEC 'DESJMP.CLIST.JMP(JMPSEG01)','A' CONTROL NOLIST NOCONLIST SET &SYSOUTTRAP = 999 LISTA SET &SYSOUTTRAP = 0 SET &NOMBRE = TABLA SET &CONTA = 0 SET &ULTIMO = &SYSOUTLINE /* */ /* ============= MEMORIZAR SALIDA ============================= */ /* */ LOOP1: SET &CONTA = &CONTA + 1 IF &CONTA > &ULTIMO THEN GOTO LISTAR SET &NOMBRE&CONTA = &&SYSOUTLINE&CONTA GOTO LOOP1 EXIT1: SET &CONTA = 0 WRITE NUMERO DE ELEMENTOS: &ULTIMO /* */ LOOP2: SET &CONTA = &CONTA + 1 IF &CONTA > &ULTIMO THEN GOTO LISTAR SET &SALIDA = &&NOMBRE&CONTA WRITE &SALIDA GOTO LOOP2 /* */ LISTAR: SET &FICHERO= &SYSUID..JMP.CMD /* WRITE */ /* WRITENR LA SALIDA CONTIENE &ULTIMO LINEAS */ /* WRITE */ /* */ /* ============= ESCRIBIR SALIDA EN FICHERO =================== */ /* */ IF &SYSDSN('&FICHERO') = OK THEN + ALLOC FILE(SALIDA) DATASET('&FICHERO') OLD REUSE ELSE ALLOC FILE(SALIDA) DATASET('&FICHERO') NEW CATALOG + UNIT(3380) RECFM(F B) LRECL(80) + BLKSIZE(6240) TRACKS SPACE(3 1) REUSE /* */ OPENFILE SALIDA OUTPUT SET &SALIDA = 'LA SALIDA CONTIENE:' PUTFILE SALIDA /* */

Page 227: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 227 de 374

SET &RC = 0 ERROR + DO SET &RC = &LASTCC IF &RC = 400 THEN + WRITE FIN NORMAL DE LA CLIST ELSE + DO WRITE INESPERADO FIN DE CLIST WRITE RC ES &RC WRITE LINEA EXIT END END /* */ SET &CONTA = 6 GRABAR: SET &CONTA = &CONTA + 1 IF &CONTA > &ULTIMO THEN GOTO CERRAR SET &LINEA = &&NOMBRE&CONTA SET &SALIDA = &LINEA PUTFILE SALIDA /* WRITE &SALIDA */ GOTO GRABAR CERRAR: CLOSFILE SALIDA FREE FILE(SALIDA) EXEC 'DESJMP.CLIST.JMP(DISPLAY1)','&FICHERO'

Page 228: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 228 de 374

Salida del comando : <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ------------------- MENU PARTICULAR DE JMP ------------------------ OPTION ===> tso lista 1 ... X EXIT - SALIR DEL MENU TERMFILE DESJMP.JMP.PANEL DESJMP.ISPF.ISPPROF DESJMP.INT.TABLA *** <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Page 229: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 229 de 374

3.10.2 DISPLAY1 : visualizar en panel el fichero generado con JMPALO00 Panel que se desea obtener: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @JMP-94----------------- Lista de librerías --------- ROW 1 TO 16 OF 94 OPCION====> SCROLL ==> CSR Opciones : B Browse <<< LIBRERIAS ALOCADAS >>>_______ E Edit M Miembros m Librerías Observaciones - -------------------------------------------- --------------- SYS1.BRODCAST DESJMP.JMP.ESKELETO DESJMP.JMP.MENSAJES DESJMP.JMP.PANEL DESJMP.JMP.TABLAS DESJMP.JMP.TABLAS(JMPINT00) DESJMP.SPFLOG1.LIST ************************* BOTTOM OF DATA ***************************** <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> A continuación se muestra el listado de la clist que sirve para visualizar con un panel el contenido de un fichero secuencial. Aunque en este caso dicho fichero contienen las librerías alocadas, que han sido cargadas previamente en el ejemplo anterior. Los comentarios a este ejemplo pueden verse ampliamente en la sentencia ERROR. /* <<<<<<<<<<<<<<<<<<<<<< DISPLAY1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* =========== CAPTURA Las librerías alocadas ==================== */ PROC 1 FICHERO /* */ /* ============= DISPLAYA LA TABLA DE ELEMENTOS ==================== */ /* */ CONTROL MSG SET EOF = NO SET PF3 = &LASTCC SET RETCOD = 0 SET RC = 0 ERROR + DO SET RETCOD = &LASTCC IF &RETCOD = 8 THEN + DO IF &PASO = EXAMEN THEN + DO SET EXISTE = NO RETURN

Page 230: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 230 de 374

END WRITENR YA EXISTE LA TABLA JMPALO01. NO PUEDO CREARLA READ SEGUIR EXIT END IF &RETCOD = 400 THEN + DO SET EOF = SI RETURN END ELSE + EXIT END ALLOC FI(ENTRADA) DA('&FICHERO') SHR REUSE ISPEXEC TBCREATE JMPALO01 NOWRITE NAMES(ELEMENTO,COMENTA) OPENFILE ENTRADA /* */ GETFILE ENTRADA /* SET LIBRERIA = &STR(&SUBSTR(1:45,&ENTRADA)) */ /* */ GETFILE ENTRADA DO WHILE &EOF = NO SET ELEMENTO = &STR(&SUBSTR(01:44,&ENTRADA)) SET COMENTA = &STR(&SUBSTR(45:60,&ENTRADA)) /* */ SET PASO = EXAMEN SET EXISTE = SI ISPEXEC TBEXIST JMPALO01 IF &EXISTE = NO THEN ISPEXEC TBADD JMPALO01 SAVE(ELEMENTO,COMENTA) GETFILE ENTRADA END CLOSFILE ENTRADA FREE FI(ENTRADA) ERROR OFF ISPEXEC TBSCAN JMPALO01 ARGLIST(ELEMENTO) NEXT ISPEXEC TBSORT JMPALO01 FIELDS(ELEMENTO,C,A) SET &SIGUE = SI DO WHILE &SIGUE = SI ISPEXEC TBTOP JMPALO01 ISPEXEC TBDISPL JMPALO01 PANEL(JMPALO02) IF &LASTCC = 8 THEN - DO ISPEXEC TBCLOSE JMPALO01 EXIT END SET &ELEMENTO = &ELEMENTO SET &LIBRERIA = &LIBRERIA SET &FICHERO = &LIBRERIA.(&ELEMENTO.) IF &MARCA = b THEN - DO ISPEXEC BROWSE DATASET('&FICHERO') SET &COMENTA = 'VISUALIZADA' END IF &MARCA = E THEN - DO ISPEXEC EDIT DATASET('&FICHERO')

Page 231: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 231 de 374

SET &COMENTA = 'EDITADA ' END IF &MARCA = M THEN - DO EXEC 'DESJMP.CLIST.JMP(JMPLIB05)','&FICHERO' END SET &MARCA = ' ' END

Page 232: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 232 de 374

Panel JMPALO02: )ATTR default($+_) ? TYPE(INPUT) INTENS(low) CAPS(off) JUST(LEFT) # TYPE(OUTPUT) INTENS(high) CAPS(ON) JUST(LEFT) pad(_) )BODY $------------------------- Lista de librerías ------------------------- $ OPCION====>_Zcmd +SCROLL ==> _scin+ $ + Opciones :$B+Browse #cabecera + + $E+Edit + $M+Miembros + m Librerías Observaciones + - -------------------------------------------- --------------- )MODEL ROWS(ALL) + _z?elemento +?comenta + )INIT &SCIN= Csr .zvars = marca &marca = ' ' )END

Page 233: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 233 de 374

3.10.3 JMPLIB00 : capturar los miembros de una librería /* <<<<<<<<<<<<<<<<<<<<<< JMPLIB00 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ====== CAPTURA LOS MIEMBROS DE UNA LIBRERIA ===================== */ PROC 0 TEST CONTROL MSG SET RC = 0 SET LIBRERIA = &SYSUID.. ISPEXEC DISPLAY PANEL(JMPLIB01) CURSOR(LIBRERIA) SET RC = &LASTCC IF &LIBRERIA = &STR() THEN EXIT EXEC 'DESJMP.CLIST.JMP(JMPLIB05)','&LIBRERIA' /* */

Page 234: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 234 de 374

3.10.4 JMPLIB05 : /* <<<<<<<<<<<<<<<<<<<<<< JMPLIB05 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ====== CAPTURA LOS MIEMBROS DE UNA LIBRERIA ===================== */ /* */ PROC 0 LIBRERIA TEST /* */ CONTROL NOLIST NOCONLIST SET &SYSOUTTRAP = 999 LISTDS '&LIBRERIA' MEMBERS SET &SYSOUTTRAP = 0 SET &NOMBRE = TABLA SET &CONTA = 0 SET &ULTIMO = &SYSOUTLINE /* */ /* ============= MEMORIZAR SALIDA ============================= */ /* */ IF &TEST = TEST THEN SET &ETIQUETA = EXIT1 ELSE SET &ETIQUETA = LISTAR /* */ LOOP1: SET &CONTA = &CONTA + 1 IF &CONTA > &ULTIMO THEN GOTO &ETIQUETA SET &NOMBRE&CONTA = &&SYSOUTLINE&CONTA GOTO LOOP1 /* */ EXIT1: SET &CONTA = 0 WRITE NUMERO DE ELEMENTOS: &ULTIMO /* */ LOOP2: SET &CONTA = &CONTA + 1 IF &CONTA > &ULTIMO THEN GOTO LISTAR SET &SALIDA = &&NOMBRE&CONTA WRITE &SALIDA GOTO LOOP2 /* */ LISTAR: IF &TEST = TEST THEN WRITENR LA SALIDA CONTIENE &ULTIMO LINEAS /* */ /* ============= ESCRIBIR SALIDA EN FICHERO =================== */ /* */ SET &FICHERO= &SYSUID..JMP.LISTDS IF &SYSDSN('&FICHERO') = OK THEN + ALLOC FILE(SALIDA) DATASET('&FICHERO') OLD REUSE ELSE ALLOC FILE(SALIDA) DATASET('&FICHERO') NEW CATALOG + UNIT(3380) RECFM(F B) LRECL(80) + BLKSIZE(6240) TRACKS SPACE(3 1) REUSE OPENFILE SALIDA OUTPUT SET &SALIDA = 'LA SALIDA CONTIENE:' PUTFILE SALIDA /* */

Page 235: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 235 de 374

SET &RC = 0 ERROR + DO SET &RC = &LASTCC IF &RC = 400 THEN + WRITE FIN NORMAL DE LA CLIST ELSE + DO WRITE INEXPERADO FIN DE CLIST WRITE RC ES &RC WRITE LINEA EXIT END END /* */ SET &CONTA = 6 GRABAR: SET &CONTA = &CONTA + 1 IF &CONTA > &ULTIMO THEN GOTO CERRAR SET &LINEA = &&NOMBRE&CONTA SET &SALIDA = &LINEA PUTFILE SALIDA /* WRITE &SALIDA */ GOTO GRABAR CERRAR: CLOSFILE SALIDA FREE FILE(SALIDA) /* */ /* ============== DISPLAYA LA TABLA DE MIEMBROS ==================== */ /* */ CONTROL MSG SET EOF = NO SET RETCOD = 0 /* */ ERROR + DO SET RETCOD = &LASTCC IF &RETCOD = 8 THEN + DO WRITENR YA EXISTE LA TABLA jmplib01. NO PUEDO CREARLA READ SEGUIR EXIT END IF &RETCOD = 400 THEN + DO SET EOF = SI RETURN END ELSE + EXIT END /* */

Page 236: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 236 de 374

ALLOC FI(ENTRADA) DA('&FICHERO') SHR ISPEXEC TBCREATE JMPLIB01 NOWRITE NAMES(MIEMBRO) OPENFILE ENTRADA GETFILE ENTRADA /* */ GETFILE ENTRADA DO WHILE &EOF = NO SET MIEMBRO = &STR(&SUBSTR(1:10,&ENTRADA)) ISPEXEC TBADD JMPLIB01 SAVE(MIEMBRO) GETFILE ENTRADA END CLOSFILE ENTRADA FREE FI(ENTRADA) /* -----------------------------------------------*/ /* PRESENTAR Y TRATAR LA TABLA */ /* -----------------------------------------------*/ ERROR OFF ISPEXEC TBSCAN JMPLIB01 ARGLIST(MIEMBRO) NEXT ISPEXEC TBSORT JMPLIB01 FIELDS(MIEMBRO,C,A) SET &SIGUE = SI DO WHILE &SIGUE = SI ISPEXEC TBTOP JMPLIB01 ISPEXEC TBDISPL JMPLIB01 PANEL(JMPLIB02) IF &LASTCC = 8 THEN - DO ISPEXEC TBCLOSE JMPLIB01 EXIT END SET &MIEMBRO = &MIEMBRO SET &LIBRERIA = &LIBRERIA SET &FICHERO = &LIBRERIA.(&MIEMBRO.) IF &MARCA = B THEN - DO ISPEXEC BROWSE DATASET('&FICHERO') END IF &MARCA = E THEN - DO ISPEXEC EDIT DATASET('&FICHERO') END IF &MARCA = P THEN - DO EXEC 'DESJMP.CLIST(IMPRIMIR)','&fichero' END SET &MARCA = ' ' END

Page 237: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 237 de 374

Panel JMPLIB01: )ATTR default($+_) ? TYPE(INPUT) INTENS(HIGH) CAPS(ON) JUST(LEFT) PAD('_') )BODY $----------------- Listar miembros de un directorio (PDS) ------------- $ OPCION ===> _Zcmd + + $ $ $ + Librería ........ : ?librería + $ + + + Esta opción lista los miembros de un fichero particionado + dejando la salida en$&zuser..jmp.listds + + $ $ $ )INIT )PROC VER (&librería,dsname) &ZSEL = TRANS( TRUNC (&ZCMD,'.') x,'exit' ' ',' ' *,'?' ) )END

Page 238: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 238 de 374

Panel JMPLIB02: )ATTR default($+_) ? TYPE(INPUT) INTENS(low) CAPS(ON) JUST(LEFT) # TYPE(OUTPUT) INTENS(high) CAPS(ON) JUST(LEFT) pad(_) )BODY $----------------- Listado de miembros de un PDS ----------------------- $ OPCION====>_Zcmd + $SCROLL == > _scin+ $ + Librería ........ :#librería comandos $B+Browse $E+Edit $P+Imprimir $ $ Miembros Mensaje + * ******** *********************************** )MODEL ROWS(ALL) + _z?miembro +#mensaje + )INIT &SCIN= Csr .zvars = marca .cursor = marca &marca = ' ' )END

Page 239: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 239 de 374

3.10.5 LISTAR : Listar por impresora, con IEBGENER un fichero /* <<<<<<<<<<<<<<<<<<<<<<< LISTAR >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> * /* * /* ====== LISTAR FICHERO POR RMT101 EN VERTICAL Y LETRA PEQUE#A ==== * /* * PROC 9 FICHERO + FORMATO + REMOTO + CLASE + CABECERA + DERECHA + IZQUIERDA + PIE + LRCL /* * SET &LABEL=LEER SET &TEST = TESTNO IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* ----------------------------------------------------------------- * IF &LRCL = 0 THEN SET LRCL = 80 /* * /* * /* ---------------------------------- EXAMINAR FORMATO /* * IF '&FORMATO' = 'V' THEN GOTO VERTICAL /* * /* ========================= PONER HORIZONTAL ====================== * /* * HORIZONTAL: + ALLOC FILE(SYSUT1) DATASET('DESJMP.JMP.JCL(HORIZONT)') SHR REUSE ALLOC FILE(SYSUT2) DATASET('&SYSUID..JMP.TMP') OLD REUSE OPENFILE SYSUT1 INPUT OPENFILE SYSUT2 OUTPUT GETFILE SYSUT1 SET &SYSUT2 = &SYSUT1 PUTFILE SYSUT2 CLOSFILE SYSUT1 CLOSFILE SYSUT2 FREE FILE(SYSUT1 SYSUT2) GOTO SEGUIR /* *

Page 240: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 240 de 374

/* ========================= PONER VERTICAL ======================== * /* * VERTICAL: + ALLOC FILE(SYSUT1) DATASET('DESJMP.JMP.JCL(VERTICAL)') SHR REUSE ALLOC FILE(SYSUT2) DATASET('&SYSUID..JMP.TMP') OLD REUSE OPENFILE SYSUT1 INPUT OPENFILE SYSUT2 OUTPUT GETFILE SYSUT1 SET &SYSUT2 = &SYSUT1 PUTFILE SYSUT2 CLOSFILE SYSUT1 CLOSFILE SYSUT2 FREE FILE(SYSUT1 SYSUT2) /* * /* ========================= ESCRIBIR FORMATO ====================== * /* * SEGUIR: + FREE DA('&SYSUID..JMP.TMP') ALLOC FILE(SALIDA) DATASET('&SYSUID..JMP.TMP') MOD REUSE OPENFILE SALIDA OUTPUT /* * /* ========================= ESCRIBIR FICHERO ====================== * /* * ALLOC F(ENTRADA) REUSE DA('&FICHERO') SHR IF &LASTCC NE 0 THEN DO WRITE ERROR EN LA ALOCACION DEL FICHERO DE ENTRADA &FICHERO FREE DA('&FICHERO') EXIT END OPENFILE ENTRADA INPUT SET &RC = 0 /* --------------------- RUTINA DE ERROR ------------------------ * ERROR + DO SET &RC = &LASTCC IF &RC = 400 THEN + GOTO FINPASO1 ELSE + DO WRITE INESPERADO FIN DE CLIST : RETURN CODE = &RC WRITE =========================================== EXIT END END /* ======================================================= SET &BLANCOS = &STR( ) SET &SALIDA = &STR(&BLANCOS &BLANCOS FICHERO: &FICHERO ) PUTFILE SALIDA SET &SALIDA = &BLANCOS PUTFILE SALIDA PUTFILE SALIDA LEER: GETFILE ENTRADA IF &LASTCC NE 400 THEN + DO SET &SALIDA = &STR(&BLANCOS &SUBSTR(1:&LRCL,&ENTRADA)) PUTFILE SALIDA

Page 241: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 241 de 374

GOTO &LABEL END FINPASO1: + CLOSFILE ENTRADA CLOSFILE SALIDA FREE FILE(ENTRADA SALIDA) /* * /* ========================= IMPRMIR TEMPORAL ====================== * /* * ALLOC FILE(SYSUT1) DATASET('&SYSUID..JMP.TMP') SHR REUSE ALLOC FILE(SYSUT2) SYSOUT(&CLASE) DEST(&REMOTO) REUSE ALLOC FILE(SYSPRINT) DUMMY REUSE ALLOC FILE(SYSIN) DUMMY REUSE CALL 'SYS1.LINKLIB(IEBGENER)' FREE FILE(SYSUT1 SYSUT2 SYSPRINT SYSIN) /* * WRITE =====>> FICHERO : &FICHERO IMPRESO POR RMT101 : < OK >

Page 242: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: CLIST Autor: José M. Peco

Página 242 de 374

3.10.6 NAT /* <<<<<<<<<<<<<<<<<<<<<< LNAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ====== LISTA OBJETO POR RMT101 EN VERTICAL Y LETRA PEQUE#A ====== */ PROC 2 OBJETO LIBRERIA /* CONTROL LIST CONLIST */ EDIT 'DESJMP.JMP.JCLTIPO(INT0051J)' OLD CNTL NONUM C * 999 'YYYYYYYY' '&OBJETO' ALL TOP C * 999 'ZZZZZZZZ' '&LIBRERIA' ALL SUBMIT END NOSAVE DESJMP.JMP.JCLTIPO(INT0051J): //XXXXXXLP JOB (123,456),'JMP-PRU',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(0,0) //*===================================================================== //* PASAR OBJETO NATURAL A FICHERO TEMPORAL //*===================================================================== //* //NATBATCH EXEC DNATURAL //* //DDPRINT DD DUMMY SYSOUT=* //CMPRINT DD DUMMY SYSOUT=* //*MPRT01 DD SYSOUT=I,DEST=RMT101,COPIES=1,OUTPUT=*.OUT1 //OUT1 OUTPUT CHARS=GTE2,PAGEDEF=388STU,FORMDEF=STDA //CMPRT01 DD DSN=DESJMP.JMP.TMP,DISP=OLD //CMSYNIN DD DSN=DESJMP.JMP.JCL(LOGONPGM),DISP=SHR //************************************************************ // DD * JMP0001P ZZZZZZZZ YYYYYYYY FIN /* //*=====================================================================

Page 243: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 243 de 374

Tema 4 : Diálogos ISPF 4.1 Generalidades Un dialogo ISPF esta formado por la adecuada combinación de los distintos componentes que pueden intervenir en el mismo. Estos componentes son: - Paneles - Funciones - Mensajes - Tablas - Esqueletos - Tutorial Este tema tratara de ampliar cada uno de los componentes citados acompañando cada explicación con un ejemplo aclaratorio. Panel: Un panel es la definición de una pantalla completa tal y como la vera el usuario, pudiendo ir acompañada de procesos elementales. En función de la finalidad del panel, se pueden considerar 4 tipos distintos: - Menu - Entrada de datos - Visualizador de datos - Pantallas de HELP Como norma general, se debe tener en cuenta que los paneles diferencian entre mayúsculas y minúsculas los valores que se asignen a las variables, si bien, a la hora de su codificación, se pueden escribir con mayúsculas o minúsculas, ya internamente sus especificaciones son interpretadas como mayúsculas. Panel MENU o panel de Selección Este tipo de panel presenta al usuario las distintas opciones que puede elegir desde dicho panel. La opción elegida por el usuario se recoge en una variable, y en base a este valor se ejecutara el siguiente paso del dialogo, pudiendo ser este: - Otro panel - Un comando - Un programa

Page 244: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 244 de 374

Panel de Entrada de datos Este tipo de panel pide los datos necesarios para la ejecución de una función; o visualiza el contenido de determinadas variables previamente cargadas, como por ejemplo el resultado de una función, etc.; o una mezcla de ambas. Panel para visualizar datos Este tipo de pantalla representa una particularizacion del tipo anterior, necesitando para su ejecución un proceso repetitivo, pues se utiliza para visualizar el contenido de ficheros de datos. La definición de este panel consiste en definir el proceso de una fila genérica. Posteriormente, en tiempo de ejecución, ISPF se encargara de procesar el fichero completo en base a la definición realizada. Panel de HELP Este tipo de Panel solo contiene texto, pues como su nombre indica, representan la explicación que el desarrollador ha preparado para que el usuario pueda seguir un dialogo ISPF sin problemas. En ISPF se dispone del comando PANELID que permite visualizar en el ángulo superior izquierdo el nombre del miembro que contiene el panel que esta en pantalla. Función Se entiende por Función un procedimiento escrito en cualquier lenguaje y que tiene por finalidad proporcionar una salida en base a determinados parámetros de entrada pasados como argumentos en el momento de llamar a la misma. Un ejemplo de función podría ser el escribir en un fichero los nombres de las distintas librerías alocadas para su posterior tratamiento.

Page 245: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 245 de 374

Mensajes Es la forma diseñada por ISPF para poder informar al usuario a lo largo del dialogo del resultado de determinadas acciones o de ciertas validaciones. Existen dos tipos de mensajes en un dialogo: - Mensajes cortos - Mensajes largos ISPF dispone de forma predeterminada del ángulo superior derecho de la pantalla para la presentación de los mensajes cortos, y de la tercera línea de la pantalla para la presentación de los mensajes largos.

Page 246: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 246 de 374

Tablas Las tablas son matrices de datos de dos dimensiones, y en consecuencia son el equivalente de los ficheros de datos, ya que representan: Campo 1 ... Campo n Fila 1 ... Fila m Una característica importante de las tablas ISPF es que para ser procesadas deben residir en memoria, lo cual puede afectar al tamaño de la tabla, ya que si esta reside en disco, debe ser cargada previamente en memoria. Esqueletos Se entiende por esqueleto un fichero preformateado con la salida deseada, en el cual se han sustituido los valores variables por nombres de variables precedidos por un &. Posteriormente, este fichero será procesado para generar la salida deseada, y será en este proceso, llamado 'FILE TAILORING' en el que se sustituirán las variables por los valores correspondientes. Tutorial Es la manera prevista en un dialogo para poder informar al usuario de las acciones que se ejecutaran cuando se elija cada una de las opciones de un menu, o de los datos, formato, etc que se deben aportar para ejecutar una determinada acción. Este dialogo se disparará automáticamente al pulsar la tecla asociada al HELP, que normalmente será la PF1.

Page 247: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 247 de 374

4.2 Variables Una variable es una dirección de memoria simbólica, pero para evitar referenciar direcciones por el peligro que esto entraña, utilizamos nombres asociados a estas direcciones. La nomenclatura seguida para designar estas variables sigue las reglas generales, es decir de 1 a 8 caracteres alfanuméricos, siendo obligatoriamente el primero alfabético. En ISPF podemos considerar tres tipos de variables: del sistema Sus nombres están predeterminados por el sistema y comienzan por "Z". de usuario Sus nombres son elegidos por el desarrollador a fin de que tengan un significado apropiado al contenido que representa. de control Son variables de propósito especial y comienzan por "." 4.2.1 Variables del sistema Como se ha dicho anteriormente, estas variables son de uso general. La lista completa se muestra en el anexo correspondiente, no obstante, a continuación se listan las de uso mas común, con indicación del contenido que representan. ZDATE Contiene la fecha en formato yy/mm/dd ZTIME Contiene la hora en formato HH.MM ZTERM Contiene el tipo de terminal ZPFnn Contiene el conjunto de PFs ZCMD Contiene el comando de entrada ZSEL Cadena de selección desde el panel de selección ZPRIM Flag de panel como opción primaria de menu. ZERRMSG Identificación del mensaje de error ZPARENT Nombre del panel de selección del primer nivel. ------- VARIABLES ESPECIALES DE LOS PANELES DEL TUTORIAL ZHTOP Nombre del panel raíz del tutorial. ZCONT Nombre del panel de continuación del tutorial. ZUP Nombre del panel de nivel superior al actual. ZHINDEX Nombre del panel tutorial índice. ZIND Indicador para panel índice.

Page 248: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 248 de 374

La descripción de las variables mas usadas se muestra a continuación: ZCMD En esta variable del sistema se recoge el valor de la selección hecha por el usuario final, pero también puede contener cualquier comando, figure o no como opción en el panel de selección o menu. Este caso se puede dar, por ejemplo, cuando se desea ejecutar un comando de TSO. ISPF permite navegar directamente por los menús cuando se conocen las distintas opciones que marcan el camino. Esto se consigue separando la opción elegida de cada nivel por un punto ".". Por esta razón, lo unico que debemos hacer es obtener la primera parte de esta variable para saber cual es la primera opción elegida. Esto se hace con la función TRUNC, tal y como se muestra en el siguiente ejemplo: &ZSEL = TRUNC(TRANS(&ZCMD,'.') 1,'...' 2,'...' *,'?') El propio servicio ISPF SELECT se encargara de efectuar de forma automática la navegación, colocando la parte truncada del comando en la variable ZCMD del siguiente panel de selección. Otra utilidad disponible en ISPF es el uso del símbolo "=" para indicar que las opciones elegidas deben realizarse desde el menú raíz, es decir desde el panel que tenga codificado ZPRIM=YES. El siguiente ejemplo muestra un fragmento de un panel de selección, o menú, en el que se puede apreciar lo comentado con respecto a esta variable.

Page 249: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 249 de 374

)BODY %-------------------- Menú Principal de JMP ---------------------- %OPCION ===>~ZCMD + % % 1 +Librerías del entorno % 2 +Editar fichero + % 3 +Imprimir fichero con margen + ... % + % X +EXIT - SALIR DEL MENU )INIT &ZPRIM = YES &ZHTOP = JMPH000 .HELP = JMPH100 &ZHINDEX = JMPH999 )PROC &ZSEL = TRANS(TRUNC(&ZCMD,'.') 1,'CMD(EX ''Jmpdes.CLIST.INT(ENTORNO)'')' 2,'PANEL(ISREDM01) NEWAPPL(JMP) ' 3,'CMD(EX ''Jmpdes.CLIST(PRT)'')' ... X,'EXIT' ' ',' ' *,'?' ) )END

Page 250: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 250 de 374

ZSEL Esta variable contiene siempre una cadena especificando el comando, panel o programa que se debe ejecutar. Debe encontrarse en los paneles de datos y de visualización de tablas para indicar al sistema qué es lo siguiente que se debe ejecutar. Solo es ejecutable desde un panel, ya sea de datos o de visualización de tablas, debiendo ser invocado mediante el servicio DISPLAY o TBDISPL en una función. Ejemplo: ISPEXEC DISPLAY PANEL(panelxxx) El valor asignado a esta variable siempre tiene que ajustarse a uno de los siguientes formatos: 'CMD(comando [parámetros]) [LANG(APL)] + [NOCHECK] + [opciones_aplicacion]' 'PANEL(nombre_panel) [OPT(opción) [opciones_aplicacion]]' 'PGM(programa) [PARM(parámetros)] [NOCHECK] [opciones_aplicacion]' 'EXIT' donde [opciones_aplicacion] puede ser: NEWPOOL Esta opción especifica que se desea comenzar un nuevo pool de variables para los niveles que se inician en el panel llamado. Cuando se regrese al panel desde el que se hace esta llamada, es decir, cuando se regrese a este panel, se recuperan los valores del pool actual. En ISPF existen 3 tipos de POOL de variables: - de aplicacion - SHARED o compartido - Profile

Page 251: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 251 de 374

NEWAPPL [ [(id_aplicacion)] [PASSLIB] ] Este parámetro permite indicar a ISPF que comienza una nueva aplicacion, cuyo nombre se especifica con id_aplicacion. Esto normalmente conlleva el uso de nuevos pools de variables, perfiles y tablas de comandos. Este parámetro por tanto esta especificando que se usen los miembros de la librería PROFILE que tienen por nombre: Perfil de la aplicacion xxxxPROF Perfil de edición xxxxEDIT Tabla de comandos xxxxCMDS donde xxxx es el id_aplicacion. Si no se especificara el prefijo id_aplicacion, por defecto asumirá el valor "ISP" . Con PASSLIB se puede especificar si se desea pasar a la nueva aplicacion las librerías que se encuentran alocadas en la aplicacion actual. Parámetros de CMD: LANG(APL) Con este parámetro se indica a ISPF que se inicia un entorno realizado con APL2 (lenguaje de comandos) NOCHECK Este parámetro indica a ISPF que si el camino marcado en ZCMD no es correcto, que ignore el error. Parámetros de PANEL: OPT(opción) Con este parámetro indicamos a ISPF que elija la opción especificada del nuevo panel de selección. Es equivalente a la concatenacion de opciones vista al tratar la variable ZCMD. Parámetros de PGM PARM( ... ) permite pasar valores de parámetros a un programa. NOCHECK Este parámetro indica a ISPF que si el camino marcado en ZCMD no es correcto, que ignore el error.

Page 252: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 252 de 374

Es de resaltar el hecho de que los parámetros se pasan de forma distinta a un comando y a un programa. Por ultimo, si se elige la cadena EXIT, simplemente ISPF retorna al panel previo. Ejemplo: &opción = TRUNC(&ZCMD,'.') &resto = .TRAIL &ZSEL = TRANS(&opción 1,'PGM(programa) PARM(&resto.)' + 2,'CMD(EX JMPPRTDS &fichero)' + 3,'PANEL(jmptab00) NEWAPPL(jmp)' + 4,'CMD(LISTA)' X,'EXIT' ' ',' ' *,'?' ) En este ejemplo, si la opción elegida es : 1 se ejecuta el programa especificado y se pasa como parámetro el resto de la variables ZCMD una vez truncada. 2 Se ejecuta el procedimiento "alias.jmpprtds.clist" y se pasa como parámetro a dicho procedimiento el nombre del fichero a listar. 3 En este caso se elige el panel jmptab00, y se comienza una nueva aplicacion, denominada jmp. 4 Esta opción especifica que se ejecute el comando de TSO LISTA, a fin de obtener en pantalla una relación de todas las librerías alocadas. x Esta opción especifica que se desea retornar al menú anterior. ' ' Esta opción especifica que si pulsa INTRO sin haber elegido ninguna opción, se mantenga en el mismo panel sin que se visualice ningún mensaje. * Si la opción elegida no es ninguna de las anteriores, entonces el valor devuelto a ZSEL es una interrogación, lo cual provoca que se visualice el mensaje de OPCION INVALIDA.

Page 253: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 253 de 374

ZPRIM Esta variable simplemente sirve para especificar que el menú que la contenga será considerado como panel raíz. Es de resaltar el hecho de que en ISPF se mantiene una estructura en forma de árbol invertido. Por lo tanto, esta variable especifica aquellos nudos raíces que nos permiten recorrer cada una de las ramas principales. El formato de esta variable es &ZPRIM = YES El uso habitual de esta variable esta relacionado con el comando RETURN. En ISPF, cuando se esta en un nivel bajo de panel, escribiendo END o EXIT, se retorna al menú de nivel inmediatamente superior, pero escribiendo RETURN se regresa al menú raíz. Este regreso a veces puede ser problematico, ya que cuando se esta en un nivel bajo de una aplicacion, y se ejecuta el comando RETURN, se sale de los distintos pools compartidos cerrándolos sin salvarlos previamente, por lo que el usuario podría perder parte de su trabajo. Este problema se resuelve codificando raíces intermedias mediante la variable ZPRIM. El siguiente ejemplo es un fragmento de un panel de selección o menú, concretamente la sección INIT, en el que se muestra la codificación de esta variable, mediante la cual se hace panel raíz a este panel. )INIT &ZPRIM = YES &ZHTOP = JMPH000 .HELP = JMPH100 &ZHINDEX = JMPH999 &USUARIO = &ZUSER IF (&ZUSER = DESJMP , DESMGO ) &OPCIONES = 'ES PS UN HH UU U0 JJ J M T U N A ' en dicha sección: - Se hace a este panel raíz o principal - se define el panel JMPH100 como panel de help asociado a este - se define el panel JMPH999 como panel índice del help - se define el panel JMPH000 como panel raíz del help asociado - se carga la variable de usuario USUARIO con el contenido de la variable del sistema ZUSER - Si el usuario es Jmpdes o TEST33 se carga la variable OPCIONES con la cadena representada.

Page 254: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 254 de 374

ZPARENT Normalmente en ISPF el usuario va navegando por los distintos paneles en función de la jerarquía que representan las distintas opciones de los mismos. Esta jerarquía puede variarse usando esta variable. Su formato es : &ZPARENT = id_panel Es decir, se puede llegar al panel que contenga esta variable por cualquier camino, pero al ejecutar EXIT, no se retornara al panel previo, sino al especificado por esta variable.

Page 255: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 255 de 374

4.2.2 Variables de Usuario Sus nombres son elegidos por el desarrollador a fin de que tengan un significado apropiado al contenido que representa. El siguiente ejemplo muestra un panel que pide la cadena a buscar y el nombre de la librería en la que buscar dicha cadena, cargando las variables de usuario CADENA y LIBRERIA )ATTR DEFAULT(%@!) | TYPE(OUTPUT) INTENS(LOW) CAPS(OFF) JUST(RIGHT) PAD(' ') { TYPE(input) iNTENS(high) CAPS(On) just(left) pad('_') } TYPE(TEXT) INTENS(LOW) CAPS(OFF) )BODY %JMP-94@------------%Buscar una palabra en una librería@--------------@ %OPCION ===>!ZCMD @ @ % @ Cadena a buscar: {cadena @ @ Librería ......: {librería @ % @ @ Esta utilidad%submite@un proceso que se dedica a @ buscar la cadena especificada entre los miembros @ la librería indicada. @ @ El%resultado@le deja en la cola de salida con el @ nombre:%&Zuser@y el sufijo%ST @ @ @ )INIT vget (zdldsnlv) profile &librería = &zdldsnlv )PROC ver(&librería,dsname) &Zcmd = '99' &zdldsnlv = &librería vput (zdldsnlv) profile if (&librería = all,'') &Zcmd = 'X' if (&cadena = all,'') &Zcmd = 'X' &ZSEL = TRANS(TRUNC(&ZCMD,'.') 99,'CMD(EX ''DESJMP.CLIST.MGO(SCANTSOC)'' ''&CADENA.,&LIBRERIA.'')' X,'EXIT' ' ',' ' *,'?' ) )END

Page 256: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 256 de 374

a fin de tener el ejemplo completo se acompañan la clist y el JCL asociados. clist: 'DESJMP.CLIST.MGO(SCANTSOC)' /* <<<<<<<<<<<<<<<<<<<<<< SCANTSOC >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ====== BUSCA UNA CADENA EN LOS MIEMBROS QUE SE ESPECIFIQUEN ==== */ PROC 2 CADENA LIBRERIA /* */ EDIT 'Jmpdes.JMP.JCLTIPO(SCANTSOC)' OLD CNTL NONUM C * 999 'LLLLLLLL' '&LIBRERIA' ALL C * 999 'CCCCCCCC' '&CADENA' ALL /* LIST */ SUBMIT END NOSAVE EXIT jcl: 'Jmpdes.JMP.JCLTIPO(SCANTSOC)' //XXXXXXBT JOB (123,456),'JMP-PRU-4',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1) //***************************************************************** //* BUSCAR CADENA EN DIRECTORIO //***************************************************************** //BUSCAR EXEC PGM=ISRSUPC,PARM=(SRCHCMP,'ANYC') //NEWDD DD DISP=SHR,DSN=LLLLLLLL //OUTDD DD SYSOUT=X //SYSIN DD * SRCHFOR 'CCCCCCCC' /*

Page 257: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 257 de 374

4.2.3 Variables de control Son variables que sirven para controlar determinadas funciones en un panel. La lista completa de estas variables es : .ALARM = { YES | NO } .ATTR(&variable | .cursor) = 'nombre_attr(valor)' .ATTRCHAR (carácter) = 'nombre_attr(valor)' .AUTOSEL = { YES | NO } .CURSOR = nombre_variable .CSRPOS = { nn | &variable } .CSRROW = { nn | &variable } .HELP = id_panel .MSG = id_mensaje .PFKEY .RESP .TRAIL .ZVARS Siendo su significado el siguiente: .ALARM Define si se activa o no la alarma del terminal. .ATTR Permite cambiar el atributo de un campo en un panel, como por ejemplo pasar un campo a protegido. .ATTRCHAR Esta variable es parecida a la anterior, con la diferencia de que en este caso, cambia el atributo asociado a un carácter. Ejemplo, en lugar de proteger todos los campos de entrada de un panel, se cambia el atributo asociado al carácter en el sentido de decir que tal carácter que antes era de entrada ahora es de salida, con lo que los datos de los campos que antes eran de entrada, ahora quedan protegidos.

Page 258: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 258 de 374

.AUTOSEL esta variable solo puede ser usada en los paneles de visualización de tablas, y controla que se haya seleccionado una fila. .CURSOR Controla el posicionamiento del cursor en la variable que se especifique. .CSRPOS Controla el posicionamiento del cursor dentro de una variable del panel. .CSRROW Esta variable solo puede ser usada en los paneles de visualización de tablas, y controla la ubicación del cursor en una fila determinada. .HELP Esta variable contiene el nombre del panel de HELP asociado a la función de ayuda. .MSG Esta variable contiene el identificador del mensaje que se visualizara en la pantalla. .PFKEY Esta variable contiene el valor de la ultima PF pulsada. Ejemplo: If (.PFKEY = PF10 ) ... .RESP Identifica el tipo de respuesta dado por el usuario (END o RETURN) .TRAIL Esta variable contiene el resto de la ultima función de truncamiento realizada. Así, por ejemplo: &alfa = '123.456' &entero = trunc(&alfa,'.') resulta : &entero = 123 &decimal = .TRAIL resulta : &decimal = 456 .ZVARS Establece la correlación entre las variables Z con su nombre largo. Como ya se vera al tratar la definición del panel, la longitud de una variable viene definida por el delimitador que se establezca. Pero si la variable tiene que tener una longitud de 1 carácter, y con objeto de dar a las variables de usuario nombres con significado, en la definición del panel se define, en ese caso, como "Z", y en la sección inicial se establece la correlación entre las variables z, ya que puede haber varias, con sus nombres largos, de acuerdo con el siguiente formato: .ZVARS = '(variable1, variable2, ... )'

Page 259: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 259 de 374

El siguiente ejemplo muestra el panel JMPINT58 el cual hace uso de este tipo de variables, ya que las variables que recogen los valores de TIPO ABSOLUTO y TIPO DE OBJETO en los que buscar, representan variables de 1 posición. )ATTR DEFAULT(%@!) | TYPE(OUTPUT) INTENS(LOW) CAPS(OFF) JUST(RIGHT) PAD(' ') { TYPE(input) iNTENS(high) CAPS(On) just(left) pad('_') } TYPE(TEXT) INTENS(LOW) CAPS(OFF) )BODY %JMP-94@-----------%Buscar una palabra en una libreria@--------------@ %OPCION ===>!ZCMD @ @ Libreria ......... : {libreria@ @ Máscara de fuentes : {máscara @ @ Cadena a buscar .. : {cadena @ @ Reemplazar por ... : {newval @ @ Valor absoluto ... : {Z@ (Y,N) (%Y@indica no buscar palabra completa) @ Tipo de Objetos .. : {Z@ (A,G,L,P,N,S,M,H,C,T,R,*) % @ @ Esta utilidad%submite@un proceso que se dedica a @ buscar la cadena especificada entre los miembros @ de la libreria de NATURAL cuyo nombre se ajuste @ a la máscara especificada. @ @ El%resultado@le deja en la cola de salida con el @ nombre:%&Zuser@y el sufijo%SN @ @ )INIT .Zvars = '(completo,tipo)' &libreria= 'INTNAL-D' &cadena = ' ' &newval = ' ' &tipo = '*' &completo= 'Y' )PROC ver (&tipo, nb, list P,N,S,M,H,A,G,L,C,T,R,*) ver (&completo, nb, list Y,N) &Zcmd = '99' if (&libreria = all,'') &Zcmd = 'X' if (&máscara = all,'') &Zcmd = 'X' if (&cadena = all,'') &Zcmd = 'X' &ZSEL = TRANS(TRUNC(&ZCMD,'.') 99,'CMD(EX ''DESJMP.CLIST.MGO(SCANNATC)'' + ''&cadena.,&libreria.,&máscara.,&completo.,&tipo.,&newval.'')' X,'EXIT' ' ',' ' *,'?' ) )END

Page 260: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 260 de 374

La particularidad de este panel se centra no solo en las variables "Z" sino también en cómo siendo un panel de entrada de datos es tratado como un panel de selección con el uso de la variable &ZSEL. clist: DESJMP.CLIST.MGO(SCANNATC) /* <<<<<<<<<<<<<<<<<<<<<< SCANNATC >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ====== BUSCA UNA CADENA EN LA LIBRERIA QUE SE ESPECIFIQUE ==== */ PROC 5 CADENA LIBRERIA MASCARA COMPLETO TIPO NEWVAL /* SET &TEST = NOTEST IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL MSG /* ----------------------------------------------------------------- */ /* */ EDIT 'Jmpdes.JMP.JCLTIPO(SCANNATP)' OLD CNTL NONUM C * 999 'CCCCCCCC' '&CADENA' ALL C * 999 'LLLLLLLL' '&LIBRERIA' ALL C * 999 'MMMMMMMM' '&MASCARA' ALL C * 999 'TTTTTTTT' '&TIPO' ALL C * 999 'OOOOOOOO' '&COMPLETO' ALL C * 999 'NNNNNNNN' '&NEWVAL' ALL /* LIST */ SUBMIT END NOSAVE EXIT /* ----------------------------------------------------------------- */ jcl: JMPDES.JMP.JCLTIPO(SCANNATP) //XXXXXXSN JOB (123,456),'JMP-PRU-4',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(0,0) //* ------------------------------------------------------------------ //* BUSCAR EN LIBRERIA NATURAL UNA CADENA JCL-CLIST //* ------------------------------------------------------------------ //NATBATCH EXEC DNATURAL,PARM='IM=D,MT=0,INTENS=1' //DDCARD DD DSN=PRU.DES.OPTION(RUNUSERM),DISP=SHR // DD DSN=PRU.DES.OPTION(RUNTIME),DISP=SHR //CMPRINT DD SYSOUT=W,DEST=RMT101 //CMSYNIN DD * INTNAL-D/BATCH/BATCH SCAN S/CCCCCCCC/NNNNNNNN/LLLLLLLL/MMMMMMMM/TTTTTTTT/OOOOOOOO/N FIN /*

Page 261: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 261 de 374

4.3 Sentencias Los paneles de ISPF, mediante las sentencias que se explican a continuación, permiten, en si mismos, ejecutar una lógica sencilla, aunque no por ello incompleta, lo cual simplifica la programación del dialogo. También permiten comentar la lógica asociada encerrando los comentarios entre las cadenas '/*' para indicar el comienzo y '*/' para el final . Ejemplo: /* ------- comentario ---------- */ Atendiendo a su finalidad, podemos agrupar las sentencias de los paneles de ISPF en los siguientes grupos: - Sentencias de asignación - Sentencias de verificación - Sentencia IF - Sentencia VGET - Sentencia VPUT - Sentencia Referesh 4.3.1 Sentencias de asignación Esta sentencia permite asignar valores a variables. Su formato es: &Nombre_variable = valor donde "valor" puede ser : - un numero 123 - una cadena de caracteres 'ABC' - el contenido de otra variable &fichero - el resultado de una función TRANS(&código s,si n,no) Es de resaltar el hecho de que cuando una cadena contenga apóstrofes, se codificaran dos apóstrofes por cada apóstrofe de la cadena.

Page 262: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 262 de 374

4.3.2 Sentencias de verificación Estas sentencias se usan para realizar de forma sencilla y rápida validaciones sobre el contenido de las variables. Su formato es: VER ( &variable [NONBLANK | NB ] + palabra_clave + [valores] + [MSG=id-mensaje] ) donde palabra_clave representa: ALPHA valores alfabéticos (A-Z,a-z,@,#,$) NUM valores numéricos (0-9) HEX Valores hexadecimales (0-9,A-F,a-f) BIT valores binarios (0,1) NAME Valida que sigue las reglas generales para el nombre de variables y objetos (primer carácter alfabético y el resto hasta 8 alfanuméricos) DSNAME Valida que sigue las reglas generales para la designación de datasets.(Nombres de hasta ocho caracteres concatenados con puntos con una longitud total de hasta 44 posiciones) FILEID RANGE chequea que el valor de la variable desde,hasta esta contenido en el rango especificado. El numero puede tener un máximo de 16 dígitos. LIST Chequea que el valor de la variable es val1,val2,... uno de la lista especificada.

Page 263: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 263 de 374

PICT Chequea el valor de la variable con la 'cadena' máscara representada por la cadena dada. La cadena estará formada por los siguientes caracteres: c = carácter A = alfabético N | 9 = numérico X = Hexadecimal Cualquier otro carácter distinto a estos se chequeara por igual. Cada uno de los parámetros puede ir separado por comas o blancos El parámetro NONBLANK o NB significa que el campo es obligatorio. En caso de que la verificación no la superara, se visualiza un mensaje de error genérico y el cursor se sitúa en la variable examinada. Y, si se especificara el parámetro MSG se visualizara el mensaje correspondiente en lugar del genérico. Ejemplos: VER (&job, NB, NAME) VER (&libreria, DSNAME) VER (&fecha, PICT '99-99-9999') VER (&lregis, range 0,254 MSG=jmpcad00) VER (&estado LIST s,c,v,d) El siguiente ejemplo se corresponde con la sección PROC del Panel JMPINT51 diseñado para pedir una cadena y una libreria de NATURAL, y pasar esos datos a una clist para listar todos los objetos NATURAL cuyo nombre se ajuste a la máscara especificada. Como la utilidad que se desea ejecutar admite el '*' como comodín para listar varios objetos con la misma raíz, y en el caso de especificar una raíz muy corta puede provocar un listado demasiado grande, este procedimiento lo que hace es truncar la cadena con los 5 primeros caracteres cargando la variable PREFIJO, y luego examinar si dicha variable sigue las reglas de la nomenclatura. En el caso de que contuviera un carácter especial, como por ejemplo un '*' daría un error diciendo que no es un nombre valido.

Page 264: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 264 de 374

)PROC &Zcmd = '99' if (&libreria = all,'') &Zcmd = 'X' if (&objeto = all,'') &Zcmd = 'X' /* verificar longitud del nombre del objeto */ &prefijo = TRUNC(&objeto,5) VER(&prefijo,NAME) &ZSEL = TRANS(TRUNC(&ZCMD,'.') 99,'CMD(EX''DESJMP.CLIST.MGO(FAGLNAT)'' + ''&objeto.,&libreria.'')' X,'EXIT' ' ',' ' *,'?' ) )END

Page 265: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 265 de 374

4.3.3 Sentencia IF ISPF permite que los paneles puedan procesar una lógica sencilla, dejando que los problemas complejos sean resueltos por la programación de la función o del procedimiento. Esta sentencia es la que permite controlar la lógica condicional en los paneles. Su formato es: IF ( ope1 operador ope2 [,ope3 ...]) sentencia donde : Ope1, ope2, ope3 son los operandos ; y operador es = o Ø= Nota: Dependiendo del terminal el símbolo ^ equivale a Ø Esta sentencia tiene las siguientes particularidades: - Solo se permite el chequeo por igual o por no igual. - No se permite la opcion ELSE Por lo que se refiere a asociar un grupo de sentencias a una cierta condición, hay que especificar que la agrupación se implementa mediante la indentacion de las sentencias con respecto a la sentencia IF. El siguiente ejemplo aclarara este punto: 1 IF (&var1 Ø= N) 2 IF (&var2 = val1,val2) 3 set &var3 = 'cumple los dos IF' 4 set &var4 = 'idem' 5 set &var5 = 'cumple solo el IF de la línea 1' 6 set &var6 = ... 7 IF (&var7 = &var8) &var9 = ... La línea 1 chequea que la variable 1 no es igual al valor "N" Las líneas 2 a 5 solo se ejecutan si superan el chequeo de la línea 1. La línea 2 solo se ejecuta si se supera el chequeo de la línea 1 por lo que se están concatenando dos condiciones, y por tanto equivale al operador lógico AND (no valido en la lógica de paneles). La línea 2 chequea que el valor de la variable 2 sea igual al valor1 o al valor2. Por lo tanto, equivale al operador lógico OR. Las líneas 3 y 4 solo se ejecutan si se supera la condición de la línea 2 La línea 5 se ejecuta si se supero la condición de la línea 1, sin importar la condición de la línea 2 ya que esta a la misma altura que el IF de dicha línea. La línea 6 se ejecuta siempre, pues esta a la misma altura que la línea 1.

Page 266: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 266 de 374

La línea 7 se ejecuta siempre y si se cumple la condición se ejecuta la sentencia de asignación que la sigue. Este ejemplo denota la importancia de la indentacion a la hora de programar la lógica en los paneles ISPF. Por lo que se refiere a la utilización o no de la cláusula ELSE, las nuevas versiones de ISPF ya la contemplan, pero no obstante el siguiente ejemplo muestra una forma de implementarla. 1 IF ( &var1 = val1 ) sentencia1 2 IF ( &var1 ^= val1 ) sentencia2 La línea 1 chequea una condición por igual y la línea 2 chequea la misma condición por no-igual, por lo que equivale a ELSE.

Page 267: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 267 de 374

El siguiente ejemplo muestra un fragmento del panel JMPINT00, en el que se muestra este extremos. )BODY %-------------------- Menú Principal de JMP ---------------------- %OPCION ===>~ZCMD + % % 1 +Librerías del entorno % 2 +Editar fichero + % 3 +Imprimir fichero con margen + ... % + % X +EXIT - SALIR DEL MENU )INIT &ZPRIM = YES &ZHTOP = JMPH000 .HELP = JMPH100 &ZHINDEX = JMPH999 )PROC /* ------------------------------ editar salida -------- */ IF (&OPCION = EE , ES ) IF (&ZUSER = DESJMP , DESMGO ) &ZCMD = 'U.21' /* ------------------------------------------------------*/ &ZSEL = TRANS(TRUNC(&ZCMD,'.') 1,'CMD(EX ''Jmpdes.CLIST.INT(ENTORNO)'')' 2,'PANEL(ISREDM01) NEWAPPL(JMP) ' 3,'CMD(EX ''Jmpdes.CLIST(PRT)'')' ... X,'EXIT' ' ',' ' *,'?' ) )END Este ejemplo transforma la entrada escrita en línea de comando, de modo que si se escribe EE o ES y además el usuario es DESJMP o DESMGO, entonces cambia el valor escrito por el valor U.21. ¿Para que esta transformación? Esta es una forma de generar abreviaturas para realizar acciones, personalizandolas para un usuario determinado. La opcion U nos lleva a otro panel, del cual elegimos la opcion 21. y lo que hace es editar un fichero secuencial de uso general, de nombre fijo y que se puede usar entre otras cosas, para recoger la salida del spool, o para editar ficheros excesivamente grandes.

Page 268: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 268 de 374

/* <<<<<<<<<<<<<<<<<<<<<< INTUTI21 >>>>>>>>>>>>>>>>>>>>>>>>> */ /* */ PROC 0 LIBRERIA ISPEXEC EDIT DATASET('Jmpdes.JMP.SALIDA') EXIT En resumen, cuando el usuario Jmpdes o el usuario TEST33 escriba en la línea de comando EE o ES lo que se ejecutara automáticamente será la edición del dataset o fichero 'DESJMP.JMP.SALIDA'. El hecho de colgar esta opcion de otro panel en lugar de especificar la acción a realizar en el propio panel de selección es con objeto de tener un panel que recoja la abreviatura y su significado, aunque entiendo que puede haber muchas formas de realizar esta funcionalidad. El siguiente ejemplo, es otro fragmento del mismo panel, y limita las opciones U, T, ... para ser usadas solo por los usuarios DESJMP o DESMGO, ya que si algún usuario que no sea alguno de los dos especificados selección cualquiera de las opciones se cambiara ese valor por "X", por lo que abandonaría el panel. IF (&OPCION = U , T , J , M , A , TE) IF (&ZUSER ^= DESJMP) IF (&ZUSER ^= DESMGO) &ZCMD = 'X' &ZSEL = TRANS(TRUNC(&ZCMD,'.') 1,'CMD(EX ''DESMGO.XXX.CLIST(ENTORNO)'')' 2,'PGM(ISREDIT) PARM(P,ISREDM01) NEWAPPL' 3,'PANEL(MGOUTI00)' ... P,'CMD(EX ''DESJMP.CLIST.MGO(JMPLLL00)'')' S,'PANEL(ZSDSFOP2) NEWAPPL(ISF)' X,'EXIT' ' ',' ' *,'?' ) &ZTRAIL = .TRAIL )END

Page 269: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 269 de 374

4.3.4 Sentencia VGET Esta sentencia es usada para leer el contenido de variables del pool que se especifique. Su formato es: VGET (var1 var2 ... varn) pool Siendo POOL el nombre del pool del que se desea leer el contenido de las variables var1, var2, ... varn. Como ejemplo se recomienda ver el que acompaña a la sentencia VPUT.

Page 270: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 270 de 374

4.3.5 Sentencias VPUT Esta sentencia es usada para escribir contenidos de variables en otros POOLs. Su formato es: VPUT (var1 var2 ... varn) pool Siendo POOL el nombre del pool en el que se desea guardar el contenido de las variables var1, var2, ... varn. Por ejemplo, al ejecutar el siguiente panel, este nos pide una cadena para buscarla entre los miembros de la libreria que se especifique. Con objeto de no tener que estar escribiendo el nombre de la libreria cada vez que se ejecute este panel, lo que se hace es: En la sección INIC, previa a la presentación del panel, se lee el contenido de la variable ZDEDSNLV recuperando su contenido desde el perfil activo. A continuación asignamos el valor de esta variable a la variable LIBRERIA. Una vez que se presenta el panel, y a fin de memorizar el contenido de la variable LIBRERIA, para que cuando se vuelva a ejecutar este panel, se recupere el ultimo valor, hay que grabar su contenido, lo cual se hace con la sentencia VPUT. )BODY %JMP-94@----------%Buscar una palabra en una libreria@-----------@ %OPCION ===>!ZCMD % @ Cadena a buscar: {cadena @ @ Libreria ......: {libreria @ ... )INIT vget (zdldsnlv) profile &libreria = &zdldsnlv )PROC ver(&libreria,dsname) &Zcmd = '99' &zdldsnlv = &libreria vput (zdldsnlv) profile if (&libreria = all,'') &Zcmd = 'X' if (&cadena = all,'') &Zcmd = 'X' &ZSEL = TRANS(TRUNC(&ZCMD,'.') 99,'CMD(EX ''JMPDES.CLIST.MGO(SCANTSOC)'' + ''&CADENA.,&LIBRERIA.'')' X,'EXIT' ' ',' ' *,'?' ) )END Nota: El hecho de usar la variable ZDLDSNLV es porque es una variable propia del ISPF, concretamente es la variable que en el panel que representa la opcion general 3.4 (utilidades), representa el campo nombre del DSN, y así el usuario puede ahorrase el tener que escribir el nombre de la libreria, si antes se ha usado esta variable.

Page 271: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 271 de 374

Page 272: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 272 de 374

4.3.6 Sentencias REFRESH Esta sentencia es usada para refrescar el contenido de las variables del panel.

Page 273: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 273 de 374

4.4 Mensajes En la introducción de este tema, se comento que ISPF diseña sus pantallas reservando dos zonas para mensajes, el ángulo superior derecho y la tercera línea de la pantalla. Mediante estos mensajes el desarrollador puede planificar la informacion que ofrecerá al usuario a lo largo del dialogo, bien para informarle del resultado de la acción desarrollada, bien del porqué no se ha superado una validación, etc. Existen dos tipos de mensajes en un dialogo: - Mensajes cortos : Aparecerán en el ángulo superior derecho - Mensajes largos : Apareceran en la tercera línea Un mensaje se compone de : Id-mensaje obligatorio Identificador del mensaje mensaje-corto opcional texto del mensaje con una longitud máxima de 24 caracteres. Panel-help obligatorio Identificador del panel de help asociado a este mensaje. ind-alarma opcional Indicador de si ejecuta la alarma (en el caso de que el hardware lo permita) mensaje-largo texto mensaje largo con un longitud máxima de 78 caracteres. Estos 5 atributos de un mensaje se graban en dos líneas de un miembro de la libreria de mensajes, siendo el diseño de estas líneas : ID-MENSAJE ['m_corto'] [.HELP={panel | *}] [.ALARM={YES|NO}] 'mensaje largo' Los componentes que intervienen en esta definición ya han sido comentados, con la excepción del siguiente: ID-MENSAJE: debe tener de 4 a 8 caracteres. Tiene que ajustarse al formato : AAAAA999Y siendo AAAAA de 1 a 5 caracteres alfabéticos (a-z,$,@,#) 999 3 caracteres numéricos (0-9) Y un carácter alfabético como sufijo. Opcional m_corto El texto del mensaje corto panel El identificador del panel de ayuda En base al identificador del mensaje se determina el miembro en el que se

Page 274: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 274 de 374

grabara dicho mensaje truncando dicho identificador por el segundo dígito. Dentro del miembro asignado, los mensajes son grabados secuencialmente, siendo por tanto necesario para la recuperación del mensaje que dicha libreria de mensajes (o miembro) sea recorrida secuencialmente. Ejemplo: JMPTB01A 'tabla &tabla no existe' .ALARM = YES 'No se puede abrir la tabla &tabla porque no existe' JMPTB01B 'Tabla &tabla borrada ' .HELP=* 'Se ha borrado con exito la tabla &tabla' JMPTB02 .ALARM=YES 'Pulse ''PF1'' para invocar al HELP.' JMPTB10 'Miembro salvado OK' ... Pues bien, estos mensajes se grabaran en el miembro JMPTB01 de la libreria especificada para mensajes. Como puede verse en el ejemplo, un mensaje puede contener en su definición nombres de variables para que en el momento de su ejecución sean sustituidas por el valor correspondiente, truncando el resultado en el caso de que se excediera del tamaño especificado. Es importante asegurarse de que el profile de este miembro tenga NUMBER OFF ya que si no se machacarian las posiciones 72 a 80 por la numeración, para lo cual, estando editando el miembro, se ejecutaran desde línea de comando los siguientes: PROFILE NUMBER ON para activar la numeración de las líneas PROFILE UNNUM para limpiar de numeración las columnas 72 a 80 PROFILE NUMBER OFF Para que desde ahora no numere las líneas. Como puede observarse en el formato del mensaje, el mensaje corto es opcional, mientras que el largo es obligatorio. ISPF usara el mensaje largo en caso de que no se hubiera especificado el mensaje corto. La notación "*" en el componente .HELP para especificar a ISPF que utilice como panel de help el panel de help asociado al panel que se este procesando. Para invocar un mensaje se pueden utilizar diversas formas. El siguiente ejemplo adelanta lo que se vera en el próximo apartado, las funciones, y muestra como invocar un mensaje desde una clist.

Page 275: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 275 de 374

/* <<<<<<<<<<<<<<<<<<<<<< SYSMAIN >>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* ========= BUSCAR UN OBJETO EN DESARROLLO =================== */ /* */ PROC 0 /* */ /*--------------------------------------------------------------*/ /* */ SET &TEST = TESTNO IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* */ SET ESKELETO = SYSMAIN SET DSN = '&SYSUID..SALIDA.TMP' /* */ ISPEXEC DISPLAY PANEL(SYSMAIN) IF &LASTCC NE 0 THEN EXIT /* */ FREE FI(ISPFILE) ALLOCATE FI(ISPFILE) DA(&DSN.) OLD REUSE /* */ ISPEXEC FTOPEN IF &LASTCC NE 0 THEN GOTO ERROR1 /* */ ISPEXEC FTINCL &ESKELETO IF &LASTCC NE 0 THEN GOTO ERROR2 /* */ ISPEXEC FTCLOSE IF &LASTCC NE 0 THEN GOTO ERROR3 /* */ ISPEXEC SETMSG MSG(JMPFT04) SUBMIT &DSN IF &TEST = TEST THEN WRITE SUBMITIDO PROCESO DE BUSQUEDA OK /* */ GOTO EXIT /* --------------------- mensajes ----------------- */ ERROR1: ISPEXEC SETMSG MSG(JMPFT01) GOTO EXIT ERROR2: ISPEXEC SETMSG MSG(JMPFT02) ISPEXEC FTCLOSE GOTO EXIT ERROR3: ISPEXEC SETMSG MSG(JMPFT03) /* --------------------------------------------------*/ EXIT: FREE FI(ISPFILE) EXIT END

Page 276: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 276 de 374

Los siguientes ejemplos muestran distintas formas de invocar un mensaje desde un panel: /* si el usuario no es DESJMP o DESMGO pide password */ IF (&USERID ^= DESJMP , DESMGO ) VER (&PASSWORD,NONBLANK,MSG=JMPI100) /* password incorrecta */ /* si la cadena no esta a blancos visualiza el mensaje JMPI133 */ IF (&cadena ^= ' ' ) .MSG = JMPI133 /* validar que el contenido de LIBRERIA sea distinto de blancos */ VER (&LIBRERIA,NONBLANK,MSG=JMPP187)

Page 277: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 277 de 374

4.5 Funciones ISPF como cualquier otro sistema también tiene sus propias funciones. Estas son: TRUNC Para truncamiento de cadenas. TRANS Para decodificación (traducción) de valores PFK Para recoger el texto asociado a una PF. LVLINE Para buscar la ultima línea visualizada.

Page 278: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 278 de 374

4.5.1 Función TRUNC Esta función permite truncar una cadena de caracteres en una posición fija o bien al encontrar un carácter. Su formato es: &variable1 = TRUNC(&variable2, {nn | 'carácter'}) En el caso de que la cadena no contenga el carácter especificado, &VARIABLE1 contiene &VARIABLE2 La diferencia entre usar el truncamiento por una posición fija y el truncamiento por búsqueda de una carácter, es que en el primer caso la variable .TRAIL contiene las posiciones n+1 hasta el final, mientras que en el segundo caso, el carácter buscado no pertenece a ningún resultado. Asi, por ejemplo: &alfa = '123.456' &entero1 = TRUNC(&alfa,3) &entero1 = 123 &decimal1 = .TRAIL &decimal1 = .456 &entero2 = TRUNC(&alfa,'.') &entero2 = 123 &decimal2 = .TRAIL &decimal2 = 456 El siguiente ejemplo presenta un fragmento de la lógica seguida, cuando se pide el nombre de un dataset, para poner el apóstrofe al final del nombre si se ha puesto apóstrofe al principio del nombre del mismo. &punto = '.' &comilla = '''' if (&fichero Ø= ' ') &prefijo = TRUNC(&fichero,1) /* separar el primer carácter */ IF (&prefijo = &comilla ) /* **** empieza por comilla **** */ &nombre = .TRAIL &cuerpo = TRUNC(&nombre,'''') /* separar el apóstrofe final */ IF (&cuerpo = &nombre ) /* nombre no termina con comilla */ &fichero = '&fichero&comilla' IF (&prefijo ^= &comilla ) &fichero = '&comilla&zprefix&punto&fichero&comilla' De esta forma si &fichero = 'DESJMP.JMP.CLIST se transforma en 'DESJMP.JMP.CLIST' Y si &fichero = JMP.CLIST se transforma en 'DESJMP.JMP.CLIST' y si &fichero = 'DESJMP.JMP.CLIST' no sufre ninguna transformación.

Page 279: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 279 de 374

4.5.2 Función TRANS Esta función transforma una cadena de caracteres en otra. Su formato es : &variable1 = TRANS(&variable2 cod1,valor1 + cod2,valor2 ... + [MSG=id_mensaje] ) donde : cod1 es el valor de entrada 1 valor1 es el valor de salida 1 cod2 es el valor de entrada 2 valor2 es el valor de salida 2 id_mensaje Es el identificador del mensaje que se visualizara en el caso de que el valor de variable2 no coincida con ningún valor de entrada de los distintos pares de valores especificados. Nota: El uso de las comas es opcional, ya que el blanco sirve de delimitador, pero el uso de la coma ayuda a dar mas claridad. Como puede adivinarse por el formato de la función, esta lo que hace es chequear el valor contenido en variable2 con los valores de entrada de cada una de las parejas de valores especificadas, y, en caso de coincidencia, devuelve en variable1 el valor de salida de la primera pareja de valores cuyo código coincida. Si ninguno de los valores de entrada coincidiera con el valor de salida, ISPF visualizará el mensaje especificado en el parámetro MSG, al tiempo que carga a blancos variable1. Otro uso frecuente de esta función es para decodificar valores de variables. Ejemplo: &Estado=TRANS(&código S,Soltero C,Casado V,viudo )

Page 280: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 280 de 374

Como parejas de valores especiales validas, tratadas por ISPF se encuentran: *,cadena En este caso, sea cual sea el valor de variable 2 se devolverá en variable1 la cadena especificada como pareja del "*". *.* En este caso, se devuelve en variable1 el valor de variable2 ' ',' ' En este caso, se admite el blanco como valor, y se devuelve blanco, por lo que se queda en el mismo panel sin sacar mensaje de error. Un uso muy normal de esta función se encuentra en los paneles de selección (tipo menú) en donde traduciremos el valor de la opcion elegida por el comando a ejecutar, como ya se vera al estudiar dicho tipo de panel. &ZSEL = TRANS(&opcion 1,'PGM(programa1)' 2,'CMD(comando1)' 3,'PANEL(panel1)' ' ',' ' *,'?' )

Page 281: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 281 de 374

4.5.3 Función PFK Esta función permite obtener informacion asociada a una PF. Su formato es: &variable1 = PFK( nn | 'cadena' | &variable2 ) El contenido de variable1 será un numero en caso de que el argumento de la función sea una cadena, o una cadena en el caso de que el argumento sea un numero, correspondiendo en cualquier caso el numero con el numero de PF que tiene asociada la cadena que es pasada o recibida. Ejemplo: &variable1 = PFK(04) &variable2 = PFK('TSO EX JMP') En este caso el contenido de variable1 es 'TSO EX JMP', mientras que el contenido de variable2 es 4 ya que la PF4 esta programada como 'TSO EX JMP'. En el caso de que hubiera varias PFs programadas con el mismo contenido, esta función devolverá el numero menor de la PF.

Page 282: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 282 de 374

4.5.4 Función LVLINE Esta función esta asociada a la zona definida como AREA en un panel. Su formato es: &variable1 = LVLINE( nombre_area )

Page 283: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 283 de 374

4.6 Panel Como se ha comentado en la introducción de este tema, el panel es la parte visible de cualquier dialogo, y por tanto, podría decirse que es la parte mas importante del mismo, ya que por lo que el usuario ve será juzgado probablemente el dialogo. El diseño estándar de un panel ISPF es : +-------------------------------------------------------------+ ID-pantalla Titulo mensaje corto comando /opcion scroll mensaje largo +-------------------------------------------------------------+ ... zona aplicacion ... +-------------------------------------------------------------+ Las secciones de que se compone la definición de un panel son: - ATTR Definición de los caracteres que servirán de atributos - BODY Cuerpo del Panel - INIT Lógica anterior a la presentación del panel - PROC Lógica posterior a la presentación del panel - REINIT Lógica anterior a la presentación del panel en caso de que se vuelva a presentar el panel como consecuencia de un error, etc. - MODEL Esta sección solo se utiliza en paneles de visualización de datos, y define el modelo de una fila. - END Esta sección establece el final de la definición del panel Todas estas secciones tienen la siguiente sintaxis para su definición: )Sección_id [parámetro [parámetro ... ]] es decir todas se definen por el carácter ")" seguido del identificador de la sección.

Page 284: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 284 de 374

Cada panel debe ser un miembro de una libreria alocada previamente como de paneles, debiendo tener en el perfil de cada miembro la opcion de UNNUM, ya que se debe disponer de las 80 columnas para el diseño de la pantalla. El siguiente ejemplo muestra como alocar la libreria de paneles y llamar al primer panel o panel raíz de las utilidades desarrolladas como ejemplo. El ejemplo completo se encuentra en el anexo de esta tema. PROC 0 /* ----------------------------------------- LIBRERIA DE PANELES */ ISPEXEC LIBDEF ISPPLIB DATASET ID('JMPDES.JMP.PANEL') ISPEXEC SELECT PANEL(JMPMENU0) EXIT Como norma general, como se dijo en la introducción, se debe tener en cuenta que los paneles diferencian en los valores asignados a las variables, entre mayúsculas y minúsculas, si bien, a la hora de su codificación, se pueden escribir con mayúsculas o minúsculas, ya internamente las especificaciones son interpretadas como mayúsculas. Por ultimo cabe comentar el comando PANELID que activa o desactiva la visualización del nombre del panel en el ángulo superior izquierdo del mismo. Entendiendo por nombre del panel el nombre del miembro que contiene la definición del panel visualizado.

Page 285: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 285 de 374

4.6.1 Sección ATTR Esta sección es OPCIONAL. Su formato es: )ATTR [DEFAULT(abc | %+_)] donde abc representan los caracteres con los que definimos: a : Texto intensificado. Por defecto ISPF asume "%" b : Texto normal. Por defecto ISPF asume "+" c : Campo de entrada. Por defecto ISPF asume "_" ISPF permite no obstante asociar cualquier carácter a un conjunto de atributos básicos a fin de indicar mediante dicho carácter el tipo que visualización que se desea para determinada variable o texto. Dicho carácter puede ser cualquier carácter del teclado o un carácter hexadecimal. Los atributos básicos son: Atributo Valores ATTN ( ON | OFF ) AREA ( DYNAMIC | GRAPHIC ) CAPS ( ON | OFF | IN | OUT ) COLOR ( WHITE | RED | BLUE | GREEN | YELOW ) DATAMOD ( código ) EXTEND ( ON | OFF ) HILITE ( BLINK | USCORE | REVERSE ) INTENS ( HIGH | LOW | NONE ) JUST ( LEFT | RIGHT | ASIS ) PAD ( NULLS | USER | carácter ) PADC ( NULLS | USER | carácter ) SKIP ( ON | OFF ) SCROLL ( ON | OFF ) TYPE ( TEXT | INPUT | OUTPUT | DATAIN | DATAOUT ) USERMOD ( código )

Page 286: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 286 de 374

Siendo el significado de cada atributo el siguiente: Atributo Significado ATTN Campo seleccionable por lápiz luminoso (light-pen) AREA Permite definir el tipo de datos que contendrá una zona del panel o ventana. CAPS Especifica si se convierte a mayúsculas la entrada alfabética ( ON | OFF ) , o si esto solo se hace en la entrada de datos (IN) o en la salida (OUT). COLOR Especifica el color asociado al carácter del atributo. DATAMOD Atributo asociado al tipo de area dinámica. El area dinámica presenta mezclados en una cadena tanto variables de datos como de texto. El carácter que se defina con este atributo permitirá cambiar el valor del campo de entrada que nos interese. EXTEND Atributo asociado al tipo de area dinámica. Indica que la ventana o area puede extenderse a 132 columnas en el caso de que se trabaje con una pantalla que permita dicho ancho. HILITE Especifica la característica de contraste asociado al tipo de campo ( Parpadeante, Subrayado o Video-inverso). INTENS Establece la característica de intensidad ( alta, baja o ninguna). JUST Establece la característica de Justificación (derecha o izquierda) o sin justificación (ASIS). PAD Este atributo sirve para definir el carácter de relleno pudiendo especificarse este tanto PAD('_') como PAD(_). Eligiendo la opcion de PAD(USER) se asumirá el carácter de relleno que el usuario tenga definido en su perfil general (opcion 0.1) del menú principal de ISPF. PADC Este atributo, parecido al anterior en cuanto a su definición, especifica el carácter de relleno que se utilizara solo cuando el campo contenga totalmente blancos o nulos. SKIP Este atributo especifica si cuando en la entrada de datos se llena totalmente un campo, si salta al campo siguiente (ON) o si bloquea el teclado (OFF). SCROLL Este atributo también esta asociado al area dinámica. TYPE Este atributo especifica el tipo de campo : TEXT se refiere a constantes INPUT se refiere a campos de entrada (no protegidos)

Page 287: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 287 de 374

OUTPUT se refiere a campos de salida (protegidos) DATAIN se refiere a datos de entrada en el area dinámica DATAOUT se refiere a datos de salida en el area dinámica USERMOD Este atributo esta asociado al area dinámica y especifica que queremos detectar si el usuario ha modificado algún campo del area, aunque solo sea sobrescribiendo los mismos caracteres.

Page 288: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 288 de 374

El siguiente ejemplo es un fragmento del panel JMPINT58 visto anteriormente: )ATTR DEFAULT(%@!) | TYPE(OUTPUT) INTENS(LOW) CAPS(OFF) JUST(RIGHT) PAD(' ') { TYPE(input) iNTENS(high) CAPS(On) just(left) pad('_') } TYPE(TEXT) INTENS(LOW) CAPS(OFF) )BODY %JMP-94@---------%Buscar una palabra en una libreria@--------------@ %OPCION ===>!ZCMD @ @ Libreria ............. : {libreria@ @ Máscara de los fuentes : {máscara @ ... @ @ Esta utilidad%submite@un proceso que se dedica a @ buscar la cadena especificada entre los miembros @ de la libreria de NATURAL cuyo nombre se ajuste @ a la máscara especificada. @ @ El%resultado@le deja en la cola de salida con el @ nombre:%&Zuser@y el sufijo%SN @ En el vemos que: - la variable LIBRERIA es una variable de entrada, sale en pantalla en intensificado, lo que se escriba se pasa a mayúsculas, y al aparecer el panel el campo sale relleno con el carácter '_'. - La palabra "submite" dentro del texto explicativo aparecerá intensificada pues va precedida del carácter %, y este atributo de intensificado termina cuando se encuentra con @ que especifica texto normal por definirse así en el DEFAULT.

Page 289: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 289 de 374

4.6.2 Sección BODY Esta sección es OBLIGATORIA. Su formato es: )BODY [DEFAULT(abc)] + [WIDTH(ancho)] + [EXPAND(xy)] + [CMD(campo1)] + [SMSG(campo2)] + [LMSG(campo3)] + [KANA] + [ASIS] Siendo el significado de cada uno de los parámetros el siguiente: DEFAULT(abc) Este parámetro tiene el mismo significado que en la sección anterior. WIDTH(ancho) Este parámetro permite establecer el ancho de la pantalla. EXPAND(xy) Establece los caracteres de comienzo (x) y fin (y) de la zona a expandir. CMD(campo1) Establece el campo de comando en campo1 SMSG(campo2) Establece que el mensaje corto aparezca en el campo2 LMSG(campo3) Establece que el mensaje largo aparezca en el campo3 KANA Informa a ISPF que los caracteres KATAKANA pueden encontrarse en el BODY. ASIS Indica que cuando el usuario cambie la posición de la línea de comando (por ejemplo a través de la opcion 0.4 del menú principal de ISPF , el panel se procesara como esta diseñado. Esta sección es la que realmente contiene el diseño de la pantalla, tal y como la vera el usuario final, siendo lo normal que únicamente se codifique )BODY si el panel va a ser llamado por una clist por ejemplo. Para el diseño de la pantalla se combinaran tanto cadenas de texto como nombres de variables, todos ellos acompañados de los caracteres de control de atributos definidos en la primera sección a fin de obtener el diseño deseado. Las variables se identifican por ir precedidas del carácter & , y los nombres de estas variables se regirán por las reglas generales, es decir: - Deben empezar por carácter alfabético - Deben seguir a este primer carácter hasta 7 caracteres alfanuméricos.

Page 290: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 290 de 374

Pueden concatenarse variables, pero para ello se delimitara el final de la primera variable con un punto. Ejemplos: &nombre = 'ABCDE12' &numero = 4 &nombre.&numero = 789 En esta caso se asigna a la variable &nombre4 el valor 789 CMD(printo &fichero.) En este caso debe delimitarse la variable FICHERO pues va seguido por otro carácter especial. La longitud de las variables viene definida por el limitador del campo. Las distintas variables serán de entrada o de salida dependiendo del carácter de atributo que se asocie en el diseño de la pantalla. Asi, por ejemplo: (1) )ATTR DEFAULT(%+_) (2) )BODY (3) +-----------------%iMPRIMIR FICHERO+---------------+ (4) + Comando ==> _ZCMD (5) + (6) + Fichero ... : _fichero + (7) + Impresora.. : _impre+ (8) + (9) ... etc De este ejemplo podemos hacer las siguientes puntualizaciones, correspondientes a las líneas numeradas a la derecha: (1) Define los atributos por defecto: % Texto-intensificado + Texto-normal _ Variable-de-entrada (2) Define el comienzo de la sección correspondiente al cuerpo. (3) Define el guionado como texto-normal y el texto "imprimir-fichero" en intensificado para pasar de nuevo a texto-normal. (4) Viene el texto normal "Comando ==>" y la variable de entrada _ZCMD. Esta variable, por empezar por "Z" nos indica que es una variable del sistema, concretamente es la variable que se utiliza en los paneles para recoger el comando de entrada. (5) Es una línea en blanco. (6) Define la posición del texto "Fichero ... :" con el atributo de texto-normal; y

Page 291: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 291 de 374

La posición de comienzo de la variable FICHERO, campo de entrada por lo que no se especifica &; Es de notar que la longitud de la variable viene delimitada por el delimitador "+", por lo que el nombre de fichero mas largo solo podrá contener 8 posiciones. (7) Las mismas reflexiones que las de la línea 6, pero en este caso la longitud de la variable &impre esta limitado a 5 posiciones.

Page 292: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 292 de 374

4.6.3 Sección INIT Esta sección es OPCIONAL. Su formato es: )INIT La lógica contenida en esta sección se ejecutara antes de que el panel sea presentado al usuario. Las sentencias que pueden contener son: - Sentencias de asignación - Sentencias de verificación - Sentencias IF - Sentencias VPUT - Sentencias REFRESH

Page 293: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 293 de 374

4.6.4 Sección PROC Esta sección es OPCIONAL. Su formato es: )PROC La lógica contenida en esta sección se ejecutara después de que el usuario devuelva el control al sistema, lo cual ocurrirá al pulsar INTRO o cualquier otra PF en el panel visualizado. Las sentencias que puede contener esta sección son: - Sentencias de asignación - Sentencias de verificación - Sentencias IF - Sentencias VPUT - Sentencias REFRESH

Page 294: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 294 de 374

4.6.5 Sección REINIT Esta sección es OPCIONAL. Su formato es: )REINIT La lógica contenida en esta sección se ejecutara cuando se detecten errores en la sección PROC, ya que hace que ISPF mantenga el mismo panel en la pantalla, o bien al ser invocado de nuevo el servicio sin especificar el nombre del PANEL. También esta sección puede contener todos los tipos de sentencias definidas en la sección INIT, si bien, las que normalmente se usaran en esta sección serán las de resaltar los campos erroneos o de invocar determinados mensajes. )REINIT IF (&CADENA ^= ' ') .CURSOR = &LIBRERIA )PROC IF (&LIBRERIA = ' ') .MSG = JMPI005 VER(&LIBRERIA,NAME) ... En el ejemplo presentado, en la sección PROC se valida que el contenido de LIBRERIA este a blancos, y si es así, visualiza el mensaje JMPI005. En el caso de que este a blancos, visualiza el mensaje y pasa a ejecutar la sección REINIT, con lo que coloca el cursor en la variable LIBRERIA. Si ha superado la anterior validación, examina que el contenido de LIBRERIA sigue las reglas de nomenclatura, y de nuevo, si no supera esta validación, posiciona el cursor en la variable LIBRERIA. Con el fin de resaltar el error detectado, esta sección puede cambiar los atributos del campo erróneo de la siguiente forma: )REINIT .ATTR(.CURSOR) = 'HILITE(REVERSE)'

Page 295: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 295 de 374

4.6.6 Sección MODEL Esta sección es obligatoria pero solo en los paneles de visualización de tablas. Su formato es: )MODEL [ROWS( ALL | SCAN )] + [CLEAR (var1 [var2...])] El objeto de esta sección es definir la ubicación de cada uno de los campos a visualizar de una fila genérica. El propio servicio de ISPF, el TBDISPL que se estudiara con las funciones, será el encargado de, en base a esta definición, visualizar el numero de filas que quepan, etc. pero siempre ajustándose al modelo establecido, permitiendo el scroll, etc sin codificación alguna. Este modelo, es decir, el diseño de una fila, puede ocupar de una a ocho líneas del panel. En el caso de que en el momento de su ejecución no cupiera la informacion de una fila multilinea en la pantalla, ISPF no visualiza dicha fila. La sintaxis de esta sección es la misma que la vista en la sección )BODY. Si se especifica el parámetro ROWS(SCAN), el servicio de ISPF examinara el argumento de búsqueda especificado en TBSARG para presentar solo aquellas filas satisfacen la búsqueda. Como ya se dijo en la introducción de este tema, ISPF ve las tablas como matrices de dos dimensiones (campos y filas) donde se presupone que cada fila contiene todos los campos, y por tanto podemos considerarlas como registros de longitud fija. Pero a veces, nos puede interesar definir variables que amplíen la informacion de una fila, pero que no estén definidas en la tabla. Este tipo de variables, que solo acompañan a las filas desde que se abre la tabla hasta que se cierra, es decir solo mientras esta en memoria, reciben el nombre de VARIABLES DE EXTENSION. Las tablas para ser procesadas, deben cargarse previamente en memoria. Por eso, cuando se van leyendo las distintas filas de una tabla, cada valor se va metiendo en su celda correspondiente dentro de la matriz a la que se ha hecho mención anteriormente. Pero las variable de extensión no forman parte de esa matriz, ya que son variables que se definen de forma genérica. Por tanto, si se cargara esa variable con un valor, al visualizar la tabla, ese valor se visualizaría para todas las filas displayadas. Si se quiere que no ocurra esto, debe especificarse el parámetro CLEAR pasándole como argumento aquellas variables de extensión que se deben resetear. Esta sección se volverá a estudiar cuando se traten los servicios de ISPF en el apartado correspondiente a FUNCIONES.

Page 296: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 296 de 374

)ATTR default($+_) ? TYPE(INPUT) INTENS(low) CAPS(off) JUST(LEFT) # TYPE(OUTPUT) INTENS(high) CAPS(ON) JUST(LEFT) pad(_) )BODY $------------------------ DSN especiales ---------------------------- $ COMANDO ===>_opcion +SCROLL ==> _scin+ $ + Línea: $B+Browse $M+Miembros Comando: $A+Alta DSN +tabla:$&tabla + + $E+Edit $D+Borrar $X+Retornar $ $P+Rmt101 $V+Vput:4 + m DSN Observaciones + - ------------------------------------------- --------------------- )MODEL ROWS(ALL) +_z?elemento +?comenta + )INIT &SCIN= Csr /* modo scrool */ .zvars = marca &marca = ' ' &opcion = ' ' .cursor = marca /* Donde se posiciona el cursor */ /* --------------------------------------- */ )PROC VER (&MARCA LIST B,E,b,e,M,m,D,d,P,p,V,v) )END Este panel es el usado para presentar el siguiente resultado. En el se puede apreciar cómo se usa la sección MODEL, definiendo las tres variables usadas en una línea: MARCA (que es una Zvariable), ELEMENTO y COMENTA: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ------------------------------ DSN especiales ----- ROW 1 TO 12 OF 12 COMANDO ===> SCROLL ==> CSR Línea: B Browse M Miembros Comando: A Alta DSN tabla: JMPINT00 E Edit D Borrar X Retornar P Rmt101 V Vput:4 m DSN Observaciones - -------------------------------------------- ---------------------- JMPDES.CLIST CLIST PRIMARIAS JMPDES.CLIST.MGO CLIST AP. PARTICULAR JMPDES.INT.CLIST CLIST DESARROLLO JMPDES.JMP.CLIST CLIST RAIZ JMPDES.JMP.ESKELETO ESQUELETOS JMPDES.JMP.JCL LIBRERIA DE JCLS JMPDES.JMP.JCLTIPO JCLS USADOS EN Proc. JMPDES.JMP.NOTAS NOTAS ******************************* BOTTOM OF DATA ********************** <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Page 297: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 297 de 374

4.6.7 Sección END Esta sección es obligatoria. Esta sección es una sección vacía, es decir no puede contener ningún tipo de sentencia, ya que su única misión es informar a ISPF que se ha terminado la definición del panel.

Page 298: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 298 de 374

4.7 Tablas ISPF Las tablas ISPF son matrices de datos de dos dimensiones, y en consecuencia son el equivalente de los ficheros de datos, ya que representan la siguiente estructura: Campo 1 ... Campo n Fila 1 ... Fila m Al representar ficheros de datos, su contenido puede residir en disco de forma permanente. No obstante, una característica importante de las tablas ISPF es que para ser procesadas deben residir en memoria viéndose afectada la memoria disponible por el tamaño de la tabla. ISPF proporciona para el tratamiento de estas tablas un conjunto de servicios que se estudian en el apartado correspondiente a FUNCIONES ya que normalmente serán invocados dichos servicios dentro de alguna función.

Page 299: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 299 de 374

4.8 Función Se denomina FUNCION al conjunto formado por la pantalla o panel, mas la lógica asociada a los datos capturados o presentados en el mismo. Hasta ahora se ha estudiado, cómo se define un panel y de que partes consta. Este capitulo trata sobre cómo asociar una lógica a los datos, de modo que se pueda crear un dialogo en tiempo de ejecución con el usuario. Una función puede estar escrita en lenguaje de comandos o en cualquier lenguaje de programación (COBOL,FORTRAN,...), y tiene por objetivo la realización de una tarea concreta, para lo cual puede hacer uso una o varias veces de los servicios de ISPF. La sintaxis de llamada de los servicios de ISPF es: ISPEXEC servicio parámetro [parámetro ... ] donde los servicios, agrupados por su funcionalidad son: Uso General DISPLAY Para visualizar paneles de DATOS SETMSG Para visualizar un mensaje en un panel SELECT Visualiza un panel de selección Para tratamiento de tablas TBDISPL Para visualizar un panel de TABLA TBCREATE Crea tabla TBOPEN Abre una tabla permanente TBSORT Clasifica una tabla TBSTATS Devuelve estadísticas de una tabla TBQUERY Devuelve informacion acerca de una tabla TBSAVE Salva una tabla a disco TBCLOSE Cierra una tabla TBEND Termina de procesar una tabla sin salvarla TBERASE Borra una tabla Para tratamiento de filas TBADD Añade una fila TBDELETE Borra una fila TABEXIST Chequea la existencia de una clave en una tabla TBGET lee una fila TBMOD Modifica una fila TBPUT Escribe una fila TBSARG Establece el argumento de búsqueda TBSCAN Realiza la búsqueda de las filas TBVCLEAR Hace reset de los campos de la fila que se especifican. De posicionamiento en tablas TBTOP Se sitúa en la primera fila de una tabla TBSKIP Salta a la siguiente fila TBBOTTOM Se sitúa en la ultima fila de una tabla.

Page 300: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 300 de 374

De FILE TAILORING FTOPEN Abre un fichero de FILE TAILORING FTINCL Incluye en la salida un esqueleto FTCLOSE Cierra un fichero de FILE TAILORING FTERASE Borra el fichero de salida De variables VGET Lee variables de un pool VPUT escribe variables en un pool Otros servicios BROWSE Invoca al programa de BROWSE de ISPF CONTROL Especifica parámetros para el control de errores EDIT Invoca al programa de EDIT de ISPF EDREC Recupera una sesión de EDIT GETMSG Lee informacion de un mensaje ISREDIT Invoca al editor de macros de ISPF LIBDEF Define las librerías ISPF de un dialogo LOG Escribe los mensajes en un fichero LOG PQUERY Recupera informacion desde un area de un panel Como respuesta a la llamada a un servicio, ISPF devuelve siempre un código de retorno, cuyos valores, por regla general, significan : 0 Se ha ejecutado con éxito el servicio 4 Se ha detectado informacion de aviso (Warning) 8 Se ha detectado error grave 12 Se ha detectado error fatal En el anexo se especifica el código de retorno y el significado para cada uno de los servicios de ISPF. Puesto que para la realización de los ejemplos explicativos, seguiremos el lenguaje de comandos CLIST, la sintaxis para examinar el código de retorno debe ser :. IF &LASTCC operador valor THEN sentencia donde: operador puede ser >,<,>=,=,=<,Ø=,Ø>,Ø<,^=,^<,^> Valor puede ser una constante, una variable o una expresión En los párrafos siguientes se analizan los distintos servicios de ISPF enunciados.

Page 301: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 301 de 374

4.8.1 Servicios Generales DISPLAY Este servicio se utiliza para visualizar paneles de DATOS, entendiendo por tal un panel para entrada o salida de datos. El formato de la llamada a este servicio es: ISPEXEC DISPLAY [PANEL(id-panel)] [MSG(id-mensaje)] + [CURSOR(campo)] [CSRPOS(posición)] donde PANEL especifica el miembro de la libreria de paneles que será visualizado MSG especifica el mensaje que será visualizado cuando se visualice el panel. CURSOR especifica el nombre del campo en el que se posicionara el cursor cuando se visualice el panel. CSRPOS especifica la posición del campo en la que se situara el cursor cuando se visualice el panel. Como ejemplo de este servicio, se presenta la clist JMPINT06 que sirve para imprimir un fichero por una impresora no predeterminada, pidiéndose estos datos por el panel JMPINT06 El comando PRINTO que usa la clist invocada es un comando de TSO que sirve para imprimir un fichero por la impresora que se defina en el parámetro de palabra clave DEST(). /* -------- jmpint06 --------- */ PROC 0 ISPEXEC DISPLAY PANEL(JMPINT06) IF &LASTCC Ø= 0 THEN EXIT PRINTO DA(&FICHERO.) DEST(&REMOTO.) EXIT.

Page 302: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 302 de 374

Definición del panel JMPINT06: )ATTR DEFAULT(%@!) )BODY %JMP-94@-------------------%Imprimir Fichero @-------------------@ %OPCION ===>!ZCMD @ @ Impresora...:!remoto@ % @ Fichero ....:!fichero @ % % )INIT &remoto = 'RMT101' &fichero = &Zuser .cursor = fichero .csrpos = 7 )PROC ver(&fichero,dsname) &Zcmd = '99' if (&fichero = all,'') &Zcmd = 'X' )END En el panel se puede poner la validación de que el nombre del fichero se ajuste a las reglas de nomenclatura de DSN, pero es en la CLIST donde se debe validar que el fichero existe, y en el caso de que no exista mandar el mensaje correspondiente, para lo cual se deben añadir las siguientes líneas : IF &SYSDSN('&FICHERO') ^= OK + THEN ISPEXEC DISPLAY MSG(JMPP001) CURSOR(&fichero) Esta llamada al servicio DISPLAY carece del parámetro PANEL, lo cual hace que se revisualice el ultimo que se visualizo, y además, que se ejecute la sección )REINIT del mismo. Con el fin de resaltar el error detectado, esta sección puede cambiar los atributos del campo erróneo de la siguiente forma: )REINIT .ATTR(.CURSOR) = 'HILITE(REVERSE)'

Page 303: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 303 de 374

SETMSG Este servicio se utiliza para visualizar un mensaje. El formato de la llamada a este servicio es: ISPEXEC SETMSG [MSG(id-mensaje)] donde MSG especifica el identificador del mensaje que se quiere visualizar. ejemplo: ISPEXEC TBEXIST JMPLIB01 IF &LASTCC = 8 THEN + ISPEXEC SETMSG MSG(JMPM001W) /* ya existe */ Como ya se vio en el párrafo dedicado a los mensajes JMPM001W es un mensaje contenido en el miembro JMPM00 de la libreria definida para mensajes.

Page 304: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 304 de 374

SELECT Este servicio esta previsto para que presente una pantalla de tipo "MENU", es decir, el diseño de la pantalla es prácticamente solo de texto informando de las distintas opciones que se pueden elegir, y un campo para recoger la opcion elegida por el usuario. El formato de la llamada a este servicio es: ISPEXEC SELECT PANEL(id-panel)] donde id-panel especifica el miembro de la libreria de paneles que se quiere visualizar. El siguiente ejemplo muestra una clist, la cual termina presentando el panel raíz con todas las utilidades desarrolladas en este libro, por eso lo primero que hace es alocar las distintas librerías, que se usaran en los paneles y clists invocados desde el panel invocado (JMPMENU0). PROC 0 /* ----------------------------------- LIBRERIA DE PANELES /* ISPEXEC LIBDEF ISPPLIB DATASET ID('JMPDES.JMP.PANEL') /* /* -------------------------------- LIBRERIA DE PROCEDURES /* ISPEXEC LIBDEF ISPTLIB DATASET ID('JMPDES.CLIST') /* /* -------------------------------- LIBRERIA DE ESQUELETOS /* ISPEXEC LIBDEF ISPSLIB DATASET ID('JMPDES.CLIST.JCLTIPO') /* /* --------------------------------- LLAMADA PANEL INICIAL /* ISPEXEC SELECT PANEL(JMPMENU0)

Page 305: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 305 de 374

A continuación se muestra la definición del panel JMPMENU0 )ATTR DEFAULT($+~) | TYPE(OUTPUT) INTENS(LOW) CAPS(OFF) JUST(RIGHT) PAD(' ') { TYPE(TEXT) INTENS(LOW) CAPS(OFF) } TYPE(TEXT) INTENS(LOW) CAPS(OFF) )BODY +-------------------$MENU PARTICULAR DE JMP+---------------------- $OPCION===>~ZCMD + $ $ $ $ 1+Utilidades particulares + $ 2+Tratamiento de tablas + $ 3+Tratamiento de cadenas + $ 4+Miembros de una libreria + $ 5+Borrar tabla + $ 6+Librerías alocadas + $ 7+Librerías especiales + $ 8+Testear aplicaciones + $ 9+Visualizar o no las PF's + $ + $ X+EXIT - SALIR DEL MENU )INIT &ZHTOP = USRH000 .HELP = USRH100 &ZHINDEX = USRH999 )PROC &ZSEL = TRANS(TRUNC(&ZCMD,'.') 1,'CMD(EX ''JMPDES.CLIST.MGO(JMP)'')' 2,'PANEL(JMPTAB00)' 3,'PANEL(JMPCAD00)' 4,'CMD(EX ''JMPDES.CLIST.MGO(JMPLIB00)'')' 5,'CMD(EX ''JMPDES.CLIST.MGO(JMPDEL00)'')' 6,'CMD(EX ''JMPDES.CLIST.MGO(JMPALO00)'')' 7,'CMD(EX ''JMPDES.CLIST.MGO(JMPESP00)'')' 8,'PGM(ISPYXDR) PARM(ISR) NOCHECK' 9,'PGM(ISPOPF) PARM(PFK,&ZPARM)' X,'EXIT' ' ',' ' *,'?' ) )END

Page 306: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 306 de 374

4.8.2 Servicios para el Tratamiento de tablas Como se dijo en la introducción de este tema, las tablas de ISPF tienen como especial característica el hecho de que para su uso deben cargarse en memoria, lo cual puede imponer restricciones al tamaño de las mismas. Estos servicios proporcionan la posibilidad de usar y mantener las tablas de ISPF. TBDISPL Este servicio se utiliza para visualizar FILAS de una TABLA. El formato de la llamada a este servicio es: ISPEXEC TBDISPL nombre-tabla [PANEL(id-panel)] + [MSG(id-mensaje)] [CSRROW(num-fila)] + [CURSOR(campo)] [CSRPOS(posición)] + [AUTOSEL(YES|NO)] + [POSITION(vname)] [ROWID(vname)] donde PANEL especifica el panel que será visualizado debiendo ser del tipo de visualización de tablas, es decir, debe tener definida la sección )MODEL MSG especifica el mensaje que será visualizado cuando se visualice el panel. CSRROW especifica el numero de la fila en la que se situara el cursor al aparecer el panel. CURSOR especifica el nombre del campo en el que se posicionara el cursor cuando se visualice el panel. CSRPOS especifica la posición del campo en la que se situara el cursor cuando se visualice el panel. AUTOSEL especifica si la fila se selecciona solo con posicionar el cursor en cualquier campo de la fila (YES) , o si es preciso marcar alguna campo de selección para seleccionar la fila, con independencia de donde se sitúe el cursor (NO). ROWID El panel visualizara el panel especificado correspondiendo la primera fila visualizada del panel con la fila que tiene por puntero (CRP : current row pointer) el numero especificado en la variable que acompaña a este argumento. Si val1 = 0 se posionara en el TOP de la tabla. POSITION Este parámetro es parecido al anterior, solo que en el caso de especificarse, devuelve en la variable especificada el valor del CRP de la fila seleccionada. Como ejemplo de este servicio, se presenta el procedimiento JMPALO01

Page 307: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 307 de 374

visto en los ejemplos del tema de clist, el cual presenta clasificadas por orden alfabético, las librerías que se tienen alocadas, y que en un paso previo se han cargado en la tabla JMPALO01. Una vez elegida una de esta librerías mediante una marca en el campo correspondiente se visualizaran todos los miembros de dicha libreria. /* -------- jmpalo01 ---------*/ PROC 0 ... cargar en la tabla JMPTAB01 librerías alocadas ... 1 ISPEXEC CONTROL DISPLAY SAVE 2 ISPEXEC TBDISPL JMPTAB01 PANEL(JMPINT01) 3 IF &LASTCC Ø= 0 THEN GOTO T_ERROR 4 IF &MARCA Ø= STR() THEN DO 5 ISPEXEC BROWSE &LIBRERIA 6 IF &LASTCC Ø= 0 THEN GOTO T_ERROR 7 END 8 ISPEXEC CONTROL DISPLAY RESTORE ... Este ejemplo cuenta con llamadas a varios servicios de ISPF por lo que se comentara cada una de sus líneas a fin de aclarar los conceptos correspondientes, con independencia de que sean tratados con mas extensión en sus apartados correspondientes. 1 Salva la situación actual para no perderla ya que se va a llamar a un servicio de TBDISPL con un nombre de panel distinto o no. 2 presenta el panel JMPALO01 con los nombres de las librerías alocadas mas un campo para marcar la libreria de la que se desea ver los miembros. 3 Si hay algún problema a la hora de presentar ese panel se desvía el flujo del procedimiento al párrafo T_ERROR. 4 Si se ha marcado con algún carácter el campo marca, se ejecutan las sentencias contenidas entre DO y END 5 Llama al programa BROWSE pasándole como parámetro la libreria cuyos miembros se quieren consultar. 8 Restaura la situación salvada antes de invocar al servicio BROWSE

Page 308: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 308 de 374

TBCREATE Este servicio se utiliza para crear una tabla, especificando los nombres de los campos (columnas) y los nombres de aquellos campos que conllevan el atributo de clave. El formato de la llamada a este servicio es: ISPEXEC TBCREATE nombre-tabla + [NAMES(lista1)] [KEYS(lista2)] + [WRITE | NOWRITE] [SHARE] + [LIBRARY(ddname)] [REPLACE] donde lista1 Especifica la lista de campos que componen una fila de la tabla. Solo se especifica el nombre de la columna, no la longitud ni el tipo. La lista de campos puede delimitarse por blancos o por comas. Lista2 Especifica la lista de campos que componen la clave de acceso, solo en el caso de que la tabla este indexada. WRITE Especifica que la tabla es permanente, es decir que se grabara en disco cuando se cierre. NOWRITE Especifica que la tabla es temporal, es decir solo existe hasta que se cierre, momento en el cual desaparece. Esta es la opcion por defecto. SHARED Este parámetro esta relacionado con el SPLIT de pantalla. Una tabla solo puede crearse para una pantalla, pero como el identificador es el terminal, este parámetro esta especificando si dicha tabla puede ser accesible por la otra pantalla lógica asociada al mismo terminal. LIBRARY Este parámetro permite especificar la ddname, es decir el nombre asignado al dataset en la alocacion del fichero, el caso de que se quiera crear la tabla en una libreria distinta a la especificada por defecto.con el servicio LIBDEF. REPLACE Especifica que si la tabla ya existe, que la sustituya por la nueva, y si no existe que la cree. Los códigos de retorno devueltos por este servicio son: 8 la tabla ya existe 12 La tabla esta siendo usada.

Page 309: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 309 de 374

El siguiente ejemplo muestra el panel y la clist usados para dar de alta el nombre de un dataset en la tabla que tiene por nombre el nombre del usuario, y que contiene todos los nombres de aquellos ficheros de uso mas frecuente. /* <<<<<<<<<<<<<<<<<<<<<< JMPZZZ0A >>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* */ PROC 0 TEST IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* ------------------------------------------------------------- */ /* */ SET CABECERA = <<< LIBRERIAS PARTICULARES >>> SET &FICHERO= DESJMP.JMP.TABLAS(&SYSUID.) /* */ /* -------------------------- PEDIR ENTRADA -------------------- */ /* */ ISPEXEC DISPLAY PANEL(JMPZZZ01) IF ( &ELEMENTO = &STR( ) ) THEN EXIT /* */ INICIO: + /* */ ISPEXEC CONTROL ERRORS RETURN ALLOC FI(ENTRADA) DA('&FICHERO') SHR REUSE IF &LASTCC ^= 0 THEN FREE DA('&FICHERO') /* */ /* ----------------------- DEFINIR LIBRERIA DE TABLAS OUTPUT --- */ /* */ ISPEXEC LIBDEF ISPTABL DATASET ID('DESJMP.JMP.TABLAS') SET &RC = &LASTCC /* */ /* -------------------------------- ABRIR TABLA --------------- */ /* */ ISPEXEC TBOPEN &SYSUID WRITE SET &RC = &LASTCC /* ----- LA TABLA ESTA ABIERTA -----*/ IF &RC = 12 THEN + DO ISPEXEC TBCLOSE &SYSUID SET RC = &LASTCC WRITE ===> CERRAR TABLA DE ENTRADA : &RC FREE DA ('&FICHERO') EXIT END

Page 310: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 310 de 374

/* ----- NO EXISTE LA TABLA --------*/ IF &RC = 8 THEN + DO ISPEXEC TBCREATE &SYSUID NAMES(ELEMENTO,COMENTA) + WRITE REPLACE SET &RC = &LASTCC IF &RC ^= 0 THEN + WRITE ===> CREAR TABLA DE ENTRADA : &RC ISPEXEC TBSORT &SYSUID FIELDS(ELEMENTO) SET &RC = &LASTCC IF &RC ^= 0 THEN + WRITE ===> CLASIFICAR TABLA ......... : &RC END /* */ /* -------------------------- PEDIR ENTRADA -------------------- */ /* */ ERROR OFF /* */ ISPEXEC TBADD &SYSUID SAVE(ELEMENTO,COMENTA) ORDER SET &RC = &LASTCC IF &RC EQ 0 THEN + DO ISPEXEC TBSAVE &SYSUID NEWCOPY SET &RC = &LASTCC END ISPEXEC TBEND &SYSUID FREE DA ('&FICHERO.') /* */ EXIT

Page 311: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 311 de 374

La definición del panel JMPZZZ01 es la siguiente: )ATTR default($+_) ? TYPE(INPUT) INTENS(HIGH) CAPS(ON) JUST(LEFT) PAD('_') )BODY $------------------- Mantenimiento de DSNs especiales ------------- $ + + Esta opcion da de alta en la tabla de DSNs especiales + el nombre del DSN que se especifique a continuación. + También se puede acompañar una peque|a reseña de su + contenido. + $ + Nombre DSN ...... : ?elemento + $ + Descripción breve : ?comenta + $ $ $ )INIT &elemento= ' ' &comenta = ' ' &salir = ' ' )PROC /* IF ( &ELEMENTO = ALL,'') &SALIR = 'SI' */ /* VER (&elemento,dsname) */ )END El resultado obtenido es el siguiente: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ---------------------- DSN especiales ----------- ROW 1 TO 12 OF 12 COMANDO ===> SCROLL ==> CSR Línea: B Browse M Miembros Comando: A Alta DSN tabla: JMPINT00 E Edit D Borrar X Retornar P Rmt101 V Vput:4 m DSN Observaciones - --------------------------------- ------------------------------- DESJMP.CLIST CLIST PRIMARIAS DESJMP.CLIST.MGO CLIST DE APLICACION PARTICULAR DESJMP.INT.CLIST CLIST DESARROLLO Particular DESJMP.JMP.CLIST CLIST RAIZ DESJMP.JMP.ESKELETO ESQUELETOS ************************** BOTTOM OF DATA ************************* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Page 312: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 312 de 374

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ------------------ Mantenimiento de DSNs especiales -------------- Esta opcion da de alta en la tabla de DSNs especiales el nombre del DSN que se especifique a continuación. También se puede acompañar una pequeña reseña de su contenido. Nombre DSN ...... : DESJMP.JMP.JCL__________________________ Descripción breve : LIBRERIA DE JCLS______________ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -------------------- DSN especiales ------------- ROW 1 TO 12 OF 12 COMANDO ===> SCROLL ==> CSR Línea: B Browse M Miembros Comando: A Alta DSN tabla: JMPINT00 E Edit D Borrar X Retornar P Rmt101 V Vput:4 m DSN Observaciones - --------------------------------- ------------------------------- DESJMP.CLIST CLIST PRIMARIAS DESJMP.CLIST.MGO CLIST DE APLICACION PARTICULAR DESJMP.INT.CLIST CLIST DESARROLLO Particular DESJMP.JMP.CLIST CLIST RAIZ DESJMP.JMP.ESKELETO ESQUELETOS DESJMP.JMP.JCL LIBRERIA DE JCLS ************************** BOTTOM OF DATA ************************* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Page 313: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 313 de 374

TBOPEN Este servicio se utiliza para abrir una tabla permanente, ya que la temporal desaparece cuando se cierra. El formato de la llamada a este servicio es: ISPEXEC TBOPEN nombre-tabla + [WRITE | NOWRITE] [SHARE] + [LIBRARY(ddname)] donde WRITE Especifica que la tabla se grabara en disco cuando se cierre. NOWRITE Especifica que la tabla no se grabara en disco cuando se cierre. SHARE Este parámetro esta relacionado con el SPLIT de pantalla. Una tabla solo puede crearse para una pantalla, pero como el identificador es el terminal, este parámetro esta especificando si dicha tabla va a poder ser accedida por la otra pantalla lógica asociada al mismo terminal. LIBRARY Este parámetro permite especificar la ddname, es decir el nombre asignado al dataset en la alocacion del fichero, en el caso de que la tabla se encuentre en una libreria distinta a la especificada por defecto.mediante el servicio LIBDEF. Los códigos de retorno devueltos por este servicio son: 8 la tabla NO existe 12 La tabla esta siendo usada. Ejemplo: ISPEXEC TBOPEN &SYSUID WRITE IF &LASTCC = 8 DO + ISPEXEC TBCREATE &SYSUID + NAMES(LIBRERIA, OBSERVA) KEYS(LIBRERIA) END En este caso se abre una tabla que tiene por nombre el nombre del usuario, ya que es el valor contenido en la variable del sistema &SYSUID; y, en el caso de que no exista la tabla, se crea como miembro de la libreria definida para tablas de salida, y con los campos LIBRERIA y OBSERVA, estando clasificada por el campo LIBRERIA.

Page 314: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 314 de 374

TBSORT Este servicio se utiliza para clasificar una tabla. Además, este servicio se encarga de guardar la informacion relativa al sort a fin de que si en momentos posteriores a su clasificación se insertaran nuevas filas, estas se clasificaran en el sitio que les corresponda de acuerdo con las especificaciones dadas en este servicio. El formato de la llamada a este servicio es: ISPEXEC TBSORT nombre-tabla + FIELDS(lista-tríos) donde lista-tríos Especifica la lista de tríos en base a los que se clasificara la tabla, siendo el formato de un trió el siguiente: campo,C|N,A|D donde C significa carácter N significa Numérico A orden ascendente D orden descendente Los códigos de retorno devueltos por este servicio son: 0 Todo correcto 12 La tabla no esta abierta 16 Error en la conversión 20 error grave Ejemplo: El siguiente ejemplo muestra como clasificar una tabla por una clave compuesta de dos campos: miembro y libreria. ISPEXEC TBCREATE jmptab02 + NAMES(miembro libreria, observa) ISPEXEC TBSORT FIELDS(miembro,c,a libreria,c,a)

Page 315: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 315 de 374

TBSTATS Devuelve estadísticas de una tabla Este servicio se utiliza para obtener estadísticas de datos de una tabla, pudiendo estar o no abierta dicha tabla. El formato de la llamada a este servicio es: ISPEXEC TBSTATS nombre-tabla + [CDATE(variable_1)] + [UDATE(variable_2)] + [CTIME(variable_3)] + [UTIME(variable_4)] + [USER(variable_5)] + [ROWCREAT(variable_6)] + [ROWCURR(variable_7)] + [ROWUPD(variable_8)] + [TABLEUPD(variable_9)] + [SERVICE(variable_10)] + [RETCODE(variable_11)] + [STATUS1(variable_12)] + [STATUS2(variable_13)] + [STATUS3(variable_14)] + [LIBRARY(nombre_dd)] donde CDATE devuelve la fecha de creación de la tabla en la variable_1 UDATE Devuelva la fecha en la que se realizo la ultima modificación a la tabla. CTIME Devuelve la hora del día en el que se creo la tabla. UTIME Devuelve la hora del día en el que se realizó la ultima modificación a la tabla. USER Devuelve en variable_5 el usuario que accedió por ultima vez a la tabla. ROWCREAT Devuelve el numero de filas iniciales de la tabla ROWCURR Devuelve el numero de filas actuales de la tabla. ROWUPD Devuelve el numero de filas modificadas de la tabla. TABLEUPD Devuelve el numero de veces que ha sido modificada la tabla SERVICE Devuelve el nombre del ultimo servicio de ISPF que accedió a la tabla. RETCODE Devuelve el valor del código de retorno que devolvió este ultimo servicio.

Page 316: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 316 de 374

STATUS1 Devuelve uno de los siguientes valores: 1 - la tabla existe en la libreria de tablas de entrada alocada. 2 - La tabla no existe en la libreria de tablas de entrada alocada. 3 - No se encuentra alocada la libreria de tablas de entrada STATUS2 Devuelve uno de los siguientes valores en función de como se haya abierto esta tabla para la pantalla lógica desde la que se hace la consulta: 1 - La tabla no esta abierta para esta pantalla. 2 - esta abierta en modo NOWRITE 3 - esta abierta en modo WRITE 4 - esta abierta en modo SHARED NOWRITE 5 - esta abierta en modo SHARED WRITE STATUS3 Devuelve uno de los siguientes valores en función de que se encuentra disponible para ser abierta en modo WRITE: 1 - La tabla esta disponible 2 - La tabla no esta disponible LIBRARY Este parámetro especifica el nombre lógico de otra DD distinta a la ISPTLIB, asociado a la libreria donde se encuentra la tabla de la que se desea obtener estadísticas. Ejemplo: ISPEXEC TBSTATS JMPTAB01 CDATE(FECHAC) UDATE(FECHAU) WRITE la fecha de creación de la tabla fue : &FECHAC WRITE La fecha de la ultima modificación fue : &FECHAU En tiempo de ejecución resulta: la fecha de creación de la tabla fue : '94/11/10' La fecha de la ultima modificación fue : '95/03/12'

Page 317: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 317 de 374

TBQUERY Este servicio devuelve informacion relativa a la tabla, la cual debe estar abierta. ISPEXEC TBQUERY nombre-tabla + [KEYS(variable_1)] + [NAMES(variable_2)] + [KEYNUM(variable_3)] + [NAMENUM(variable_4)] + [ROWNUM(variable_5)] + [POSITION(variable_6)] + Donde: KEYS Devuelve una cadena con el conjunto de campos que configuran la clave. NAMES Devuelve una cadena con el resto de campos KEYNUM devuelve el numero de campos que configuran la clave NAMENUM Devuelve el numero de campos no clave de la tabla ROWNUM Devuelve el numero de filas de la tabla POSITION Devuelve el valor del CRP (current row pointer), es decir el puntero de la fila actual. Ejemplo: Al ejecutar el programa resulta: ISPEXEC TBQUERY TABEJEM KEYS(CLAVE) + NAMES(NOCLAVE) + KEYNUM(CLAVEN) + NAMENUM(NOCLAVEN) + ROWNUM(FILAS) WRITE La clave esta formada por los campos &CLAVE WRITE El resto de campos son : &NOCLAVE WRITE La clave tiene &CLAVEN campos WRITE El numero de campos no clave es &NOCLAVEN WRITE La tabla tiene &FILAS filas En tiempo de ejecución resulta: La clave esta formada por los campos '(CLAVE1 CLAVE2)' El resto de campos son : '(CAMPO1 CAMPO2 CAMPO3)' La clave tiene 2 campos El numero de campos no clave es 3 La tabla tiene 123 filas

Page 318: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 318 de 374

TBSAVE Este servicio se encarga de escribir el contenido de una tabla desde memoria a disco. El formato de la llamada a este servicio es: ISPEXEC TBSAVE nombre-tabla [+] [LIBRARY(nombre_ddname) +] [NAME(nombre_miembro) +] [NEWCOPY | REPLCOPY +] [PAD(porcentaje) +] donde Nombre-tabla es el nombre de la tabla ISPF que se encuentra en memoria. Nombre_ddname Es el nombre lógico asociado al nombre de una libreria de tablas distinto al usado por defecto (ISPTABL) mediante una sentencia ALLOC. Nombre_miembro Es el nombre del nuevo miembro en la libreria definida para tablas de salida. NEWCOPY especifica que el nuevo miembro se escriba al final de la libreria de tablas. REPLCOPY Especifica que el nuevo miembro se escriba sobre el anterior, reemplazando al que existía, si es que existía. PAD Especifica el porcentaje que se debe reservar para futuras modificaciones. Este espacio se reserva al final del miembro creado, y solo en creación. Como ejemplo se muestra un fragmento de la clist que acompaña la explicación de la sentencia TBCREATE. En el se muestra cómo se salva a disco la tabla ISPF que esta en memoria con el nombre del usuario, que es el nombre contenido en la variable del sistema &SYSUID. DO ISPEXEC TBSAVE &SYSUID NEWCOPY SET &RC = &LASTCC END El siguiente fragmento muestra el contenido del miembro que contiene la tabla salvada. Dicho contenido se muestra en formato normal y hexadecimal.

Page 319: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 319 de 374

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> BROWSE -- JMPDES.JMP.TABLAS(JMPINT00) --- LINE 00000000 COL 001 080 COMMAND ===> Hex on SCROLL ===> CSR *************************** TOP OF DATA **************************** ..TIR:... .{JMPINT00....'d...0........m.?. .n.....JMPDES ........... TO...q]a..COMENTA ...q]n.........]..........JMPDES.CLIST..CLIST PRIMA TO..JMPDES.CLIST.COMENTA ..CLIST PRIMARIAS.......q...b.....&.,..JMPDE ..CLIST DE APLICACION PARTICULAR.ELEMENTO..JMPDES.CLIST.MGO.COMENTA . ... ********************** BOTTOM OF DATA ******************************** <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> BROWSE -- JMPDES.JMP.TABLAS(JMPINT00) ---- LINE 00000000 COL 001 080 COMMAND ===> SCROLL ===> CSR ************************* TOP OF DATA ******************************* --------------------------------------------------------------------- ..TIR:... .{JMPINT00....'d...0........m.?. .n.....JMPDES ........... 04ECD700040CDDDCDEFF008078000F00000000936140900113EEDCFE4400000000000 04399A006000147953000200D400600002000C43F30151F273327782000001000C000 --------------------------------------------------------------------- TO...q]a..COMENTA ...q]n.........]..........JMPDES.CLIST..CLIST PRIMA ED01095820CDDCDEC400095900800700050102030500EEDCFE4CDCEE00CDCEE4DDCDC 360008A107364553100508A5060000040A0E0C0D040C327782B339230F33923079941 ... ************************** BOTTOM OF DATA *************************** <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Page 320: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 320 de 374

TBCLOSE Este servicio realiza una doble función, salva el contenido de la tabla que se va a cerrar sobre disco, y borra de la memoria la tabla salvada. El formato de la llamada a este servicio es por lo tanto similar al formato de la sentencia TBSAVE: ISPEXEC TBCLOSE nombre-tabla [+] [LIBRARY(nombre_ddname) +] [NAME(nombre_miembro) +] [NEWCOPY | REPLCOPY +] [PAD(porcentaje) +] donde Nombre-tabla es el nombre de la tabla ISPF que se encuentra en memoria. Nombre_ddname Es el nombre lógico asociado al nombre de una libreria de tablas distinto al usado por defecto (ISPTABL) mediante una sentencia ALLOC. Nombre_miembro Es el nombre del nuevo miembro en la libreria definida para tablas de salida. NEWCOPY especifica que el nuevo miembro se escriba al final de la libreria de tablas. REPLCOPY Especifica que el nuevo miembro se escriba sobre el anterior, reemplazando al que existía, si es que existía. PAD Especifica el porcentaje que se debe reservar para futuras modificaciones. Este espacio se reserva al final del miembro creado, y solo en creación. Como ejemplo se muestra un fragmento de la clist que acompaña la explicación de la sentencia TBCREATE. En el se muestra cómo se cierra una tabla salva a disco la tabla ISPF que esta en memoria con el nombre del usuario, que es el nombre contenido en la variable del sistema &SYSUID. ISPEXEC TBCLOSE &SYSUID NEWCOPY

Page 321: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 321 de 374

TBEND Este servicio se encarga de borrar de memoria la tabla especificada sin salvar su contenido a disco. El formato de la llamada a este servicio es: ISPEXEC TBEND nombre-tabla

Page 322: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 322 de 374

TBERASE Este servicio se encarga de borrar una tabla de la libreria definida por defecto, o si es distinta, de la libreria que se especifique. El formato de la llamada a este servicio es: ISPEXEC TBERASE nombre-tabla [+] [LIBRARY(nombre_ddname) ] donde nombre_ddname especifica el nombre de una libreria alocada, y distinta de la ISPTABL, que es la usada por defecto.

Page 323: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 323 de 374

4.8.3 Tratamiento de filas TBADD Este servicio añade una fila a la tabla especificada inmediatamente después de la fila actual, a no ser que se especifique el parámetro ORDER o que la tabla se encuentre previamente clasificada. El formato de la llamada a este servicio es: ISPEXEC TBADD nombre_tabla + [SAVE(lista _campos)] + ORDER donde SAVE Permite especificar variables de extensión, es decir campos que no existen para todas las filas y que serán salvados acompañando a la fila que tenga. ORDER Este parámetro es aplicable a tablas que han sido clasificadas previamente. Después de llamar a este servicio debe, como siempre, chequearse el código de retorno, ya que si fuera 8 especificaria que no se ha añadido la fila por tener clave duplicada, es decir, que ya existe otra fila con esa clave. Como ejemplo ilustrativo se acompaña un fragmento de la clist JMPZZZ0A que da de alta el nombre de un DSN en la tabla que tiene por nombre el nombre del usuario. /* <<<<<<<<<<<<<<<<<<<<<< JMPZZZ0A >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* */ PROC 0 TEST IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* ------------------------------------------------------------- */ /* */ SET CABECERA = <<< LIBRERIAS PARTICULARES >>> SET &FICHERO= DESJMP.JMP.TABLAS(&SYSUID.) /* */ /* -------------------------- PEDIR ENTRADA -------------------- */ /* */ ISPEXEC DISPLAY PANEL(JMPZZZ01) IF ( &ELEMENTO = &STR( ) ) THEN EXIT /* */ INICIO: + /* */ ISPEXEC CONTROL ERRORS RETURN ALLOC FI(ENTRADA) DA('&FICHERO') SHR REUSE IF &LASTCC ^= 0 THEN FREE DA('&FICHERO') /* */

Page 324: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 324 de 374

/* -------------------------- DEFINIR LIBRERIA DE TABLAS OUTPUT */ /* */ ISPEXEC LIBDEF ISPTABL DATASET ID('DESJMP.JMP.TABLAS') SET &RC = &LASTCC /* */ /* -------------------------------- ABRIR TABLA --------------- */ /* */ ISPEXEC TBOPEN &SYSUID WRITE SET &RC = &LASTCC /* ----- LA TABLA ESTA ABIERTA -----*/ IF &RC = 12 THEN + DO ISPEXEC TBCLOSE &SYSUID SET RC = &LASTCC WRITE ===> CERRAR TABLA DE ENTRADA : &RC FREE DA ('&FICHERO') EXIT END /* ----- NO EXISTE LA TABLA --------*/ IF &RC = 8 THEN + DO ISPEXEC TBCREATE &SYSUID NAMES(ELEMENTO,COMENTA) + WRITE REPLACE SET &RC = &LASTCC IF &RC ^= 0 THEN + WRITE ===> CREAR TABLA DE ENTRADA : &RC ISPEXEC TBSORT &SYSUID FIELDS(ELEMENTO) SET &RC = &LASTCC IF &RC ^= 0 THEN + WRITE ===> CLASIFICAR TABLA ......... : &RC END /* */ /* -------------------------- PEDIR ENTRADA -------------------- */ /* */ ERROR OFF /* */ ISPEXEC TBADD &SYSUID SAVE(ELEMENTO,COMENTA) ORDER SET &RC = &LASTCC IF &RC EQ 0 THEN + DO ISPEXEC TBSAVE &SYSUID NEWCOPY SET &RC = &LASTCC END ISPEXEC TBEND &SYSUID FREE DA ('&FICHERO.') EXIT

Page 325: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 325 de 374

TBDELETE Este servicio borra una fila de la tabla que se especifique. Para tablas con sin campos clave, borrar la fila actual, mientras que para tablas con clave borrar la fila cuya clave coincida con los valores cargados en las variables que tengan los nombres de los campos clave. El formato de la llamada a este servicio es: ISPEXEC TBDELETE nombre_tabla Después de llamar a este servicio debe, como siempre, chequearse el código de retorno, ya que si fuera 8 especificaría que no se ha borrado la fila, bien porque no existe una fila con la clave especificada, o bien, para tablas sin clave, porque nos encontramos en el TOP de la tabla, por lo que el CSR no tiene un valor determinado. Como ejemplo ilustrativo se acompaña un fragmento de la clist JMPZZZ0M que borra una fila de la tabla y carga el mensaje 'BORRADO' en el campo de observaciones. IF &MARCA = B THEN - DO ISPEXEC CONTROL DISPLAY SAVE SET &MENSAJE = BORRADO ISPEXEC TBDELETE JMPLIB01 ISPEXEC CONTROL DISPLAY RESTORE END

Page 326: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 326 de 374

TBEXIST Este servicio chequea la existencia de una clave en una tabla El formato de la llamada a este servicio es: ISPEXEC TBEXIST nombre_tabla En el caso de que no exista la clave buscada o de que la tabla no este indexada, este servicio devuelve el código de retorno 8.

Page 327: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 327 de 374

TBGET Este servicio hace que ISPF se reposicione en la fila de la tabla que se especifique, y que recupere los valores de los campos de esa fila. El formato de la llamada a este servicio es: ISPEXEC TBGET nombre_tabla + [SAVENAME(variable_1)] + [NOREAD] + [POSITION(variable_2)] + [ROWID(variable_3)] donde SAVENAME este parámetro permite conocer el nombre de las variables de extensión que se grabaron con TBADD. NOREAD este parámetro permite posicionarse en una fila concreta, pero no lee el contenido de los campos. POSITION estos parámetros posicionan el cursor en la fila que se ROWID especifique. En el caso de que no exista la clave buscada o de que la tabla no este indexada, este servicio devuelve el código de retorno 8.

Page 328: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 328 de 374

TBMOD Este servicio hace que ISPF añada una fila a la tabla si no existe una fila con la clave especificada, o , si existe, que modifique la fila. El formato de la llamada a este servicio es: ISPEXEC TBMOD nombre_tabla + [SAVE(lista _campos)] + ORDER donde SAVE Permite especificar variables de extensión, es decir campos que no existen para todas las filas y que serán salvados acompañando a la fila que tenga. ORDER Este parámetro es aplicable a tablas que han sido clasificadas previamente. En el caso de que no exista la clave buscada da de alta la fila, y devuelve como código de retorno 8 o de que la tabla no este indexada, este servicio devuelve el código de retorno 8.

Page 329: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 329 de 374

TBPUT Este servicio hace que ISPF modifique una fila de la tabla que se especifique si la tabla esta indexada, o la fila actual si no lo esta. El formato de la llamada a este servicio es: ISPEXEC TBMOD nombre_tabla + [SAVE(lista _campos)] + ORDER donde SAVE Permite especificar variables de extensión, es decir campos que no existen para todas las filas y que serán salvados acompañando a la fila que tenga. ORDER Este parámetro es aplicable a tablas que han sido clasificadas previamente. En el caso de que no exista la clave buscada devuelve como código de retorno 8.

Page 330: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 330 de 374

TBSARG Este servicio permite definir los argumentos de búsqueda que serán usados para limitar las filas a procesar mas tarde por los servicios TBSCAN o por TBDISPL al visualizar datos en un panel visualizador de datos con la sección )MODEL y ROWS(SCAN). El formato de la llamada a este servicio es: ISPEXEC TBSARG nombre_tabla + [ARGLIST(lista)] + [NEXT | PREVIOUS] + [NAMECOND(condiciones)] donde lista Permite especificar las variables de extensión sobre las que se aplicara la búsqueda, junto con los campos de la tabla. NEXT Estos parámetros especifican que en el momento de PREVIOUS hacer la búsqueda, esta se realice desde la fila actual hacia atrás (PREVIOUS) o hacia delante (NEXT) desde la fila actual. condiciones representa pares de valores del tipo : (nombre1,condicion1 nombre2,condicion2 ... ) Los valores posibles de condición son: EQ | NE | GE | GT | LT | LE Por defecto asume EQ. El siguiente ejemplo muestra su uso. Concretamente se trata de la clist encargada de borrar un elemento de la tabla de DSNs especiales. Su función es simple, recibe un nombre de fichero, y debe borrar de la tabla de DSNs especiales asociados a un usuario, dicho nombre de la tabla que tiene por nombre el nombre del usuario. (no se borrar el fichero, solo el nombre de la tabla de nombres especiales): /* <<<<<<<<<<<<<<<<<<<<<< JMPZZZ02 >>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* BORRAR UN ELEMENTO DE LA TABLA DE DSN ESPECIALES */ /* */ PROC 1 NOMBRE /* */ SET &TEST = TESTNO IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* ------------------------------------------------------------- */ /* */ SET CABECERA = <<< LIBRERIAS PARTICULARES >>> SET &FICHERO= DESJMP.JMP.TABLAS(&SYSUID.) /* */ /* ----- RUTINA DE ERRORES ------------------------------------- */ /* */ INICIO: + /* */ ISPEXEC CONTROL ERRORS RETURN ALLOC FI(ENTRADA) DA('&FICHERO') SHR REUSE

Page 331: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 331 de 374

IF &LASTCC ^= 0 THEN FREE DA('&FICHERO') /* */ /* --------------------------- DEFINIR LIBRERIA DE TABLAS OUTPUT */ /* */ ISPEXEC LIBDEF ISPTABL DATASET ID('DESJMP.JMP.TABLAS') SET &RC = &LASTCC IF &TEST = TEST THEN WRITE ===> LIBRERIA DE SALIDA : &RC /* */ /* -------------------------------- ABRIR TABLA --------------- */ /* */ ISPEXEC TBOPEN &SYSUID WRITE SET &RC = &LASTCC IF &TEST = TEST THEN WRITE ===> ABRIR T.ENTRADA : &RC /* ----- LA TABLA ESTA ABIERTA -----*/ IF &RC = 12 THEN + DO ISPEXEC TBCLOSE &SYSUID SET RC = &LASTCC WRITE ===> CERRAR TABLA DE ENTRADA : &RC FREE DA ('&FICHERO') EXIT END /* ----- NO EXISTE LA TABLA --------*/ IF &RC = 8 THEN + DO WRITE NO PUEDO BORRAR PORQUE NO EXISTE LA TABLA EXIT END /* */ /* -------------------------- PEDIR ENTRADA -------------------- */ /* */ IF ( &NOMBRE NE STR() ) THEN + DO SET ELEMENTO = &NOMBRE ISPEXEC TBSARG &SYSUID NAMECOND(ELEMENTO,EQ) ISPEXEC TBSCAN &SYSUID SET A1 = &ELEMENTO SET A2 = &COMENTA ISPEXEC TBDELETE &SYSUID SET &RC = &LASTCC IF &TEST = TEST THEN WRITE ===> TBDELETE : &RC ISPEXEC TBSAVE &SYSUID SET &RC = &LASTCC IF &TEST = TEST THEN WRITE ===> TBSAVE : &RC ISPEXEC TBCLOSE &SYSUID SET &RC = &LASTCC IF &TEST = TEST THEN WRITE ===> TBCLOSE : &RC IF &TEST = TEST THEN WRITE BORRAR : &A1 '-' &A2 SET &RC = &LASTCC END ISPEXEC TBEND &SYSUID FREE DA ('&FICHERO.') /* */ EXIT /* */

Page 332: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 332 de 374

En el caso de que no exista la clave buscada devuelve como código de retorno 8.

Page 333: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 333 de 374

TBSCAN Este servicio permite realiza la búsqueda en base a los argumentos definidos en TBSARG y recupera los datos de los campos de la fila seleccionada. El formato de la llamada a este servicio es: ISPEXEC TBSCAN nombre_tabla + [ARGLIST(lista)] + [NEXT | PREVIOUS] + [SAVENAME(variable_1)] [NOREAD] [POSITION(variable_2)] [ROWID(variable_3)] donde lista Permite especificar las variables de extensión sobre las que se aplicara la búsqueda, junto con los campos de la tabla. En el caso de que se especifique este parámetro, ISPF ignorara los argumentos especificados en TBSARG. NEXT Estos parámetros especifican que en el momento de hacer la PREVIOUS búsqueda, esta se realice desde la fila actual hacia atrás (PREVIOUS) o hacia delante (NEXT) desde la fila actual. SAVENAME este parámetro permite conocer el nombre de las variables de extensión que se grabaron con TBADD. NOREAD este parámetro especifica que se posicione en la fila buscada, pero que no lea el contenido de los campos. POSITION estos parámetros posicionan el cursor en la fila que se ROWID especifique. En el caso de que no exista la clave buscada devuelve como código de retorno 8.

Page 334: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 334 de 374

TBVCLEAR Este servicio realiza un reset, (-mueve blancos-), a todas las variables que tengan por nombre cualquier nombre de campo de la tabla que se especifica como unico parámetro de este servicio. El formato de la llamada a este servicio es: ISPEXEC TBVCLEAR nombre_tabla Suele usarse este servicio después de escribir una fila en la tabla, a fin de que la nueva fila no mantenga valores de la anterior.

Page 335: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 335 de 374

4.8.4 Servicios para el posicionamiento Los siguientes servicios simplemente se mencionan ya que su propia definición es lo suficientemente explicativa. TBTOP Este servicio posiciona el puntero (CSR) en el principio de la tabla que se especifique. El formato de la llamada a este servicio es: ISPEXEC TBTOP nombre_tabla Es de resaltar el hecho de que no se sitúa en la primera fila, sino en el principio de la tabla, que como se puede ver en el ejemplo que se acompaña, son conceptos distintos, pues desde el principio de la tabla al primer elemento hay informacion asociada con la tabla, estadísticas, etc. Cuando se dice que se posicione en el principio de la tabla, estamos diciendo que se posicione antes de la primera fila. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>> BROWSE -- JMPDES.JMP.TABLAS(JMPINT00) -------------- LINE 000 COMMAND ===> = ********************************* TOP OF DATA ***************** ..TIR:... .{JMPINT00....'d...0........m.?. .n.....JMPDES ..... TO...q]a..COMENTA ...q]n.........]..........JMPDES.CLIST..CLISA TO..JMPDES.CLIST.COMENTA ..CLIST PRIMARIAS.......q...b.....&.,C ..CLIST DE APLICACION PARTICULAR.ELEMENTO..JMPDES.CLIST.MGO.COL PLICACION PARTICULAR.........q...b.....&.,..JMPDES.INT.CLIST..A NTERNACIONAL.ELEMENTO..JMPDES.INT.CLIST.COMENTA ..CLIST DESARRR El anterior ejemplo se corresponde con un BROWSE de la tabla usada para contener DSNs asociados a una aplicacion.

Page 336: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 336 de 374

TBSKIP Este servicio hace que ISPF se posicione en la siguiente fila de la tabla que se especifique, y que recupere los valores de los campos de esa fila. El formato de la llamada a este servicio es: ISPEXEC TBSKIP nombre_tabla + [NUMBER(numero)] + [ROW(fila)] + [SAVENAME(variable_1)] + [NOREAD] + [POSITION(variable_2)] + [ROWID(variable_3)] donde NUMBER este parámetro indica a ISPF que salte un numero determinado de filas, el especificado como NUMERO. Por defecto entiende NUMBER(+1) ROW este parámetro permite ir a una fila determinada, aquella cuyo numero se especifica como argumento de este parámetro, y que debe cargarse con anterioridad. SAVENAME este parámetro permite conocer el nombre de las variables de extensión que se grabaron con TBADD. NOREAD este parámetro permite poscionarse en una fila concreta, pero no lee el contenido de los campos. POSITION estos parámetros posicionan el cursor en la fila que se ROWID especifique.

Page 337: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 337 de 374

TBBOTTOM Este servicio sitúa el puntero (CSR) en la ultima fila de una tabla y recupera sus datos. El formato de la llamada a este servicio es: ISPEXEC TBBOTTOM nombre_tabla + [SAVENAME(variable_1)] + [NOREAD] + [POSITION(variable_2)] + [ROWID(variable_3)] donde SAVENAME este parámetro permite conocer el nombre de las variables de extensión que se grabaron con TBADD. NOREAD este parámetro permite posicionarse en la ultima fila, pero no lee el contenido de los campos. POSITION estos parámetros posicionan el cursor en la fila que se ROWID especifique.

Page 338: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 338 de 374

4.8.5 De FILE TAILORING Se entiende por esqueleto un fichero preformateado con la salida deseada, en el cual se sustituyen los valores variables por el nombre de las variables. Posteriormente, este fichero será procesado para generar la salida deseada, y será en este proceso, llamado 'FILE TAILORING' en el que se sustituirán las variables por los valores correspondientes. Como ejemplo se incluye el esqueleto usado para copiar todos los miembros de una libreria a un fichero secuencial: MGOUTIPS //XXXXXXPS JOB (123,456),'JMP-PRU-4',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1) //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //* TRATAR FICHEROS //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //PASO1 EXEC PGM=IEBPTPCH //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=&LIBRERIA,DISP=SHR //* ----------- FICHERO DE SALIDA //SYSUT2 DD DSN=&SECUENCI.,DISP=(&DIS.,CATLG,CATLG), // SPACE=(CYL,(1,1),RLSE),UNIT=SYSDA, // DCB=(RECFM=FBA,LRECL=133,BLKSIZE=23408) //* ----------- PARAMETROS ------- //SYSIN DD * PRINT TYPORG=PO,MAXFLDS=1 RECORD FIELD=(80) /* Donde las variables son: &LIBRERIA : Nombre de la libreria &SECUENCI : Nombre del fichero secuencial &DIS : Disposición del fichero

Page 339: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 339 de 374

FTOPEN Este servicio abre el fichero de FILE TAILORING, es decir el fichero de salida que contendrá el resultado del proceso. El formato de la llamada a este servicio es: ISPEXEC FTOPEN [TEMP] /* <<<<<<<<<<<<<<<<<<<<<< MGOUTIPS >>>>>>>>>>>>>>>>>>>>>> */ /* ========= BUSCAR UN OBJETO EN DESARROLLO ============== */ /* */ PROC 0 /* */ /*-------------------------------------------------------- */ /* */ SET &TEST = TESTNO IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* */ SET ESKELETO = MGOUTIPS SET FICHERO = '&SYSUID..SALIDA.TMP' /* */ ISPEXEC DISPLAY PANEL(MGOUTIPS) IF &LASTCC NE 0 THEN EXIT /* */ FREE FI(TEMPORAL) ALLOCATE FI(TEMPORAL) DA(&FICHERO.) OLD REUSE /* */ ISPEXEC FTOPEN IF &LASTCC NE 0 THEN GOTO ERROR01 /* */ ISPEXEC FTINCL &ESKELETO IF &LASTCC NE 0 THEN GOTO ERROR02 /* */ ISPEXEC FTCLOSE IF &LASTCC NE 0 THEN GOTO ERROR03 /* */ /* ISPEXEC SETMSG MSG(DDSM120A) */ SUBMIT &FICHERO WRITENR PROCESO SUBMITIDO OK /* */ GOTO EXIT /* -------------------------------------- */ ERROR01: ISPEXEC SETMSG MSG(JMPP001A) GOTO EXIT ERROR02: ISPEXEC SETMSG MSG(JMPP002A) ISPEXEC FTCLOSE GOTO EXIT ERROR03: ISPEXEC SETMSG MSG(JMPP003A) EXIT: FREE FI(TEMPORAL) EXIT END Asi mismo, para poder completar el ejemplo, se acompaña la definición del panel MGOUTIPS

Page 340: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 340 de 374

)ATTR DEFAULT(%@!) | TYPE(OUTPUT) INTENS(LOW) CAPS(OFF) JUST(RIGHT) PAD(' ') { TYPE(input) iNTENS(high) CAPS(On) just(left) pad('_') } TYPE(TEXT) INTENS(LOW) CAPS(OFF) )BODY %JMP-94@---%Copiar todos los miembros de un PDS a un secuencial@---@ @ @ % @ Libreria :{libreria @ @ Secuencial :{Secuenci @ % @ Disposición del fichero secuencial:{dis@ % @ @ Esta utilidad%submite@un proceso que copia todos @ @ los miembros de una libreria en el fichero secuen- @ cial que se especifique. @ )INIT &libreria = 'tspg' &secuenci = ' ' &dis = 'OLD' )PROC &Zcmd = '99' if (&libreria = all,'') &Zcmd = 'X' if (&secuenci = all,'') &Zcmd = 'X' VER(&libreria,dsname) VER(&secuenci,dsname) &ZSEL = TRANS(TRUNC(&ZCMD,'.') 99,'CMD(EX ''DESJMP.CLIST.MGO(MGOUTIPS)'' + ''&libreria.,&secuenci.'')' X,'EXIT' ' ',' ' *,'?' ) )END Nota: De este panel cabe resaltar el hecho de que al haber sido llamado mediante el servicio DISPLAY no se tendrá en cuenta el valor de la variable del sistema &ZSEL.

Page 341: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 341 de 374

FTINCL Este servicio es el que copia el esqueleto en el fichero alocado como fichero de salida, y al tiempo que lo copia, realiza las sustituciones de las variables por sus valores. El formato de la llamada a este servicio es: ISPEXEC FTINCL nombre_esqueleto [NOFT] donde NOFT especifica, en caso de usarse, que el esqueleto sea copiado tal cual sobre el fichero de salida, es decir, sin realizar sustituciones (NO FileTailoring) Un ejemplo de su uso puede verse en el servicio FTOPEN

Page 342: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 342 de 374

FTCLOSE Este servicio es el que cierra el fichero de salida. El formato de la llamada a este servicio es: ISPEXEC FTCLOSE [NAME(miembro) + [NOREPL] + [LIBRARY(nombre_dd)] donde NAME este parámetro especifica el nombre del miembro que contendrá el fichero de salida en el caso de que la alocacion del fichero de salida sea una libreria, o fichero particionado. NOREPL este parámetro especifica que no se ejecute el proceso de sustitución si existe un miembro con el nombre especificado. LIBRARY Este parámetro permite especificar el nombre lógico del fichero de salida, o DDNAME asignado al fichero de salida en el momento de la alocacion, y que por defecto es ISPFILE. Un ejemplo de su uso puede verse en el servicio FTOPEN

Page 343: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 343 de 374

FTERASE Este servicio suele ser invocado para borrar el fichero de salida una vez que ha cumplido su objetivo. El formato de la llamada a este servicio es: ISPEXEC FTERASE miembro + [LIBRARY(nombre_dd)] donde miembro este parámetro especifica el nombre del miembro que contiene el fichero de salida en el caso de que la alocacion del fichero de salida sea una libreria, o fichero particionado. LIBRARY Este parámetro permite especificar el nombre lógico del fichero de salida, o DDNAME asignado al fichero de salida en el momento de la alocacion, y que por defecto es ISPFILE. Un ejemplo de su uso puede verse en el servicio FTOPEN

Page 344: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 344 de 374

4.8.6 De variables Los servicios de variable permiten intercambiar los contenidos de las variables desde el pool del procedimiento de clist que se esta ejecutando hasta el pool definido a nivel de aplicacion (PROFILE) o el pool compartido por todas las aplicaciones (SHARED). Prácticamente los servicios que se van a ver ya se estudiaron como sentencias de las secciones INIT o PROC de la definición del panel, no obstante se mencionaran otros servicios para el manejo de variables, que no van a ser tratados por estar relacionados con el intercambio de informacion con otras aplicaciones, por lo que se sale del ámbito de este libro. Estos servicios son: VGET Lee el contenido de una variable de un pool VPUT escribe en un pool el contenido de una variable VDEFINE Define las variables que se usaran para intercambio de informacion con un modulo de un programa VDELETE Este servicio hace desaparecer del pool de la función las variables especificadas. VCOPY Este servicio, invocado desde un programa, permite obtener el contenido de variables del pool de la función en el programa. VREPLACE Este servicio, invocado desde un programa, modifica el contenido de las variables especificadas en el pool de la función. VRESET Este servicio, invocado desde un programa, hace reset de las variables especificadas en el pool de la función. VERASE Este servicio, parecido a VDELETE, hace desaparecer las variables especificadas y su contenido, del pool que se especifique (SHARED o PROFILE).

Page 345: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 345 de 374

VGET Este servicio permite leer el contenido de una o varias variables desde el pool que se especifique sobre una variable que tenga el mismo nombre que la variable del pool en el procedimiento o función. El formato de la llamada a este servicio es: ISPEXEC VGET (lista) [ SHARED | PROFILE | ASSIS ] donde lista especifica la lista de variables que quieren leerse. En el caso de que solo se desee recuperar el valor de una variable, puede omitirse los paréntesis. SHARED este parámetro especifica que los valores de las variables especificadas en la lista deben obtenerse del pool compartido por todas las aplicaciones. PROFILE este parámetro especifica que los valores de las variables especificadas en la lista deben obtenerse del pool definido para la aplicacion. ASIS este parámetro especifica que los valores de las variables especificadas en la lista deben obtenerse del pool compartido por todas las aplicaciones (SHARED), y si no existe, entonces debe leer su valor del pool de aplicacion. En el caso de que no exista en el pool especificado la variable, el servicio devuelve como código de retorno el valor 8.

Page 346: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 346 de 374

VPUT Este servicio permite escribir el contenido de una o varias variables desde el pool de la función o procedimiento, sobre el pool que se especifique. En el caso de que no existiera en el pool una variable con el nombre especificado, la crearía. El formato de la llamada a este servicio es: ISPEXEC VPUT (lista) [ SHARED | PROFILE | ASSIS ] donde lista especifica la lista de variables que quiere salvarse sobre el pool. En el caso de que solo se desee recuperar el valor de una variable, puede omitirse los paréntesis. SHARED este parámetro especifica que los valores de las variables especificadas en la lista deben salvarse sobre el pool compartido por todas las aplicaciones. PROFILE este parámetro especifica que los valores de las variables especificadas en la lista deben grabarse en el pool definido para la aplicacion. ASIS este parámetro especifica que los valores de las variables especificadas en la lista deben guardarse sobre el pool compartido por todas las aplicaciones (SHARED), y si no existe, entonces debe guardar su valor en el pool de aplicacion. En el caso de que exista una variable con el nombre dado, en ambos pools, solo se modificara el contenido del pool compartido (SHARED). En el caso de que no exista en la función la variable especificada, el servicio devuelve como código de retorno el valor 8.

Page 347: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 347 de 374

4.8.7 Definición de librerias Este servicio es uno de los mas importantes por la trascendencia que tiene ya que es el encargado de definir los nombres lógicos o DD_names asociados a las librerias físicas. El formato de la llamada a este servicio es: ISPEXEC LIBDEF tipo_libreria DATASET ID(lista_dsn) + LIBRARY ID(dd_name) + donde tipo_ libreria Puede tomar uno de los siguientes valores: ISPPLIB : Libreria de módulos cargables ISPPLIB : Libreria de paneles ISPMLIB : Libreria de mensajes ISPTLIB : Libreria de tablas de entrada ISPTABL : Libreria de tablas de salida ISPSLIB : Libreria de esqueletos ISPFILE : Libreria de ficheros de salida del File tailoring. Lista_dsn La palabra clave DATASET permite asociar una lista de datasets con el tipo de libreria que se especifique, quedando alocados para la aplicacion los ficheros que se definan en esta lista. LIBRARY la ddname que acompaña como argumento a este parámetro especifica el nombre de la libreria que se asocia al tipo de libreria de ISPF definido con este servicio. Cuando se usa este parámetro es necesario ejecutar el comando ALLOC para asignar la libreria a nuestro entorno de trabajo. Como ejemplo de este servicio se acompaña la clist sencilla y autocomentada que cumple con la importantisima misión de alocar las distintas librerias necesarias para poder ejecutar las utilidades desarrolladas.

Page 348: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 348 de 374

/* <<<<<<<<<<<<<<<<<<<<<=============>>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* <<<<<<<<<<<<<<<<<<<<< CLIST RAIZ >>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* <<<<<<<<<<<<<<<<<<<<<=============>>>>>>>>>>>>>>>>>>>>>>>>>>> */ PROC 0 */ /* ----------------------------------------- LIBRERIA DE PANELES */ /* */ ISPEXEC LIBDEF ISPPLIB DATASET ID('JMPDES.JMP.PANEL') /* */ /* ----------------------------------------LIBRERIAIDEDPROCEDURES */ /* */ ISPEXEC LIBDEF ISPTLIB DATASET ID('JMPDES.CLIST') /* */ /* --------------------------------------- LIBRERIA DE ESQUELETOS */ /* */ ISPEXEC LIBDEF ISPSLIB DATASET ID('JMPDES.CLIST.JCLTIPO') /* */ /* ------------------------------------------- LIBRERIA DE TABLAS */ /* */ ISPEXEC LIBDEF ISPSLIB DATASET ID('JMPDES.CLIST.JCLTIPO') /* */ /* ---------------------------------------- LLAMADA PANEL INICIAL */ /* */ ISPEXEC SELECT PANEL(JMPMENU0) /* */ EXIT

Page 349: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 349 de 374

4.8.8 Otros servicios ISPF dispone de otros muchos servicios, algunos de los cuales se listan a continuación, con una breve reseña de la función que realizan. BROWSE Invoca al programa de BROWSE de ISPF CONTROL Especifica parámetros para el control de errores ADDPOP activa la visualización del identificador del panel REMPOP desactiva la identificación del panel del ángulo superior izquierdo. EDIT Invoca al programa de EDIT de ISPF EDREC Recupera una sesión de EDIT GETMSG Lee informacion de un mensaje GRxxxxxx Establece el interface con GDDM ISREDIT Invoca al editor de macros de ISPF LIBDEF Define las librerias ISPF de un dialogo LMxxxxxx Permite hacer uso de la libreria PDF de servicios LOG Escribe los mensajes en un fichero LOG PQUERY Recupera informacion desde un area de un panel Para obtener una informacion mas detallada de estos servicios, se recomienda usar la opcion del TUTORIAL de ISPF.

Page 350: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 350 de 374

4.9 Tutorial ISPF para poder asesorar al usuario en tiempo de ejecución, permite asociar paneles solo de texto, es decir, de salida, a la PF que se haya definido como de HELP. Esto se consigue haciendo uso de la variable .HELP del sistema, asignando a esta variable, en la sección )INIT, el nombre del panel que va a servir de HELP cuando se pulse la tecla correspondiente. Existen otras dos variables asociadas con el tutorial: &ZHTOP y &ZHINDEX, las cuales pueden cargarse con los nombres de los paneles que sirven de tabla de contenidos y de índice por páginas respectivamente. Los paneles de help o tutoriales son iguales a los de datos, con la diferencia de que solo se usa la variable ZSEL para seleccionar opcion en el caso de que desde un panel (índice por ejemplo) se puedan elegir distintas opciones. Otra variable usada en estos paneles es &ZUP establece cual es, a partir de que se le asigne un valor en un panel en la sección )INIT )PROC o )REINIT, el panel anterior o padre del actual. El comando SKIP o S hace que se salga de la aplicacion de tutorial y se regrese a la aplicacion real, ya que una vez situados en un panel del tutorial, puede navegarse por ellos como si de otra aplicacion se tratara. El comando ENTER hace que se visualice el siguiente panel y que debe cargarse en la variable &ZCONT de la sección )PROC. El comando BACK o B hace que se retroceda un nivel en la aplicacion de tutorial.

Page 351: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 351 de 374

4.10 Ejemplos:

Page 352: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 352 de 374

4.10.1 Pasar un archivo particionado o PDS a fichero secuencial. Como ejemplo del uso de esqueletos se incluye el siguiente procedimiento usado para copiar todos los miembros de una libreria o fichero particionado, a un fichero secuencial: Clist principal: /* <<<<<<<<<<<<<<<<<<<<<< INTUTIPS >>>>>>>>>>>>>>>>>>>>>> */ /* ================ PASAR PDS A SECUENCIAL =============== */ /* */ PROC 0 SET &TEST = TESTNO IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* */ SET ESKELETO = INTUTIPS SET DSN = '&SYSUID..SALIDA.TMP' /* */ ISPEXEC DISPLAY PANEL(INTUTIPS) IF &LASTCC NE 0 THEN EXIT IF &LIBRERIA = STR() THEN EXIT IF &SECUENCI = STR() THEN EXIT /* */ FREE FI(ISPFILE) ALLOCATE FI(ISPFILE) DA(&DSN.) OLD REUSE /* */ ISPEXEC FTOPEN IF &LASTCC NE 0 THEN GOTO ERROR1 /* */ ISPEXEC FTINCL &ESKELETO IF &LASTCC NE 0 THEN GOTO ERROR2 /* */ ISPEXEC FTCLOSE IF &LASTCC NE 0 THEN GOTO ERROR3 /* */ /* ISPEXEC SETMSG MSG(JMPH004) */ SUBMIT &DSN WRITENR PROCESO SUBMITIDO OK /* */ GOTO EXIT /* -------------------------------------- */ ERROR1: ISPEXEC SETMSG MSG(JMPH001) GOTO EXIT ERROR2: ISPEXEC SETMSG MSG(JMPH002) ISPEXEC FTCLOSE GOTO EXIT ERROR3: ISPEXEC SETMSG MSG(JMPH003) EXIT: FREE FI(ISPFILE) EXIT END

Page 353: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 353 de 374

Panel: INTUTIPS )ATTR DEFAULT(%@!) | TYPE(OUTPUT) INTENS(LOW) CAPS(OFF) JUST(RIGHT) PAD(' ') { TYPE(input) iNTENS(high) CAPS(On) just(left) pad('_') } TYPE(TEXT) INTENS(LOW) CAPS(OFF) )BODY %JMP-94@--%Copiar todos los miembros de un PDS a un secuencial@---@ @ @ % @ Libreria :{libreria @ @ Secuencial :{Secuenci @ % @ Disposición del fichero secuencial:{dis@ % @ @ Esta utilidad%submite@un proceso que copia todos @ los miembros de una libreria en el fichero secuen- @ cial que se especifique. @ @ @ @ @ )INIT &libreria = 'tspg' &secuenci = ' ' &dis = 'OLD' )PROC VER(&libreria,dsname) VER(&secuenci,dsname) )END

Page 354: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 354 de 374

Esqueleto : INTUTIPS //XXXXXXPS JOB (123,456),'JMP-PRU-4',CLASS=T,MSGCLASS=X, // NOTIFY=XXXXXX,MSGLEVEL=(1,1) //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //* TRATAR FICHEROS //* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //PASO1 EXEC PGM=IEBPTPCH //STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //* ----------- FICHERO DE ENTRADA //SYSUT1 DD DSN=&LIBRERIA,DISP=SHR //* ----------- FICHERO DE SALIDA //SYSUT2 DD DSN=&SECUENCI.,DISP=(&DIS.,CATLG,CATLG), // SPACE=(CYL,(1,1),RLSE),UNIT=SYSDA, // DCB=(RECFM=FBA,LRECL=133,BLKSIZE=23408) //* ----------- PARAMETROS ------- //SYSIN DD * PRINT TYPORG=PO,MAXFLDS=1 RECORD FIELD=(80) /* Donde las variables son: &LIBRERIA : Nombre de la libreria &SECUENCI : Nombre del fichero secuencial &DIS : Disposición del fichero

Page 355: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 355 de 374

4.10.2 Listar archivo por impresora: Panel: )ATTR DEFAULT(%@!) | TYPE(OUTPUT) INTENS(LOW) CAPS(OFF) JUST(RIGHT) PAD(' ') { TYPE(input) iNTENS(high) CAPS(On) just(left) pad('_') } TYPE(TEXT) INTENS(LOW) CAPS(OFF) )BODY %JMP-94@-------------------%Imprimir Ficheros @-----------------------@ %OPCION ===>!ZCMD @ ---- Margenes --- @ Usuario ....: %&usuario @ Cabecera .. :%!ca@ @ Impresora...:%!rm @ Derecha ... :%!de@ @ Clase salida:%!Z@ Izquierda.. :%!iz@ @ Formato ....:%!z@ (Vertical/Horizontal) Pie ....... :%!pi@ @ Longitud reg:%!lrg@ % @ Fichero ....: {fi @ % % Vertical Horizontal @ @ +------------------+ +----------------------+ @ ] cabecera ] ] cabecera ] @ +---+----------+---+ +---+--------------+---+ @ ] d ] ] i ] ] d ] ] i ] @ ] d ] ] i ] ] d ] ] i ] @ ] d ] ] i ] +---+--------------+---+ @ ] d ] ] i ] ] pie ] @ +---+----------+---+ +----------------------+ @ ] pie ] @ +------------------+ )INIT &USUARIO = &Zuser .ZVARS = '(cl , ft )' &rm = 'RMT101' &cl = 'A' &ft = 'V' &ca = 5 &de = 30 &iz = 10 &pi = 5 &lrg = 80 &fi = &Zuser .cursor = fi .csrpos = 7 )PROC ver(&fi,dsname) ver(&ft, NB, list V,H) &Zcmd = '99' if (&fi = all,'') &Zcmd = 'X' &ZSEL = TRANS(TRUNC(&ZCMD,'.') 99,'CMD(EX ''JMPDES.CLIST.MGO(LISTAR)'' + ''&fi.,&ft.,&rm.,&cl.,&ca.,&de.,&iz.,&pi.,&lrg.'')'

Page 356: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 356 de 374

X,'EXIT' ' ',' ' *,'?' ) )END

Page 357: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 357 de 374

Clist LISTAR /* <<<<<<<<<<<<<<<< LISTAR >>>>>>>>>>>>>>>>>>>>>>>>>>> */ /* */ /* LISTAR FICHERO POR RMT101 EN VERTICAL Y LETRA PEQUE#A */ /* */ PROC 9 FICHERO + FORMATO + REMOTO + CLASE + CABECERA + DERECHA + IZQUIERDA + PIE + LRCL /* */ /*---------------------------------------------------------*/ /* */ SET &LABEL=LEER /* */ /*---------------------------------------------------------*/ /* */ SET &TEST = TESTNO IF &TEST = TEST THEN CONTROL SYMLIST CONLIST MSG ELSE CONTROL NOMSG /* */ /* --------------------------------------------------------*/ /* */ IF &LRCL = 0 THEN SET LRCL = 80 /* */ /* */ ALOCAR: SET &FILEALOC = &SYSUID..JMP.TMP /* */ /* ============= ALOCAR Y/O CREAR FICHERO DE SALIDA ==*/ /* */ IF &SYSDSN('&FILEALOC') ^= OK THEN + DO ALLOC FILE(SYSUT2) DATASET('&FILEALOC') + NEW CATALOG + UNIT(3380) RECFM(F B) LRECL(133) + BLKSIZE(23408) TRACKS SPACE(3 1) REUSE FREE DA('&FILEALOC') END /* */ /* ---------------------------------- EXAMINAR FORMATO /* */ IF '&FORMATO' = 'V' THEN GOTO VERTICAL /* */ /* ========================= PONER HORIZONTAL ============= */ /* */

Page 358: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 358 de 374

HORIZONTAL: + ALLOC FILE(SYSUT1) DATASET('Jmpdes.JMP.JCL(HORIZONT)')+ SHR REUSE ALLOC FILE(SYSUT2) DATASET('&SYSUID..JMP.TMP') OLD REUSE OPENFILE SYSUT1 INPUT OPENFILE SYSUT2 OUTPUT GETFILE SYSUT1 SET &SYSUT2 = &SYSUT1 PUTFILE SYSUT2 CLOSFILE SYSUT1 CLOSFILE SYSUT2 FREE FILE(SYSUT1 SYSUT2) GOTO SEGUIR /* */ /* ========================= PONER VERTICAL ============== */ /* */ VERTICAL: + ALLOC FILE(SYSUT1) DATASET('Jmpdes.JMP.JCL(VERTICAL)') + SHR REUSE ALLOC FILE(SYSUT2) DATASET('&SYSUID..JMP.TMP') + OLD REUSE OPENFILE SYSUT1 INPUT OPENFILE SYSUT2 OUTPUT GETFILE SYSUT1 SET &SYSUT2 = &SYSUT1 PUTFILE SYSUT2 CLOSFILE SYSUT1 CLOSFILE SYSUT2 FREE FILE(SYSUT1 SYSUT2) /* */ /* ========================= ESCRIBIR FORMATO ==============*/ /* */ SEGUIR: + FREE DA('&SYSUID..JMP.TMP') ALLOC FILE(SALIDA) DATASET('&SYSUID..JMP.TMP') + MOD REUSE OPENFILE SALIDA OUTPUT /* */ /* ========================= ESCRIBIR FICHERO ============= */ /* */ ALLOC F(ENTRADA) REUSE DA('&FICHERO') SHR IF &LASTCC NE 0 THEN DO WRITE ERROR EN LA ALOCACION DEL FICHERO &FICHERO FREE DA('&FICHERO') EXIT END OPENFILE ENTRADA INPUT SET &RC = 0 /* --------------------------------------------------- */

Page 359: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 359 de 374

ERROR DO SET &RC = &LASTCC IF &RC = 400 THEN + GOTO FINPASO1 ELSE + DO WRITE INESPERADO FIN DE CLIST : RC = &RC WRITE ==================================== EXIT END END /* -------------------------------------------------- */ SET &BLANCOS = &STR( ) SET &SALIDA = &STR(&BLANCOS &BLANCOS FICHERO: &FICHERO ) PUTFILE SALIDA SET &SALIDA = &BLANCOS PUTFILE SALIDA PUTFILE SALIDA /* --------------------------------------------------- */ LEER: GETFILE ENTRADA IF &LASTCC NE 400 THEN + DO SET &SALIDA = &STR(&BLANCOS &SUBSTR(1:&LRCL,&ENTRADA)) PUTFILE SALIDA GOTO &LABEL END /* --------------------------------------------------- */ FINPASO1: + CLOSFILE ENTRADA CLOSFILE SALIDA FREE FILE(ENTRADA SALIDA) /* */ /* ================ IMPRMIR TEMPORAL ====================== */ /* */ ALLOC FILE(SYSUT1) DATASET('&SYSUID..JMP.TMP') SHR REUSE ALLOC FILE(SYSUT2) SYSOUT(&CLASE) DEST(&REMOTO) REUSE ALLOC FILE(SYSPRINT) DUMMY REUSE ALLOC FILE(SYSIN) DUMMY REUSE CALL 'SYS1.LINKLIB(IEBGENER)' FREE FILE(SYSUT1 SYSUT2 SYSPRINT SYSIN) WRITE =====>> FICHERO : &FICHERO IMPRESO POR RMT101 < OK > EXIT /* */

Page 360: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ISPF Autor: José M. Peco

Página 360 de 374

Formato: Los parámetros para poner la impresora en vertical o en horizontal se incluyen como archivos aunque pudieran especificarse directamente como variables, pero se hace así por claridad. Son los siguientes Horizontal: DSN=Jmpdes.JMP.JCL(HORIZONT) 1&&??% %Y2,8% %Y3,12% %Y4,1% %Y10,1% %Y5,65% %Y6,133% Vertical : DSN=Jmpdes.JMP.JCL(VERTICAL) 1&&??% %Y2,8% %Y3,12% %Y4,1% %Y10,0% %Y5,80% %Y6,90%

Page 361: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 361 de 374

ANEXOS

Page 362: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 362 de 374

Anexo 1 : Perfil del Usuario JMP-94 ---------------- Utilidades Desarrollo Particular ------------------ OPCION ===> TSO PROFILE IKJ56688I CHAR(0) LINE(0) PROMPT INTERCOM NOPAUSE MSGID MODE WTPMS G NORECOVER PREFIX(TEST33) PLANGUAGE(ENU) SLANGUAGE(ENU) IKJ56689I DEFAULT LINE/CHARACTER DELETE CHARACTERS IN EFFECT FOR THIS TERMINAL *** JMP-94 ---------------- Utilidades Desarrollo Particular ------------------ OPCION ===> TSO PROFILE prefix(tspg8s) JMP-94 ---------------- Utilidades Desarrollo Particular ------------------ OPCION ===> TSO PROFILE IKJ56688I CHAR(0) LINE(0) PROMPT INTERCOM NOPAUSE MSGID MODE WTPMS G NORECOVER PREFIX(TEST8S) PLANGUAGE(ENU) SLANGUAGE(ENU) IKJ56689I DEFAULT LINE/CHARACTER DELETE CHARACTERS IN EFFECT FOR THIS TERMINAL *** --------------------- ISPF MASTER APPLICATION MENU ------------------------ ===> tso ex jmp USERID - TEST8S 1 ISPF/PDF - ISPF/Program Development Facility TIME - 09:42 ... X EXIT - Terminate ISPF using list/log defaults Enter END command to terminate ISPF. IKJ56228I DATA SET JMP.CLIST NOT IN CATALOG OR CATALOG CAN NOT BE ACCESSED ***

Page 363: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 363 de 374

<<<<<<<<<< este error se produce por tener en el profile noprefix >>>>>> --------------------- ISPF MASTER APPLICATION MENU ------------------------ ===> tso profile IKJ56688I CHAR(0) LINE(0) PROMPT INTERCOM NOPAUSE MSGID MODE WTPMS G NORECOVER NOPREFIX PLANGUAGE(ENU) SLANGUAGE(ENU) IKJ56689I DEFAULT LINE/CHARACTER DELETE CHARACTERS IN EFFECT FOR THIS TERMINAL *** JMP-94 ---------------- Utilidades Desarrollo Particular ------------------ OPCION ===> TSO PROFILE IKJ56688I CHAR(0) LINE(0) PROMPT INTERCOM NOPAUSE MSGID MODE WTPMS G NORECOVER PREFIX(TEST33) PLANGUAGE(ENU) SLANGUAGE(ENU) IKJ56689I DEFAULT LINE/CHARACTER DELETE CHARACTERS IN EFFECT FOR THIS TERMINAL *** JMP-94 ---------------- Utilidades Desarrollo Particular ------------------ OPCION ===> TSO PROFILE prefix(tspg8s) JMP-94 ---------------- Utilidades Desarrollo Particular ------------------ OPCION ===> TSO PROFILE TEST33 95/05/05 09:59 PFs:24 IKJ56688I CHAR(0) LINE(0) PROMPT INTERCOM NOPAUSE MSGID MODE WTPMS G NORECOVER PREFIX(TEST8S) PLANGUAGE(ENU) SLANGUAGE(ENU) IKJ56689I DEFAULT LINE/CHARACTER DELETE CHARACTERS IN EFFECT FOR THIS TERMINAL ***

Page 364: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 364 de 374

<<<<<<<< otro error que se produce por tener noprefix en el profile es: >>>>>>>> JMP-94 ----------------- Buscar una palabra en una libreria ----------------- OPCION ===> Cadena a buscar: IKJ_______________ Libreria ......: TEST8S.JMP.JCL___________________________ Esta utilidad submite un proceso que se dedica a buscar la cadena especificada entre los miembros la libreria indicada. El resultado le deja en la cola de salida con el nombre: TEST33 y el sufijo ST IKJ56883I DATA SET SUBMIT.D95125.T0094427.CNTL NOT ALLOCATED, REQUEST CANCELED EDIT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ya que no puede alocar el fichero que quiere submitir por no estar autorizado. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Page 365: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 365 de 374

Anexo 2 : Códigos de retorno Los siguientes códigos de retorno corresponden a los codigis devueltos por los servicios que se especifican cuando son invocados mediante la sentencia ISPEXEC: CONTROL 0 normal 4 Se quiere inhibir la facilidad de SPLIT cuando se trabaja en control. Se ignora el SPLIT DISABLE 20 Error grave DISPLAY 0 Normal 4 Algun mandato en el stack no se puede encontrar 8 final por end o Return 12 No se encuentra el objeto invocado (panel, mensaje, cursor) 16 se ha producido un truncamiento al grabar una variable definia 20 Error grave FTCLOSE 0 Normal 4 ya existe el miembro y no se ha indicado NOREPL. El miembro original se mantiene 8 Archivo no abierto (no hay archivo FTOPEN previo) 12 Archivo de salida en uso. 16 Archivo de esqueletos o de salida no asignados 20 Error grave FTERASE 0 Normal 8 el archivo no existe 12 El archivo de salida esta en uso. 16 Libreria alternativa de salida no asignada 20 Error grave FTINCL 0 Normal 8 el esqueleto no existe 12 El esqueleto esta en uso 16 La libreria de esqueletos o el archivo de salida no esta alocado. 20 Error grave

Page 366: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 366 de 374

FTOPEN 0 Normal 8 el "file tailoring" ya se esta ejecutando. 12 La libreria de esqueletos o el archivo de salida no están alocado. 16 El archivo de salida esta en uso. 20 Error grave GETMSG 0 Normal 12 no se encuentra el mensaje 20 Error grave LIBDEF 0 Normal 4 No existe una biblioteca de ese tipo 8 Ya existe una biblioteca de ese tipo (COND) 12 Se ha indicado ISPPROF 16 no se ha alocado la libreria 20 Error grave SELECT 0 Normal por END 4 Normal por RETURN o EXIT 12 No se ha encontrado el panel 16 Se ha trancado ZCMD o ZSEL 20 Error grave SETMSG 0 Normal por END 4 Se ha ejecutado con COND y hay un SETMSG pendiente 12 Mensaje no encontrado 20 Error grave TBADD 0 Normal por END 4 Se ha especificado numero de filas y solo se obtiene espacio para una fila 8 Ya existe una fila con esa clave. CRP=0 12 La tabla esta cerrada 16 Error de conversión a numérico (SOlo en tablas clasificadas) 20 Error grave

Page 367: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 367 de 374

TBBOTTOM 0 Normal 8 La tabla esta vacía. CRP=0 12 La tabla esta cerrada 16 Valor de variable truncado . 20 Error grave TBCLOSE 0 Normal 12 La tabla esta cerrada 16 La biblioteca alternativa de tablas no esta asignada. 20 Error grave TBCREATE 0 Normal 4 Normal. Existe una tabla igual pero se ha indicado REPLACE 8 Ya existe una tabla con el nombre dado y no se ha especificado la opcion REPLACE, o bien, se ha indicado REPLACE pero la dis- posición es SHARE 12 La tabla esta en uso 16 Se ha indicado WRITE y no se ha signado una biblioteca alter- nativa 20 Error grave TBDELETE 0 Normal 8 En tablas con clave: No existe la fila a modificar (CRP=0) En tablas sin clave: el CRP esta en el TOP y ahi sigue. 12 La tabla no esta abierta. 20 Error grave TBEND 0 Normal 4 La tabla no esta abierta. 20 Error grave TBERASE 0 Normal 8 No existe la tabla en la libreria de salida. 12 La tabla esta en uso. 16 La libreria de tablas de salida no esta abierta. 20 Error grave

Page 368: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 368 de 374

TBEXIST 0 Normal. El CRP se posiciona en la fila indicada. 8 En tablas con clave: No existe la fila indicada (CRP=0) En tablas sin clave: No se puede invocar este servicio (CRP=0) 12 La tabla no esta abierta 20 Error grave TBGET 0 Normal. 8 En tablas con clave: No existe la fila indicada (CRP=0) En tablas sin clave: El CRP estaba en el TOP y alli se queda. 12 La tabla no esta abierta 16 Valor de la variable truncado 20 Error grave TBMOD 0 Normal. En tablas con clave: La fila se ha actualizado (CRP=0) En tablas sin clave: La fila se ha añadido 8 Solo en tablas con clave: La fila se ha añadido 12 La tabla no esta abierta 16 Error de conversión. Solo en tablas clasificadas. 20 Error grave TBOPEN 0 Normal. 8 La tabla no existe 12 Fallo de ENQ: Esta en uso por este u otro usuario 16 No esta signada la libreria de tablas de entrada. 20 Error grave TBPUT 0 Normal. 8 En tablas con clave: La clave no coincide con la apuntada por el CRP (el CRP se pone a 0) En tablas sin clave: El CRP esta en el TOP y alli se mantiene. 12 La tabla no esta abierta 16 Error de conversión en tablas aplicadas 20 Error grave TBSAVE 0 Normal. 12 La tabla no esta abierta 16 No esta signada la libreria de salida. 20 Error grave

Page 369: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 369 de 374

TBSKIP 0 Normal. 8 El salto especificado sobrepasa el numero de filas de la tabla 12 La tabla no esta abierta 16 Valor de la variable truncado 20 Error grave TBSORT 0 Normal. 12 La tabla no esta abierta 16 Error de conversión en tablas aplicadas 20 Error grave TBTOP 0 Normal. 12 La tabla no esta abierta 20 Error grave TBVCLEAR 0 Normal. 12 La tabla no esta abierta 20 Error grave VCOPY 0 Normal. 8 No existe alguna variable 16 Valor de la variable truncado 20 Error grave VDEFINE 0 Normal. 8 No existe alguna variable 16 Valor de la variable truncado 20 Error grave VDELETE 0 Normal. 8 No existe alguna variable 20 Error grave

Page 370: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 370 de 374

VERASE 0 Normal. 8 No existe alguna variable 20 Error grave VGET 0 Normal. 8 No existe alguna variable 16 Valor de la variable truncado 20 Error grave VPUT 0 Normal. 8 No existe alguna variable 16 Valor de la variable truncado al grabar las variables en el pool profile 20 Error grave VREPLACE 0 Normal. 16 Valor de la variable truncado. 20 Error grave VRESET 0 Normal. 20 Error grave

Page 371: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 371 de 374

Anexo 3 : Variables del sistema en ISPF Este anexo especifica los nombres de variables del sistema que pueden ser usados en ISPF, con indicación del pool al que pertenecen, formato y descripción. FECHA Y HORA ************ -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZDATE Shr NM 8 Fecha actual ZDATEF Shr NM 8 Fecha actual con delimimtador dependiendo del idioma (DD/MM/YY,YY/MM/DD,MM.DD.YY,...) ZDATEFD Shr NM 8 Fecha actual como en ZDATEF pero con los caracteres que se especifiquen ZDAY Shr NM 2 Día del mes ZJDATE Shr NM 6 Fecha Juliana en formato (YY.DDD) ZMONTH Shr NM 2 Mes del año Ztime Shr NM 5 Hora en formato (hh:mm) Zyear Shr NM 2 Año -------- ---- ---- ---- --------------------------------------------- GENERAL ******* -------- ---- ---- ---- --------------------------------------------- Z Shr NM 0 Variable nula Zapplid Shr NM 8 Identificador de la aplicacion Zenvir Shr NM 32 Descripción del entorno : de 1:08 Nombre producto, versión y release 9:16 Sistema operativo 17:24 Entorno de operación (TSO o BATCH) 25:32 Reservado Zispfrc Shr I 8 Código de retorno de ISPSTART Zlang Pro nm 8 Idioma Zlogon Shr nm 8 Procedimiento de Logon Zplace pro I/O 7 Posición de la línea de comando (ASSIS/BOTTOM) Zprefix Shr nm 8 Prefijo TSO Zprofapp pro I 8 Nombre de la tabla extensión del profile pool Ztempf Shr nm 44 Nombre del archivo temporal usado para el proceso de file tailoring Ztempn Shr nm 8 DDname del archivo temporal usado en el proceso de file tailoring. Zuser Shr nm 8 Identificacion del usuario Zsysid Shr nm 4 Identificacion del entorno -------- ---- ---- ---- ---------------------------------------------

Page 372: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 372 de 374

TERMINAL Y TECLAS DE FUNCION **************************** -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZCOLORS Shr no m 4 Numero de colores soportados por el terminal ZFKA Shr no m 3 Formato del area de visualización de PFs (Long,Short,no) ZHILITE Shr no m 3 especificación de si el terminal soporta brillo (YES,NO) ZKEYS Prof S 4 Numero de teclas PF ZPFCTL Prof E/S 5 Autorizacion al mandato PFSHOW ZPFFMT Prof E/S 4 Numero de PFs visualizadas por línea ZPFSET Prof E/S 4 PFs visualizadas ZPFSHOW Prof E/S 8 Estado del parámetro PFSHOW ZPFxx Prof E/S 255 Valor asignado a la PF de numero xx ZPF13-ZPF24 : primarias ZPF01-ZPF12 : alternativas ZPFLxx Prof E/S 8 Valor asignado a las etiquetas de la PF xx. ZPFL13-ZPFL24 : primarias ZPFL01-ZPFL12 : alternativas ZPRIKEYS Prof E/S 4 especifica el conjunto de PFs que será tratado como conjunto primario. LOW especifica el conjunto 01 A 12 UPP especifica el conjunto 13 a 24 ZSCREEN Shr no m 1 Numero de pantalla lógica (rango: 1-4) ZSCREEND Shr no m 4 Numero de líneas de la pantalla disponibles ZSCREENW Shr no m 4 Numero de columnas de la pantalla disponibles ZSCRMAXD Shr no m 4 Numero máximo de líneas por pantalla ZSCRMAXW Shr no m 4 Numero máximo de columnas de la pantalla ZSPLIT Shr no m 4 Pantalla partida (YES,NO) ZTERM Shr no m 4 Tipo de terminal definido en PROFILE de ISPF (opcion 0) -------- ---- ---- ---- --------------------------------------------- ARCHIVOS LOG Y LIST ******************* -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZLOGNAME Shr no m 44 Nombre del archivo de log ZLSTNAME Shr no m 44 Nombre del archivo de list -------- ---- ---- ---- ---------------------------------------------

Page 373: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 373 de 374

DESPLAZAMIENTO DE PANTALLAS *************************** -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZSCBR Prof E/S 4 Desplazamiento en BROWSE ZSCED Prof E/S 4 Desplazamiento en EDIT ZSCML Prof E/S 4 Desplazamiento en listas de miembros ZSCROLLA Shr S 4 Valor del despalzamiento (PAGE,MAX,numero) ZSCROLLN Shr S 4 Numero calculado dependiendo de ZSCROLLA ZSCROLLD Shr S 4 Valor por omisión utilizado en visualización de tablas y areas dinamicas. -------- ---- ---- ---- --------------------------------------------- Mandato PRINTG ************** -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZFAMPRT Func no m 4 Tipo de impresora para PRINTG ZDEVNAM Func E 8 Nombre del dispositivo para PRINTG ZASPECT Func E 4 -------- ---- ---- ---- --------------------------------------------- Servicio LIST ************* -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZLSTLPP Shr no m 4 Numero de líneas por página en archivo list ZLSTNUML Shr no m 4 Numero de líneas impresas en la página actual ZLSTTRUN Shr no m 4 Longitud del registro -------- ---- ---- ---- --------------------------------------------- Errores ******* -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZERRHM Func S 8 Nombre del panel de ayuda asociado al mensaje ZERRMSG Func S 8 Identificador del mensaje ZERRSM Func S 24 Texto del mensaje corto ZERRLM Func S 78 Texto del mensaje largo ZERRALRM Func S 3 Indicador de alarma (YES o NO) -------- ---- ---- ---- ---------------------------------------------

Page 374: Tso Para Desarrolladores Nr 33933

TSO para desarrolladores: ANEXOS Autor: José M. Peco

Página 374 de 374

Servicio TBDISPL **************** -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZTDMARK ? E ? Marca de fin de datos ZTDMSG ? E 8 Marca de inicio de datos ZTDROWS Func S 6 Numero de filas de la tabla ZTDLROWS Func E 6 Numero de filas en la tabla lógica ZTDSELS Func S 4 Numero de filas seleccionadas ZTDTOP Func S 6 CRP de la fila superior del display ZTDLTOP Func E 6 posición de la fila actual de la tabla ZTDRET Func E 8 Indica si el dialogo quiere utilizar la posi- bilidad de desplazamiento ZTDADD Func S 3 Indica si son presisas mas filas para satisfa- cer la peticion de despalzamiento (YES o NO) ZTDSCRP Func E/S 6 CRP de la fila que será mostrada como primera después del desplazamiento. ZTDSRID Func S 6 Identificacion de la fila apuntada por ZTDSCRP ZTDAMT Func S 4 Numero de filas que el dialogo debe añadir para satisfacer la peticion de despalzamiento ZTDSIZE Func S 4 Numero de modelos de la parte desplazable -------- ---- ---- ---- --------------------------------------------- En paneles de ayuda ******************* -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZCONT Nombre del siguiente panel ZHINDEX Nombre del primer panel índice ZHTOP Nombre del panel superior ZIND YES indica una página de índice ZUP nombre del panel padre -------- ---- ---- ---- --------------------------------------------- En paneles de menú ****************** -------- ---- ---- ---- --------------------------------------------- NOMBRE POOL TIPO LONG DESCRIPCION -------- ---- ---- ---- --------------------------------------------- ZCMD Campo de entrada de mandatos ZPARENT Nombre del menú padre ZPRIM YES indica que se trata de un menú primario ZSEL ZCMD truncado en el primer punto -------- ---- ---- ---- ---------------------------------------------