Desarrollando en Cobol y Natural sobre Plataforma Mainframe

viernes, 3 de octubre de 2014

Web dinámica, veloz y colorida




Saludos.

jueves, 2 de octubre de 2014

Estructura básica de un programa Cobol (1)

Hoy vamos a tratar un tema muy básico de nuestro lenguaje pero para el que, sin embargo, hemos recibido varias cuestiones de lectores principiantes en el mundo Cobol. Se trata de identificar cuáles son todos los apartados que debe incorporar un programa Cobol estándar.

Al principio, si no estamos acostumbrados a trabajar con Cobol, nos puede parecer un poco rígida la forma en que se estructuran los programas en este lenguaje. Sin embargo, una vez vayamos ampliando nuestra experiencia, nos daremos cuenta de que la cosa es tan sencilla como pueda serlo en cualquier otro lenguaje de programación.



Un programa Cobol está estructurado en una serie de Divisiones, Secciones y Párrafos en los que hay que ir declarando la información que corresponda a cada una de ellas. La estructura general sería la siguiente:

IDENTIFICATION DIVISION
   PROGRAM-ID
   AUTHOR
   INSTALLATION
   DATE-WRITTEN
   DATE-COMPILED
   SECURITY

ENVIRONMENT DIVISION

   CONFIGURATION SECTION
      SOURCE-COMPUTER
      OBJECT-COMPUTER
      SPECIAL-NAMES

   INPUT-OUTPUT SECTION
      FILE CONTROL
      I-O-CONTROL

DATA DIVISION

   FILE SECTION
      ...
      FICHERO
         REGISTRO
      ...

   WORKING-STORATE SECTION
      ...
      VARIABLE
      ...

   LINKAGE SECTION
      ...
      PARAMETRO
      ...

PROCEDURE DIVISION
   ...
   SECCION
      PARRAFO
         SENTENCIA
   ...

A continuación, comentamos un poco más en detalle en qué consiste cada una de las Divisiones y Secciones enumeradas anteriormente.

1º) IDENTIFICATION DIVISION

Esta División se utiliza para declarar una serie de variables globales asociadas al programa, tales como el nombre del objeto (PROGRAM-ID), el nombre del autor del objeto (AUTHOR), la instalación (INSTALLATION), las fechas de codificación y de compilación (DATE-WRITTEN y DATE- COMPILED) y la seguridad (SECURITY). En general, se trata de datos informativos que no tienen mayor impacto en la codificación posterior del programa.

IDENTIFICATION DIVISION
   PROGRAM-ID
   AUTHOR
   INSTALLATION
   DATE-WRITTEN
   DATE-COMPILED
   SECURITY 

2º) ENVIRONMENT DIVISION

Esta División se compone de dos importantes secciones, CONFIGURATION SECTION e INPUT-OUTPUT-SECTION, cuyo contenido pasamos a detallar a continuación.

ENVIRONMENT DIVISION

A) CONFIGURATION SECTION

Aquí se especifica información relevante para el programa. Por un lado, se debe indicar el nombre de la máquina empleada para la codificación (SOURCE-COMPUTER y OBJECT-COMPUTER). Por otro lado, en el apartado SPECIAL-NAMES hay que detallar las configuraciones especiales que vaya a tener nuestro programa.

Este último apartado tiene su importancia. En general, en Europa se emplea para hacer la declaración DECIMAL POINT IS COMMA, que le indica al compilador que, en nuestro programa, la parte decimal de un número va a ir precedida de una coma (,) y no de un punto (.) como ocurre en EEUU.

   CONFIGURATION SECTION
      SOURCE-COMPUTER
      OBJECT-COMPUTER
      SPECIAL-NAMES 

B) INPUT-OUTPUT SECTION

En esta sección, en el apartado FILE CONTROL hay que especificar el nombre de los ficheros que se tratarán en nuestro fuente. Se indicará la equivalencia entre el nombre lógico que va a tener un determinado fichero en el programa Cobol y el nombre externo que tendrá en el JCL que lo invoque. Este apartado sólo se rellenará si nuestro objeto va a estar insertado en un proceso batch (por contra, no se usará si se va a tratar de un programa CICS on-line).

Adicionalmente, en esta sección aparece también el apartado I-O-CONTROL, que se usará para indicar el área de memoria que va a ser compartida por los ficheros utilizados en el programa. Este segundo apartado es opcional.

   INPUT-OUTPUT SECTION
      FILE CONTROL
      I-O-CONTROL

El próximo día continuaremos revisando las dos últimas Divisiones del programa Cobol, junto con todas las secciones contenidas en ellas. Os adelantamos que hablaremos de la "Data Division" y de la "Procedure Division", aunque ya las revisaremos en detalle en el siguiente post.

Y eso es todo. Ya sólo nos queda emplazaros a la segunda parte para que podamos completar la revisión de todas las Divisiones y secciones de la estructura básica de un programa Cobol.

Saludos.

jueves, 25 de septiembre de 2014

Acceso a Archivos UNIX desde ZOS mediante ISPF

Aunque no sea muy conocida por la mayoría de los programadores Cobol, desde el sistema operativo ZOS existe la posibilidad de entrar al entorno UNIX mediante la herramienta ISPF. De hecho, este "UNIX ZOS" acepta los mismos comandos que el estándar, así que los expertos en dicho entorno no tendrán problemas para adaptarse.

La herramienta ISPF nos permite acceder al entorno UNIX desde el entorno tradicional ZOS mediante el empleo de los servicios USS (Unix System Services). Gracias a ello, podemos teclear comandos desde el entorno ZOS del mismo modo que si nos encontrásemos en un entorno UNIX puro.



En realidad, se trata de dos utilidades diferenciadas. Una de ellas, denominada TSO OMVS, sirve para ejecutar los comandos UNIX estándar y la otra, denominada ZOS UDL, nos permite visualizar el contenido de los archivos y directorios UNIX que tenemos asignados. Hoy vamos a revisar esta última.

Para acceder a esta utilidad, partiendo desde el menú POM (Primary Option Menu) del ISPF, tendremos que seguir los siguientes pasos.

1º) Opción Utilities: Seleccionamos la opción 3 - Utilities - Perform utility functions.

3  Utilities     Perform utility functions 

2º) Opción Udlist: Seleccionamos la opción 17 - Udlist - Print or display (to process) z/OS UNIX directory list.

17 Udlist      Print or display (to process) z/OS UNIX directory list

3º) Accedemos al panel z/OS UNIX Directory List Utility, donde tendremos que introducir el pathname en el que tengamos almacenados nuestros archivos Unix. En nuestro ejemplo, es el /u/JJST029 ("u" corresponde a Unix y "JJST029" es nuestro código de usuario).



4º) A continuación, accedemos a un panel en el que se muestran todos los archivos (filenames) que hay disponibles en nuestro directorio.

Pathname . : /u/JJST029                                            
                                                                   
Command  Filename        Message          Type Permission Audit  Ext
---------------------------------------------------------------------
         .                                Dir  rwxr-xr-x  fff---   
         ..                               Dir  r-xr-xr-x  ------   
         .sh_history                      File rw-------  fff--- --s-
         ds.lst                           File rw-------  fff--- --s-
         etc.lst                          File rw-------  fff--- --s-
         jjst                             File rwx-w----  fff--- --s-
         Welcome                          File rw-------  fff--- --s-
******************************* Bottom of data **********************


Aquí se podrá trabajar con los archivos y los directorios que tenemos almacenados en nuestro entorno UNIX. Podremos crear, borrar, editar o ver el contenido de cualquiera de los ficheros que se muestren en el listado anterior.

5º) Por ejemplo, podríamos proceder a visualizar el contenido de nuestro archivo denominado "jjst". Para ello, ponemos una B (browse) delante del mismo y pulsamos INTRO.

 BROWSE    /u/JJST029/jjst                            Line 0000
 Command ===>                                                 
********************************* Top of Data *****************
hola unix                                                     
******************************** Bottom of Data ***************


En este caso se muestra el texto "hola unix", que es el contenido que previamente habíamos dado de alta en el archivo jjst.

Como vemos, es muy sencillo ver nuestro archivos UNIX desde ZOS mediante esta opción del ISPF. Este panel nos puede ayudar a trabajar de una manera cómoda con los ficheros almacenados en UNIX, independientemente de si se han creado mediante la utilidad TSO OMVS mencionada al principio (que simula el entorno UNIX) o mediante un JCL que ha enviado nuestro dataset al directorio UNIX.

En un futuro publicaremos otro post en el que explicaremos cómo se puede generar un archivo desde un JCL y dejarlo, con el nombre que queramos, en nuestro directorio UNIX ZOS asignado para que podamos operar con él desde el panel "z/OS UNIX Directory List Utility" (utilidad UDL) que hemos visto hoy.

Pues nada, esperamos que lo comentado sirva para que, los que no conocíais esta opción, a partir de ahora sepáis que siempre podremos trabajar desde el entorno UNIX con los ficheros que deseemos, sin más que enviarlos al directorio asignado.

Saludos.

jueves, 18 de septiembre de 2014

Utilización de Ficheros In-Stream en JCL

En ocasiones, cuando deseamos probar un procedimiento o un programa que acabamos de codificar, no queremos perder el tiempo creando todos los ficheros secuenciales precisados por el mismo. En esos casos, por contra, nuestro objetivo es completar dicha prueba en el menor tiempo posible. Afortunadamente, para cubrir esta necesidad disponemos de los ficheros In-Stream.

Los ficheros In-Stream son aquellos cuyos registros se definen en el propio código del JCL, eliminando así la necesidad de crear un dataset secuencial para almacenarlos. La ejecución del JCL leerá esos registros in-stream de manera idéntica a como lo haría si estuviesen contenidos en un fichero secuencial estándar.



A continuación, mostramos un ejemplo de utilización de un fichero In-Stream en un paso JCL. En particular, aquí se está empleando en conjunción con la utilidad IEBGENER.

//PASO1    EXEC PGM=IEBGENER                          
//SYSPRINT DD SYSOUT=*                                
//SYSIN    DD DUMMY                                   
//SYSUT2   DD SYSOUT=*                                
//SYSUT1   DD DATA *    INICIO IN-STREAM              
1111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444
5555555555555555555555555555555555555555555555555555555

/* FIN IN-STREAM                                      
// 
                                                 

En este ejemplo, la idea es que el programa IEBGENER recoja los registros de un fichero de entrada (en la card SYSUT1) y los envíe a la salida (card SYSUT2). Debido a que en la salida estamos incluyendo la expresión SYSOUT=*, entonces lo que se hará es enviar los registros leidos al SPOOL.

Como se puede observar, en la DD de la card SYSUT1 no estamos incluyendo una declaración DSN seguida del nombre del fichero secuencial de entrada, como se haría en un proceso estándar. En su lugar, estamos provisionando la cláusula DATA *, que es la que marca el inicio del fichero In-Stream.

Bajo la declaración DATA * se deben introducir los registros de datos que formarán parte de nuestro fichero. En el ejemplo vemos que aparecen 5 registros de 55 posiciones cada uno. Su contenido se detalla del mismo modo que si estuviésemos escribiendo la información en un fichero secuencial.

//SYSUT1   DD DATA *    INICIO IN-STREAM              
1111111111111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444444444444444
5555555555555555555555555555555555555555555555555555555

/* FIN IN-STREAM 

Cuando ejecutemos este paso JCL, la utilidad IEBGENER leerá los 5 registros del fichero In-Stream de manera exactamente igual a como lo haría si los estuviese recuperando de un dataset secuencial. La salida se mostrará en el SPOOL, tal y como habíamos indicado.

 COMMAND INPUT ===>                                           
IEF142I JJ00Z PASO1 - STEP WAS EXECUTED - COND CODE 0000   
IEF285I   JJ00.JJ00Z.JOB04550.D0000102.?         SYSOUT 
IEF285I   JJ00.JJ00Z.JOB04550.D0000103.?         SYSOUT 
IEF285I   JJ00.JJ00Z.JOB04550.D0000101.?         SYSIN  
IEF373I STEP/PASO1   /START 2014157.0931                      
IEF032I STEP/PASO1   /STOP  2014157.0931                      
        CPU:     0 HR  00 MIN  00.00 SEC    SRB:     0 HR  00 M
        VIRT:    60K  SYS:   308K  EXT:        0K  SYS:    1121
IEF375I  JOB/JJ00Z/START 2014157.0931                      
IEF033I  JOB/JJ00Z/STOP  2014157.0931                      
        CPU:     0 HR  00 MIN  00.00 SEC    SRB:     0 HR  00 M
DATA SET UTILITY - GENERATE                                   
IEB352I WARNING: ONE OR MORE OF THE OUTPUT DCB PARMS COPIED FRO
                                                              
PROCESSING ENDED AT EOD                                       
111111111111111111111111111111111111111111111111111111111111111
222222222222222222222222222222222222222222222222222222222222222
333333333333333333333333333333333333333333333333333333333333333
444444444444444444444444444444444444444444444444444444444444444
555555555555555555555555555555555555555555555555555555555555555

******************************** BOTTOM OF DATA ***************

Se puede observar como, al final de la impresión del SPOOL, aparece el contenido de los 5 registros que habíamos dado de alta en nuestro fichero In-Stream. La información mostrada no se puede diferenciar de la que se visualizaría si esos 5 registros hubiesen sido recuperados de un fichero secuencial de entrada.

Esta es una forma muy fácil de realizar pruebas rápidas sobre programas creados o modificados, ya que nos evita tener que dar de alta todos los ficheros secuenciales que se van a utilizar y, además, así no tenemos que estar cambiando los datos de los registros contenidos en ellos. En ocasiones nos ayudará a ahorrar bastante biempo.

En principio, el paso In-Stream es muy sencillo y, por tanto, no debería producir ningún error de ejecución, siempre y cuando lo especifiquemos de la forma que os hemos indicado más arriba. Obviamente, el contenido de los registros in-stream sí que puede (y debe) ser modificado.

Pues nada, esperamos que lo comentado os haya ayudado a descubrir una forma más rápida de probar los programas. Siempre viene bien saber que existe esta opción, aunque luego finalmente nos decidamos a usar la forma más tradicional.

Saludos.

jueves, 11 de septiembre de 2014

Lista de Utilidades ZOS básicas para JCL

A la hora de operar con ficheros secuenciales en un JCL, el sistema operativo ZOS nos proporciona una serie de herramientas, denominadas utilidades, que nos permiten realizar multitud de acciones con datasets: creación, eliminación, copia, ordenación e incluso impresión su contenido.

En el blog, a lo largo del tiempo, ya hemos ido hablando de cómo se puede implementar el código JCL para poder trabajar con las utilidades principales: IEFBR14, IEBCOPY, IEBGENER, IDCAMS y DFSORT. Cada una de ellas tiene unas características específicas que deben ser conocidas antes de ponernos a elaborar el paso correspondiente.



Hoy queríamos hacer un resumen de las utilidades revisadas, para que dispongamos de una guía que nos permita acceder con facilidad al detalle de cada uno de estos programas. La lista de utilidades básicas es la siguiente:

- Utilidad IEFBR14: Se trata de una utilidad que no realiza ninguna acción. Con su lanzamiento se entra a ejecutar el programa y, a continuación, se sale de él. Sirve para catalogar ficheros en vacío, borrarlos, etc... Podemos ver más información de la misma en el post Utilidad IEFBR14 para JCL.

- Utilidad IEBCOPY: Esta utilidad se emplea para realizar una copia de un miembro particionado (o de un miembro Library) o para unir dos miembros particionados. Podemos ver más información en el post Utilidad IEBCOPY para JCL.

- Utilidad IEBGENER: Esta utilidad sirve para realizar copias de ficheros secuenciales. Normalmente se emplea para realizar un backup de un fichero secuencial origen, aunque también se puede utilizar para producir un PDS o un PDSE a partir de un Secuencial. Podemos ver más información en el post Utilidad IEBGENER para JCL.



- Utilidad IDCAMS: Se emplea para realizar la operativa sobre los ficheros VSAM. Lo más importante es que nos permite realizar la creación de los mismos. Aunque también se emplea para realizar la eliminación, la carga de datos o incluso la impresión del contenido de los VSAM. Tenemos más información en el post Utilidad IDCAMS para JCL - 1 y en el post Utilidad IDCAMS para JCL - y 2.

- Utilidad DFSORT: Esta utilidad se emplea para realizar la ordenación de los registros del fichero secuencial indicado y almacenar el resultado ordenado en un nuevo fichero. Aparte de esto, la utilidad también puede ser empleada para realizar simples copias de ficheros o para unir el contenido de varios ficheros. Tenemos más información en el post Utilidad DFSORT para JCL - 1 y en el post Utilidad DFSORT para JCL - y 2.

Como vemos, estas utilidades nos permiten realizar todas las actividades básicas con ficheros secuenciales y con ficheros VSAM. Con ellas podemos realizar desde su creación y su eliminación hasta la copia, ordenación e incluso impresión del contenido de los datasets.



Por supuesto, existen muchas utilidades más en el mundo ZOS, pero realmente estas son las que, con diferencia, vamos a emplear más a menudo. Probablemente en un futuro vayamos viendo, poco a poco, algunas de las menos conocidas, pero con las mencionadas ya tenemos de sobra para trabajar con JCL.

Pues nada, con todo lo comentado ya no nos deberían quedar dudas acerca de las utilidades básicas de JCL. Pero si, a pesar de todo, os sigue quedando alguna, podéis preguntarnos con total libertad.

Saludos.

sábado, 6 de septiembre de 2014

Se acabaron las vacaciones

Bueno, ya estamos por aqui de nuevo, dispuestos a retomar la programación tras estas semanas de descanso. Por supuesto, nos lo iremos tomando con calma al principio, ya que hay que dejar que el cuerpo se vaya adaptando poco a poco a la nueva rutina.

Esperamos que vosotros también hayáis podido disfrutar de vuestras vacaciones veraniegas: siempre es importante recargar las pilas de vez en cuando. Y si no ha sido así, al menos deseamos que haya habido alguna buena razón que os lo haya compensado.



Pues nada, ya iremos publicando más cosas en el blog...

Saludos.

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.
Related Posts Plugin for WordPress, Blogger...