Desarrollando en Cobol y Natural sobre Plataforma Mainframe

viernes, 15 de agosto de 2014

Nos vamos de vacaciones

Pues nada, como hacemos todos los años por estas fechas, ahora nos vamos a tomar unas semanas de vacaciones para desconectar un poco del día a día. Aunque no lo notemos de forma consciente, la verdad es que la tensión diaria se va acumulando durante todo el año, así que se agradecen estas pausas para descansar.




Los que os estéis iniciando ahora en este mundo del Host, podéis aprovechar el mes de agosto para estudiaros algún libro de texto sobre el tema. Si lo hacéis así, ya veréis como en septiembre notaréis que tenéis más seguridad a la hora de programar en Cobol. Al fin y al cabo, la clave está en practicar...

¡Hasta la vuelta!

Saludos.

jueves, 14 de agosto de 2014

Creación de fichero VSAM mediante JCL (y 2)

Hace unas semanas comenzamos a ver cuáles eran los pasos que debíamos seguir para la construcción de un JCL cuya función fuese la generación de un fichero VSAM mediante la utilidad IDCAMS (ver post Creación de fichero VSAM mediante JCL - 1). Hoy trataremos de completar la descripción del proceso.

Recordemos que en esa primera parte habíamos hablado de los pasos de borrado y de carga de datos, así como de la declaración de las cards SYSPRINT y SYSIN del paso de creación del fichero VSAM. A continuación, terminaremos de ver las declaraciones necesarias para el mencionado paso de creación.



3º) Declaración DEFINE: El comando DEFINE sirve para indicar a la utilidad IDCAMS que tiene que proceder a la creación de un fichero VSAM.  Esta cláusula se divide en 3 partes:

a) Cláusula CLUSTER: Aquí es donde se deberá indicar el nombre del fichero VSAM y las características asociadas a dicho fichero. En el ejemplo, este fichero se denominará JJ00.FACTURAS.PEND.

  DEFINE CLUSTER ( NAME (JJ00.FACTURAS.PEND) -

Al dar de alta el fichero, tendremos que especificar una serie de datos precisados para la creación del mismo.

- TRACKS: Espacio de almacenamiento requerido por el VSAM.

- RECORDSIZE: Tamaño del registro almacenado en el fichero.

- FREESPACE: Para los ficheros indexados, esto especifica el porcentaje de espacio que deseamos establecer como espacio reservado (para futuras expansiones) cuando el CLUSTER sea inicialmente cargado o cuando se realice una inserción masiva sobre el mismo.

- VOLUMES: Unidad en la que se almacenará el fichero.

- SHAREOPTIONS: Sirve para indicar la forma en que el CLUSTER puede ser compartido, de manera que varios jobs puedan acceder al VSAM al mismo tiempo. Se debe indicar la Región (CICS) y el Sistema (MVS).

- KEYS: En los ficheros indexados deberá indicarse cuál es el campo clave del registro. Posteriormente, podremos localizar un registro específico simplemente con indicar el valor del campo clave, ya que no podrá estar repetido en dos registros diferentes.

- UNIQUE: Esto se indica cuando deseamos que nuestro CLUSTER no forme parte de un espacio de datos (dataspace) que contenga otros CLUSTER. De este modo, en la unidad se crea un nuevo espacio de datos que queda reservado enteramente para nuestro CLUSTER (por tanto, debe existir espacio libre en las unidades especificadas para realizar esta acción).

- IMBED: Sirve para indicar que los registros de secuencia de conjunto deben ser insertados en el componente de datos del CLUSTER.

- INDEXED: Aquí tendremos que indicar qué tipo de fichero VSAM queremos dar de alta: NONINDEXED para ficheros secuenciales (ESDS), INDEXED para ficheros indexados (KSDS), NUMBERED para ficheros relativos (RRDS) o LINEAR para ficheros lineales (LDS).

                   TRACKS (02 00) -
                   RECORDSIZE (80 80) -
                   FREESPACE (00 00) -
                   VOLUMES (E3WK01) -
                   SHAREOPTIONS (2 3) -
                   KEYS (6 1) -
                   UNIQUE -
                   IMBED ) -


b) Cláusula DATA: Al tratarse de un fichero VSAM indexado (es decir, de tipo KSDS), aquí podremos indicar el nombre del fichero de datos asociado. En el ejemplo, este fichero se denominará JJ00.FACTURAS.PEND.DATA. Recordemos que los KSDS emplean dos subficheros para el tratamiento de la información: uno para el almacenamiento de los índices y otro para el almacenamiento de los datos asociados a cada índice.

            DATA ( NAME (JJ00.FACTURAS.PEND.DATA) ) -

c) Cláusula INDEX: Del mismo modo, al tratarse de un fichero VSAM indexado, aquí podremos indicar el nombre del fichero de índices asociado. En el ejemplo, este fichero se denominará JJ00.FACTURAS.PEND.INDEX.

           INDEX ( NAME (JJ00.FACTURAS.PEND.INDEX) )

Una vez especificados todos los parámetros anteriores, ya estaremos preparados para lanzar el JCL con el paso de creación del fichero VSAM (indexado, en este caso). Aunque hay gran cantidad de parámetros, si los indicamos tal y como aparecen más arriba, en principio no deberíamos tener problemas en el momento de la ejecución.

En nuestro ejemplo, tras ejecutar el job pudimos comprobar que se había generado el fichero VSAM correspondiente (JJ00.FACTURAS.PEND) y sus dos subficheros asociados (JJ00.FACTURAS.PEND.DATA y JJ00.FACTURAS.PEND.INDEX).

- Enter "/" to select action             Message      Volume
------------------------------------------------------------- 

 JJ00.FACTURAS.PEND                                   *VSAM*
 JJ00.FACTURAS.PEND.DATA                              ZARES1
 JJ00.FACTURAS.PEND.INDEX                             ZARES1
**************** End of Data Set list ***********************


Como se puede apreciar, el Data Set JJ00.FACTURAS.PEND aparece con la etiqueta *VSAM* en la columna "Volume", lo que lo identifica claramente como un fichero VSAM. Junto a él, podemos observar la presencia de los ficheros DATA e INDEX.



Finalmente, comentar que, aunque el ejemplo lo hemos realizado para un fichero KSDS, el código podría ser fácilmente adaptado para ficheros VSAM secuenciales (ESDS) o ficheros VSAM relativos (RRDS), ya que el procedimiento de generación es bastante similar.

Y eso es todo. Esperemos que lo comentado sirva para arrojar un poco más de luz sobre los ficheros VSAM y que os permita realizar la generación de los mismos sin problema alguno.

Saludos.

miércoles, 13 de agosto de 2014

Test de conocimientos de Cobol CICS DB2

Para el que se aburra durante estos días de verano y quiera evaluar su nivel de conocimientos de COBOL / CICS / DB2, aquí os traemos un interesante test que servirá para cumplir dicha función. No tardaremos mucho tiempo en realizarlo y siempre nos permitirá aprender alguna cosa nueva.

Recordad que, como ya sabemos, en un test también influye un poco la suerte (ya que todo depende del tipo de preguntas que nos hagan) y, por tanto, es posible que vuestro nivel real difiera bastante de la puntuación obtenida aquí. Pero bueno, como mínimo nos servirá para pasar un rato entretenido.

El tiempo límite para la realización del test no debería ser superior a 20 minutos (si pasado ese tiempo no lo habéis completado, entonces es que realmente no sabéis la respuesta de las cuestiones restantes). El listado de las preguntas es el siguiente.



=============================================================

1º) ¿Qué es el CICS?

   a) Un sistema operativo.
   b) Un middleware.
   c) Un protocolo de red.
   d) Una aplicación de usuario.

2º) Cuando un usuario introduce una transacción, ¿qué componente CICS valida el código de transacción?

   a) Terminal Control
   b) Task Control
   c) Program Control
   d) Transaction Control

3º) Si dos usuarios introducen el mismo identificador de Transacción, CICS carga dos copias del programa inicial, una para cada usuario.

   a) Verdadero.
   b) Falso.

4º) ¿Qué acción tiene que realizar un programador para asegurarse de que CICS copia el bloque DFHEIBLK en un programa de una aplicación?

   a) COPY DFHEIBLK
   b) INCLUDE DFHEIBLK
   c) COPY DFHCOMMAREA
   d) Ninguna de las anteriores

5º) Cuando se codifica el comando de control de terminal RECEIVE (puntualizar que no hablamos del comando BMS RECEIVE MAP), ¿cuál de las siguientes es considerada una condición de excepción normal?

   a) NORMAL
   b) EOC
   c) LENGERR
   d) (a) y (b)
   e) Todas las anteriores

6º) Las dos condiciones siguientes son equivalentes:
   I) IF EIBRESP NOT EQUAL DFHRESP(NORMAL)
   II) IF EIBRESP EQUAL DFHRESP(ERROR)

   a) Verdadero
   b) Falso

7º) Para colocar el cursor en una posición particular de la pantalla, se debe usar el comando SEND CONTROL.

   a) Verdadero
   b) Falso

8º) Para ejecutar una nueva transacción en CICS por primera vez, los únicos requisitos son que el programa esté precompilado, compilado y linkeditado.

   a) Verdadero
   b) Falso

9º) ¿Cuál de las siguientes acciones no se puede realizar con la herramienta CEDF?

   a) Modificar todos los comandos CICS
   b) Modificar todas las condiciones de excepción
   c) Cambiar la WORKING STORAGE de los programas
   d) Elegir no ejecutar todos los comandos CICS (opción NOOP)
   e) Producir un ABEND en una tarea
   f) Debug de un programa que está ejecutándose en otro terminal

10º) Para desencadenar un ABEND de una tarea desde CEDF, se debe presionar dos veces la tecla función ABEND.

   a) Verdadero
   b) Falso

=============================================================



Las soluciones a las cuestiones anteriores son las siguientes: 1º) b, 2º) b, 3º) b, 4º) d, 5º) d, 6º) b, 7º) a, 8º) b, 9º) a y 10º) a. Es importante que intentéis agotar los 20 minutos tratando de deducir las respuestas antes de recurrir a la resolución. Nunca viene mal esforzarse un poco...

En función de los aciertos que hayamos tenido en el quiz, nos encontraremos en un grupo de conocimiento u otro. A continuación podéis echarle un vistazo a la categoría que os corresponda.

A) Ocho aciertos o más: Se nota que esto del Cobol se te da bien aunque, por otra parte, es normal ya que seguramente tengas muchos años de experiencia con el entorno CICS.

B) Seis o siete aciertos: Tienes bastantes conocimientos de Cobol CICS, y probablemente dentro de algún tiempo sustituirás a los programadores más veteranos de este entorno.

C) Cuatro o cinco aciertos: Es evidente que sabes muchas cosas sobre Cobol, aunque todavía te queda bastante margen para mejorar. Hay que ganar un poco más de experiencia.

D) Dos o tres aciertos: Bueno, posiblemente eres un programador novato en el mundo del Cobol. Pero no te desanimes, en algún momento hay que empezar y tarde o temprano acabarás dominando el lenguaje.

E) Menos de dos aciertos: Probablemente todavía no has estudidado Cobol CICS con suficiente profundidad como para afrontar un test de este tipo. Tienes que decidir si este mundo es lo que te interesa o no.



De todas formas, os volvemos a recordar lo que dijimos al principio. En un test también interviene el azar y, por tanto, es posible que el resultado no coincida exactamente con vuestra experiencia en Cobol. Puede haber ocurrido que las 10 cuestiones de este test sean justo las que todavía no os sabéis o, al contrario, es posible que estas sean las únicas 10 preguntas que seríais capaces de responder en relación con el Cobol CICS. Cuando hablamos de test, nunca hay que descartar el factor fortuna.

Pues nada, aparte de esto, esperamos que al menos os hayáis divertido durante 20 minutos respondiendo a las diversas cuestiones del test. En un futuro, si tenemos tiempo, trataremos de ir incluyendo más quiz de este tipo en el blog.

Saludos.

jueves, 7 de agosto de 2014

Creación de fichero VSAM mediante JCL (1)

Hace algún tiempo estuvimos viendo la forma de generar un fichero VSAM mediante la opción "VSAM Utilities" del ISPF (ver post Creación de fichero VSAM mediante ISPF). Hoy veremos cómo se puede realizar esta misma acción mediante el lanzamiento de un JCL previamente configurado.

En realidad, una vez tengamos claro cómo hay que parametrizarlo, lo más normal es que prefiramos la opción de generación del VSAM mediante JCL frente a la generación mediante ISPF. Obviamente, es mucho más rápido y cómodo lanzar un JCL que tener que ir detallando todos los datos que se solicitan en la opción "VSAM Utilities".



A continuación vamos a mostrar un ejemplo de cómo se debería implementar, en un JCL, el paso de creación de un fichero VSAM de tipo KSDS (indexado).

//****************************************************
//DELETE   EXEC PGM=IDCAMS
//SYSPRINT DD   SYSOUT=*
//SYSIN    DD   *
  DELETE  (JJ00.FACTURAS.PEND)

//****************************************************
//DEFINE   EXEC PGM=IDCAMS
//SYSPRINT DD   SYSOUT=*
//SYSIN    DD   *
  DEFINE CLUSTER ( NAME (JJ00.FACTURAS.PEND) -
                   TRACKS (02 00) -
                   RECORDSIZE (80 80) -
                   FREESPACE (00 00) -
                   VOLUMES (E3WK01) -
                   SHAREOPTIONS (2 3) -
                   KEYS (6 1) -
                   UNIQUE -
                   IMBED ) -
            DATA ( NAME (JJ00.FACTURAS.PEND.DATA) ) -
           INDEX ( NAME (JJ00.FACTURAS.PEND.INDEX) )
/*

//****************************************************
//REPRO    EXEC PGM=IDCAMS
//ORIGEN   DD   DSN=JJ00.FACTURAS.ORIGEN,DISP=SHR
//SYSPRINT DD   SYSOUT=*
//SYSIN    DD   *
  REPRO INFILE (ORIGEN) OUTDATASET (JJ00.FACTURAS.PEND)
/*

//****************************************************

Como vemos, el código anterior se compone de 3 pasos y no sólo de uno. Esto es debido a que, junto al paso de creación del VSAM (DEFINE), hemos añadido un paso previo de borrado del registro existente (DELETE) y un paso posterior de carga de datos del fichero (REPRO).

El paso DELETE sirve para comprobar si ya existe un fichero con el nombre con el que pretendemos crear el VSAM. Y, en caso de que se encuentre alguno, procede a su borrado ya que, si no hiciésemos esto, el paso DEFINE de creación daría un error al verificarse que ya existe una entidad con el nombre propuesto.

Por otra parte, el paso REPRO nos sirve para, una vez creado el VSAM, cargarlo con información procedente de otro fichero origen (cuyo nombre también tendremos que especificar). En el ejemplo, estamos volcando la información del fichero JJ00.FACTURAS.ORIGEN al fichero VSAM denominado JJ00.FACTURAS.PEND.

Centrándonos ya en el propio paso de creación del VSAM (DEFINE), vemos que consiste en una invocación de la utilidad IDCAMS que lleva asociada una serie de parámetros. A continuación vemos en qué consiste cada uno de ellos.

1º) Declaración SYSPRINT: Aquí tenemos que indicar el lugar al que deseamos que se envíen todos los mensajes generados durante el proceso de ejecución. Si ponemos SYSOUT=* entonces dicha información se enviará directamente al SPOOL (a la MSGCLASS indicada en nuestro job).

//SYSPRINT DD   SYSOUT=*

2º) Declaración SYSIN: Son las sentencias de control de entrada para el programa. En este caso, la utilidad IDCAMS lleva asociada la sentencia DEFINE, que deberá ser especificada justo debajo de la declaración SYSIN.

//SYSIN    DD   *



El próximo día seguiremos viendo cuáles son las declaraciones que debemos realizar en nuestro JCL para conseguir que IDCAMS realice la creación del fichero VSAM buscado. La cláusula DEFINE CLUSTER es la más importante del paso y, por tanto, aquella en la que habrá que poner más cuidado a la hora de definir los parámetros requeridos.

Eso es todo por hoy. Os emplazamos a la segunda parte del post para continuar con la descripción del proceso a realizar para completar la puesta a punto nuestro JCL.

Saludos.

Related Posts Plugin for WordPress, Blogger...